学switch体时遇到的问题

C语言 码拜 9年前 (2015-11-08) 997次浏览
问题已经解决了,不好意思,新问题请见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的返回值。

//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
解决方案:5分
万一你getchar()前,用户刚输入了<Tab>,<Enter>两个按键呢?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明学switch体时遇到的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)