求助:c语言计算器小程序!为何跳过执行? 求高手帮忙修改、指点! 先谢谢啦!!!

#include<stdio.h>#include<math.h>#include<stdlib.h>voidfunj();voidfunm();voidmain(){f... #include<stdio.h>
#include<math.h>
#include<stdlib.h>
void funj();
void funm();

void main()
{
funm();
}

void funj()
{
double x,y;
char t,q;

printf(" 加<a>/减<s>/乘<m>/除<d>/向上<r>/退出<x>\n");
printf("例如:计算3+5请输入:3a5即可\n");
scanf("%lf%c%lf",&x,&t,&y);
switch(t){
case 'a': printf("%.2f+%.2f=%.2f\n",x,y,x+y);break;
case 's': printf("%.2f-%.2f=%.2f\n",x,y,x-y);break;
case 'm': printf("%.2fx%.2f=%.2f\n",x,y,x*y);break;
case 'd': printf("%.2f÷%.2f=%.2f\n",x,y,x/y);break;
case 'r': {system("cls");funm();break;}
case 'x':exit(0);
default :printf("ERROR!输入有误!!!\n");
}
printf("继续吗?y继续,n退出!!!\n");
q=getchar();//为何不执行这一行?即执行以下语句!
putchar(q);
switch(q){
case 'y':{system("cls");funm();break;}
case 'n':exit(0);break;
default :printf("2ERROR!输入有误!!!\n");
}
}
void funm()
{
char le;
printf("******************计算器******************\n");
printf(" 简易型<j>/科学性<k>/退出<x>\n");
printf("******************************************\n");
printf("请输入相应字符来进行下一步操作...\n");
do{
scanf("%c",&le);
switch(le){
case 'j': {system("cls");funj();break;}
case 'k':{system("cls");printf("暂无\n");break;}
case 'x':exit(0);break;
default :printf("************************\nERROR!输入有误!!!\n请重新输入\n");
}
}
while(le!='j'||le!='k'||le!='x');

}
展开
 我来答
reneliu601
推荐于2016-10-06 · 超过24用户采纳过TA的回答
知道答主
回答量:95
采纳率:0%
帮助的人:49.1万
展开全部
假设你要输入3+5,0在你输入3a5之后,再按回车作为结束,q=getchar();不是没执行,是执行了把 回车符 赋给了 "q",所以就会判断失败。
我按你的思想对void funj()进行了修改
void funj()
{
double x,y;
char t,q,p,m;

printf(" 加<a>/减<s>/乘<m>/除<d>/向上<r>/退出<x>\n");
printf("例如:计算3+5请输入:3a5即可\n");
scanf("%lf%c%lf",&x,&t,&y);
switch(t)
{
case 'a': printf("%.2f+%.2f=%.2f\n",x,y,x+y);break;
case 's': printf("%.2f-%.2f=%.2f\n",x,y,x-y);break;
case 'm': printf("%.2fx%.2f=%.2f\n",x,y,x*y);break;
case 'd': printf("%.2f÷%.2f=%.2f\n",x,y,x/y);break;
case 'r': {system("cls");funm();break;}
case 'x':exit(0);
default :printf("ERROR!输入有误!!!\n");
}
printf("继续吗?y继续,n退出!!!\n");

p = getchar();
q = getchar();
m = getchar();
//为何不执行这一行?即执行以下语句!
putchar(q);

switch(q)
{
case 'y':{system("cls");funm();break;}
case 'n':exit(0);break;
default :printf("2ERROR!输入有误!!!\n");
}
}
多定义了两个字符,用来存放3a5输入时的回车,和输入q时候的回车,这样,程序就对了。已经调试过了,可用。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
牧念露0H
2011-08-24 · TA获得超过248个赞
知道小有建树答主
回答量:317
采纳率:0%
帮助的人:263万
展开全部
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void funj();
void funm();

void main()
{
funm();
}

void funj()
{
double x,y;
char t,q;

printf(" 加<a>/减<s>/乘<m>/除<d>/向上<r>/退出<x>\n");
printf("例如:计算3+5请输入:3a5即可\n");
scanf("%lf%c%lf",&x,&t,&y);
switch(t){
case 'a': printf("%.2f+%.2f=%.2f\n",x,y,x+y);break;
case 's': printf("%.2f-%.2f=%.2f\n",x,y,x-y);break;
case 'm': printf("%.2fx%.2f=%.2f\n",x,y,x*y);break;
case 'd': printf("%.2f÷%.2f=%.2f\n",x,y,x/y);break;
case 'r': {system("cls");funm();break;}
case 'x':exit(0);
default :printf("ERROR!输入有误!!!\n");
}
printf("继续吗?y继续,n退出!!!\n");
q=getchar();//为何不执行这一行?即执行以下语句!
//putchar(q); //先注了这一行
printf("%d\n",q); //我们用printf打印q的ascii码值
printf("'\n'=%d,'\r'=%d\n",'\n','\r'); //同时打印'\n'和'\r'的assii码值

switch(q){
case 'y':{system("cls");funm();break;}
case 'n':exit(0);break;
default :printf("2ERROR!输入有误!!!\n");
}
}
void funm()
{
char le;
printf("******************计算器******************\n");
printf(" 简易型<j>/科学性<k>/退出<x>\n");
printf("******************************************\n");
printf("请输入相应字符来进行下一步操作...\n");
do{
scanf("%c",&le);
switch(le){
case 'j': {system("cls");funj();break;}
case 'k':{system("cls");printf("暂无\n");break;}
case 'x':exit(0);break;
default :printf("************************\nERROR!输入有误!!!\n请重新输入\n");
}
}
while(le!='j'||le!='k'||le!='x');

}
注意看上面我修改的部分,注掉了一行,加了两个打印。
有没有发现q的值与'\r','\n'其中之一相等,所以很容易明白getchar(q)在我们输入3a5按回车时已经把回车即'\r','\n'之一读进去了,而回车用putchar打印是看不见的,所以问题已经解决
另外linux下回车只是'\n',windows下是'\r'和'\n'的组合,我现在手头只有linux,没法验证windows下q究竟读入了哪个值,所以让你都打印出来做比较。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友bd4cf2a31
2011-08-24 · TA获得超过332个赞
知道小有建树答主
回答量:333
采纳率:100%
帮助的人:349万
展开全部
楼主,先说你的问题:
执行printf("继续吗?y继续,n退出!!!\n");,后程序还会输出个换行字符(\n),正好把这个字符赋给了变量q,q打印出来时看不到的,
你可以把程序这样该下:
printf("继续吗?y继续,n退出!!!\n");
q=getchar();
while(q=='\n')
q=getchar();
我试了这样OK了, 输入Y后也会报错,这个也是同样的问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
七级狗
2011-08-24 · TA获得超过356个赞
知道答主
回答量:283
采纳率:0%
帮助的人:98.4万
展开全部
while(le!='j'||le!='k'||le!='x');
应该改为while(le!='j'&&le!='k'&&le!='x');
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
言语小诗
2011-08-24
知道答主
回答量:34
采纳率:0%
帮助的人:14.4万
展开全部
main的大括号,,,晕
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式