C语言初步-第37讲: 循环嵌套(大奖赛计分 )<scanf(),printf()格式控制小结>

来源:互联网 发布:成都怎么样知乎 编辑:程序博客网 时间:2024/06/05 10:38

任务和代码:

/**Copyright (c)2017 CSDN学院*All rights reserved*文件名称:main.c*作者: Osseyda完成日期:2017.9.23*版本号:v2.**问题描述:在歌手大奖赛中,有10个评委为参赛的选手打分,分数为1~10分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。*问题输出:输出该学生的平均得分*/#include <stdio.h>int main(){    int i;    double max=0,min=10,sum=0,x;    for(i=1;i<=10;i++){        printf("第%d位评委打分为:",i);        scanf("%lf",&x);        if(x>max)            max=x;        if(x<min)            min=x;        sum+=x;    }    printf("该选手平均分为:%.2f",(sum-max-min)/8);    return 0;}
运行结果:


知识点总结:

        1.max、min设定时的小技巧。

        2.scanf()可以进行输入格式控制的,比如scanf("%6d",1234); 是指整个字符长度为6,输出结果是   1234,前面俩空格,但是不能控制输入的小数点位数,如

           scanf("%6.2d",1234);

           printf()则可以控制输出小数点后的位数,比如printf("%10.3f\n",1234.56),是指整个字符长度为10,小数点后三位,不足则前面用空格补齐。

        3.scanf()内不需要”\n“,按换行键后自动停止输入,输入的时候多余的部分会放入缓存区。

        4.scanf()里的%f对应的是float,%lf对应的是double;  printf()里的%f对应的是double,%lf对应long double;

           精度小的转换成精度大的,允许。如float i; printf(%f",i);

           反之,绝对不允许。如double i;scanf(%f",i);则是错误的;

           int i;printf("%f",i) 也是错误的。


心得:

        这次把输入输出语句好好补了补,温故知新,哈哈哈哈,以后遇到新的再更新。


任务和代码:

/*问题描述:拓展为多人版,输出当前选手的最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择N:”如果输入的不是N或n,可以为下一位选手计算成绩。*问题输出:输出多个学生的成绩,每个学生都有10个评委的打分及平均分*/#include <stdio.h>int main(){    int i;    char c;    double max,min,sum,x;    do{        max=0,min=10,sum=0;        for(i=1;i<=10;i++){            printf("第%d位评委打分为:",i);            scanf("%lf",&x);            if(x>max)                max=x;            if(x<min)                min=x;            sum+=x;        }        printf("该选手平均分为:%.2f",(sum-max-min)/8);        printf("\n");        printf("请按任意键继续:");    }    while((c=getchar())!='N'&&(c=getchar())!='n');    return 0;}
运行结果:


知识点总结:

       循环的嵌套


心得:

1.在初始化 max=0,min=10,sum=0;的时候,应该在

           if(x>max)
                max=x;
            if(x<min)
                min=x;

    之前,否则很可能出错

2.自己碰到循环的嵌套的时候应该一步步来,在积木上添积木


代码和程序:

*问题描述:在前一题的基础上,增加功能,若用户输入不在0-10范围内,则立即要求重输,直到正确。*问题输出:输入1~10分外重新输入,直到正确。*/#include <stdio.h>int main(){    int i;    char c;    double max,min,sum,x;    do{        i=1;max=0,min=10,sum=0;        do{            printf("第%d位评委打分为:",i);            scanf("%lf",&x);            if(x>10||x<0)                continue;            if(x>max)                max=x;            if(x<min)                min=x;            sum+=x;            i++;        }        while(i<=10);        printf("该选手平均分为:%.2f",(sum-max-min)/8);        printf("\n");        printf("请按任意键继续:");    }    while((c=getchar())!='N'&&(c=getchar())!='n');    return 0;}

运行结果:


知识点总结:

        if() break; if() continue;语句在循环语句中的使用。

        break回到循环体之外,continue回到循环体之前。


心得:

       1.在for循环体中使用continue;变量仍+1;

       2.使用do() while();或while();语句可以避免上述问题,但在变量赋值的时候,不注意变量的位置,很容易出错。

     

*注:上述两段代码有两处错误

         1.缺少语句fflush(stdin); //将输入缓冲清空,否则getchar()会读入之前录入中的回车等符号

         2.while((c=getchar())!='N'&&(c=getchar())!='n');这条语句有错误,详细如下:

            while((c=getchar())!='n'&&(c=getchar())!='N');
            此时按n可以退出,按N不可退出;

            换成while((c=getchar())!='N'&&(c=getchar())!='n');
            此时按N可以退出,按n不可退出

            换成c=getchar();放在fflush(stdin);之后
            while(c!='n'&&c!='N');
            此时按N或n均可以退出

            单独换成while((c=getchar())!='N');
            按N可以退出

            单独换成while((c=getchar())!='n');
            按n可以退出


            原因:把getchar()写在同一个判断语句中,比如if(getchar()='N'||getchar()='n'),输入n再回车,第一个getchar()读入n,第二个读入enter,所以不会执行判断句后的语句。

改成c=getchar();if(c='N'||c='n')就可以避免上述情况啦~

阅读全文
0 0
原创粉丝点击