C语言程序设计第五次作业——循环结构(1)
一、改错题
1.题目
输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:c = 5×(f-32)/9
其中,c表示摄氏温度,f表示华氏温度。
源程序(有错误的程序)
#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 (fahr = lower ; fahr <= upper; fahr ++)后面多了一个“;”
改正方法:删掉for (fahr = lower ; fahr <= upper; fahr ++)后面的“;”
错误信息2:

错误原因:for (fahr = lower ; fahr <= upper; fahr ++)中括号里的表达式用了“,”隔离
改正方法:for (fahr = lower ; fahr <= upper; fahr ++)中括号里的“,”全部换成“;”
错误信息3:

错误原因:前面声明变量时fahr为整型,但输出时fahr的格式化输出符号错误,并且celsius的格式化输出格式也是有问题的,如图:

改正方法:将printf("%3.0f %6.1f\n", fahr, celsius)改成printf("%d %.1f\n", fahr, celsius);
错误信息4:

错误原因:经检查for语句后有多条语句,但是for后并未添加“{}”
改正方法:在13行和第16行插入“{}”
错误信息5:

错误原因:原题为每次循环的华氏度的温度增加2,而在错误的源代码的for语句中,每次循环中华氏度只增加1.
改正方法:将for语句中的“fahr++”改为“fahr += 2”
错误信息5:

错误原因:回过头检查计算公式不对
改正方法:celsius = 5 /9 * (fahr - 32.0)改为celsius = 5 * (fahr - 32.0) / 9
输入样例数据“32 35”,结果如图:

符合期望。
输入另一组样例数据“40 30”,结果如图:

符合期望。
与样例一样,再次输入两组数据检验,如图:


符合期望,认为改正完毕。
附上改正后的源代码:
#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.详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
执行步骤:
(1)执行int的整型定义;
(2)给odd,even赋初值为0;
(3)执行for语句
①首先执行i = 1;
②输入num;
③进入if语句,若为真则执行 even++,若为假,则执行else语句中的odd++;
④回到for循环执行i++,此时的i=2;
⑤执行i <= 10为真;
⑥继续执行②③④;
⑦输入十次之后,i = 11,此时i <= 10为假,则跳出for循环语句,执行下一步;
(4)执行printf("%d %d",even,odd);
说明程序实现的功能:
此程序主要是让用户输入十个整数,然后程序判断,输出十个数中偶数有多少个,奇数有多少个。
2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?
①运行结果如下:

