编程,用来计算用户输入的四则运算表达式的值,只含加减乘除,不含括号。
实例解析:
表达式中含有加减乘除,乘除的优先级别比加减高。
我们以键盘输入-3.12 + 2*3.5/4 + 8/2 - 3*6为例来说明算法。
式子中的2*3.5/4、8/2和3*6要先算,算完之后整个表达式将只有4个数据项,剩下的问题就很简单了。为此我们可以把整个表达式分成4部分(4块),块与块之间必定是由加减号连接的,每块中间只有乘除,没有加减。
实际上,没有必要先把每块的值都计算出来,在计算表达式的过程中,每遇到一块,可以先把这一块的结果算出来,然后与前面的计算结果进行加减运算,后面块的值可以在用到的时候再计算。
具体的计算方法是:
程序开始先定义一个变量result,并初始化为0。
从头开始处理每一块:提取一个数据,如果数据后面是乘(除),则表示该块计算未结束,继续提取第二个数据并与第一个数据进行乘(除)运算,然后再看后面的运算符,如果还是’*’或’/’,则继续提取数据并进行计算……直到遇到运算符‘+’、‘-’或空字符为止。
遇到运算符‘+’、‘-’或空字符,都表示该块的计算已经结束,可以将计算结果累加到result中了。
重复上面的方法,对每一块都作这样的处理,直到表达式结束。result就是最后的结果。
程序代码:
#include "stdio.h"
#include "stdlib.h"
float get_num(char **);
int main()
{char a[80];
int sign = 1; //对于表达式中的 ‘+’,sign = 1,对于‘-’,sign = -1
float result = 0;
char *p; //用来指向要处理的字符
clrscr();
gets(a);
p = a;
if(*p == '-') { //表达式第一个字符若是‘-’
sign = -1; //存储符号
p++;
}
while(*p != 0) { //没有遇到空字符,则循环
float m; //m用来存储某块的计算结果
m = sign*get_num(&p); //get_num执行过程中,p会向后移动
while( *p == '*' || *p == '/' ){ //该循环求解某块的结果
if( *p == '*' ) {
p++;
m *= get_num(&p);
}
else {
int div;
p++;
div = get_num(&p);
if( div == 0 ) {
printf("错误!除数为0!\n");
exit(1);
}
else
m /= div;
}
}
if(*p != '+' && *p != '-' && *p != 0){
printf("错误!遇到非法字符:%c\n", *p);
exit(0);
}
result += m; //将上面计算出的某块的结果累加到result中
if(*p == '+'){
sign = 1;
p++;
}
else if(*p == '-') {
sign = -1;
p++;
}
else //遇到空字符,退出循环
break;
}
printf("The result is %f\n", result);
getch();
return 0;
}
float get_num(char **pp) //pp指向p
{float x = 0, m = 10;
if(**pp != '.' && (**pp <'0' || **pp >'9') ) {
printf("错误!运算符后面不是一个有效的数据\n");
exit(1);
}
while(**pp >= '0' && **pp <= '9') {
x = x*10 + **pp - 48;
(*pp)++;
}
if(**pp == '.') {
(*pp)++;
while(**pp >= '0' && **pp <= '9') {
x += (**pp - 48)/m;
(*pp)++;
m *= 10;
}
}
return x;
}
分享到:
相关推荐
新能源车行业报告:特斯拉Q1财报抢眼,吹响行业进击号角-0507-国海证券-21页.pdf
策略问道产业系列之云计算产业:5G科技周期下半场,进击云计算-1122-华泰证券-41页.pdf
策略问道产业系列之云计算产业:5G科技周期下半场,进击云计算-20191122-华泰证券-41页.pdf
标题中的“主要消费产业行业研究日本便利店启示录不断进击的-29页.pdf.zip”表明这是一份关于日本便利店行业的深度研究报告,包含了29页的内容,并被压缩在一个ZIP文件中。这份报告可能探讨了日本便利店业的发展模式...
西式咖啡与中式茶饮作为两大饮品文化,在全球范围内都具有深远的影响力和庞大的市场。国信证券的这篇研究报告深入分析了从西式咖啡到中式茶饮的发展趋势、行业特征以及未来投资前景。 首先,报告指出全球咖啡赛道...
电气设备行业:从消费电池看国内电池龙头竞争力,新市场,老对手;中国芯,再进击-0602-长江证券-30页.pdf
QT-计算器,类似手机计算器
c语言带括号的计算器,栈的初始化自实现,计算器实现逻辑
FullSpeed-Python-进击的Python-中文版.pdf
影视动漫行业:漫谈·国产电影的进击之路-20180427-华创证券-18页.pdf
天风证券:摩托车行业深度-大排量强势进击-“品牌出海”迈向全球市场
C 语言控制台计算器是一个简单但很实用的程序,它允许用户在命令行界面中输入算术表达式,并计算出结果。该程序通常包括以下几个主要部分: 1. **输入处理**:程序需要从控制台读取用户输入的表达式字符串。可以使用 C ...
由C语言实现的基础库,提供的功能有: 基础库 co_vec 向量数组 co_dict 字典(哈希表),内部有一个链表用于遍历,使用它可以实现lrucache co_set 集合,内部由红黑树实现。 co_list 双向链表 co_queue 循环队列 co_...
rabbitmq安装教程图片版本,主要介绍了erlang语言环境安装、rabbitmq server安装,rabbit 插件安装
标题和描述中提到的知识点可以细分为以下几个方面: 一、全球咖啡市场现状与分析 国际咖啡市场是一个极具潜力和广阔空间的赛道,2019年的收入规模已经超过4000亿美元。全球范围内诞生了诸如星巴克这样的行业巨头,...
20210603-国泰君安-通信设备及服务行业全球进击系列之二:光模块全球进击.pdf
根据提供的文件内容,以下是详细的IT知识点: 1. 药明生物概述: 药明生物是一家专注于生物药研发生产外包服务的公司,成立于2010年。该公司早期主要提供生物药研发外包服务,随着2015年从药明康德剥离以及2017年...
20210228-中信建投-万孚生物-300482-借力新冠,进击全球.pdf
5G技术的应用正在推动整个传媒行业特别是游戏产业发生翻天覆地的变化。5G技术的高速度、低延迟和广覆盖特性,为云游戏的发展提供了强有力的技术支持,使得云游戏成为5G应用中的一个亮点。以下详细解析了这一趋势所...