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

(一)改错题
输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:
c = 5×(f-32)/9
其中,c表示摄氏温度,f表示华氏温度。
输入输出样例1:
  Enter lower:32
  Enter upper:35
  fahr celsius
  32 0.0
  34 1.1
输入输出样例2:
  Enter lower:40
  Enter upper:30
  fahr celsius
源程序(有错误的程序)

#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 ++) ;
        celsius = 5 /9 * (fahr - 32.0); 
        printf("%3.0f %6.1f\n", fahr, celsius); 

   return 0; 
}

  错误信息1:
  错误原因:第13行循环语句for的括号后面不能加分号。
  改正方法:去掉for括号后的分号。
  错误信息2:
  错误原因:for的循环语句没有在下一行加上大括号。
  改正方法:在第14行加上大括号与for对齐。
  错误信息3:
  错误原因:循环语句for括号里的表达式应用分号隔开,而不是用逗号。
  改正方法:将逗号改为分号。
  错误信息4:

编译无误后,运行结果错误。
  错误原因:

开始时声明fahr是整型变量,而最后输出时却是浮点型。
  改正方法:将输出语句中的“%3.0f”改为“%3d”。
  错误信息5:
  错误原因:

声明了celsius是double类型,计算celsius的式子前没加(double),强制转换。
  改正方法:在计算celsius的式子前加上(double)。
  错误信息6:
  错误原因:由题可知,fahr应该是每次加2,而不是加1。
  改正方法:将“fahr++”改为“fahr=fahr+2”。
改正后编译无误,运行结果为:


正确的程序为:

#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 = (double)5 / 9 * (fahr - 32.0); 
        printf("%3d %6.1f\n", fahr, celsius); 
    }
    
    return 0; 
}

(二)学习总结
1.有如下程序:

#include <stdio.h>
int main()
{    
    int i,num,odd,even;
    odd = 0;
    even = 0;    
    for(i = 1; i <= 10;i++)
    {
        scanf("%d",&num);
        if(num % 2 == 0)
        {
            even++;
        }
        else
        {
            odd++;
        }       
    }   
    printf("%d %d",even,odd);
   return 0; 
}

详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
答:①定义i,num,odd,even均为整型变量。
②将0分别赋值给odd,even。
③添加for循环语句,给循环变量赋初值i=1;循环条件为i<=10;循环变量增值i++。
④输入一个数,在if语句中判断这个数与2的余数是否为0,若是则even+1,若不是则odd+1。
⑤判断完后i+1,再次输入一个数,判断与2求余是否为0,是则even+1,否则odd+1,然后再次i+1。
⑥当i=10时,再次出入数据,判断此数与2求余是否为0,是则even+1,否则odd+1,然后再次i+1。
⑦直到i=11时,已不满足循环条件,循环结束。
⑧加入输出语句,输出even和odd。
功能:将10个数分成两类,分为奇数和偶数,再输出各自的个数。
2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?

#include <stdio.h>
int main()
{    
    int i,j;
    i = 2;
    j = 2;
    i++;
    ++j;
    printf("i = %d\n",i);
    printf("j = %d\n",j);   
    return 0; 
}

答:结果:
增量运算符在单独使用时,前缀和后缀形式的结果是一样的。
(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?

#include <stdio.h>
int main()
{    
    int i,j;
    i = 2;
    j = 2;  
    printf("%d\n",i++);
    printf("%d\n",++j);     
    return 0; 
}

答:结果:
后缀形式i++的执行过程:先使用i值,再执行i+1。
前缀形式++j的执行过程:先执行j+1,再使用j值。
说明当增量运算符作为表达式的一部分时,前缀形式和后缀形式的执行过程是不一样的。前缀是先执行再使用,后缀是先使用再执行。
i=2,j=3
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
(1)

#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
        printf("*");
    printf("\n");   
    return 0; 
}

(2)

#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
        printf("*");
        printf("\n");   
    return 0; 
}

(3)

#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
    {
        printf("*");
        printf("\n");
    }
    return 0; 
}

(4)

#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
    {
        printf("*");
    } 
    printf("\n");
    return 0; 
}

