C语言程序设计第五次作业

(一)改错题

输出华氏摄氏温度转换表:输入两个整数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:


错误原因:for语句后面加了分号
改正方法:将for语句后面的分号去掉
错误信息2:图同上
错误原因:for语句里面的三个语句用逗号隔开
改正方法:将for语句里的三个语句用分号隔开
错误信息3:


错误原因:fahr为整型变量,却错用%3.0f,celsius是保留一位小数,却错用%6.1f
改正方法:

错误信息4:


错误原因:for语句后面没加{}
改正方法:在for语句后面加上{}
错误信息5:


错误原因:原题要求每次循环的华氏度温度加2,而此循环中只增加了1
改正方法:

错误信息6:


错误原因:计算公式错误
改正方法:

再运行样例一:

结果正确
运行样例二:

正确代码:

#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 += 2) 
{
		       
		celsius = 5 * (fahr - 32.0)/9; 
        printf("%d %.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);
       eturn 0; 
    }

详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
执行步骤:
1.执行int的整型定义
2.给odd和even赋初始值,分别为0
3.执行for语句
(1)执行i=1;
(2)输入num
(3)执行if语句,若为真,则执行even++;若为假,则执行odd++
(4)进行for循环,当i=2时,执行(2)(3)
(5)再进行for循环,直到i=11时,不符合for循环的条件,输出even和odd的值
程序实验的功能:
输入十个整数,判断十个整数中有几个偶数,几个奇数
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; 
}

运行结果:

增量运算符在单独使用时,i++是赋值,再加1;++j是先加1,再赋值
(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; 
}

运行结果:

执行过程:
1.执行整型定义
2.执行i=2,j=2;
3.输出i的值
4.执行i++;
5.执行++j,将j的值加1
6.输出j
说明的问题:
i++是赋值,再加1;++j是先加1,再去赋值
两条输出语句执行完后,i和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)的运行结果不同,(3)(4)程序中{}里的内容也不一样,而循环结构执行的是{}中的内容,所以我认为循环体的认定与{}有关。
如果一个循环语句后面加了{},那么这个语句循环体为{}里面的内容,如果循环语句后面没有加{},那么循环体语句为循环语句后的第一条语句。
我认为(1)(3)(4)是正确的,(2)是错误的
4.对其他你认为需要进行总结的内容进行总结。
(1)循环体语句可以是单条语句也可以是复合语句,建议无论循环体有几条语句,一律都加大括号
(2)for语句中的表达式可以是任意有效的C语言表达式
(3)注意for语句中表达式可以部分或全部省略,但两个分号不能省略。当省略表达式2时,因为缺少循环条件的判断,会形成无限循环

(三)实验总结
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\n count = %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)实验分析:
问题1:不清楚循环体是哪部分,导致编译陷入困难
解决办法:通过询问同学
问题2:没有考虑N=0时的情况
解决办法:在程序开始时,对N是否等于0进行判断
问题3:

原因:求平均数时,没有用double进行强制转换
解决办法:求平均数时,采用double进行强制转换
(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(fabs(W-B)>=B*0.1 && W<B)
	    {
		    printf("You are tai shou le!\n");
	    }
	    else 
	    {
		    printf("You are tai pang le!\n");
	    }	
    }
    return 0;
    }

(4)实验分析:
对这道题因为不清楚fabs的用法导致思路混乱,编程无法进行,通过问同学知道fabs的用法
(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,e=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:e++;
	    }
    }
    printf("%d %d %d %d %d",a,b,c,d,e);

    return 0;
    }

(4)实验分析:
问题:运行结果错误

原因:没有给a,b,c,d,e赋值
解决办法:给a,b,c,d,e分别赋值为零
(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)实验分析:
问题:输出结果变成了最大的

原因:将数字与最小值进行判断时,错将小于号写成大于号

解决办法:将大于号改成小于号
(5)PTA提交列表:

(四)博客互评
王映丹:http://www.cnblogs.com/windsky-1999/p/7810363.html
善感:http://www.cnblogs.com/tengwenqing/p/7811860.html
楠有乔木:http://www.cnblogs.com/hbnydxxdkjwy/p/7816868.html

posted on 2017-11-12 02:39  田彩  阅读(469)  评论(3编辑  收藏  举报

导航