상세 컨텐츠

본문 제목

C 언어 예제, 계산기 만들기

컴퓨터 관련/C 언어 예제

by 열정과 함께 2013. 12. 27. 14:19

본문

목표는 이렇다.


1. 사칙 연산이 가능해야 한다.

2. 연산을 취소할 수 있어야 한다.


아래는 시험용 그림.



그리고 코드는 이렇다.


#include <stdio.h>

int plus(double *p, double *q, double *r);

int minus(double *p, double *q, double *r);

int multiple(double *p, double *q, double *r);

int divide(double *p, double *q, double *r);

int exponent(double *p, double *q, double *r);

int rollback(double *p, double *r);

int main()

{

double *p, *q, *r;

char *s;

int i,j;

char char_plus, char_minus, char_multiple, char_divide, char_exponent, char_operator, char_rollback, char_end, char_new;

double a, b, c;

char_plus = '+';

char_minus = '-';

char_multiple = '*';

char_divide = '/';

char_exponent = '^';

char_rollback = 'c';

char_end ='e';

char_new = 'n';

printf("계산기입니다. \n");

printf("가능한 연산은 다음과 같습니다. \n %c(plus) %c(minus) %c(multiple) %c(divide) %c(exponent) \n", char_plus, char_minus, char_multiple, char_divide, char_exponent);

printf("연산을 취소하려면 연산에서 %c 를 입력하세요. \n", char_rollback);

printf("연산을 끝내려면 연산에서 %c 를 입력하세요. \n", char_end);

printf("새 연산을 시작하려면 %c 를 입력하세요 \n", char_new);

a = 0;

printf("수를 입력해 주세요 \n");

scanf("%lf", &a);

for(i=0;i<9999;i++)

{

printf("수행할 연산은 무엇입니까? ");

scanf(" %c", &char_operator);


/*연산이 수행되는 부분*/

if(char_operator == '+')

{

printf("얼마를 더하겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

plus(&a, &b, &c);

printf("결과 : %f \n",*p);

}

else if(char_operator == '-')

{

printf("얼마를 빼겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

minus(&a, &b, &c);

printf("결과 : %f \n", *p);


}

else if(char_operator == '*')

{

printf("얼마를 곱하겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

multiple(&a, &b, &c);

printf("결과 : %f \n", *p);

}

else if(char_operator == '/')

{

printf("얼마로 나누겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

divide(&a, &b, &c);

printf("결과 : %f \n", *p);

}

else if(char_operator == '^')

{

printf("몇 승 하겠습니까?(소수점은 입력할 수 없습니다) ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

exponent(&a, &b, &c);

printf("결과 : %f \n", *p);

}

else if(char_operator == 'c')

{

if(i == 0)

{

printf("되돌아갈 연산이 없습니다. \n");

}

else

{

rollback(&a, &c);

printf("이전의 연산으로 되돌아갑니다. \n");

printf("입력되어있는 숫자 : %lf \n", *p);

}

}

else if(char_operator =='e')

{

printf("연산이 종료되었습니다. \n");

break;

}

else if(char_operator == 'n')

{

printf("변수들이 모두 초기화됩니다. \n");

a = 0;

b = 0;

c = 0;

printf("수를 입력해 주세요. \n");

scanf("%lf", &a);

}

else

{

printf("잘못된 연산입니다. 수행할 연산을 다시 입력하십시오.\n");

}

}

return 0;

}


int plus(double *p, double *q, double *r)

{

double a,b;

*r = *p;

*p = *p + *q;

return 0;

}

int minus(double *p, double *q, double *r)

{

double a, b;

*r = *p;

*p = *p - *q;

return 0;

}

int multiple(double *p, double *q, double *r)

{

double a, b;

*r = *p;

*p = *p * *q;

return 0;

}

int divide(double *p, double *q, double *r)

{

double a, b;

*r = *p;

*p = *p / *q;

return 0;

}

int exponent(double *p, double *q, double *r)

{

int a, b, c, d;

b = *p;

d = *p;

c = *q;

for(a=1;a<c;a++)

{

b = b * d;

}

*p = b;

return 0;

}

int rollback(double *p, double *r)

{

*p = *r;

return 0;

}


간단히 설명하자면......


#include <stdio.h>

int plus(double *p, double *q, double *r);

int minus(double *p, double *q, double *r);

int multiple(double *p, double *q, double *r);

int divide(double *p, double *q, double *r);

int exponent(double *p, double *q, double *r);

int rollback(double *p, double *r);


사용될 함수들을 정의하였다. 덧셈, 뺄셈, 곱셉, 나눗셈, 지수 승, 그리고 연산의 취소를 위한 함수이다.


int main()

{

double *p, *q, *r;

char *s;//연산에 사용될 숫자와 연산자의 포인터화

int i,j;//코딩 짜는데 필요한 변수들.

char char_plus, char_minus, char_multiple, char_divide, char_exponent, char_operator, char_rollback, char_end, char_new;//연산 기호의 정의

double a, b, c;//연산에 사용될 숫자들

char_plus = '+';

char_minus = '-';

char_multiple = '*';

char_divide = '/';

char_exponent = '^';

char_rollback = 'c';

char_end ='e';

char_new = 'n';


연산에 사용들의 기호를 정리하였다. char 변수를 선언할 때는 char XX = 'X' 과 같은 식으로 정의해야 한다.

printf("계산기입니다. \n");

printf("가능한 연산은 다음과 같습니다. \n %c(plus) %c(minus) %c(multiple) %c(divide) %c(exponent) \n", char_plus, char_minus, char_multiple, char_divide, char_exponent);

printf("연산을 취소하려면 연산에서 %c 를 입력하세요. \n", char_rollback);

printf("연산을 끝내려면 연산에서 %c 를 입력하세요. \n", char_end);

printf("새 연산을 시작하려면 %c 를 입력하세요 \n", char_new);

a = 0;

printf("수를 입력해 주세요 \n");

scanf("%lf", &a);


연산의 연속성을 확보하기 위해 for 구문은 첫 변수 이후에 시작한다. for 구문은 무한으로 하지는 않았고 대신 9999 번까지 가능하니 실질적으로 무한이라 생각된다.


for(i=0;i<9999;i++)

{

printf("수행할 연산은 무엇입니까? ");

scanf(" %c", &char_operator);


if(char_operator == '+')

{

printf("얼마를 더하겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

plus(&a, &b, &c);

printf("결과 : %f \n",*p);

}


덧셈이 수행되는 부분. 연산을 취소하는 단계가 있으려면 이전의 값이 살아있어야 하므로 변수는 셋이 들어간다. 아래에서도 모두 동일.


else if(char_operator == '-')

{

printf("얼마를 빼겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

minus(&a, &b, &c);

printf("결과 : %f \n", *p);


}


뺄셈이 수행되는 부분.


else if(char_operator == '*')

{

printf("얼마를 곱하겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

multiple(&a, &b, &c);

printf("결과 : %f \n", *p);

}


곱셈이 수행되는 부분


else if(char_operator == '/')

{

printf("얼마로 나누겠습니까? ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

divide(&a, &b, &c);

printf("결과 : %f \n", *p);

}


나눗셈이 수행되는 부분


else if(char_operator == '^')

{

printf("몇 승 하겠습니까?(소수점은 입력할 수 없습니다) ");

scanf("%lf", &b);

p = &a;

q = &b;

r = &c;

exponent(&a, &b, &c);

printf("결과 : %f \n", *p);

}


지수승이 수행되는 부분. 소수점은 입력까지는 되지만 인식이 안 되므로 연산이 불가하다.


else if(char_operator == 'c')

{

if(i == 0)

{

printf("되돌아갈 연산이 없습니다. \n");

}

else

{

rollback(&a, &c);

printf("이전의 연산으로 되돌아갑니다. \n");

printf("입력되어있는 숫자 : %lf \n", *p);

}

}


연산이 취소되는 부분. 단, 첫 단계부터 연산을 취소할 수는 없다.


else if(char_operator =='e')

{

printf("연산이 종료되었습니다. \n");

break;

}


연산이 종료되는 부분, for 안에 모든 연산자들이 들어있으므로 for 구문 만 벗어나면 연산은 끝나는 것이다. 대신 거기서 다른 부분은 실행할 수 없음.


else if(char_operator == 'n')

{

printf("변수들이 모두 초기화됩니다. \n");

a = 0;

b = 0;

c = 0;

printf("수를 입력해 주세요. \n");

scanf("%lf", &a);

}


새 연산을 시작하는 부분. 기존의 변수에 모두 0 을 넣으면 초기화되는거나 마찬가지. 그리고 처음에 for 구문 밖에 있던 부분을 따로 넣어주었다.


else

{

printf("잘못된 연산입니다. 수행할 연산을 다시 입력하십시오.\n");

}


연산자 이외의 것이 입력되면 연산을 수행할 수 없으니 이렇게 했다. 사실 전체 for 를 만든 것은 연산의 연속성 확보도 있으나, 잘못된 기호가 입력되었을 때 다시 돌아갈 수 있게 하기 위함도 있다.


}

return 0;

}


int plus(double *p, double *q, double *r)

{

double a,b;

*r = *p;

*p = *p + *q;

return 0;

}

int minus(double *p, double *q, double *r)

{

double a, b;

*r = *p;

*p = *p - *q;

return 0;

}

int multiple(double *p, double *q, double *r)

{

double a, b;

*r = *p;

*p = *p * *q;

return 0;

}

int divide(double *p, double *q, double *r)

{

double a, b;

*r = *p;

*p = *p / *q;

return 0;

}

int exponent(double *p, double *q, double *r)

{

int a, b, c, d;

b = *p;

d = *p;

c = *q;

for(a=1;a<c;a++)

{

b = b * d;

}

*p = b;

return 0;

}


지수 승의 연산 부분. 변수를 int 로만 정의했으므로, 입력할 때는 소수점이 있도록 입력해도 내부에서는 소수점을 잘라먹고 정수형으로만 연산할 수 있게 했다. 어쩔 수 없다. 실수형이 들어가면 로그 값을 계산해야 하니......


int rollback(double *p, double *r)

{

*p = *r;

return 0;

}



관련글 더보기

댓글 영역