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