简易计算器(C语言实现)

article/2025/11/7 18:46:48

算法核心:

一般表达式都采用的中缀表达式,而中缀表达式不仅要依赖运算符优先级,还要处理括号。所以,对于中缀表达式,一般是先将其化作后缀表达式,在后缀表达式中只有操作符和运算符,而且越放在前面的运算符越先执行。

算法步骤:

1.将算术表达式转换为后缀表达式。先设置两个数组,一个是用于存放后缀表达式的res[]数组,另一个是用于当作栈使用用于存放运算符的Stack[]数组,每取一个字符:
(1)当遇到运算符时:
a.若该运算符的优先级比目前Stack[]栈顶的运算符高时,直接入栈;
b.若运算符的优先级没有Stack[]栈顶的运算符高时,则不断出栈,直到该运算符优先级比目前Stack[]栈顶的运算符高为止,对于出栈的字符都存于res[]数组。
(2)当遇到括号字符时:
a.若为左括号,则直接入栈;
b.若为右括号,则不断出栈,并将出栈的符号存于res[]中,直到出栈符号为左括号。
(3)当遇到数字字符时,则直接存于res[]数组。
最后,将栈中的所有字符依次出栈到res[]数组中去。
2.对得到的后缀表达式求值。依次从res[]的左到右处理字符串,每取一个字符:
(1)当字符为数字字符时,则进行入栈保存;
(2)当字符为运算符时,则进行出栈两次的操作,将出栈得到的两个数字进行相应的运算,并将结果进行入栈。
直到所有字符取完为止。