②在此程序中增量运算符的前缀和后缀并不影响程序的运算,但是如果单独看的话,i++是先拿自身去用,再自身加一,++j是先自身加一,再把结果拿去用
(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?
①运行结果如下:

②执行过程:
- 首先执行整型定义;
- 第二步执行i = 2,j = 2;
- 第三步执行输出语句,先输出i的值,再执行i++;
- 第四步执行++j,将j的值加1,再输出j,也就是输出为3。
③说明问题:
i++是先拿自身去用,再自身加一,++j是先自身加一,再把结果拿去用。执行完输出语句后i和j的值都是3。
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
运行源程序(1)的结果如下图:

运行源程序(2)的结果如下图:

运行源程序(3)的结果如下图:

运行源程序(4)的结果如下图:

实验分析:
(1)(2)两程序的运行结果一致,所以从结果看循环体的认定与缩格形式无关
(3)(4)两程序比较,“{}”中所包含的内容并不相同,输出结果也不一样,所以认为循环体的认定与“{}”有关,因为循环结构执行的是“{}”里的内容
如果循环语句后加了“{}”则一个循环语句中的循环体为“{}”中的内容,如果循环语句后没有加“{}”则认为循环语句后的第一条语句为循环体语句
(1)(3)(4)为正确,(2)为错误,原因:
因为(1)并没有“{}”,所以循环体只执行for语句后面的第一个语句,所以那个语句可以缩进表示循环体
(2)中的第二个printf语句并不是循环体,所以没必要缩进,所以(2)为错误
(3)(4)都有“{}”来表示循环体,所以正确
4.其他你认为需要进行总结的内容进行总结
(1)我们需要掌握的
①自增自减运算符,并且知道“++” 或“--”在数据前和在数据后区别及用法;
②复合赋值运算符;
③逗号运算符;
④for语句;
⑤为什么要使用循环,实现循环时,如何确定循环条件和循环体?
(2)我们在写程序时需要注意的
①for循环的()中表达式用“;”隔开,而不是用“,”;
②当利用循环求和时不要忘记给定义的和的变量赋初值;
③for循环语句里可以嵌套选择语句;
④当我们执行循环体语句时一定要看看题目有没有要求输出时换行,如果有要求一定要加上“\n”。
三、实验总结
1.求奇数分之一序列前N项和
(1)题目
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
(2)流程图

(3)源代码
#include <stdio.h>
int main()
{
int N,i,a;
double S,sum;
scanf("%d",&N);
a=N+N;
sum = 0;
for(i = 1;i <= a;i = i+2)
{
sum = sum + 1.0 / i;
}
printf("sum = %.6f",sum);
return 0;
}
(4)实验分析
问题1:

原因:在for语句的()中的表达式2写成了“i <= N”,忽略了i每次是加2的,所以执行次数不对,答案也与题目不符
解决办法:将“i <= N”改成“i <= N + N”
问题2:

原因:将“sum = sum + 1.0 / i”写成了“sum = sum + 1 / i”,导致运算为整型运算,运算不正确
解决办法:将“1”改成“1.0”,转换成小数
(5)本题PTA提交列表

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

(3)源代码
#include <stdio.h>
int main()
{
int N,n,a,b,i;
scanf("%d",&N);
a = 0;
b = 0;
for(i = 1;i <= N;i++)
{
scanf("%d",&n);
if(n % 2 == 0)
{
a = a + 1;
}
else
{
b =b + 1;
}
}
printf("%d %d",b,a);
return 0;
}
(4)实验分析
问题1:

原因:忘记了if语句的()中的等于号应该用两个
解决办法:将“if(n % 2 = 0)”改成“if(n % 2 == 0)”
(5)本题PTA提交列表

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


(3)源代码
#include <stdio.h>
int main()
{
int c = 0,d = 0,e = 0,f = 0,i;
char a;
for(i = 1;i <= 10;i++)
{
scanf("%c",&a);
if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
{
c = c + 1;
}
else if(a == '\n' || a == ' ')
{
d = d + 1;
}
else if(a >= '0' && a <= '9')
{
e = e + 1;
}
else
{
f = f + 1;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",c,d,e,f);
return 0;
}
(4)实验分析
问题1:

原因:字符判断没有给字符加“''”
解决办法:将错误程序改成if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
问题2:在数字字符判断时将else if(a >= '0' && a <= '9')写成了else if(a >= '0' && a < '0')导致输出结果错误,如图:

原因:没有认识到数字字符就是一位数,而是以为不管几位数字,只要是数字就是一个字符
解决办法:将错误的程序改成else if(a >= '0' && a <= '9')
(5)本题PTA提交列表

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

(3)源代码
#include <stdio.h>
#include <math.h>
int main()
{
int N,i,a;
double sum = 0;
scanf("%d",&N);
for(i = 1;i <= N;i++)
{
sum = sum - i * pow(-1,i) / (2 * i - 1);
}
printf("%.3f",sum);
return 0;
}
(4)实验分析
问题1:第一次运行出现编译错误,错误如下:

原因:用了数学函数,但是没有写数学头文件
解决办法:在第二行写入#include <math.h>
此问题解决后并无其他问题,运行正常
(5)本题PTA提交列表

四、博客互评
我的评论同学的博客链接
程晓磊
http://www.cnblogs.com/8426224ll/p/7813670.html
评论内容:
①建议改错题改正完毕后再输入两组其他与样例不一样的数据测试程序的正确与否;
②raptor的截图最好不要把程序边框也截上,这样会显得raptor流程图模糊,也显得乱;
③第三个raptor流程图不对,这样写的话“0”和第一个选择结构里的条件无法比较,会出现程序错误;
④总体不错,看的出来用心,老铁,不客气!
刘恺煊
http://www.cnblogs.com/liukaixuan/p/7812027.html
评论内容:
①第三个raptor流程图不对,这样写的话“0”和第一个选择结构里的条件无法比较,会出现程序错误;
②其他方面不错,整体观看性非常好,非常工整,值得学习;
③老铁,不客气!
郭玉霖
http://www.cnblogs.com/HBQ521/p/7803633.html
评论内容:
①改错题的错误程序说一下错的原因包括解决方法,让人一看就明白;
②改错题改正完毕后再输入两组其他与样例不一样的数据测试程序的正确与否;
③文章中的源程序打字输入,这样要比截图整齐一点,给人的感觉会好很多;
④老铁,总体还是不错哒,加油,不客气!
这是我此次的博客作业
祝评论我博客的人当你想买东西的时候,打开钱包一看 钱够!
C语言程序设计第五次作业——循环结构(1)的更多相关文章
- C语言程序设计第五次作业——循环结构
(一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...
- C语言程序设计第五次作业--循环结构(1)
(一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...
- C语言程序设计第五次作业——循环结构1
(一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...
- C语言程序设计第六次作业——循环结构(2)
C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...
- C语言程序设计第六次作业--循环结构(2)
(一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...
- C语言程序设计第六次作业--循环结构2
(一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...
- C语言第五次作业——循环结构
C语言程序设计第五次作业--循环结构(1) (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增 ...
- C语言程序设计第五次作业
一.实验内容 1.输入两个正整数m和n(要求m<=n), 求m!+(m+1)!+(m+2)!-+n! 2.输出1000以内的所有完数.所谓完数是指这个数恰好等于除他本身外的所有因子 ...
- C语言程序设计第三次作业--选择结构(1)
Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...
随机推荐
- angluarjs2入门学习资源
http://www.runoob.com/angularjs2/angularjs2-tutorial.htmlhttps://segmentfault.com/a/1190000008423981 ...
- redis入门(05)redis的key命令
一.什么是redis键命令 Redis 键(key):Redis 键命令用于管理 redis 的键. Redis 键命令的基本语法: redis 127.0.0.1:6379> COMMAND ...
- 新概念英语(1-125)Tea for two
Does Susan have tea by herself?A:Can't you come in and have tea now,Peter? Not yet.B:I must water th ...
- C# word文档转换成PDF格式文档
最近用到一个功能word转pdf,有个方法不错,挺方便的,直接调用即可,记录下 方法:ConvertWordToPdf(string sourcePath, string targetPath) so ...
- Apache设置用户权限(2个域名。一个能访问全部文件,一个只能访问指定文件)
可以利用apache的虚拟主机的配置设置: 2个域名一个是xxxxx.com ,一个是aaaaa.com xxxxx.com配置只访问jpg文件,aaaaa.com可以访问所有文件 <Virtu ...
- spark2.1:rdd.combineByKeyWithClassTag的用法示例
测试spark版本: Spark context Web UI available at http://192.168.1.1:32735 Spark context available as 'sc ...
- 1.4 正则化 regularization
如果你怀疑神经网络过度拟合的数据,即存在高方差的问题,那么最先想到的方法可能是正则化,另一个解决高方差的方法就是准备更多数据,但是你可能无法时时准备足够多的训练数据,或者获取更多数据的代价很高.但正则 ...
- Node.js的安装以及Node.js的模块管理
索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Eleme ...
- Java集合框架的四个接口
接口 [四个接口 collection list set map 的区别] collection 存储不唯一的无序的数据 list 存储有序的不唯一的数据 set 存储无序的唯一的数据 m ...
- C#在使用Assembly加载程序集时失败
错误现象: 进行插件读取时出现错误:"尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework ...