C语言基础。基本数据类型+循环+数组基础,求大神解答

Demo蓝莲花 发布于 2016/05/17 08:24
阅读 273
收藏 0
定义一个结构体用于存储学生信息,学生信息包括姓名、年龄、成绩三个值。

创建这个结构体类型的数组,接收用户输入的五位学生的信息。提供下列菜单接收用户的输入,并实现相关功能

BUG如下

代码如下:

#include<stdio.h>
struct student{
    char name[20];
    int age;
    float scores;
};

void main(){
    student data[5],temp;
    int num;
    char c;
    for(int i=0; i<5; i++){
    fflush(stdin);
    printf("请输入第%d个学生的姓名:",i+1);
    gets(data[i].name);
    printf("请输入第%d个学生你的年龄:",i+1);
    scanf("%d",&data[i].age);
    printf("请输入第%d个学生你的成绩:",i+1);
    scanf("%f",&data[i].scores);
    }
    do{    
        printf("********************************************************************************\n");
        printf("**  请选择您要访问的功能(1/2/3/0):                                         **\n");
        printf("**  1.输出全部学生信息                                                        **\n");
        printf("**  2.按分数降序输出学生信息                                                  **\n");
        printf("**  3.按年龄升序输出学生信息                                                  **\n");
        printf("**  0.退出程序                                                                **\n");
        printf("********************************************************************************\n");
        printf("请选择您要访问的功能(1/2/3/0):");
        fflush(stdin);
        scanf("%d",&num);
        switch(num){
            case 1:
                printf("输出全部学生信息如下:\n");
                for(int i=0; i<5; i++){
                    printf("第%d个学生的姓名是:%s\t年龄是:%d\t成绩是:%.1f\n",i+1,data[i].name,data[i].age,data[i].scores);
                }
                break;
            case 2:
                printf("按分数降序输出学生信息如下:\n");
                for(int i=0; i<5; i++){
                    for(int j=i+1; j<5; j++){
                        student temp;
                        if(data[i].scores < data[j].scores){
                            temp = data[i];
                            data[i] = data[j];
                            data[j] = temp;
                        }
                    }
                    printf("第%d个学生的姓名是:%s\t年龄是:%d\t成绩是:%.1f\n",i+1,data[i].name,data[i].age,data[i].scores);
                }
                break;
            case 3:
                printf("按年龄升序输出学生信息如下:\n");
                for(int i=0; i<5; i++){
                    for(int j=i+1; j<5; j++){
                        if(data[i].age < data[j].age){
                            temp = data[i];
                            data[i] = data[j];
                            data[j] = temp;
                        }
                    }
                    printf("第%d个学生的姓名是:%s\t年龄是:%d\t成绩是:%.1f\n",i+1,data[i].name,data[i].age,data[i].scores);
                }
                break;
            case 0:
                printf("您已退出程序!\n");
                break;
            default:
                printf("你的输入有误!是否继续<y/n>:\n");
                fflush(stdin);
                scanf("%s",&c);
                while( c != 'y' && c != 'n'){
                    fflush(stdin);
                    printf("你的输入有误!是否继续<y/n>:\n");
                    scanf("%s",&c);
                }
                if( c == 'n')
                    break;
        }
    }while((c == 'y' )||(num>=0 && num<4));
}

疑惑如下:

我default直到结束,有判定条件。为什么输入字符还会有case值;

多谢啦

追加:请问我这个程序要怎么完善BUG。求给代码,+解释,麻烦了!

加载中
0
xpbob
xpbob
因为你输入的是字符串,scanf接收的是一个int类型,所以这里没有重新对num赋值,你的num用完之后没有设置成一个能进入default的值,所以每次都是上一次赋值成功的值
0
烈冰
烈冰
有点怀旧的感觉
0
trayvon
trayvon
scanf("%d",&num);在c语言中这个语句是读取一个整型赋值给num,读到字符型出错,并没有赋值给num,这条语句已经完成。执行下面的语句,因为num定义在do循环之外,所以还是上一次的值。因为num是你上一次得到的正确值,所以并没有执行到default语句的条件。所以继续循环。但是输入的字符留在缓冲区,因为使用了fflush(stdin)所以可以继续输入。你可以注释掉你的do while中的fflush(stdin);语句就会发现是一个死循环。
0
SVD
SVD
VC6.0即视感
返回顶部
顶部