问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言编的计算器,运行不正常,求修改

发布网友 发布时间:2024-10-13 14:31

我来回答

3个回答

热心网友 时间:2024-10-24 05:53

基本思路OK。

对于连加、连乘处理不对,每次计算后还要循环,不是直接跳出。去了break,应该对了。



#include <stdlib.h>
#include <math.h>

int mid(void);
int high(void);

char wm;
void match(char expectedwm) /*对当前的标志进行匹配*/
{
if (wm == expectedwm) wm = getchar(); /*匹配成功,获取下一个标志*/
else
{
printf("cannot match\n");
exit(1); /*匹配不成功,退出程序*/
}
}
int low(void)/*用于计算表达式中级别最低的运算*/
{
int result = mid(); /*计算比加减运算优先级别高的部分*/
while ((wm == '+') || (wm == '-'))
if (wm == '+')
{
match('+');     /*进行加法运算*/
result += mid();

}
else if (wm == '-')
{
match('-');    /*进行减法运算*/
result -= mid();

}
return result;
}
int mid(void)
{
int div;
int result = high();
while ((wm == '*') || (wm == '/'))
if (wm == '*')
{
match('*');
result *= high();

}
else if (wm == '/')
{
match('/');
div = high();
if (div == 0)
{
printf("除数为0.\n");
exit(1);
}
result /= div;

}
return result;
}
int high(void)/*用于计算表达式中级别最高的运算,即带()的运算*/
{
int result;
if (wm == '(') /*带有括号的运算*/
{
match('(');
result = low();/*递归计算表达式*/
match(')');
}
else if (wm >= '0'&&wm <= '9') /*实际的数字*/
{
ungetc(wm, stdin); /*将读入的字符退还给输入流,为读取整个数*/
scanf("%d", &result); /*读出数字*/
wm = getchar();  /*读出当前的标志*/
}
else
{
printf("The input has unexpected char\n"); /*不是括号也不是数字*/
exit(1);
}
return result;
}

int main()
{
int result;  /*运算的结果*/
printf("*****************************************\n");
printf("**Welcome to use this simple calculator**\n");
printf("**Please input a multinomial like      **\n");
printf("**                    6-3*(5-1)/2+14/7 **\n");
printf("*****************************************\n");
wm = getchar(); /*载入第一个符号*/
result = low(); /*进行计算*/
if (wm == '\n') /* 是否一行结束 */
printf("The answer is : %d\n", result);
else
{
printf("Unexpected char!");
exit(1); /* 出现了例外的字符 */
}
scanf("%d", &result);
return 0;
}

热心网友 时间:2024-10-24 05:54

#include <stdio.h>
#include<math.h>
#include <stdlib.h> //使用exit 要包含它
char wm;
int mid(void); //函数先声明在使用(如果不知道先后顺序)
void match( char expectedwm);
int low( void );
int high( void );

void match( char expectedwm) /*对当前的标志进行匹配*/
{
if( wm == expectedwm ) wm = getchar(); /*匹配成功,获取下一个标志*/
else
{
printf("cannot match\n");
exit(1); /*匹配不成功,退出程序*/
}
}
int low( void )/*用于计算表达式中级别最低的运算*/
{
int result = mid(); /*计算比加减运算优先级别高的部分*/
while(( wm == '+' ) || ( wm == '-' ))
if ( wm == '+')
{
match('+'); /*进行加法运算*/
result += mid();
break;
}
else if ( wm == '-')
{
match('-'); /*进行减法运算*/
result -= mid();
break;
}
return result;
}
int mid(void)
{
int div;
int result=high();
while((wm=='*')||(wm=='/'))
if(wm=='*')
{
match('*');
result *=high();
break;
}
else if(wm=='/')
{
match('/');
div=high();
if(div==0)
{
printf("除数为0.\n");
exit(1);
}
result /=div;
break;
}
return result;
}
int high( void )/*用于计算表达式中级别最高的运算,即带()的运算*/
{
int result;
if( wm == '(' ) /*带有括号的运算*/
{
match( '(' );
result = low();/*递归计算表达式*/
match(')');
}
else if ( wm>= '0'&&wm<='9' ) /*实际的数字*/
{
ungetc( wm, stdin ); /*将读入的字符退还给输入流,为读取整个数*/
scanf( "%d", &result ); /*读出数字*/
wm = getchar(); /*读出当前的标志*/
}
else
{
printf("The input has unexpected char\n"); /*不是括号也不是数字*/
exit(1);
}
return result;
}
int main()
{
int result; /*运算的结果*/
printf("*****************************************\n");
printf("**Welcome to use this simple calculator**\n");
printf("**Please input a multinomial like **\n");
printf("** 6-3*(5-1)/2+14/7 **\n");
printf("*****************************************\n");
wm = getchar(); /*载入第一个符号*/
result = low(); /*进行计算*/
if( wm == '\n' ) /* 是否一行结束 */
printf( "The answer is : %d\n", result );
else
{
printf( "Unexpected char!");
exit(1); /* 出现了例外的字符 */
}
scanf("%d",&result);
return 0;
}追问6-3*(5-1)/2+14/7这个算式就无法运行。同级运算无法进行

