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
源程序为:

错误信息1:

错误原因:

如图所示,在for语句中,表达式之间用分号隔开而不能用逗号,并且,在for语句后,不能跟分号。
改正方法:将for语句中的两个逗号改为分号,并将for语句后的分号去掉。
错误信息2:
当输入样例一时,结果出现错误

错误原因:fahr在定义时是整型,但在输出时却以%f的形式输出
改正方法:将%3.0f改为%d
错误信息3:

错误原因:在计算时celsius暴露狂了一位小数,但在输出时,celsius却保留了6位小数
改正方法:将%6.1f改为%。1f
错误信息4:
错误原因:celsius是浮点型,但在运算中却计算为整型
改正方法:如图所示,将5改为5.0


错误信息5:

错误原因:for语句后缺少大括号
改正方法:在for语句后加上大括号
错误信息5:

错误原因:计算的式子并不正确
改正方法:将fahr++改为fahr=fahr+2
全部修正过之后,结果正确,如图所示:

(二)学习总结

1.有如下程序:

详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
答:
<1>定义变量i,num,odd,even。
<2>给变量odd,even赋初值。
<3>开始for循环语句
<4>给i赋初值i=1
<5>给定循环条件i<=10
<6>输入num
<7>判断num是否能被2整除,如果是,执行even++
<8>如果num不能被2整除,便执行odd++
<9>给i加1,此时i=2
<10>继续输入num
<11>判断num是否能被2整除,如果是,执行even++
<12>如果num不能被2整除,便执行odd++
<13>给i加1,此时i=3
<14>继续输入num
<15>判断num是否能被2整除,如果是,执行even++
<16>如果num不能被2整除,便执行odd++
.
.
.
<17>给i加1,此时i=10
<18>判断num是否能被2整除,如果是,执行even++
<19>如果num不能被2整除,便执行odd++
<20>给i加1,此时i=11
<21>i不满足循环条件
<20>结束循环
<21>输出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进行加法运算,而对++j来说则是先对j进行加法运算,再取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)发现,printf的缩进不同,但是,(1)和(2)的输出结果却是相同的,由此可知,缩进并不影响运行结果。
但是,反观(1)(2)和(3)(4)可以发现,(1)(2)的循环语句并没有加{},而三四的语句都加了{},但是(1)(2)(4)程序的结果都相同,只是(3)的{}括住的语句和(4)不同,由此可知,{}可以影响运行结果。
我认为第四种格式才是正确的缩进格式。

4.对其他你认为需要进行总结的内容进行总结。
<1>在if后的语句最好不要出现表达式,以减少误差
<2>如果有浮点数的比较,要先计算出来再运行,或者将小数同时乘以一个数,变为整数
<3>N项和连加是要循环N次即为if(i=1;i<=N;i++)
<4>在for语句中,表达式可全部可部分省略,但是两个分号不能省略
(三)实验总结

  1. 求奇数分之一序列前N项和
    (1)题目:本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
    (2)流程图:

(3)源代码:

(4)实验分析:没有错误
(5)本题的PTA提交情况为:

3.奇偶分家
(1)题目:给定N个正整数,请统计奇数和偶数各有多少个?
(2)流程图:

(3)源代码:

(4)实验分析:没有错误
(5)本题的PTA提交情况为:

5.统计字符
(1)题目:本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
(2)流程图:

(3)源代码:

(4)实验分析:
问题:计算出错,结果和样例不符

原因:对ASCII码值掌握不太熟练,对字母的范围的对应的ASCII码值计算错误,导致计算出错
改正方法:对ASCII码值进行重新计算
问题:依旧是结果错误

原因:对letter,blank,digit,other没有赋初值,导致程序随机取值
改正方法:如图所示:

(5)本题的PTA提交情况为:

7.求交错序列前N项和
(1)题目:本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
(2)流程图:

(3)源代码:

(4)实验分析:
问题:答案不正确

原因:对for语句没有完全理解,没有弄清楚循环条件。
解决办法:将for语句后的j<N改为i<=N。
(5)本题的PTA提交情况为:

五.博客互评
1.http://www.cnblogs.com/longv587/p/7821191.html
2.http://www.cnblogs.com/yiqiekaoziji/p/7821155.html
3.http://www.cnblogs.com/hbnydxxdkjwy/p/7816868.html

posted @ 2017-11-12 15:21  大鱼会飞  阅读(571)  评论(1编辑  收藏  举报