文档库 最新最全的文档下载
当前位置:文档库 › 多功能计算器

多功能计算器

用C语言设计一个多功能计算器
实现功能:
1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出结果。
结果可以作为下一个运算的第一运算数。按‘C’清屏,按‘X’退出。
例如:输入:2+5 输出:7
2)实现单运算符表达式计算的功能。
输入的操作数可以包含整数或浮点数。如果遇到错误的表达式,应输出错误提示信息。
输入表达式如下:
例如:输入:2+5
输出:7
#include
#include
#include
#include
#include


#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100
#define BUFSIZE 100
#define NAME 'n'



int getop(char s[]);
void push(double);
double pop(void);
int getch(void);
void ungetch(int c);
double atof(char s[]);
void mathfnc(char s[]);
void clear(void);



int sp = 0; double val[MAXVAL];
int bufp = 0; char buf[BUFSIZE];
int main(void)
{
int i, type, var = 0;
double op2, v;
char s[MAXOP];
double variable[26];

for(i = 0; i < 26; i++)
variable[i] = 0.0;


while ((type = getop(s)) != EOF) {
switch(type) {

case NUMBER :
push (atof(s));
break;

case NAME :
mathfnc(s);
break;

case '+' :
push (pop() + pop());
break;

case '*' :
push (pop() * pop());
break;

case '-' :
op2 = pop();
push (pop() - op2);
break;

case '/' :
op2 = pop();
if (op2 != 0.0)
push (pop() / op2);
else
printf ("error: zero divisor\n");
break;

case '%' :
op2 = pop();
if(op2 != 0.0)
push(fmod(pop(), op2));
else
printf("error : zero divisor\n");
break;

case 'c' :
clear();
break;

case '=' :
pop();
if(var >= 'A' && var <= 'Z')
variable[var - 'A'] = pop();
else
printf("error : no variable name\n");
break;

case '\n' :
v = pop();
printf("\t %.8g\n", v);
break;

default :
if(type >= 'A' && type <= 'Z')
push(variable[type - 'A']);
else if (type == 'v')
push(v);
else
printf("error : unknown command %s\n", s);
}

var = type;
}
return 0;
}




/*读入一个数*/
int getop(char s[])
{
int i, c;

while((s[0] = c = getch()) == ' ' || c == '\t') /*去除空格*/
;
s[1] = '\0';
i = 0;
if(c == '-')
if(isdigit(c = getch()) || c == '.')
s[++i] = c;
else {
if(c != EOF)
ungetch(c);
return '-';
}


if(islower(c)) {
while(islower(s[++i] = c = getch()))
;
s[i] = '\0';
if(c != EOF)
ungetch(c);
if(strlen(s) > 1)
return NAME;
else
return c;
}



if(!isdigit(c) && c != '.')/*如果不是数字就返回*/
return c;


if(isdigit(c)) /*读取整数部分*/
while(isdigit(s[++i] = c = getch()))
;

if(c == '.') /*读取小数部分*/
while(isdigit(s[++i] = c = getch()))
;

s[i] = '\0';


if(c != EOF)
ungetch(c); /*把多读入的一个字符返回到输入流*/
return NUMBER;
}



void clear(void)
{
sp = 0;
}




void mathfnc(char s[])
{
double op2;
if(strcmp(s, "sin") == 0)
push(sin(pop()));
else if(strcmp(s, "cos") == 0)
push(cos(pop()));
else if(strcmp(s, "exp") == 0)
push(exp(pop()));
else if(strcmp(s, "pow") == 0) {
op2 = pop();
push(pow(pop(), op2));
}else
printf("error : %s not supported\n", s);
}



void push(double f)
{
if(sp < MAXVAL)
val[sp++] = f;
else
printf("error : stack full, can't pust %g\n", f);
}




double pop(void)
{
if(sp > 0)
return val[--sp];
else {
printf("error: stack empty\n");
return 0.0;
}
}




int getch(void)
{
return ((bufp > 0) ? buf[--bufp] : getchar());
}




void ungetch(int c)
{
if(bufp >= BUFSIZE)
printf("ungetch : too many characters\n");
else
buf[bufp++] = c;
}




double atof(char s[])
{
double val,power;
int i, sign;

for(i = 0; isspace(s[i]); i++)
;

sign = (s[i] == '-') ? -1 : 1;
if(s[i] == '+' || s[i] == '-')
i++;
for(val =0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if(s[i] == '.')
i++;
for(power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10.0;
}
return sign * val / power;
}

相关文档