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