C语言实现计算器混合运算(含括号,加减乘除)

news2024/9/20 16:54:06

功能描述:

实现计算器混合运算基本功能,包括:( )、+、-、*、/。

功能很简单,但实现起来还是有一定逻辑难度,因为,混合运算需要考虑优先级。

优先级最高的为:()

其次,*、/

最后,+、-

所以在每次运算时,需要排查,先计算优先级高的部分。

为了便于编程,输入的混合表达式,都采用字符串形式,便于处理,不然数值输入更难以处理,区分优先级计算。最后的结果以浮点型输出。

代码如下:

主函数:

void main()
{
	char str[100] = "";
	gets(str);
	printf("result = %f\n",calc(charProcess(str)));	
} 

计算函数:

double calc(char * str)
{
	int i,j=0,k=0,l=0;
	char op[100] = "";//符号字符串 
	char aq[100] = "";//数字字符串 
	double num[100] = {0};//数字 
	double res=0;//结果 
	for(i=0;str[i]!='\0';i++)
	{
		if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
		{
			aq[j++]=str[i];
		}//将输入的字符串中的数字提取出来 
		else
		{ 
			num[l++]=atof(aq);//数字存入double类型 
			memset(aq,0,sizeof(aq));//清空aq 
			op[k++]=str[i];//符号存入op 
			j=0;
		}
	}
	num[l++]=atof(aq);
	op[k]='\0';
	//puts(op);
	//for(i=0;num[i]!='\0';i++)
	//{
	//	printf("%.2lf\t",num[i]);
	//}
	//printf("\n");
	for(i=0;op[i]!='\0';i++)
	{
		if(op[i]=='*')
		{
			for(j=i;op[j]!='\0';j++) 
			{
				op[j]=op[j+1];//符号递进 
			}
			num[i]=num[i]*num[i+1];
			for(j=i+1;num[j]!='\0';j++)
			{
				num[j]=num[j+1];//数字递进 
			}
			i--; //符号前进i要退一 
		}//乘法运算 
		if(op[i]=='/')
		{
			for(j=i;op[j]!='\0';j++) 
			{
				op[j]=op[j+1];
			}
			num[i]=num[i]/num[i+1];
			for(j=i+1;num[j]!='\0';j++)
			{
				num[j]=num[j+1];
			}
			i--;
		}//除法运算 
	}
	res=num[0];
	for(i=0;op[i]!='\0';i++)
	{
		if(op[i]=='+')
		{
			res=res+num[i+1];
		}
		if(op[i]=='-')
		{
			res=res-num[i+1];//进行加减运算 
		}
	}
	//printf("%.2lf\n",res);		//	输出结果
	return res;
}

核心子函数:

/****************************************************
***函数名称:char* charProcess(char str[])
***函数参数:char* charProcess(char str[])    输入字符串,返回值为结果
***函数功能:判断混合运算中是否有括号(),如没有不做任何处理,
***          如有则先将括号中内容处理完后再进行混合运算
***
***
***
****************************************************/
char* charProcess(char str[])		//	
{
	char flag = 0;
	char strTemp[20] = "";
	char strTemp2[20] = "";
	char strTemp3[100] = "-";
	char strTempDes[20] = "";
	char strResult[100] = "";
	char flagChar = 0;
	char flagChar2 = 0;
	int i = 0;	//	循环变量
	int j = 0;
	int k = 0;
	int n = 0;
	int cnt = 0;
	int index = 0;
	int index1 = 0;		//	记录(出现的位置(坐标)
	int index2 = 0;		//	记录)出现的位置(坐标)
	
	for(i = 0; i<(int)strlen(str); i++)
	{
		if('(' == str[i])
		{
			cnt++;
			flag++;
		}
	}
	printf("cnt = %d\n",cnt);
	if(flag >= 1)
	{
		for(i=0; i<cnt; i++)
		{
			for(j = 0; j<(int)strlen(str); j++)
			{
				if('(' == str[j])
				{
					index1 = j;		//	( 出现的位置记录   取最后一个
				}
			}
			for(j = 0; j<(int)strlen(str); j++)
			{
				if(')' == str[j])
				{
					index2 = j;		//	) 出现的位置记录   取最后一个
					if(index2>index1)
					{
						break;
					}
				}
			}
			for(k = index1+1; k<index2;k++)
			{
				strTemp[n] = str[k];
				n++;
			}
			strTemp[n] = '\0';
			n = 0;
			sprintf(strTemp2,"%.2f",calc(strTemp));
			puts(strTemp2);
			for(k = index1; k<=index2;k++)
			{
				strTempDes[n] = str[k];
				n++;
			}
			strTempDes[n] = '\0';
			n = 0;
			str_replace(strResult,str,strTempDes,strTemp2);
			strcpy(str,strResult);
			puts(str);
			memset(strTemp,0,sizeof(strTemp));
			memset(strTempDes,0,sizeof(strTempDes));
			memset(strTemp2,0,sizeof(strTemp2));
			memset(strResult,0,sizeof(strResult));
		}

		/// 增加处理
		str_replace(strResult,str,"+-","-");
		strcpy(str,strResult);
		str_replace(strResult,str,"--","+");
		strcpy(str,strResult);
		
		for(i=0;i<(int)strlen(str)-1;i++)
		{
			if('*' == str[i]  && '-' == str[i+1])
			{
				flagChar2 = 1;
				index = i;
				for(j=index;j>=0;j--)
				{
					if('+' == str[j])
					{
						str[j] = '-';
						break;
					}
					if('-' == str[j])
					{
						str[j] = '+';
						break;
					}
				}
				continue;
			}
			if('/' == str[i]  && '-' == str[i+1])
			{
				flagChar2 = 1;
				index = i;
				for(j=index;j>=0;j--)
				{
					if('+' == str[j])
					{
						str[j] = '-';
						break;
					}
					if('-' == str[j])
					{
						str[j] = '+';
						break;
					}
				}
				continue;
			}
		}

		for(i=0;i<(int)strlen(str)-1;i++)
		{
			if('*' == str[i]  && '-' == str[i+1])
			{
				index = i;
				for(j=index;j>=0;j--)
				{
					if('+' == str[j])
					{
						flagChar++;
					}
					if('-' == str[j])
					{
						flagChar++;
					}
				}
				break;
			}
			if('/' == str[i]  && '-' == str[i+1])
			{
				index = i;
				for(j=index;j>=0;j--)
				{
					if('+' == str[j])
					{
						flagChar++;
					}
					if('-' == str[j])
					{
						flagChar++;
					}
				}
				break;
			}
		}
		if(0 == flagChar && 0 != flagChar2)
		{
			strcat(strTemp3,str);
			strcpy(str,strTemp3);
		}
		str_replace(strResult,str,"*-","*");
		strcpy(str,strResult);
		str_replace(strResult,str,"/-","/");
		strcpy(str,strResult);
		puts(str);
		return str;		//	输入字符串有括号
	}
	else
	{
		return str;		//	字符串中没有括号
	}
}

