C语言实现四则运算

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stack> 

//判断运算符的优先级函数 
int Precede(char a, char b) 
{ 
   switch (a) 
   { 
     case '*': 
     case '/': 
        if ((b == '+') || (b == '-')) 
        { 
           return 1; //a的优先级高于b 
        } 
        else 
        { 
           return 0; //a的优先级等于b 
        } 
     
	 case '+': 
     case '-': 
	    if ((b == '*') || (b == '/')) 
	    { 
	       return -1; //a的优先级低于b 
        }
	    else 
		{ 
		   return 0; 
		} 
   
	default: 
	     printf("运算符错误!\n"); 
	     break; 
	} 
} 


int Operate(int j, int k, char operater) 
{ 
	switch (operater) 
	{ 
		case '+': 
			return k + j; 
		//break;  
		case '-': 
			return k - j; 
		//break; 
		case '*': 
			return k * j; 
		//break;  
		case '/':  
			return k / j; 
		//break;  
		default: printf("运算错误!\n"); 
		         break; 
	} 
} 

int calculate(int len, char *expStr) 
{ 
	//表达式异常处理,注意len <= 0要加括号 
	if ((len <= 0 ) || (expStr == NULL)) 
	{ 
		printf("表达式为空!\n"); 
	} 
	int i = 0, j = 0, k = 0; 
	std::stack<int> date; 
	std::stack<char> operate; 
	while (i < len) 
	{ 
		if ((expStr[i] >= '0') && (expStr[i] <= '9')) 
		{ 
			date.push(expStr[i] - '0'); 
			i++; 
		} 
		else if ((expStr[i] == '+') || (expStr[i] == '-') || expStr[i] == '*' || expStr[i] == '/') 
		{ 
			if (operate.empty()) 
			{ 
				operate.push(expStr[i]);
				i++; 
			} 
			else 
			{ 
				//与栈顶运算符判断优先级 
				switch (Precede(expStr[i], operate.top())) 
				{ 
				  case 0: 
				  case -1: //栈顶运算符优先级高 
					   j = date.top(); 
					   date.pop(); 
					   k = date.top(); 
					   date.pop(); 
					   date.push(Operate(j, k , operate.top()));
					   operate.pop(); 
					   //i++;  
					   break; 

				  case 1: //栈运算符顶优先级低 
					   operate.push(expStr[i]); 
					   i++; 
					   break; 
				  default: 
					   printf("优先级判断错误!\n");
					   break; 
				 } 
			} 
		} 
		else 
		{ 
			printf("表达式无法识别!\n");
			break; 
		}
	} 
	
	while (!operate.empty()) 
	{ 
		j = date.top(); 
		date.pop(); 
		k = date.top(); 
		date.pop(); 
		date.push(Operate(j, k , operate.top())); 
		operate.pop(); 
	} 
	
	return date.top(); 
} 

int main() 
{ 
   int len = 0; int i= 0, input_flag = 0; 
    
   while (!input_flag) 
   { 
	  printf("请输入表达式的长度:"); 
	  input_flag = scanf("%d", &len); 
	  if (!input_flag) 
	  { 
		printf("输入有误,仅可输入数字!\n"); 
	  } 
	  flushall(); 
    } 
	char *expStr = (char *)malloc(len * sizeof(char)); 
	input_flag = 0;
	
	while (!input_flag) 
	{ 
		printf("请输入表达式:"); 
		for (i = 0; i < len; i++) 
		{ 
			input_flag = scanf("%c", &expStr[i]); 
			//scanf("%c", &expStr[i]);  
			/*
			if ((i < len) && (expStr[i] == '\n')) 
			{
				printf("长度不够,请重新输入:"); 
				i = 0; 
			}
			*/ 
			if (!input_flag) 
			{ 
				printf("表达式输入有误!\n"); 
				flushall(); 
				break; 
			} 
		 } 
	 } 
	
	 printf("表达式的计算结果为:%d\n", calculate(len, expStr)); 
	 
  return 0; 
}

### C语言实现四则运算 为了创建一个能够执行加减乘除四则运算的程序,可以采用结构化的方式设计代码。下面是一个基于给定需求编写的C语言程序实例[^1]。 此程序不仅实现了基本的四则运算功能,还加入了循环机制以便用户连续使用计算器而无需重新启动程序,并通过`switch-case`语句来处理不同的算术操作[^3]。 #### 完整的C语言四则运算是这样的: ```c #include <stdio.h> int main() { printf("本计算器仅可计算两个数的四则运算,计算结果保留两位小数\n"); do { float num1, num2; char operator; // 输入第一个数字 printf("请输入第一个数字: "); scanf("%f", &num1); // 输入运算符 printf("请选择运算(+,-,*,/): "); while ((getchar()) != '\n'); // 清理缓冲区 scanf("%c", &operator); // 输入第二个数字 printf("请输入第二个数字: "); scanf("%f", &num2); switch (operator) { case '+': printf("%.2f + %.2f = %.2f\n", num1, num2, num1 + num2); break; case '-': printf("%.2f - %.2f = %.2f\n", num1, num2, num1 - num2); break; case '*': printf("%.2f * %.2f = %.2f\n", num1, num2, num1 * num2); break; case '/': if (num2 != 0) printf("%.2f / %.2f = %.2f\n", num1, num2, num1 / num2); else printf("错误:分母不能为零。\n"); break; default: printf("未知的操作符!\n"); } // 继续询问是否继续下一次计算 printf("\n按任意键继续... 或者输入 'q' 来退出.\n"); if (getchar() == 'q') break; getchar(); // 吃掉回车 } while (1); return 0; } ``` 上述代码展示了如何构建一个简易但实用的小型计算器应用程序,它支持浮点数之间的加法、减法、乘法以及除法运算,并且考虑到了除数可能为零的情况进行了异常处理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值