注意:(1)在res[]数组中,为了防止两个数字混淆在一起,会在两个数字中间加一个‘#’,如何保证每两个数之间都有‘#’呢?可以利用每两个数字之间一定有运算符的特点,每遇到一个运算符,就先在res[]中存一个‘#’;
(2)在对运算符设置优先级时要仔细,‘(’的优先级应该是最低的。

实例以及代码

char Stack[100]; //当作一个栈使用,存储运算符
int top=-1,k;
int rank[100];  
//对运算符优先级进行量化
void InitialRank(){rank['(']=0;rank['+']=1;rank['-']=1;rank['*']=2;rank['/']=2;
}
//出栈入栈运算符
void Push(char a){top++;Stack[top]=a;
}char Pop(){char ch;ch=Stack[top];top--;return ch;
}
//接收输入数据
int Input(char c[]){int i=0;char ch;printf("简易计算器\n");printf("请输入表达式:");ch=getchar();while(ch!='\n'){c[i++]=ch;ch=getchar();}return i;
}
//转换为后缀表达式
void PostExpression(char c[],int n,char res[]){int i;char ch;for(i=0;i<n;i++) //遍历整个中缀表达式{if(c[i]=='(') //‘(’直接入栈Push(c[i]);else if(c[i]==')') //')'不断出栈,直到遇到‘(’{ch=Pop();while(ch!='('){res[k++]=ch;ch=Pop();}}	else if(c[i]>='0'&&c[i]<='9')res[k++]=c[i];else {res[k++]='#';while(top>-1&&rank[c[i]]<=rank[Stack[top]])res[k++]=Pop();Push(c[i]);}}while(top>-1)res[k++]=Pop();
}
//后缀表达式求值
void Operation(char res[]){int i=0;int t[2],n=-1;while(i<k){if(res[i]>='0'&&res[i]<='9') //数字字符转数字{n++;t[n]=res[i]-48;i++;while(res[i]>='0'&&res[i]<='9'){t[n]=t[n]*10+res[i]-48;i++;}}else if(res[i]=='#')i++;else{switch(res[i]) //根据运算符进行运算{case '+':  t[n-1]=t[n]+t[n-1]; n--;break;case '-':  t[n-1]=t[n-1]-t[n]; n--;break;case '*':  t[n-1]=t[n]*t[n-1]; n--;break;case '/':  t[n-1]=t[n-1]/t[n]; n--;break;}i++;}}printf("运行结果为:%d",t[n]);
}
int main(){char c[20],res[20];int n;n=Input(c);InitialRank();PostExpression(c,n,res);Operation(res);return 0;
}

运行结果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Bfrg8BKe.shtml

相关文章

如何用C语言写出一个简单的计算器(简单实现)

计算器的要求&#xff1a; 1.能够对整数进行加减乘除运算 2.能够重复运算 3.能够显示错误 实现1&#xff1a; // //写一个计算器 //整数的加、减、乘、除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…

C语言写的一个简单的计算器

大学的第一学期就这样结束了。前阵子临近放假&#xff0c;不知道该干嘛&#xff0c;就分别用java和C语言写了两个东西。java写了个文件查找的程序。C语言写了个简易的计算器。至于为什么写计算器~因为刚学C语言的时候&#xff0c;还没摸过VC&#xff0c;还没碰过编译器就看了几…

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

计算器可实现加减乘除的功能 首先写一个简单都菜单函数menu: void menu() {printf("*******************************************\n");printf("******1.add 2. sub *********\n");printf("******3.mul 4.div *****…

C语言实现简单的计算器(C语言入门1)

程序介绍 本程序是一个简易的计算器&#xff08;支持小数运算&#xff09;&#xff0c;计算能力是四则运算&#xff08;加减乘除&#xff09;。需要的知识内容&#xff1a;函数&#xff0c;选择语句&#xff0c;循环语句。 源码展示 #include <stdio.h> //加法模块 do…

C语言实现简易计算器

通过C语言实现一个简易的计算器 计算器可实现加减乘除等一系列运算 方法一&#xff1a; 1.程序总体使用switch语句实现多分支选择 switch (input) {case 1:printf("请输入两个操作数\n");scanf("%d%d", &x, &y);Add(x, y); break;case 2:print…

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

用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器的方法&#xff1a; # include <stdio.h>int main() {char operator;double firstNumber,secondNumber;printf("输入操作符 (, -, *,/): ");scanf("%c", &operator);printf("输…

用C语言写一个计算器

用C语言写一个计算器&#xff0c;除了四则混合运算之外&#xff0c;还支持三角函数和绝对值等函数。 PS E:\Code\PL\calc> .\a.exe abs(3*5-4^2) abs(3*5-4^2)1.000000 25-76*(4-5) 25-76*(4-5)12.000000文章目录 1. 加减法运算2. 加法和乘法3. 四则混合运算4. 浮点型…

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

本节我们用小学生知识来制作一个简单的计算器&#xff0c;可以运算加&#xff0c;减&#xff0c;乘&#xff0c;除&#xff0c;以及余数的运算。 在这节代码中用到switch语句&#xff0c;因为要输入运算符&#xff0c;所以注意%c的对应 接下来上代码&#xff1a; #include &…

用c语言编写一个简易计算器

更高级的计算器移步http://t.csdn.cn/E2rVG 文章目录 前言一、原理是什么&#xff1f;二、使用步骤 1.代码总结 前言 利用C语言编写一个能够进行简单加减乘除的计算器 一、原理是什么&#xff1f; 利用C语言自带算法&#xff0c;进行简单的逻辑运算 二、使用步骤 1.代码 …

【C语言】计算器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5e;2…

通信行业研究宝典

文章大纲 哑铃型布局&#xff0c;从供应链、产业链到场景链端-智能硬件&#xff1a;万亿大市场&#xff0c;小米重兵布局管-物联网核心基础设施&#xff0c;小米重点布局芯片、模组、小基站云-应用服务布局&#xff1a;布局向家、车、天场景延伸&#xff0c;文娱迎来新增长 通信…

HTTP RPC Dubbo hsf Spring-cloud 图解比较

前言 HSF是一个分布式的远程服务调用框架&#xff0c;其实我更喜欢把分布式几个字去掉&#xff0c;因为HSF本身并不是一个单独的服务&#xff08;指一个进程&#xff09;&#xff0c;他是附属在你的应用里的一个组件&#xff0c;一个RPC组件(远程过程调用——Remote Procedure…

第五章:产品管理

本章索引&#xff1a; [第五章&#xff1a;产品管理(1) – 产品管理介绍] [第五章&#xff1a;产品管理(2) – 需求管理方法] [第五章&#xff1a;产品管理(3) – 目标管理 ] [第五章&#xff1a;产品管理(4) – 团队沟通] [第五章&#xff1a;产品管理(5) – 团队协同] …

5G时代,产业互联网新生态正在加速形成。

转自:微点阅读(www.weidianyuedu.com)微点阅读 - 范文大全 - 免费学习网站 导 读 回顾整个移动通信发展史,有人说2G时代发短信是最时髦的通信方式,3G时代微信兴起,4G时代手机把衣食住行都“管起来”。 到了5G时代,已经突破传统通信技术人与人之间点对点的通信模式,大…

[已授权] 互联网定位技术小谈

​ 诚邀阿里云先知社区邀请&#xff0c;不胜感激&#xff01;今日小编在此为大家介绍一下互联网中所应用的定位技术。互联网的发展日新月异&#xff0c;技术迭代很快&#xff0c;各行各业的智慧在互联网这片蓝天下碰撞结晶&#xff0c;造福大众。今天要讲述的集中定位方式&…

5G承载网,到底有哪些关键技术?

戳蓝字“CSDN云计算”关注我们哦&#xff01; 作者 | 小枣君 来源 | 鲜枣课堂 之前小枣君给大家介绍了5G承载网的基本知识&#xff08;链接&#xff1a;5G承载网到底有什么不同&#xff1f;&#xff09;。今天&#xff0c;我们再来看看5G承载网中的常见关键技术。 首先&#x…

IDC报告称中国成为全球第二大公有云 IaaS 市场;腾讯牵手宝马在华设云计算中心;华为5G折叠屏手机通过入网许可:8月上市……...

关注并标星星CSDN云计算 极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01; 每周三次&#xff0c;打卡即read 更快、更全了解泛云圈精彩news go go go 海盗船已推出第一款32G…

中台架构的未来在哪—开放式架构

春节前应“技术琐话”之约&#xff0c;试图写一篇讨论架构方法论的文章&#xff0c;然而动笔之后&#xff0c;才发现&#xff0c;自己似乎陷入了Frederick P. Brooks先生在《设计原本》一书中指出的问题&#xff1a;“设计中最困难的部分在于决定要设计什么”。 2020年1月18日…

大多数人不知道的企业数据分析能力金字塔,你处在哪一级?

写这篇文章来源于两个故事&#xff1a; 故事一&#xff1a;一位在互联网行业做数据库架构多年的朋友一起吃饭&#xff0c;问起我现在在做什么&#xff0c;我说自己在做医疗方面的数据分析&#xff0c;朋友笑&#xff0c;说&#xff1a;你有很多资源啊&#xff0c;只要你能拿到…

美团 大规模商品知识图谱的构建与应用

作者 | 曹雪智博士 美团 技术专家 来源 | DataFunTalk 在互联网新零售的大背景下&#xff0c;商品知识图谱作为新零售行业数字化的基石&#xff0c;提供了对于商品相关内容的立体化、智能化、常识化的理解&#xff0c;对上层业务的落地起到了至关重要的作用。 相比于美团大脑中…