C语言程序设计第五次作业——循环结构(1)

(一)改错题

将源程序进行编译,发现有误
错误信息1:


错误原因:第13行for语句后面加了;
改正方法:去掉;
错误信息2:

错误原因:第14行公式书写有误,按从左到右的顺序算,5/9=0,不能得出正确结果
改正方法:将5改成5.0
错误信息3:

错误原因:for语句中三条语句应用;隔开而不是,
改正方法:将,换成;
编译结果无误,运行结果不对
错误信息4:


错误原因:题目中要求每次加2fahr,而他给出的却是fahr++
改正方法:将fahr++改成fahr=fahr+2
错误信息5:


错误原因:定义华氏度为int类型,输出时却用%3.0f表示浮点型
改正方法:将%3.0f改成%3d
运行结果仍然不对

错误信息6:

错误原因:for语句后有多个语句却未用{}
改正方法:在13和17行分别加上{}
再次运行,结果正确


改正后代码为

#include <stdio.h>
int main(void)
{    
    int fahr , lower, upper;  /* fahr表示华氏度 */
    double celsius;        /* celsius表示摄氏度 */ 
    printf("Enter lower:");
    scanf("%d",&lower);
    printf("Enter upper:");
    scanf("%d",&upper);
    printf("fahr  celsius\n");             /* 显示表头 */
    /* 温度转换 */
    for (fahr = lower ; fahr <= upper; fahr=fahr+2)
	{
        celsius = 5.0 /9 * (fahr - 32.0); 
        printf("%3d %6.1f\n", fahr, celsius); 
	}

   return 0; 
}

(二)学习总结

1.执行步骤如下
①定义整型变量i,num,odd,even,
②给odd,even赋初值均为0,
③执行for的循环语句,表达式1为i=1,表达式2为i<=10,表达式3为i++,i=1符合i<=10语句,循环条件为真,执行循环体,
④输入一个变量num,
⑤判断此值能否被2整除
⑥若能,执行even++语句,若不能,执行else语句,即odd++,
⑦回到for语句,此时i=2,判断条件为真,
⑧继续输入num,
⑨执行选择语句,若能被2整除,执行even++语句,若不能,执行else语句,即odd++,
………………
⑩当循环到i=11,不符合循环条件,跳出循环体语句,输出此时even和odd的值
该程序实现的功能是:判断输入的10个数的奇偶性并统计奇偶数的个数。
2.增量运算符
(1)运行所给程序,得结果

由结果可知,增量运算符在单独使用时,前缀和后缀形式没有区别。
(2)运行所给程序,得结果

此代码说明增量运算符的前缀与后缀影响运算结果,由于i为后缀形式,因此输出,再对i增量,所以b的值输出为2,而j为前缀形式,因此首先对j增量,再输出,因此j输出的值为3。
3.有些循环语句后面有{},有些没有,有些语句有缩进,循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
程序一运行结果

程序二运行结果

程序三运行结果

程序四运行结果

由上面四个结果对比可知,只有第三个运行结果为5行每行一个,其余三套程序运行结果都为一行5个
对比结果及源程序可得:
程序1、 2 之间的差别为缩格的不同,结果二者完全相同,因此说明循环体的认定与缩格没有关系。
程序2、 3之间的差别为有无{},结果二者完全不同,二者的区别在于大括号括起的位置不同,所以认为循环体的认定与{}有关系。
程序3、 4之间的差别为{}的位置不同,结果导致程序4的输出结果没有换行
问题总结:
循环是此门课程的一大难点,需要理清的问题也很多
1.要注意前后缀的使用问题
2.for语句括号中必须有第二条表达式语句和它前后的两个;
3.while语句先判断表达式真假再执行,可以进行无限循环
4.do——while语句,也要能符合while里的条件才执行do下面的语句
5.注意复合赋值运算符,如:a+=b即为a=a+b
6.逗号运算符的有限值低于赋值运算符,基本为最低

