EXOChanBaekyy 2022-03-23 13:19 采纳率: 50%
浏览 26
已结题

当执行完第一个scanf语句后,第二个scanf语句像失效一样,直接跳到了第三个scanf语句,导致x2无法完成初始化,哪里错了呀

问题遇到的现象和发生背景

当执行完第一个scanf语句后,第二个scanf语句像失效一样,直接跳到了第三个scanf语句,导致x2无法完成初始化,哪里错了呀

#include<stdio.h>

#include<math.h>
#define e 2.718
int main() {
int x1,;
int x2;
int x3;
char k1;
char k2;
char k3;
char k4;
double w1 = 0.3;
double w2 = 0.4;
double w3 = 0.3;
double y;
double z;
double v = 0.5;
printf("今天的天气如何?\n");
printf("A.晴天 B.阴天 C.雨天\n");
scanf("%c", &k1);
switch (k1) {
case 'A':x1 = 9;
break;
case 'B':x1 = 6;
break;
case 'C':x1 = 0;
break;
default: printf("选择有误,请重新选择\n");
}
printf("\n有没有人陪你去看电影?\n");
printf("A.有,男/女朋友 B.有,好朋友 C.有,家人 D.没有\n");
scanf("%c", &k4);
switch (k4) {
case 'A':x2 = 8;
break;
case 'B':x2 = 6;
break;
case 'C':x2 = 5;
break;
case 'D':x2 = 2;
break;
default:printf("选择有误,请重新选择\n");
}
printf("\n票价如何?\n");
printf("A.0-30 B.30-60 C.60-90 D.90以上\n");
scanf("%c", &k3);
switch (k3) {
case 'A':x3 = 10;
break;
case 'B':x3 = 8;
break;
case 'C':x3 = 2;
break;
case 'D':x3 = 0;
break;
default:printf("选择有误,请重新选择\n");
}
z = (x1w1 + x2w2 + x3*w3) / 10;
y = 1 / (1 + pow(e, -z));
printf("你去看电影的可能性为:%d\n", z);
if (z >= v)
printf("去看电影");
else
printf("不去看电影");
return 0;
}

运行结果及报错内容

img

img

  • 写回答

3条回答 默认 最新

  • 关注

    (1)在scanf读取字符后,需要加getchar()来吸收回车符,否则影响下一次输入;
    (2)因为有输入错误的设置,所以每次输入,都需要放在while循环中,否则当输入错误时,不能重新输入。
    代码修改如下:

    #include<stdio.h>
    #include<math.h>
    #define e 2.718
    int main() {
        int x1;
        int x2;
        int x3;
        char k1;
        char k2;
        char k3;
        char k4;
        double w1 = 0.3;
        double w2 = 0.4;
        double w3 = 0.3;
        double y;
        double z;
        double v = 0.5;
    
        int flag = 1; //修改  添加一个变量,用于控制while
        printf("今天的天气如何?\n");
        printf("A.晴天 B.阴天 C.雨天\n");
        while (flag) //修改,用while语句,否则当输入错误时,不能重新输入
        {
            scanf("%c", &k1);
            getchar(); //修改1,这里增加这一句
            switch (k1) {
            case 'A':x1 = 9; flag = 0;//时while结束
                break;
            case 'B':x1 = 6; flag = 0;
                break;
            case 'C':x1 = 0; flag = 0;
                break;
            default: printf("选择有误,请重新选择\n");
            }
        }
        flag = 1; //重置flag
        printf("\n有没有人陪你去看电影?\n");
        printf("A.有,男/女朋友 B.有,好朋友 C.有,家人 D.没有\n");
        while (flag)
        {
            scanf("%c", &k4);
            getchar(); //修改2
            switch (k4) {
            case 'A':x2 = 8; flag = 0;
                break;
            case 'B':x2 = 6; flag = 0;
                break;
            case 'C':x2 = 5; flag = 0;
                break;
            case 'D':x2 = 2; flag = 0;
                break;
            default:printf("选择有误,请重新选择\n");
            }
        }
        printf("\n票价如何?\n");
        printf("A.0-30 B.30-60 C.60-90 D.90以上\n");
        flag = 1;
        while (flag)
        {
            scanf("%c", &k3);
            getchar();
            switch (k3) {
            case 'A':x3 = 10; flag = 0;
                break;
            case 'B':x3 = 8; flag = 0;
                break;
            case 'C':x3 = 2; flag = 0;
                break;
            case 'D':x3 = 0; flag = 0;
                break;
            default:printf("选择有误,请重新选择\n");
            }
        }
        z = (x1*w1 + x2*w2 + x3 * w3) / 10;
        y = 1 / (1 + pow(e, -z));
        printf("你去看电影的可能性为:%d\n", z);
        if (z >= v)
            printf("去看电影");
        else
            printf("不去看电影");
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?