第一版计算器
实现第一版本计算器:个位数的加减乘除运算,采用结果为浮点数加、减、乘、除相同优先级,
表达式最大长度 40 个字符。
例:输入一个字符串 1+2*3/4 ,
运算步骤为: 1+2 =>3 , 3*3 => 9 , 9/4 => 2.25
第二版计算器
实现第二版计算器:多位浮点数的加减乘除运算,采用加减乘除相同优先级,结果为浮点数,
需要判断多位浮点数。表达式最大长度 40 个字符。
例:输入一个字符串: 1.1-2.5*4+10.2/5.1 ,
运算步骤为: 1-2.5=>-1.4 , -1.4*4 => -5.6 , -5.6+10.2=>4.6, 4.6/5.1=>0.902
第三版计算器(简易终极版)
实现第三版计算器:多位浮点数的加减乘除运算,需处理优先级,采用先乘除后加减,结果为浮
点数,本版本为简单计算器的最终版本,要求使用自定义函数处理操作数,最大长度 40 个字符。
例:输入一个字符串: 1-2.5*4+10.2/5.1 ,
运算步骤为: 2.5*4=>10 , 10.2/5.1 => 2 , 1-10=>-9,-9+2=> -7
注:不使用栈
函数说明:
isdigit(char c)——库函数,用于判断参数是否为十进制数字字符,若参数c为阿拉伯数字0~9,则返回非0值,否则返回NULL
atof(const char *nptr)——库函数,用于把字符串转换成浮点数
strlwr(字符串)——大写转小写函数
strcmp(字符串1,字符串2)——字符串比较函数
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
double calc(char *s){
double a_czs[20],czs;
char a_ysf[20],ysf;
int cnt_czs=0,cnt_ysf=0,i=0;
a_czs[cnt_czs]=atof(s);//提取的第一个操作数!
while(isdigit(*s)||*s=='.'||*s==' ')s++;
while(*s!='\0'){
ysf=*s,s++,czs=atof(s);
while(isdigit(*s)||*s=='.'||*s==' ')s++;
if(ysf=='+'||ysf=='-'){
a_ysf[cnt_ysf]=ysf;
cnt_ysf++,cnt_czs++;
a_czs[cnt_czs]=czs;
}
else{
switch(ysf){
case '*':a_czs[cnt_czs]*=czs;break;
case '/':a_czs[cnt_czs]/=czs;break;
}
}
}
czs=a_czs[0];
for(i=0;i<cnt_czs;i++){
switch(a_ysf[i]){
case '+':czs+=a_czs[i+1];break;
case '-':czs-=a_czs[i+1];break;
}
}
return czs ;
}
//判断是否是运算符
int isysf(char c){
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '.')
return 1;
return 0;
}
//判断是否合法
int hfjc(char *s){
while (*s){
if (isdigit(*s) == 0 && isysf(*s) == 0 && *s != ' ')
return 0;
s++;
}
return 1;
}
int main(){
char s[41]="QUIT";
printf("输入\"%s\"可关闭计算器\n",strlwr(s));
while (1){
puts("请输入一个简单的四则运算表达式:");
printf("例如:1+2.5-1*9/2\n");
gets(s);
if (strcmp(strlwr(s), "quit") == 0) break;
if (hfjc(s) == 0){
printf("%s非法\n", s); continue;
}
printf("表达式%s的值为%.3lf\n",s,calc(s));
}
printf("欢迎下次使用\n");
return 0;
}
函数指针运用版计算器
//简易计算器
void menu(){
puts("*********************************");
puts("*** 1、加法 2、减法 3、乘法 ***");
puts("*** 4、除法 5、异或 6、退出 ***");
puts("*********************************");
}
int Add(int x,int y){
return x+y;
}
int Sub(int x,int y){
return x-y;
}
int Mul(int x,int y){
return x*y;
}
int Div(int x,int y){
return x/y;
}
int Xor(int x,int y){
return x^y;
}
int main(){
int input = 0;
int x =0,y = 0;
int (*pfArr[])(int,int) = {0,Add,Sub,Mul,Div,Xor};
do{
menu();
printf("请选择:> ");
scanf("%d",&input);
if(input>=1 && input<=5){
printf("请输入两个数字:> ");
scanf("%d%d",&x,&y);
int ret = pfArr[input](x,y);
printf("结果ret = %d\n",ret);
}
else if(input==0)
printf("退出\n");
else
printf("选择错误!\n");
}while(input);
return 0;
}