(三)实验总结

(1)题目: 统计学生平均成绩与及格人数
(2)流程图:

(3)源代码

    #include<stdio.h>
    #include<math.h>
    int main (void)
    {
        int N,i,a,count;
        double average,sum;
        average=0;
        count=0;
        sum=0;
        scanf("%d",&N);
        if(N==0)
        {
            printf("average = 0.0\ncount = 0");
        }
        else
        {
        for(i=1;i<=N;i++)
        {
            scanf("%d",&a);
            sum=sum+a;
            if(a<60)
            {
                count=count;
            }
            else
            {
                count=count+1;
            }
        }
        average=(double)sum/N;
        printf("average = %.1f\ncount = %d",average,count);
        } 
    return 0 ;
    }

(4)实验分析:
问题:输出count结果不对
原因:一开始循环语句中else语句下写的count=0,及当不符合条件时count又恢复为0
解决办法:将其改为count=count
(5)本题PTA提交列表:

(1)题目: 到底是不是太胖了
(2)流程图:

(3)源代码

    #include<stdio.h>
    #include<math.h>
    int main (void)
    {
        int N,H,W,i,standard,a;
        scanf("%d",&N);
        standard=0;
        a=0;
        for(i=1;i<=N;i++)
        {
            scanf("%d %d",&H,&W);
            standard = (H-100)*0.9*2;

            a = W-standard;
            if(a<standard*0.1&&a>-standard*0.1)
            {
                printf("You are wan mei!\n");
            }
            else if (a>=standard*0.1)
            {
                printf("You are tai pang le!\n");
            }
            else
            {
                printf("You are tai shou le!\n");
            }
 
    }
    return 0 ;
    }

(4)实验分析:
问题1:结果在极值总是有误差
原因:浮点型在等于时候总是有误差
解决办法:避免用浮点型的格式
(5)本题PTA提交列表:

(1)题目:统计学生成绩
(2)流程图:

(3)源代码:

    #include<stdio.h>
    #include<math.h>
    int main (void)
    {
        int N,A,B,C,D,E,i;
        double grade;
        A=B=C=D=E=0;
        scanf("%d",&N);
        for(i=1;i<=N;i++)
        {
            scanf("%lf",&grade);
            if(grade>=90&&grade<=100)
            {
                A++;
            }
            else if (grade<90&&grade>=80)
            {
                B++;
            }
            else if (grade<80&&grade>=70)
            {
                C++;
            }
            else if (grade<70&&grade>=60)
            {
                D++;
            }
            else
            {
                E++;
            }
        }
        printf("%d %d %d %d %d",A,B,C,D,E);
    return 0 ;
    }

(4)实验分析:
问题:判断结果不准确
原因:switch语句的表达式书写有误,应该除以10再比较会方便
解决办法:让grade/10
(5)本题PTA提交列表:

(1)题目:找出最小值
(2)流程图:

(3)源代码:

    #include<stdio.h>
    #include<math.h>
    int main (void)
    {
        int n,i,b;
        double min,t;
        scanf("%d%lf",&n,&min);
        for(i=1;i<=n-1;i++)
        {
            scanf("%d",&b);
            if(min>=b)
            {
                t=b;
                b=min;
                min=t;
            }
            else
            {
                min=min;
            }
        }
        printf("min = %.0f",min);
    return 0 ;
    }

(4)实验分析:
问题:刚读到题时有点蒙,不知从哪儿下手
解决办法:经过上课老师讲授,豁然开朗
(5)本题PTA提交列表:

博客互评

http://www.cnblogs.com/fkh1/p/7812032.html
http://www.cnblogs.com/dsy7777777/p/7818827.html
http://www.cnblogs.com/lyw7777777/p/7817394.html

posted @ 2017-11-12 14:05  沐栀*  阅读(267)  评论(0编辑  收藏  举报