追答这是你程序的逻辑问题 , 你还是自己改吧,慢慢调试

热心网友 时间:2024-10-24 05:54

还是好好看书吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在RLC电路中,谐振频率为___同期为___谐振条件为___? 电磁振荡并联 RLC振荡回路的谐振频率与振荡特性 佛手柑水培还是干放 中山市美派电器有限公司怎么样? 成都美派电器有限公司怎么样? 两条不同品牌的DDR3内存条可以一起用吗 驾驶证的牡丹卡多长时间能办下来 新衣服必须用洗衣液洗才能去甲醛吗? 梦见逛街被偷抢 2024年买什么品牌的运动男鞋比较好? CS1.6怎么跳上箱子啊?怎么架人梯啊? 我是大学生,想去贷款公司贷款 需要拿什么东西 怎么样才回给我贷款 有和信而富一样的贷款吗 请问:和中联塔吊在同一级别的还有哪几个牌子?5013和5613的一般什么价啊... 我准备投资买塔吊。。可是不知道哪种牌子的塔吊质量好?还有就是QTZ 6... ...是那种暗黄一样,可是人又懒,请问有没有简单经济实惠的美白方法... 爱动漫爱写一些文字懂一点日语的女生的第一条微博,想写个萌点可爱点的... 淘米水洗脸 有什么方法 u盘存了东西会变重吗 U盘装满了重量会增加吗? 请问,U盘里储存的东西越多会越重么? u盘中储存东西后重量会不会增加 殡仪馆工资多少一个月 前景怎么样 学习新能源汽车专业好不好呢? 庆城县驿马中学怎么样,庆阳驿马旅游景点 移动硬盘数据线接触不良? 用移动硬盘的时候,USB接触好象不是很好,断了几次,怎么知道上面的内容... iphone强制退出恢复模式要怎么做 苹果5s出现一堆英文提示是什么意思? ...美团?只要是消费的就打不开,一打开就老有一段英文,还有一段说需要设... 哪位大师帮我看看用C语言编写的“一元多项式相加”问题,运行总是出错... 沼气是甲烷吗 双立人真空泵怎么充电 初一初二没好好学什么都不会初三想学了怎么办啊 初一各科的分数,多少算不错啊,本人是太原的 【高考】志愿填报时,第一个志愿不服从分配,第二个志愿服从会不会退档... 报志愿高一分专业分语文数学不够,不服从调 剂会录取还是退档 2016年高考志愿填报,如果填报第一志愿不服从专业调剂,而分数又不够 我想染棕黄色的头发 广告费有什么 稻壳搜搜卸载 稻壳搜搜V1800445官方最新版稻壳搜搜V1800445官方最新版功能简介_百 ... 亿航WPS软件广告涵盖的范围广吗? 手机步步高e5屏多少钱 2014年8月vivoe5多少钱 步步高vivoE5 步步高vivo E5商务功能 步步高'vivoE5是不是停产了 步步高E5为什么停产了啊!烦 几月份种木棉花?