목표는 이렇다.
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;
}
C 언어 예제, 1000 의 자리수를 갖는 수의 계산 (0) | 2014.01.23 |
---|---|
C 언어 예제, 에라토스테네스의 체를 이용하여 소수 찾기 (0) | 2014.01.06 |
C 언어 예제, 유클리드 호제법으로 최대공약수 구하기(포인터 이용) (0) | 2013.12.24 |
C 언어 예제. 각 학생들의 성적 입력 받기, 평균에 따른 줄세우기(포인터 이용) (0) | 2013.12.22 |
C 언어 예제, 배열을 내림차순으로 나열하기(함수, 포인터 이용) (0) | 2013.09.23 |
댓글 영역