运行效果:

代码如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW干涉仪测向系统

开发了一套基于LabVIEW的软件系统&#xff0c;结合硬件设备&#xff0c;构建一个干涉仪测向实验教学平台。该平台应用于信号处理课程&#xff0c;帮助学生将理论知识与实际应用相结合&#xff0c;深化对信号处理核心概念的理解和应用。 项目背景&#xff1a; 当前信号处理教学…

基于Wireshark和TiWsPC(Wireshark Packet Converter)的Zigbee抓包

前言 介绍几种Zigbee抓包方式&#xff1a; 1. Ubiqua 使用教程网上非常多也非常清晰&#xff1b; 但是Ubiqua是收费软件&#xff0c;较贵&#xff1b; 我安装过了&#xff0c;费好多事&#xff0c;没安装成功。 2. Killerbee套件 https://github.com/riverloopsec/killerbe…

TB作品】51单片机 Proteus仿真 51单片机SPI显示OLED字符驱动

// GND 电源地 // VCC 接5V或3.3v电源 // D0 P1^4&#xff08;SCL&#xff09; // D1 P1^3&#xff08;SDA&#xff09; // RES 接P12 // DC 接P11 // CS 接P10 OLED显示接口与控制实验报告 背景 OLED&#xff08;有机发光二极管&#xff09;显示器由于其高对比度、低功耗和…

【论文通读】RuleR: Improving LLM Controllability by Rule-based Data Recycling

RuleR: Improving LLM Controllability by Rule-based Data Recycling 前言AbstractMotivationSolutionMethodExperimentsConclusion 前言 一篇关于提升LLMs输出可控性的短文&#xff0c;对SFT数据以规则的方式进行增强&#xff0c;从而提升SFT数据的质量&#xff0c;进而间接帮…

关于模拟数字模块认知

工业上常见信号分类 PLC控制系统主要是电信号 电信号分为数字信号和模拟信号 PLC系统中有数字量模块DO/DI&#xff0c;模拟量AO/AI。&#xff08;O为输出&#xff0c;I为输入&#xff09; 在模块应用中&#xff0c;注意前连接器要和冷压端子相匹配。前连接器可理解为接插件&am…

Go:hello world

开启转职->Go开发工程师 下面是我的第一个go的程序 在上面的程序介绍&#xff1a; 1、package main 第一行代码package main定义了包名。必须在源文件中非注释的第一行指明这个文件属于哪个包&#xff0c;如&#xff1a;package main。package main表示一个可独立执行的程…

用HttpURLConnection复现http响应码405

目录 使用GET方法&#xff0c;访问GET接口&#xff0c;服务端返回405使用GET方法&#xff0c;访问POST接口&#xff0c;服务端返回405使用POST方法&#xff0c;访问GET接口&#xff0c;服务端返回405 使用GET方法&#xff0c;访问GET接口&#xff0c;服务端返回405 发生场景&a…

