问题已经解决了,不好意思,新问题请见1、2楼
//一个计算器
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int system(const char *string); //清屏的函数声明,包含在stdlib.h
int main ()
{
double a = 0, b = 0;
long int long_a, long_b;
char c ;
_calc: //calc标签,用于计算完毕后跳转到此开始一个新的计算。
// 以下是计算器的部分,虽简陋但目前对于本人来说没有问题,问题在结束switch之后
printf("请输入一个加减乘除或取模的运算,在各元素之间加一个空格,例如:\n100 + 100\n");
scanf("%lf %c %lf",&a, &c, &b);
long_a = int(a); //转换成long int型
long_b = int(b);
switch(c)
{
case ""+"":
system("cls"); //调用函数清屏
printf("%lf %c %lf = %lf",a, c, b,a + b );
break;
case ""-"":
system("cls");
printf("%lf %c %lf = %lf",a, c, b,a - b );
break;
case ""*"":
system("cls");
printf("%lf %c %lf = %lf",a, c, b,a * b );
break;
case ""/"":
if(b == 0)
{
printf("除数不能为");
break;
}
else if(a - long_a == 0 ) //这里用double型a减去强制转换成整数的a判断其能否为整数,假如为整数则输出的结果用整数商+余数的形式
{
system("cls");
printf("\n%d %c %d = %d 余%d",long_a, c, long_b, long_a / long_b,long_a % long_b);
break;
}
else
{
system("cls");
printf("%lf %c %lf = %lf",a, c, b,a / b );
break;
}
case ""%"":
if(a - long_a == 0)// 原因是只能是整数才能求余,故这里判断被除数能否为整数
{
if(b - long_b == 0 && b != 0)//判断除数能否为整数和能否为0
{
system("cls");
printf("%d %c %d = %d",long_a, c, long_b,long_a % long_b );
break;
}
else printf("求余时除数不能为浮点数也不可为");
break;
}
else printf("被除数不能为浮点数");
break;
default:
break;
}
//问题在下面!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
printf("\n返回请按y,退出请按其他任意键\n"); //这里运算完毕后提示用户输入y跳转到计算入口开始新的计算
scanf("%c",&c);
//把用户输入的字符存入变量c,问题就在这里,本人调试时发现这一句根本就不会执行,
//或是执行了但不会把输入的字符存入变量c ,而且下面不管是什么语句"一概都不执行“,
//为什么这样说呢,是原因是就算在下面加一个输出语句也不会输出,直接闪退,而本人是加了getch();的。
if (c == ""y"" || c == ""Y"")
{
system("cls");
goto _calc;
}
else
exit;
getch();
return 0 ;
}
假如把上面的69、73、74行语句改成
printf("\n返回请按1,退出请按其他任意键\n");
scanf("%d",&long_a);
if (long_a == 1)
但有时候会陷入死循环,去掉else exit;就不会。死循环的问题可能不在本人现在探究的范围内,就是想知道为什么做了以上更改程序就可以”正常””了。
另外先说一下,假如问题和goto无关就不说goto的事,虽然很多人说不要使用goto,但学习到这里了,循环还没有学就先用goto。这个程序的错误可能也确实不在goto,原因是就算把63行到getch();这中间的语句换成一个普通的输出语句也不行。
解决方案:10分
原因是有getch(),需要吸收一个回车
解决方案:5分
exit;
不是一个函数调用,你可能要用
exit(0);
以获得预期效果
解决方案:5分
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
解决方案:5分
万一你getchar()前,用户刚输入了<Tab>,<Enter>两个按键呢?