C语言实现简易四则运算计算器

2022-10-09 10:35:39

第一版计算器

实现第一版本计算器:个位数的加减乘除运算,采用结果为浮点数加、减、乘、除相同优先级,

表达式最大长度 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;
}
  • 作者:一段路
  • 原文链接:https://blog.csdn.net/qq_65428993/article/details/124414388
    更新时间:2022-10-09 10:35:39