Polkadot(DOT)即将爆雷?治理无能还歧视亚洲!资金将在两年内耗尽!是下一个FTX吗?

近期&#xff0c;关于Polkadot(DOT)生态圈的一系列负面消息引发了业界和投资者的广泛关注。从高昂的营销开支、缺乏实际业务亮点&#xff0c;再到治理问题和种族歧视指控&#xff0c;Polkadot似乎正面临着严峻的危机。业内人士警告&#xff0c;Polkadot的财政状况堪忧&#xff…

【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在时间序列分析中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 自回归模型1.2.2 移动平均模型1.2.3 长短期记忆网络1.2.4 卷积神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 A…

简介空间复杂度

我们承接上一篇博客。我们写了时间复杂度之后&#xff0c;我们就要来介绍一下另一个相关复杂度了。空间复杂度。我觉得大家应该对空间复杂度认识可能比较少一些。我就是这样&#xff0c;我很少看见题目中有明确要求过空间复杂度的。但确实有这个是我们不可忽视的&#xff0c;所…

el-date-picker 设置默认值为当前日期

this.listQuery.Date new Date().toISOString().substr(0, 10); <el-date-picker v-model"listQuery.Date" format"yyyy-MM-dd" value-format"yyyy-MM-dd" type"date" placeholder"选择日期" change"getList()&qu…

电源纹波相关

什么是纹波&#xff1f;什么是噪声&#xff1f; 这种叠加在直流稳定量上的交流分量就称为纹波。 纹波的危害 电源纹波能影响设备性能和稳定性 纹波会导致电器上产生谐波&#xff0c;降低电源的使用效率&#xff1b; 高频电源纹波可能会产生浪涌电压或电流&#xff0c;影响设…

【解决方案】笔记本电脑屏幕亮度调节失效(Dell G15 5510 使用Fn调节)

目前解决方案&#xff1a;使用驱动总裁&#xff08;其他的驱动安装软件应该也可以&#xff0c;个人觉得这个好用&#xff09;&#xff0c;更新显卡驱动即可。如图所示本人更新了Intel UHD Graphics核显驱动&#xff0c;功能回复正常。 使用Fn快捷键调节亮度如图所示&#xff0…

Zabbix 的部署和自定义监控内容

前言 一个完整的项目的业务架构包括 客户端 -> 防火墙 -> 负载均衡层&#xff08;四层、七层 LVS/HAProxy/nginx&#xff09; -> Web缓存/应用层&#xff08;nginx、tomcat&#xff09; -> 业务逻辑层(php/java动态应用服务) -> 数据缓存/持久层&#xff08;r…

使用AOP思想实现开闭原则下的流水日志输出

主要实现思想&#xff1a; 通过实现Convert接口来抽取公共组件&#xff0c;获取想要的标准模型。 现在有两个订单场景&#xff0c;一个保存订单&#xff0c;一个为更新订单。构造如下的服务类&#xff1a; import org.springframework.stereotype.Service;Service public clas…

VSCode神仙插件——CodeSnap (好看的代码截图)

1 安装 2 使用 选中要截图的代码,右键 此时右侧会出现代码截图的预览图 如果要将截图保存到本地,则点击上图红色框中的图标 也可以点击下面截的图,CtrlC复制,然后就可以CtrlV粘贴到其他应用程序里了

Pycharm python解释器 unsupported python 3.1 解决

Pycharm 环境 unsupported python 3.1解决 1. 问题重现2. 原因分析3. 解决方法 1. 问题重现 之前使用Pycharm 2024.1.1的时候&#xff0c;环境配置的Python 3.11.9&#xff0c;现在改成使用Pycharm 2020.2.2&#xff0c;结果Python解释器显示“unsupported python 3.1”&#…

GIT 使用相关技巧记录

目录 1、commit 用户信息变更 全局用户信息&#xff08;没有特殊配置的情况下默认直接用全局信息&#xff09; 特定仓库用户信息&#xff08;只针对于当前项目&#xff09; 方法一&#xff1a;修改config文件 方法二&#xff1a;命令方式 2、idea同一代码推向多个远端仓库…

如何在Ubuntu环境下使用加速器配置Docker环境

一、安装并打开加速器 这个要根据每个加速器的情况来安装并打开&#xff0c;一般是会开放一个代理端口&#xff0c;比如1087 二、安装Docker https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script 三、配置Docker使用加速器 3.1 修改配置…

搜索广告召回技术在美团的实践

内容整理自美团技术沙龙第81期《美团在广告算法领域的探索及实践》&#xff08;B站视频&#xff09;。本文首先介绍了美团搜索广告的三个阶段&#xff1a;多策略关键词挖掘、分层召回体系、生成式召回&#xff1b;然后重点介绍了生成式关键词召回、多模态生成式向量召回、生成式…