(一)改错题
输出华氏摄氏温度转换表:输入两个整数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;
}
将源代码输入后,执行编译命令,发现存在错误;
错误(一):
错误原因:for 语句后面多加了分号。
改正方法:将for语句括号后面的分号删掉。
错误(二):
错误原因:在for语句后面括号中,分别表示fahr初值,判断范围以及步长的语句之间应该用分号分开,而不是逗号。
改正方法:将for语句后括号中判断语句前后的两个逗号改成分号。
改正后经编译无错误,如图所示:
输入给出的样例1后,输出结果有错误,如图所示:
错误(三):
错误原因:
发现第16行的输出语句中对应华氏度数的格式化输出符号有问题,在声明时以及输出时均为int型,但是输出时却格式化为浮点型。
改正方法:将对应华氏度的输出符号改为整形输出的“%d”,对应摄氏度的符号改为符合样例数据的“%.1f”。
改正后,继续输入给定的样例1,结果发现:
错误(四):
错误原因:源代码第五行定义的celsius属于double类型,而第十四行所定义的式子全部为整型,转换错误。
改正方法:在第十四行的代码celsius=后面加(double)进行强行转换。
改正后如图所示:
再次进行编译无错误,输入样例1,发现结果仍旧与给定输出样例不符:
错误(五):
错误原因:经仔细对源代码进行检查发现在for语句的循环体中没有加大括号。
改正方法:将for语句的循环体放进大括号里,其中printf语句也包括在内。
改正后如图所示:
错误(六):
错误原因:改正后,编译无错误,输入样例1,结果与预期不符,题中输出样例为2行,但源代码运行后输出结果为4行。原题中给出的循环,华氏度的温度增加2,而在源代码的for语句中,每次循环华氏度只增加1。
改正方法:将循环后华氏度的增量改变为+2。
改正后如图所示:
输入样例1,结果与预期相符:
输入样例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("%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);
return 0;
}
详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
回答: (1)先声明变量,然后再给代码赋初值;
(2)进入循环语句,开始输入数字,循环次数为10;
(3)在循环语句中输入一个数就要进行一次判断,判断该数是为奇数还是偶数,若为奇数,在奇数个数上加1(偶数一样),最后输出奇数和偶数的个数。
(4)前两次的循环,先输入一个数,判断奇数还是偶数。然后再次输入一个数,进行第二次循环,继续判断奇数和偶数。
当输入第十个数就是最后一次循环,仍然判断是奇数还是偶数。
(5)最后程序实现的是判断并计算输入的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 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.对其他你认为需要进行总结的内容进行总结。
(1)for语句中的判断语句是为了让程序能够有限次的进行循环,如果for语句中没加任何判断语句,就会进行无限循环;
(2)切记for循环语句应该用大括号括起来;
(3)for语句中三个语句中间用分号隔开;
(4)循环体结束后进行输出,输出语句在循环体外。
(三)实验总结
1.统计学生平均成绩与及格人数
(1)题目:
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。
(2)流程图:
(3)源代码及其输入样例运行结果:
(4)实验分析:
问题1:存在除数为0的情况;
原因:注意看题,输入的人数可能为0;
解决办法:加入条件判断句(if语句),判断输入人数是否为0,再执行循环体语句。
问题2:计算及格人数的时候不正确;
原因:系统会随机给及格人数的变量赋初值;
解决办法:在定义变量的时候给变量赋初值。
(5)PTA提交列表:
2.到底是不是太胖了
(1)题目:
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。
真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。
已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
(2)流程图:
(3)源代码及其输入样例运行结果:
(4)实验分析:
问题1:输出结果一直不对;
原因:存在整型与小数之间的转换;
解决办法:定义变量的时候,注意变量属于int还是double型(注意:整型/整型=整型)。
(5)PTA提交列表:
3.统计学生成绩
(1)题目
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
• 大于等于90分为A;
• 小于90且大于等于80为B;
• 小于80且大于等于70为C;
• 小于70且大于等于60为D;
• 小于60为E。
(2)流程图:
(3)源代码及其输入样例运行结果:
(4)实验分析:
问题1:运用“if”语句需要判断的太多;
原因:分数间包括的较多;
解决办法:运用“swich语句”,将分数除以10以后,再进行运算。
(5)PTA提交列表:
4.找出最小值
(1)题目
本题要求编写程序,找出给定一系列整数中的最小值。
(2)流程图:
(3)源代码及其输入样例运行结果:
(4)实验分析:
问题1:在比较大小的问题中,将输入的第一个数赋min或者max应该放在循环体的什么位置;
原因:给min或max一个初始值便于与后来输入的各个数进行比较;
解决办法:将赋值语句放在循环体外,因此循环体应该进行输入(n-1)次。
(5)PTA提交列表:
(四)博客互评
1.李晓晓:http://www.cnblogs.com/Reloaded/p/7795161.html
评价:解释的内容颇为详细,使我了解到的东西很多,有自己的独特的思想和思路,向他学习。
2.刘苗苗:http://www.cnblogs.com/liumiaomiao520/p/7795587.html
评价:条理清晰,内容完全,重点的东西标注详细,没有出现格式不完美的情况,继续加油!
3.范凯华:http://www.cnblogs.com/fkh1/p/7812032.html
评价:整体内容工整,没有出现特别大的问题,注意实验分析内容不大完整,提出个小小的建议:下次截屏的时候可以只要运算结果,截全屏会显得很大,但是不大美观,继续努力哦!