答:运行结果为:
(1)
(2)
(3)
(4)
第三个运行结果是竖着的5个,而其他三个是横着的5个
由(1)(2)对比知循环体的认定与缩格形式无关。
由(2)(4)分别与(3)对比知循环体的认定与{}有关。
循环语句中的循环体语句会用{ }括起来。
(3)(4)是正确的。
4.对其他你认为需要进行总结的内容进行总结。
①循环体语句可以是单条语句也可以是复合语句。建议无论循环体有几条语句,一律都加大括号{ }。
②for语句通常用于计数控制,用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。
③for语句中表达式可以部分或全部省略,但两个“;”不能省略。当省略表达式2时,因为缺少循环条件的判断,会形成无限循环。
④break语句在循环语句和switch语句中,终止并跳出循环体或开关体,break只能终止并跳出最近一层的结构,break只能用于循环语句和switch语句中,在循环语句中,break语句一般都是与if语句一起使用。
(三)实验总结
1.统计学生平均成绩与及格人数
(1)题目
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。
(2)流程图


(3)源代码

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

    return 0;
}

(4)实验分析
问题:当输入的N为0时,运行后无结果。
原因:没有考虑到当N为0时的情况。
解决办法:加上一个与第一个if对应的else语句说明当N为0或负数时的情况。
(5)本题PTA提交列表

2.到底是不是太胖了
(1)题目
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
(2)流程图


(3)源代码

#include <stdio.h>
#include <math.h>
int main (void)
{
    int i,N;
    double H,W,B;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
	    scanf("%lf %lf",&H,&W);
	    B=0.9*2*(H-100);
	    if(fabs(W-B)<B*0.1)
	    {
		    printf("You are wan mei!\n"); 
	    } 
	    else if(W<B)
	    {
		    printf("You are tai shou le!\n");
	    }
	    else 
	    {
		    printf("You are tai pang le!\n");
	    }	
    }
    return 0;
}

(4)实验分析
问题:源程序过于复杂。
原因:else if语句后不用加表达绝对值的式子,只需比较真实体重与标准体重的大小即可。
解决办法:将else if语句后的“fabs(W-B)>=B*0.1 && W<B”改为“W<B”.
(5)本题PTA提交列表

3.统计学生成绩
(1)题目
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(2)流程图


(3)源代码

#include <stdio.h>
int main (void)
{
    int i,N,grade,a=0,b=0,c=0,d=0,f=0;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
	    scanf("%d",&grade);
	    switch(grade/10)
	    {
		    case 10:
    	    case 9:a++;
                   break;
    	    case 8:b++;
    	   	       break;
    	    case 7:c++;
    	           break;
    	    case 6:d++;
                   break;
    	    default:f++;
	    }
    }
    printf("%d %d %d %d %d",a,b,c,d,f);

    return 0;
}

(4)实验分析
问题:运行结果错误。
原因:abcdf都没有赋值为0,运算结果为随机值。
解决办法:给abcdf赋值为0。
(5)本题PTA提交列表

4.找出最小值
(1)题目
本题要求编写程序,找出给定一系列整数中的最小值。
(2)流程图


(3)源代码

#include <stdio.h>
int main (void)
{
    int i,n,min,number;
    scanf("%d",&n);
    scanf("%d",&min); 
    for(i=1;i<n;i++)
    {
	    scanf("%d",&number);
	    if(number<min)
	    {
		    min=number;
	    }
	    else
	    {
		    min=min;
	    }
    }
    printf("min = %d",min);

    return 0; 
}

(4)实验分析
暂无问题,先假设m为最小值,与number比较,将最小值赋给m,最后m表示最小值。
(5)本题PTA提交列表

(四)博客互评
(1)腾文清:http://www.cnblogs.com/tengwenqing/p/7811860.html
(2)王映丹:http://www.cnblogs.com/windsky-1999/p/7810363.html
(3)永恒破碎:http://www.cnblogs.com/zhaochenyu/p/7810395.html

posted @ 2017-11-12 01:17  楠有乔木  阅读(1580)  评论(1编辑  收藏  举报