C语言实现计算器

用C语言写一个计算器 用C语言写一个计算器 用C语言写一个计算器,除了四则混合运算之外,还支持三角函数和绝对值等函数。 PS E:\Code\PL\calc> .\a.exe abs(3*5-4^2) abs(3*5-4^2)=1.000000 25-7+6*(4-5) 25-7+6*(4-5)=12.000000 文章目录用C语言写一个计算器1. 加减法运算2. 加法和乘法3. 四则混合运算4. 浮点型计算器程序5. 加入三角函数 在计算器中,至少包含两类变量,即数字和运算符。例如,如果希望实现a+b×(c− 阅读详情

运算速度是线性级,而且只用一个数组占用空间也比较少,可能需要的逻辑比较复杂。但是能够解决问题。实现了不带括号的所有加减乘除运算。

具体的思想:首先定义好3个存储数字变量,3个存储符号的变量,因为在四则运算中必须判断第2个有时候第三个符号后才能做出计算。然后判断完之后,将其计算出来。每次根据符号做出结果,最多判断3次符号。

代码可能比较多,但是速度特别快

int Get_number(char *str)
{
	int first_1 = 0;
	int second_2 = 0;
	int three_3 = 0;
	int sum = 0;
	int t = 0;
    int num_i = 0; //记录位数
	int i = 0; 
	char *sign_init = str;
	char *sign_num = sign_init; //获取数字
	char *sign_first = sign_init;  //记录第一个符号位置
	int pop_num = 0;
	char *sign_second = sign_init; //记录第二个符号位置
	char *sign_three = sign_init;
	while(*str != '\0')
	{
		
		if(*sign_first >= '0' && *sign_first <= '9')
		{
					 while(*str >= '0' && *str <= '9')
					 {
						 str++;
						 num_i++;
					 } // 一直获取数字
					 sign_first = str; // 获取符号的时候位置
					 sign_num = str;
					 sign_num--;
					 if(num_i == 1)  // 一位时候直接转换
					 {
						 pop_num = char_to_int(*sign_num);   //先化为int
						 first_1 = pop_num; 
						 
					 }else   //多位时候转换
					 {
							 for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
							{
							 pop_num = char_to_int(*sign_num);   //先化为int
							 first_1 += change_number_place(pop_num , i); 
								sign_num--;
							}	
					} 
				 num_i = 0;
				 //获取符号前面的一个数 frist_1 的到第一个数
		}

     else if(*sign_first == '+' || *sign_first == '-') // 如果是第一个为加号减号
		 {
			 
			 	 if(*sign_second >= '0' && *sign_second <= '9')
						 {
										if(!(*str >= '0' && *str <= '9'))
										 {
										
												str++;
												while(*str >= '0' && *str <= '9')
												{
												 str++;
												 num_i++;
												}
												sign_second = str ;//记录第二次
												sign_num = str;  //记录符号位置继续获取第二个数
												sign_num--;				
														 if(num_i == 1)  // 一位时候直接转换
															{
																pop_num = *sign_num - '0';   //先化为int
																second_2 = pop_num; 
											 
															}else   //多位时候转换
															{
																for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
																{
																		pop_num = char_to_int(*sign_num);   //先化为int
																		second_2 += change_number_place(pop_num , i); 
																	sign_num--;
																}	

															}
													num_i = 0;
										 }
						 }
					
				if(*sign_second == '+' || *sign_second == '-') // 如果是加号或减号,first_1就可以合并
				{
					
					if(*sign_first == '+')
					{
						first_1 = first_1 + second_2;
						second_2 = 0;
						
					}else if(*sign_first == '-')
					{
						first_1 = first_1 - second_2;
						second_2 = 0;
					}
					
					if(*sign_three >= '0' && *sign_three <= '9')
					{
						if(!(*str >= '0' && *str <= '9'))
							{
								str++; //合并后取第二个符号后面的数,也就是第三个数
							while(*str >= '0' && *str <= '9')  //取第三个数
											{
											 str++;
											 num_i++;
											}
											sign_num = str; //取第三个数
											sign_three = str;//取完数之后,指针移到了第3个数后面的那个符号
											sign_num--;				
													 if(num_i == 1)  // 一位时候直接转换
														{
															pop_num = *sign_num - '0';   //先化为int
																three_3 = pop_num; 
										 
														}else   //多位时候转换
														{
															for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
															{
																		pop_num = char_to_int(*sign_num);   //先化为int
																		three_3 += change_number_place(pop_num , i); 
																    sign_num--;
															}	

									 }
									 num_i = 0;//取完第三个数,指针移到第2个数后面的符号
							}
					}
					
					
							 if(*sign_three == '=')//如果第三位是等于号例如:1+2+3= 或 1+2-3=
							 {
			           if(*sign_second == '+')
								 {
									 sum = first_1 + three_3;
									 return sum;
								 }else if(*sign_second == '-')
								 {
									 sum = first_1 - three_3;
									 return sum;
								 }
							 }else if(*sign_three == '+' || *sign_three == '-')//如果不是等于号需要重新分配了
							 {
								 //如果第三个为加减号时候,第一个不动,其他移动
								 if(*sign_second == '+')
								 {										
									   sum = first_1 + three_3;
										 first_1 = sum; 
								     sign_first = sign_three;
								     second_2 = 0;
								     sign_second = sign_init;
								     three_3 = 0;
								     sign_three = sign_init;
									 
								 }else if(*sign_second == '-')
								 {
									   sum = first_1 - three_3;
										 first_1 = sum; 
								     sign_first = sign_three;
								     second_2 = 0;
								     sign_second = sign_init;
								     three_3 = 0;
								     sign_three = sign_init;
								 }

							 }else if(*sign_three == '*' || *sign_three == '/')
							 {
										sign_first = sign_second;
								    second_2 = three_3;
								    sign_second = sign_three; 
                    three_3 = 0;
								    sign_three = sign_init;
							 }
				}
				
				
	    else if((*sign_second == '*' || *sign_second == '/'))//如果二个符号是 * 或者 /
				{
								if(!(*str >= '0' && *str <= '9'))
								{
									      str++;//第二个符号后面的数,也就是第三个数
												while(*str >= '0' && *str <= '9')
												{
												 str++;
												 num_i++;
												}
												sign_num = str; //取第三个数
												sign_three = str;//记录第三个数后面的符号
												sign_num--;				
														 if(num_i == 1)  // 一位时候直接转换
															{
																pop_num = *sign_num - '0';   //先化为int
																	three_3 = pop_num; 
											 
															}else   //多位时候转换
															{
																for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
																{
																		pop_num = char_to_int(*sign_num);   //先化为int
																		three_3 += change_number_place(pop_num , i); 
																		sign_num--;
																}	

										 }
										 num_i = 0;//取到第三个数
								}
												
								
							 if(*sign_second == '*') //合并后面的运算 first_1 保留数据,second_2 和 three_3 合并;
							 {
								 second_2 = second_2 * three_3;
								 three_3 = 0;
								 sign_second = sign_init;
								 
							 }else if(*sign_second == '/')
							 {
								 second_2 = second_2 / three_3;
								 sign_second = sign_init;
								 three_3 = 0;
							 }
	             
							 if(*sign_three == '=') //如果第3个标记是 = 也就是 1+2*3= 或者 1+2/3= 的
							 {
			           if(*sign_first == '+')
								 {
									 sum = first_1 + second_2; //得出结果
									 return sum;
								 }else if(*sign_first == '-')
								 {
									 sum = first_1 - second_2;
									 return sum;
								 }
								 
							 }else if(*sign_three == '+' || *sign_three == '-')//如果不是等于号需要重新分配了
							 {
								
									  if(*sign_first == '+')
										{
										first_1 = first_1 + second_2;
										sign_first = sign_three;
										second_2 = 0;
										sign_second = sign_init;
										three_3 = 0;
										sign_three = sign_init;
										}else if(*sign_first == '-')
										{
										first_1 = first_1 - second_2;
										sign_first = sign_three;
										second_2 = 0;
										sign_second = sign_init;
										three_3 = 0;
										sign_three = sign_init;											
										}
								 
							 }else if(*sign_three == '*' || *sign_three == '/')
							 {
								  sign_second = sign_three;
								  three_3 = 0;
									sign_three = sign_init;
							 }
				}
				
				
				
				else if(*sign_second == '=') //如果第二位就是等于号,那就直接运算了
				{
					if(*sign_first == '+')
					{
						sum = first_1 + second_2;
						return sum;
					}else if(*sign_first == '-')
					{
						sum = first_1 - second_2;
						return sum;
					}else if(*sign_first == '*')
					{
						sum = first_1 * second_2;
						return sum;
					}else if(*sign_first == '/')
					{
						sum = first_1 / second_2;
						return sum;
					}
				}
		 }
		 else if (*sign_first == '*' || *sign_first == '/')
		 {
					 if(*sign_second >= '0' && *sign_second <= '9')
					 {
												if(!(*str >= '0' && *str <= '9'))
												 {
														 str++;
														while(*str >= '0' && *str <= '9')
														{
														 str++;
														 num_i++;
														}
														sign_second = str ;//记录第二次
														sign_num = str;  //记录符号位置继续获取第二个数
														sign_num--;				
																 if(num_i == 1)  // 一位时候直接转换
																	{
																		pop_num = *sign_num - '0';   //先化为int
																			second_2 = pop_num; 
													 
																	}else   //多位时候转换
																	{
																		for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
																		{
																									pop_num = char_to_int(*sign_num);   //先化为int
																									second_2 += change_number_place(pop_num , i); 
																			sign_num--;
																		}	

																	}
															num_i = 0;
												 }
					 }

					 
					 if(*sign_first == '*')
					 {
						 first_1 = first_1 * second_2;
						 sign_first = sign_second;
						 second_2 = 0;
						 sign_second = sign_init;
						 
						 
					 }else if(*sign_first == '/')
					 {
						 first_1 = first_1 /second_2;
						 sign_first = sign_second;
						 second_2 = 0;
						 sign_second = sign_init;
					 }
			  
		 }
		 else if(*sign_first == '=')
		 {
			 sum = first_1;
			 return sum;
		 }
	}
	
	return sum;
	
}
如何用C语言写出一个简单的计算器(简单实现) 写一个简单的计算器 阅读详情

相关推荐

用C语言实现简易版计算器

以上便是三种计算器功能的实现代码以及详细的解释,希望大家可以多动手尝试一下,同时可以尝试实现更多的功能。

Miun123的博客 3347

使用C语言构造一个简单计算器

新手入门讲解

m0_73599439的博客 1万+

C语言实现基于栈的计算器

在计算机科学中,栈是一种抽象数据类型,它是一种后进先出(LIFO, Last In First Out)的数据结构。栈的操作十分简单,主要包括以下两个:入栈(Push):将一个元素添加到栈顶。出栈(Pop):移除并返回栈顶元素。栈通常用于解决如撤销操作、括号匹配、表达式求值等需要后进先出存储的场景。接下来,我们将深入探讨栈的其他应用,如数字栈和运算符栈,以及它们在复杂计算中的运用,包括如何处理运算符优先级、如何实现一个简单的计算器,以及如何在C语言中实现栈等话题。

weixin_33240461的博客 1135

C语言实现的简易计算器

实现简易计算器,可以处理两个操作数的加减乘除和取余。 #include <cstdio> int main() { double num1,num2; char oper; printf("input:1+2 output:3\n"); printf("Enter your:\n"); scanf("%lf%c%l...

top_xxl_1的博客 6211

汽车LED驱动芯片TPS92682-Q1 SPI接口配置与调试实战指南

SPI(串行外设接口)作为一种高速、全双工的同步串行通信总线,广泛应用于微控制器与外围设备之间的数据交换。其工作原理基于主从架构,通过时钟、数据线和片选信号实现设备间的精准时序控制。在汽车电子和工业控制领域,SPI因其简单高效、易于扩展的特性,成为配置复杂电源管理芯片、传感器和存储器的关键技术。通过SPI接口,工程师能够动态调整设备参数、实时读取状态信息,并实现复杂的故障诊断与保护策略,极大地提升了系统的灵活性与可靠性。本文以汽车级双通道LED恒流驱动器TPS92682-Q1为例,深入解析如何通过SPI接口

weixin_29185493的博客 288

Amesim基础篇-元件详解-流体库管路

Amesim基础篇-元件详解-流体库管路

2201_75375391的博客 4519

使用C语言实现简单计算器

计算器是我们生活中很常用的工具,作为一个在学习编程语言的我们,也需要用代码来实现一个计算器的代码,我们就用C语言来实现一个进行计算两个数字的简单计算器:

2301_82247031的博客 1万+

ADS2019学习笔记:三、SPICE model导入

以BZX84-C33 SPICE model为例,学习如何在ADS2019中导入SPICE model。

qq_42945911的博客 6492

【编译原理】计算器实现(C语言)

【编译原理】计算器实现(C语言)题目要求简单分析(1)读文件(2)词法分析(3)语法分析(4)后缀表达式求值总结 这几天编译原理课留了个编写一个简单的计算器,要求能够检查错误并进行计算。其实也就是完成词法分析,语法分析,再完成一个后缀表达式的计算就好了。 这里找到了一个比较简单的方法,这里记录一下。 题目要求 简单分析 整个程序其实整体上大致分成四部分去做 1.读文件存储内容(这里的文本是以字符...

Electro1ux的博客 7325

中国知网文献引用导入EndNote9.X,Web of science导入endnote以及谷歌学术导入endnote图文详解,全网最细版本适用EndNote9.x,Endnote20版本

在科研中用到EndNote管理文献,遇到插入文献时,中国知网如何将参考文献导进Endnote9.x或者web of sicence,谷歌学术如何将文章,文献导入进文献管理软件EndNote的详细图文2022版本解释,全网最细的笔记教程,值得大家参考收藏学习

sakura的博客 5174

Docker网络教程(四)macvlan 网络教程

在这种网络下,Docker 宿主机在它的IP之上,允许接受多个 MAC 地址的请求,然后再将这些请求路由至对应的容器里。流通,Docker 会用它的 MAC 地址,把流量路由进你的容器里。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。),Docker使用其MAC地址将流量路由到你的容器。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。你需要 3.9 或者更高版本的 Linux 内核,4.0 以及以上的版本是更好的。如果你的设备叫别的名字,用对应的名字代替。

weixin_42445065的博客 4132

C语言实现简易计算器

怎样用C语言实现简易计算器 #include<stdio.h> int main() { int a=0,b=0; char c=0; scanf("%d %c %d",&a,&c,&b); if (b==0){printf("Divided by zero!");} else{ switch(c) { ...

WLHSDXN的博客 2万+

R语言绘图中文显示全攻略:从乱码到完美适配

本文详细解析了R语言绘图中的中文显示问题,从乱码根源到完美适配方案。通过showtext、sysfonts和extrafont等工具包的应用,提供跨平台的中文显示解决方案,涵盖ggplot2图表、PDF/PNG输出及Shiny应用等场景,助力用户高效实现R绘图中文完美呈现。

hp777的博客 257

用C语言设计计算器:实现加减乘除

方法一:通过普通方法:#include&lt;stdio.h&gt; #include&lt;windows.h&gt; int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int nul(int x, int y) { return x*y; } int drv(int x, int...

qq_41889292的博客 3万+

基于 YOLOv26 的车辆违规停车检测系统:实时监控

本文提出了一种基于YOLOv26的车辆违规停车实时检测系统。系统采用多模块架构,包括视频预处理、YOLOv26目标检测、DeepSORT目标跟踪、停车区域定义、行为分析和违规判定等功能模块。关键技术包括使用YOLOv26s模型进行车辆检测,结合DeepSORT算法实现车辆跟踪,支持多种停车区域定义方式(多边形、矩形、限时区域等)。系统通过边缘计算平台部署,实现了对道路边、禁止停车区等场景的实时监控,能够准确识别长时间停车、禁止区域停车等违规行为,并触发告警机制。实验结果表明,该系统在车辆检测准确率和违规判定

一键难忘的博客 773

YOLO模型轻量化实战:剪枝、量化与知识蒸馏三大技术落地详解

这篇文章结合我自己的实战经验,从原理、操作、效果、避坑四个方面,给大家讲清楚了YOLO模型轻量化的三大核心技术:剪枝、量化、知识蒸馏。先明确应用场景,再选择合适的技术组合,不要盲目追求极致压缩,要在“大小、速度、精度”之间找平衡。实战才是最好的学习方式——大家可以先拿自己的数据集试试剪枝和量化,感受一下效果,有问题可以在评论区留言。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 592

用C语言实现简单的计算器

功能介绍 用C语言实现整形简单的加减乘除操作 代码实现 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { while (1) { double x = 0, y = 0, ret = 0;//定义运算量以及结果 char operator;/...

weixin_44032272的博客 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

用C语言实现一个简易计算器

支持四则运算:加法、减法、乘法、除法。用户输入两个数字和一个运算符,程序根据运算符进行计算并输出结果。错误处理:处理非法输入和除以零的情况。程序将基于命令行输入,用户输入运算符和数字,程序实时计算并输出结果。通过本文,我们实现了一个简易的C语言计算器,支持加法、减法、乘法、除法等基础运算,并进行了错误处理和用户交互优化。通过这个项目,大家不仅可以熟练掌握基本的输入输出、条件判断、循环控制等编程基础,还能够深入了解如何在实际项目中使用函数、处理复杂的用户交互。

2401_82808034的博客 3243

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言实现简单计算器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

一方通行ACC的博客 9061

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

用c语言实现大数计算器,C语言实现简单的计算器

本文实例为大家分享了C语言实现简单计算器的具体代码,供大家参考,具体内容如下描述:简单的实现四则运算1.switch法#includevoid menu()//菜单函数{printf("************************************\n");printf("***** 1.add 2.sub *****\n");printf("***** 3.mul 4.di...

weixin_42515364的博客 780
上一篇: 查验身份证
下一篇: 串口通信
EncodedStar
博客等级 码龄10年 2614粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值