输出华氏摄氏温度转换表:输入两个整数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
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循环语句括号内没有“,”,表达式之间用“;”隔开
。把两个逗号改成两个分号
错误信息2:
错误原因:for循环语句括号外误添上了分号
改正方法:for循环语句括号外没有分号,应该把分号去掉。
错误信息3:[](http://images2017.cnblogs.com/blog/1242160/201711/1242160-20171112140017309-617055412.png
错误原因:两整数相除结果为整数,但是celsius是double类型
改正方法:在5的前面加上“(double)”
错误信息4:
错误原因:题目要求每次增加2℉,但是程序上却是每次只增加1℉
改正方法:i的变化代表温度的变化,所以将“i++”改为“i=i+2”
错误信息5:
错误原因:程序将fahr定义成整型变量,但输出却是“%f”
改正方法:整型变量输出应用“%d”,所以应将“%f”改为“%d”
(二)学习总结
1.有如下程序:
include
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)定义变量i,num,odd,even
(2)分别给odd,even赋予0值
(3)给i赋予1值
(4)判断1<=10是否成立,成立
(5)输入一个值,并将其赋给num
(6)判断num是否是偶数,如果是则even的值加1,否则odd的值加1
(7)把i的值加1,做第二次判断
(8)判断2<=10是否成立,成立
(9)输入一个值,并将其也赋给num
(10)判断这次num是否是偶数,如果是则even的值加1,否则odd的值加1
...
(11)把i的值加1,做第十次次判断
(12)判断10<=10是否成立,成立
(13)输入一个值,并将其赋给num
(14)判断num是否是偶数,如果是则even的值加1,否则odd的值加1
(15)把i的值加1,做第十一次次判断
(16)判断11<=10是否成立,不成立
(17)跳出并将even和odd的值输出
程序实现的功能是:输入10个数,判断奇数和偶数的个数
2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?
include
int main()
{
int i,j;
i = 2;
j = 2;
i++;
++j;
printf("i = %d\n",i);
printf("j = %d\n",j);
return 0;
}
结果是:i=3
j=3
增量运算符在单独使用时,前缀和后缀形式有区别吗?
答:增量运算符单独使用时,前缀形式和后缀形式的结果是一样的。
(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?
include
int main()
{
int i,j;
i = 2;
j = 2;
printf("%d\n",i++);
printf("%d\n",++j);
return 0;
}
结果是:2
3
执行过程是:
第一个输出语句:先输出i的值,然后再给i的值加1
第一个输出语句:先给j的值加1,然后再输出j的值
说明:前缀是先执行i+1或i-1,再使用i值;然而后缀却是先使用i值,再执行i+1或i-1。
这两条输出语句执行完后,i和j的值分别是3、3
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
(1)
include
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("");
printf("\n");
return 0;
}
结果:****
(2)
include
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("");
printf("\n");
return 0;
}
结果:****
(3)
#include
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("");
printf("\n");
}
return 0;
}
结果:
(4)
include
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("");
}
printf("\n");
return 0;
}
结果:****
(1).循环体的认定与缩格形式无关。因为第一个与第二个都没有{},第一个有缩格,第二个无,但结果一样。
(2).循环体的认定与与{}有关。因为第二个与第三个都没有缩格,第二个没有{},输出结果是没有分行;第三个大括号里面包括printf语句,输出结果分行
(3).循环体与运行所需的结果有关,看输出的结果格式是什么,来决定那一部分为循环体
(4).第三个与第四个是正确的缩进格式。
4.对其他你认为需要进行总结的内容进行总结。
(1)for语句中表达式可以部分或全部省略,但两个“;”不能省略。
(2)复合赋值运算符种类:+= -= *= /= %=
(3)逗号表达式的值:等于表达式n的值
(4) for语句前必须对变量赋值
(三)实验总结
2.(1)题目
统计学生平均成绩与及格人数
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。
输入格式:输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。
输出格式:按照以下格式输出:
average = 成绩均值
count = 及格人数
其中平均值精确到小数点后一位。
(2)流程图
(3)源代码
# include
int main (void)
{
int N,count,i,sum,grade;
double average;
scanf("%d\n",&N);
count=0;
sum=0;
if(N!=0&&N>0)
{
for(i=1;i<=N;i++)
{
scanf("%d",&grade);
sum=sum+grade;
average=(double)sum/N;
if(grade>=60)
{
count++;
}
else
{
count=count;
}
}
printf("average = %.1f\n",average);
printf("count = %d",count);
}
else
{
for(i=1;i<=N;i++)
{
scanf("%d",&grade);
sum=sum+grade;
if(grade>=60)
{
count++;
}
else
{
count=count;
}
}
printf("average = %.1f\n",average);
printf("count = %d",count);
}
return 0;
}
(4)实验分析
问题:答案错误
原因:没有给sum和count赋初始值
解决办法:在for语句之前将sum和count赋值为0
问题:答案错误
原因:没有考虑人数为0的情况
解决方法:添加if语句来分情况
(5)PTA提交列表
4.(1)题目
到底是不是太胖了(10 分)
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
输入格式:输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。
输出格式:为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
(3)源代码
# include
# include
int main (void)
{
int N,i;
double H,W,Gongjin,Shijin,a,b;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%lf %lf",&H,&W);
Gongjin=(H-100)*0.9;
Shijin=Gongjin*2;
a=fabs(W-Shijin);
b=Shijin*0.1;
if(a
(4)实验分析
问题:无
原因:无
解决办法:无
(5)PTA提交列表
6.(1)题目
统计学生成绩
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
• 大于等于90分为A;
• 小于90且大于等于80为B;
• 小于80且大于等于70为C;
• 小于70且大于等于60为D;
• 小于60为E。
输入格式:输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。
输出格式:在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。
(3)源代码
# include
int main()
{
int A,B,C,D,E,N,i,number;
scanf("%d",&N);
A=0,B=0,C=0,D=0,E=0;
for(i=1;i<=N;i++)
{
scanf("%d",&number);
if(number>=90&&number<=100)
{
A++;
}
else if(number<90&&number>=80)
{
B++;
}
else if(number<80&&number>=70)
{
C++;
}
else if(number<70&&number>=60)
{
D++;
}
else
{
E++;
}
}
printf("%d %d %d %d %d",A,B,C,D,E);
return 0;
}
(4)实验分析
问题:无
原因:无
解决办法:无
(5)PTA提交列表
8.(1)题目
找出最小值
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
(3)源代码
#include
int main (void)
{
int i,n,min,number;
scanf("%d",&n);
scanf("%d",&min);
for(i=1;i
(4)实验分析
问题:程序中止
原因:输入时没有&
解决办法:在min前加上&
(5)PTA提交列表
(四)博客互评
每个同学至少评论三篇其他同学的博客作业,依次列出你所评论的博客地址。对于同学对你的博客作业提出的问题,应积极进行回答,存在的错误应及时改正。希望大家能够在互评的过程中取长补短,共同进步。
氧气同学:http://www.cnblogs.com/wangqi1998/p/7816711.html#top
截图清晰,学习总结写得也是非常丰富
蕊薏同学:http://www.cnblogs.com/123ruike/p/7819921.html
内容写的非常丰富,并且条理清晰,很难得,坚持向你学习
赵晓辉同学:http://www.cnblogs.com/2205747462x/p/7820470.html
内容简练但不空洞,对自己的问题的分析认真负责
同学: