«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ITGenerations

p147. n8. 다수의 클래스를 선언하고 활용하는 간단한 문제이다. 본문

프로그래밍/c++ 명품프로그래밍

p147. n8. 다수의 클래스를 선언하고 활용하는 간단한 문제이다.

ITGenerations 2017. 12. 2. 01:50

/*

p147. n8. 다수의 클래스를 선언하고 활용하는 간단한 문제이다.

더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수행하는 4개의 클래스

Add, Sub, Mul, Div를 만들고자 한다. 이들은 모두 공통으로

다음 멤버를 가진다.

-int 타입변수 a, b : 피연산자

-void setValue(int x, int y): 매개변수 x, y를 멤버

a, b에 복사

int calculate() 함수: 연산을 실행하고 결과 리턴


Add

int a

int b

setValue()

calculate()



Sub

int a

int b

setValue()

calculate()


Mul

int a

int b

setValue()

calculate()


Div

int a

int b

setValue()

calculate()


main() 함수는 Add, Sub, Mul, Div, 클래스 타입의 객체 

a, s, m, d를 생성하고, 아래와 같이 키보드로부터

두 개의 정수와 연산자를 입력받고, a, s, m, d 객체 중에서

연산을 처리할 객체의 setvalue() 함수를 호출한 후, calculate()

를 호출하여 결과를 화면에 출력한다. 프로그램은 무한 루프를 돈다.

*/



#include <iostream>

using namespace std;





class Add

{

private:

int a, b;

public:

void setValue(int x, int y);

int calculate();

};


void Add::setValue(int x, int y)

{

a = x;

b = y;

}


int Add::calculate()

{

return (a + b);

}


class Sub

{

private:

int a, b;

public:

void setValue(int x, int y);

int calculate();

};


void Sub::setValue(int x, int y)

{

a = x;

b = y;

}


int Sub::calculate()

{

return (a-b);

}


class Mul

{

private:

int a, b;

public:

void setValue(int x, int y);

int calculate();

};


void Mul::setValue(int x, int y)

{

a = x;

b = y;

}


int Mul::calculate()

{

return (a*b);

}


class Div

{

private:

int a, b;

public:

void setValue(int x, int y);

int calculate();

};


void Div::setValue(int x, int y)

{

a = x;

b = y;

}


int Div::calculate()

{

return a / b;

//문제점: 정수만 반환, 소수점 반환 x

}



int main(void)

{

while(1)

{

int x;

int y;

char c;

Add a; //덧셈

Sub s; //뺄셈

Mul m; //곱셈

Div d; //나눗셈


cout << "1. 덧셈   '+' 입력" << endl

<< "2. 뺄셈   '-' 입력" << endl

<< "3. 곱셈   '*' 입력" << endl

<< "4. 나눗셈 '/' 입력" << endl;


cout << "변수 x 연산자(+~/) 변수 y  순으로 입력 "<< endl;

cin >> x >>c >>y;

//문제점이 있는데 변수 연산자 변수 순으로 입력해야한다.

// x, y, c를 순서대로 하더라도 변수를 입력해야만 하는게 아쉬움

// 나누셋할 때 몫은 안나옴.

// 숨은 에러 많음.


switch (c)

{



case '+':

a.setValue(x, y);

cout << a.calculate() << endl;

break;


case '-':

s.setValue(x, y);

cout << s.calculate() << endl;

break;

case '*':

m.setValue(x, y);

cout << m.calculate() << endl;

break;


case '/':

d.setValue(x, y);

cout << d.calculate() << endl;

break;


default:

break;

}

}

while(1)

return 0;

}






간단하다고 했는데 전혀 안간단하다. 저자 멍멍이 ㅎㅎ

오류가 몇가지 있는데 바로바로 해결하기에는 시간이 조금 지체되기에 미뤘고 

우선 초안으로 완성된 코드를 작성함.

if문 안쓰고 switch문 쓴건 메모리 절약 목적으로 썻는데 혹시 잘못된 생각이면 알려주시면 감사합니다.

생각대로는번호1~4에 각각 덧셈, 뺄셈, 곱셈 그리고 나눗셈으로 대입받고

인자만 입력받아서 계산하도록 하게끔 하고 싶었다.

그리고 나눗셈같은 경우 에러가 있는데 예를 들자면 4/3 같은경우 1.333....3 이 나오는게 정상인데

1이 나온다. 대안으로 (4/3) +(4%3) 으로 결과값 받게 하자니 2가 나온다.

물론 int nu1=4/3; , float nu2=4%3; float total=(int)nu1+(float)nu2; 이런식으로 하면 괜찮긴 하지만

간단하게 실습고 고칠 수 있는 오류므로 패스함.

또 다른 오류로는 사칙연산 외에 문자가 들어간다면 무한루프에 빠져서 탈출이 안됌.

저자가 원하는 바가 그거라서 어쩔수 없긴하지만.