求助: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');
} 展开
#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');
} 展开
展开全部
假设你要输入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时候的回车,这样,程序就对了。已经调试过了,可用。
我按你的思想对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时候的回车,这样,程序就对了。已经调试过了,可用。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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究竟读入了哪个值,所以让你都打印出来做比较。
#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究竟读入了哪个值,所以让你都打印出来做比较。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主,先说你的问题:
执行printf("继续吗?y继续,n退出!!!\n");,后程序还会输出个换行字符(\n),正好把这个字符赋给了变量q,q打印出来时看不到的,
你可以把程序这样该下:
printf("继续吗?y继续,n退出!!!\n");
q=getchar();
while(q=='\n')
q=getchar();
我试了这样OK了, 输入Y后也会报错,这个也是同样的问题。
执行printf("继续吗?y继续,n退出!!!\n");,后程序还会输出个换行字符(\n),正好把这个字符赋给了变量q,q打印出来时看不到的,
你可以把程序这样该下:
printf("继续吗?y继续,n退出!!!\n");
q=getchar();
while(q=='\n')
q=getchar();
我试了这样OK了, 输入Y后也会报错,这个也是同样的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
while(le!='j'||le!='k'||le!='x');
应该改为while(le!='j'&&le!='k'&&le!='x');
应该改为while(le!='j'&&le!='k'&&le!='x');
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询