C++
6일차 정리
------------------------재영쌤 주의 3가지
1.입출력은 반드시 메인함수
2.함수 선언은 클래스 내부에서, 정의는 클래스 외부에서 한다
3.함스, 변수를 의미에 맞는 단어로 사용한다.
---------------------------
#Define true 1 //
클래스는 컴파일 시 모두 메모리에 올라감으로 사용하지 않는 함수는
클래스에서 선언만 하고 밖으로 빼서 사용할때만 메모리에 올리도록 한다.
--------------while문 실패 수정하자!
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void menu(int* x,int* y,char* t)
{
cout<<"┌────────┐"<<endl;
cout<<"│절대값은 수|수 │"<<endl;
cout<<"│제곱은 ^ │"<<endl;
cout<<"└────────┘"<<endl;
cin>>*x >> *t >> *y;
}
class Calc{
public:
int plus(int su, int su2){return su + su2;}
int sub(int su, int su2){return su - su2;}
int mut(int su, int su2){return su * su2;}
int div(int su, int su2){
while(su == 0 || su2 == 0){
cin >> su >> su2;
if (su == 0 || su2 == 0){
cout << "두 수를 다시 입력해주세요 0은 안되요."<< endl;
continue;
}
else break;
}
return su / su2;
}
int abs1(int su){
if(su < 0){su = su * -1;}
return su;
}
int abs2(int su2){
if(su2 < 0){su2 = su2 * -1;}
return su2;
}
int squar(int su, int su2){
int sq=1;
for(int i=1; i <= su2; i++){
sq=sq * su;
}
return sq;
}
};
void main()
{
int x,y = 0;
char c;
Calc cal;
while(1)
{
menu(&x,&y,&c);
switch(c)
{
case '+':
cout<<x<<c<<y<<"= "<< cal.plus(x,y)<<endl;
break;
case '-':
cout<<x<<c<<y<<"= "<<cal.sub(x,y)<<endl;
break;
case '*':
cout<<x<<c<<y<<"= "<<cal.mut(x,y)<<endl;
break;
case '/':
cout<<x<<c<<y<<"= "<<cal.div(x,y)<<endl;
break;
case '|':
cout<<x<<c<<y<<"= "<< "값은 "<< cal.abs1(x) << "과 "<< cal.abs2(y) << endl;
break;
case '^':
cout<<x<<c<<y<<"= "<<cal.squar(x,y)<<endl;
break;
}
fflush(stdin);
cout<<"계속 하시겠습니까? (y/n) :";
cin>>c;
if(c == 'n')
{
break;
}
system("cls");
}
}
----------공학용 계산기
// 0120.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
class Calc{
protected:
int number1;
int number2;
public:
void SetValue(int su1, int su2){
number1 = su1;
number2 = su2;
}
int GetSum(){
return number1 + number2;
}
int GetSub(){
return number1 - number2;
}
int GetMul(){
return number1 * number2;
}
int GetDiv(){
return number1 / number2;
}
};
class ScientificCalculator : public Calc {
public:
void SetOneValue(int num){
number1 = num;
}
int GetAbsolute(){
if ( number1 < 0 )
number1 *= -1;
return number1;
}
int GetSquare(){
return number1 * number1;
}
};
int main(int argc, char* argv[])
{
int n1 , n2;
int select;
ScientificCalculator calc;
while(1){
cout << " 1. 더하기 " << endl;
cout << " 2. 빼기 " << endl;
cout << " 3. 곱하기 " << endl;
cout << " 4. 나누기 " << endl;
cout << " 5. 절대값 " << endl;
cout << " 6. 제곱 " << endl;
cout << " 7. 종료 " << endl;
cout << " > " ;
cin >> select;
if ( select >= 1 && select <= 4){
cout << "두 수를 입력하세요" << endl;
cin >> n1 >> n2;
calc.SetValue(n1 , n2);
}
else if ( select == 5 || select == 6 ){
cout << " 한 수를 입력하세요" << endl;
cin >> n1;
calc.SetOneValue(n1);
}
switch(select){
case 1 :
cout << n1 << " + " << n2 << " = "<< calc.GetSum() <<endl;
getch();
break;
case 2 :
cout << n1 << " - " << n2 << " = "<< calc.GetSub() <<endl;
getch();
break;
case 3 :
cout << n1 << " * " << n2 << " = "<< calc.GetMul() <<endl;
getch();
break;
case 4 :
if( n2 == 0){
cout << "0으로 나눌 수 없습니다." << endl;
getch();
break;
}
cout << n1 << " / " << n2 << " = "<< calc.GetDiv() <<endl;
getch();
break;
case 5 :
cout << n1 <<"의 절대값은" << calc.GetAbsolute() << endl;
getch();
break;
case 6:
cout << n1 <<"의 제곱은" << calc.GetSquare() << endl;
getch();
break;
case 7 : return 0;
}
system("cls");
}
return 0;
}
-----------------------------
conio.h
getch 문자 한개
getche 문자 한개 입력한 데이터 바로 출력
getchar() 문자 여러개 입력
#define true 1
----------------------------
// 0120.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
class Calc{
protected:
int number1;
int number2;
public:
void SetValue(int su1, int su2){
number1 = su1;
number2 = su2;
}
int GetSum();
int GetSub();
int GetMul();
int GetDiv();
};
int Calc::GetSum(){
return number1 + number2;
}
int Calc::GetSub(){
return number1 - number2;
}
int Calc::GetMul(){
return number1 * number2;
}
int Calc::GetDiv(){
return number1 / number2;
}
class ScientificCalculator : public Calc {
public:
void SetOneValue(int num){
number1 = num;
}
int GetAbsolute();
int GetSquare();
};
int ScientificCalculator::GetAbsolute(){
if ( number1 < 0 )
number1 *= -1;
return number1;
}
int ScientificCalculator::GetSquare(){
return number1 * number1;
}
int main(int argc, char* argv[])
{
int n1 , n2;
int select;
ScientificCalculator calc;
while(1){
cout << " 1. 더하기 " << endl;
cout << " 2. 빼기 " << endl;
cout << " 3. 곱하기 " << endl;
cout << " 4. 나누기 " << endl;
cout << " 5. 절대값 " << endl;
cout << " 6. 제곱 " << endl;
cout << " 7. 종료 " << endl;
cout << " > " ;
cin >> select;
if ( select >= 1 && select <= 4){
cout << "두 수를 입력하세요" << endl;
cin >> n1 >> n2;
calc.SetValue(n1 , n2);
}
else if ( select == 5 || select == 6 ){
cout << " 한 수를 입력하세요" << endl;
cin >> n1;
calc.SetOneValue(n1);
}
switch(select){
case 1 :
cout << n1 << " + " << n2 << " = "<< calc.GetSum() <<endl;
getch();
break;
case 2 :
cout << n1 << " - " << n2 << " = "<< calc.GetSub() <<endl;
getch();
break;
case 3 :
cout << n1 << " * " << n2 << " = "<< calc.GetMul() <<endl;
getch();
break;
case 4 :
if( n2 == 0){
cout << "0으로 나눌 수 없습니다." << endl;
getch();
break;
}
cout << n1 << " / " << n2 << " = "<< calc.GetDiv() <<endl;
getch();
break;
case 5 :
cout << n1 <<"의 절대값은" << calc.GetAbsolute() << endl;
getch();
break;
case 6:
cout << n1 <<"의 제곱은" << calc.GetSquare() << endl;
getch();
break;
case 7 : return 0;
}
system("cls");
}
return 0;
}
------------------함수를 밖으로 뺌.
class Calc{
public:
int GetSum(){~~}
}
---------------------------------바꿈
class Calc{
public:
int GetSum();
}
int GetSum(){~~~}
--------------------상속
상속을 받아올 때 virtual로 A라는 공간을 만들어
같은 함수를 호출시 하나만 가져오도록 함.
--------------------------
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
class A{
protected:
A(){
cout<<"A maked" <<endl;
}
};
class B:virtual public A{
protected:
B(){
cout<<"B maked" <<endl;
}
};
class C:virtual public A{
protected:
C(){
cout<<"C amked"<<endl;
}
};
class D:public B, public C{
public:
D(){
cout <<"D maked"<<endl;
}
};
void main(){
D d;
}
-------------------실행결과
ABCD
----------가상 상속
생성자가 이루어질 떄 상속값으로 어떤 값이 들어갈 것인가 확인
----------------
부모클래스에 생성자가 있으면 어떻게 될 것인가
default 생성자가 없다면 위에 부모클래스에서 빈값 받는 것을 사용하도록설정
--------------프렌드함수
멤버변수(privae)는 원래 접근 불가이나 프렌드함수는 가능하게 만들어줌
쓸일이 잘 없다.
-----------------------
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
class Dog{
private:
int Age;
int Weight;
public:
Dog(int age, int weight){
Age=age;
Weight=weight;
}
friend void Display(Dog &obj);
};
void Display(Dog &obj) {//obj라는 레퍼런스 추가
cout<<obj.Age<<endl;
cout<<obj.Weight<<endl;
}
void main(){
Dog jindo =Dog(3,4);//Dog(3,4)는 생성자 직접호출 Dog jindo; jindo(3,4);
Display(jindo);//private에 있는 Age와 Weight를 class밖에 있는 함수로 가져와서 쓴다.
}
-------------실행결과
3
4
--------프렌드 클래스(friend class)& 클래스로 멤버함수 처리
클래스 단위로 데이터의 교환이 이루어질 필요가 있을 때 사용한다
진정한 객체지향을 위한 단계
-----------------------
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
class Dog;//void Display(Dog &obj);라는 Dog클래스를 이용할 것이다! 선언
class Cat{
int Age; int Weight;
public:
Cat(int age, int weight){
Age=age; Weight=weight;
}
void Display(Dog &obj);
};
class Dog{
friend class Cat;//Cat 클래스에서 Dog를
int Age; int Weight;
public:
Dog(int age, int weight){
Age=age; Weight=weight;
}
friend void Cat::Display(Dog &obj);
};
void Cat::Display(Dog &obj){
cout <<"나 이: "<< obj.Age <<endl;
cout <<"몸무게: "<< obj.Weight <<endl;
}
void main(){
Dog jindo = Dog(3,4);
Cat cat=Cat(5,7);
cat.Display(jindo);
}
----------실행결과
나 이: 3
몸무게: 4
-----------------함수의 오버로딩
-------불가능한 것
Sizeof Sizeof 연산자.
멤버 연산자.*
멤버 지시 포인터::
범위 결정(namespace)
? :조건 연산자
----------------------------
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
void main(){
cout << 3+4<< endl;
cout <<"korea"+1<<endl;
cout <<"korea"+2<<endl;
cout <<"korea"+3<<endl;
cout <<4+"korea"<<endl;
// cout <<"kor"+"ea"<<endl;
}
------------------함수의 오버로딩 (객체+정수)
---------------------------------------------
#include "stdafx.h"
#include <iostream>
//#include <conio.h> // Console input / output
using namespace std;
class Point{
int x,y;
public:
Point(int a, int b){x=a; y=b;}
void print(){cout<<"x = "<<x<<", y = "<<y<<"\n"; }
friend Point operator + (Point tmp, int data);//tmp라는 point클래스 객체를 만든다.
};
Point operator + (Point tmp, int data){//+라는 이름의 operator 함수
cout<< " 객체 + 정수 "<<"\n";
tmp.x=tmp.x+data;
tmp.y=tmp.y+data;
return tmp;
}
void main(){
Point ov1(10,20), ov2(0,0);//Point 클래스의 ov1과 ov2라는 클래스를 만든다
ov2= ov1+10;//+라는 이름의 operator 함수를 사용한다
ov2.print();
}
--------------결과
객체 + 정수
x = 20, y = 30
계속하려면 아무 키나 누르십시오 . .
-----------------함수의 오버로딩 + operator로 4칙연산
#include "stdafx.h"
#include <iostream>
/*
+ , - , * , / 의 기능을 하는 함수를 만드시오
객체 + 정수
정수 + 객체
객체 + 객체
*/
using namespace std;
class Point{
int x,y;
public:
Point(int a, int b){x=a; y=b;}
void print(){cout<<"x = "<<x<<", y = "<<y<<"\n"; }
friend Point operator + (Point tmp, int data);
friend Point operator + (int data, Point tmp);
friend Point operator + (Point tmp, Point tmp1);
friend Point operator - (Point tmp, int data);
friend Point operator - (int data, Point tmp);
friend Point operator - (Point tmp, Point tmp1);
friend Point operator * (Point tmp, int data);
friend Point operator * (int data, Point tmp);
friend Point operator * (Point tmp, Point tmp1);
friend Point operator / (Point tmp, int data);
friend Point operator / (int data, Point tmp);
friend Point operator / (Point tmp, Point tmp1);
};
Point operator + (Point tmp, int data){
cout<< " 객체 + 정수 "<<"\n";
tmp.x=tmp.x+data;
tmp.y=tmp.y+data;
return tmp;
}
Point operator + (int data, Point tmp){
cout<< " 정수 + 객체 "<<"\n";
tmp.x=data + tmp.x;
tmp.y=data + tmp.y;
return tmp;
}
Point operator + (Point tmp, Point tmp1){
cout<< " 객체 + 객체 "<<"\n";
tmp.x=tmp1.x + tmp.x;
tmp.y=tmp1.y + tmp.y;
return tmp;
}
//------------ +
Point operator - (Point tmp, int data){
cout<< " 객체 - 정수 "<<"\n";
tmp.x=tmp.x-data;
tmp.y=tmp.y-data;
return tmp;
}
Point operator - (int data, Point tmp){
cout<< " 정수 - 객체 "<<"\n";
tmp.x=data - tmp.x;
tmp.y=data - tmp.y;
return tmp;
}
Point operator - (Point tmp, Point tmp1){
cout<< " 객체 - 객체 "<<"\n";
tmp.x=tmp1.x - tmp.x;
tmp.y=tmp1.y - tmp.y;
return tmp;
}
//--------------- -
Point operator * (Point tmp, int data){
cout<< " 객체 * 정수 "<<"\n";
tmp.x=tmp.x*data;
tmp.y=tmp.y*data;
return tmp;
}
Point operator * (int data, Point tmp){
cout<< " 정수 * 객체 "<<"\n";
tmp.x=data * tmp.x;
tmp.y=data * tmp.y;
return tmp;
}
Point operator * (Point tmp, Point tmp1){
cout<< " 객체 * 객체 "<<"\n";
tmp.x=tmp1.x * tmp.x;
tmp.y=tmp1.y * tmp.y;
return tmp;
}
//---------------- *
Point operator / (Point tmp, int data){
cout<< " 객체 / 정수 "<<"\n";
tmp.x=tmp.x/data;
tmp.y=tmp.y/data;
return tmp;
}
Point operator / (int data, Point tmp){
cout<< " 정수 / 객체 "<<"\n";
tmp.x=data / tmp.x;
tmp.y=data / tmp.y;
return tmp;
}
Point operator / (Point tmp, Point tmp1){
cout<< " 객체 / 객체 "<<"\n";
tmp.x=tmp1.x / tmp.x;
tmp.y=tmp1.y / tmp.y;
return tmp;
}
//----------------- /
void main(){
Point ov1(10,20), ov2(0,0);
ov2= ov1+10;//+라는 이름의 operator 함수를 사용한다
ov2.print();
ov2= ov1-ov2;
ov2.print();
ov2= 10*ov1;
ov2.print();
ov2= ov1/ov2;
ov2.print();
}
-----------------실행결과
객체 + 정수
x = 20, y = 30
객체 - 객체
x = 10, y = 10
정수 * 객체
x = 100, y = 200
객체 / 객체
x = 10, y = 10
계속하려면 아무 키나 누르십시오 . . .
------------------
#include "stdafx.h"
#include <iostream>
/*
어제는 13시간 51분 공부를 하고, 오늘은 14시간 20분 공부하였다.
총 공부한 시간은 얼마인지 출력하시오.
아래의 클래스를 토대로 위의 내용을 구성하시오.
class time{
int hour;
int min;
};
*/
using namespace std;
class time{
int hour;
int min;
time(int su, int su2){
hour = su;
min = su2;}
};
void main(){
time pre=time(13,51);
time now=time(14,20);
}
------------
#include "stdafx.h"
#include <iostream>
/*
어제는 13시간 51분 공부를 하고, 오늘은 14시간 20분 공부하였다.
총 공부한 시간은 얼마인지 출력하시오.
아래의 클래스를 토대로 위의 내용을 구성하시오.
class time{
int hour;
int min;
};
*/
#include "stdafx.h"
#include <iostream>
/*
어제는 13시간 51분 공부를 하고, 오늘은 14시간 20분 공부하였다.
총 공부한 시간은 얼마인지 출력하시오.
아래의 클래스를 토대로 위의 내용을 구성하시오.
class time{
int hour;
int min;
};
*/
using namespace std;
class time{
int hour;
int min;
int day;
public:
time(int su, int su2){
hour = su;
min = su2;
day = 0;
}
void print(){cout<<day<< " 일 "<< hour << " 시간 " << min<<"분은 "<<"\n"; }
friend time operator + (time tmp, time tmp2);
};
time operator + (time tmp, time tmp2){//+라는 이름의 operator 함수
tmp.min=tmp.min + (tmp.hour * 60);
tmp2.min=tmp2.min + (tmp2.hour * 60);
tmp.min=tmp.min + tmp2.min;
while(tmp.min>=60){
if(tmp.min >= 60){tmp.hour++;tmp.min-=60;}
if(tmp.hour >=24){tmp.day++;tmp.hour-=24;}
}
return tmp;
}
void main(){
time pre(13,51), now(14,20);
now=now+pre;
now.print();
}