이번 버전은 정수대신 실수(double)을 사용하였으면,
수와 연산자 사이에 빈칸이 올 경우 이를 처리할 수 있도록 하였다.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main(){
// 결과값을 담을 sum, 항의 값을 저장하는 term, 임시 변수 x입니다.
// 항이란 곱이나 나눗셈으로 묶여진 식을 말합니다.
// 전체 식은 이런 항들을 더하거나 빼 주는 역할을 하게 됩니다.
double sum=0, term, x;
// op는 연산자 입니다. sop는 덧셈이나, 뺄샘 연산자로써
// 아직 처리히지 않은 연산자 이다. 나중에 현재 항이 끝나고 나면
// sop에 따라서 현재의 항을 더하든지 빼든지 해주게 된다.
char op=0, sop=0;
printf("======계산기======\n");
printf("식을 입력해주세요: ");
scanf("%lf", &x);
// 시작할 경우는 아직 sop가 없다. 그리고 현재 term은 처음 주어지는 수로 정의 된다.
// 계속해서 곱셈이나 나눗셈이 나온다면 term은 그 값들을 곱하거나 나누어 줌으로써
// 값이 정해지게 된다.
term=x;
op=getchar(); if(op==' ') op=getchar();
while(op=='*'||op=='/') {
scanf("%lf", &x);
if(op=='*') term*=x;
if(op=='/') term/=x;
op=getchar(); while(op==' ') op=getchar();
}
// 이제 최초로 +연산자나 -연산자가 나왔다.
// 이 연산자를 sop에 보관을 한다.
// 처음에 구해진 term은 sum에 그 값을 준다.
// 다음 항의 시작되는 값을 구하여 term에 주었다.
if(op=='+'||op=='-') {
sop=op;
sum=term;
scanf("%lf", &x);
term=x;
op=getchar(); while(op==' ') op=getchar();
}
// 이제 남아 있는 모든 항들을 구해서 이들을 더해주거나 빼주면 된다.
// =연산자가 나올때 까지 계속해서 처리를 한다.
while(op!='\n'){
// 항이 계속된다면 그 값을 곱하거나 나누어 준다.
while(op=='*'||op=='/') {
scanf("%lf", &x);
if(op=='*') term*=x;
if(op=='/') term/=x;
op=getchar(); while(op==' ') op=getchar();
}
// +연산자나 -연산자를 만나면 현재의 항을 sop의 값에 따라서
// sum에 더하거나 빼준다. 그리고 지금 읽은 연산자를 sop에 준다.
// 다음 수를 읽어서 term의 시작값으로 준다.
// 그리고 다음 연산자를 읽어서 op에 준다.
// 이 op가 = 이면 큰 while문을 탈출하게 된다.
if(op=='+'||op=='-') {
if(sop=='+') sum+=term;
if(sop=='-') sum-=term;
sop=op;
scanf("%lf", &x);
term=x;
op=getchar(); while(op==' ') op=getchar();
}
}
// 마지막에 처리하지 않은 term이 있다면
// 이뜻은 sop가 +나 -라면 처리를 해준다.
// 만약 sop가 0이라면 처음 읽은 한개의 term으로 식이 끝났다는 것을 의미한다.
if(sop=='+') sum+=term;
if(sop=='-') sum-=term;
if(sop==0) sum=term;
printf("결과: %g\n", sum);
return 0;
}
수식을 다 넣고 나서 [엔터]를 눌러주면 결과가 나온다.
'c·c++ > c 프로그래밍' 카테고리의 다른 글
큰정수의 덧셈과 뺄셈(진행중) (0) | 2012.11.05 |
---|---|
피보나치-어린토끼,어른토끼 (0) | 2012.10.20 |
Newton-Raphson Method (0) | 2012.10.13 |
진법변환 (0) | 2012.10.11 |
달력출력 (0) | 2012.10.10 |