学switch体时遇到的有关问题
学switch体时遇到的问题
问题已经解决了,不好意思,新问题请见1、2楼
如果把上面的69、73、74行语句改成
但有时候会陷入死循环,去掉else exit;就不会。死循环的问题可能不在我现在探究的范围内,就是想知道为什么做了以上更改程序就可以"正常'了。
另外先说一下,如果问题和goto无关就不说goto的事,虽然很多人说不要使用goto,但学习到这里了,循环还没有学就先用goto。这个程序的错误可能也确实不在goto,因为就算把63行到getch();这中间的语句换成一个普通的输出语句也不行。
------解决思路----------------------
因为有getch(),需要吸收一个回车
------解决思路----------------------
不是一个函数调用,你可能要用
以获得预期效果
------解决思路----------------------
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
------解决思路----------------------
万一你getchar()前,用户刚输入了<Tab>,<Enter>两个按键呢?
问题已经解决了,不好意思,新问题请见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();这中间的语句换成一个普通的输出语句也不行。
------解决思路----------------------
因为有getch(),需要吸收一个回车
------解决思路----------------------
exit;
不是一个函数调用,你可能要用
exit(0);
以获得预期效果
------解决思路----------------------
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
------解决思路----------------------
万一你getchar()前,用户刚输入了<Tab>,<Enter>两个按键呢?