C语言程序设计第六次作业——循环结构(2)
(一)改错题
题目:
序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数)。
输入输出样例:
Input eps:1E-4
s = 0.835699
1、错误信息:
错误原因:while语句后没有加分号
改正方法:在while语句最后补充一个分号
2、错误信息:
错误原因:scanf语句输入格式错误
改正方法:把%f改为%lf
3、错误信息:
错误原因:n为整型变量,得数只能保留整数
改正方法:在1/n前强制类型转换成double或者把1改成1.0
4、错误信息:
错误原因:while语句条件错误
改正方法:应该把item < eps改为item >= eps
5、错误信息:
错误原因:printf保留小数错误
改正方法:把s = %f改成s = %.6f
(二)学习总结
1、语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
表示循环体可以无限循环,不断执行;应该保证循环有结束的条件,不能无限运行下去,所以在循环中加入break语句,使完成条件后可以跳出循环
2、一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
(1)循环次数已知时,用for语句实现最好,比如循环结构一中第五题统计字符就是用的for循环
题目要求编写程序,输入10个字符,所以循环次数为10,后续不同结果只需不同输出即可,这种情况用for语句最适合
程序如下
(2)在循环次数未知,但循环条件在进入循环时明确的条件下最好用while语句实现较好
循环次数未知,所以不适合用for语句,如循环结构二中第七题寻找250就是用while语句实现的
题目要求从给出的一串数字中找到“250”,由给出一串数字可知,循环次数未知,但循环条件找到250为已知,直到找到250时跳出循环,所以用while语句更为合适
程序如下
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确时用do..while语句最合适,比如循环结构(二)中的第一题求给定精度的简单交错序列部分和
题目要求编写程序,计算序列部分和,循环次数未知,且1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps,循环条件进入循环时也未知,需要在循环体中明确到第多少项才符合精度eps,所以用do...while语句更合适
程序如下
3、有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
(1)for语句如下
#include<stdio.h>
int main(void)
{
int grade=0,sum=0,i=0;
double average=0.0;
for(;;)
{
scanf("%d",&grade);
if(grade!=-1)
{
sum = sum +grade;
i++;
}
else if(grade==-1)
{
break;
}
}
average = sum / i;
printf("%f",average);
return 0;
}
(2)while语句如下
#include<stdio.h>
int main(void)
{
int grade=0,sum=0,i=0;
double average=0.0;
i=0;
while(grade!=-1)
{
scanf("%d",&grade);
sum = sum + grade;
i++;
}
average = (sum+1) / (double)(i-1);
printf("%f",average);
return 0;
}
(3)do...while语句如下
#include<stdio.h>
int main(void)
{
int grade=0,sum=0,i=0;
double average=0.0;
i=0;
do
{
scanf("%d",&grade);
sum = sum + grade;
i++;
}
while(grade!=-1) ;
average = (sum+1) / (double)(i-1);
printf("%f",average);
return 0;
}
我认为for语句相对于while语句和do...while语句更合适,因为for语句操作起来更加简单,也不需要像while语句和do...while语句那样判断跳出循环的条件,使程序出错的可能性大大降低,其次,for语句没有while语句和do...while语句那么难懂,更好理解,还有当用while语句和do...while语句时要注意-1的问题,不要把-1也加到求和之中去,这就需要在程序中做出调整,而for语句就不需要担心这个问题,所以,综上所述,我认为用for语句更加合适
4、运行下面程序,输入1到10,结果分别是什么?为什么?
运行第一个程序,输出结果为
运行第二个程序,输出结果为
两程唯一的不同是if语句中一个是break语句一个是continue语句,第一个程序中,for语句输入i=1进行if语句判定,结果为奇数,s=s+1,然后i变成2,再进行if语句判定,结果为偶数,便会break跳出循环,直接输出s,所以输出结果为s=1;而第二个程序中,for语句输入i=1进行if语句判定,结果为奇数,s=s+1,然后i变成2,再进行if语句判定,结果为偶数,会运行continue语句跳出本次循环,往复下去,当i为奇数时,进行求和运算,i为偶数时会continue跳出本次循环,所以最后输出结果为s=1+3+5+7+9=25
(三)实验总结
1、求给定精度的简单交错序列部分和
(1)题目
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
(2)流程图
(3)源代码
#include <stdio.h>
#include <math.h>
int main()
{
double sum=0.0,eps=0.0,m=0.0,n=1,flag=1;
scanf("%lf",&eps);
do
{
m = flag / (3*n-2);
sum = sum + m;
n++;
flag=-flag;
}
while(fabs(m)>eps);
printf("sum = %.6f",sum);
return 0;
}
(4)实验分析
问题:答案错误
原因: sum = sum + 1 / (3n-2)语句出错
解决办法:经过同学提醒,定义了一个新变量m和一个flag,令flag=1,m=flag / (3n-2),重新进行求和
(5)本题PTA提交列表
2、猜数字游戏
(1)题目
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
(2)流程图
(3)源代码
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a = 0,m = 0,i = 0,N = 0;
scanf("%d%d",&a,&N);
for(i = 1;i <= N;i++)
{
scanf("%d",&m);
if(m < 0)
{
break;
}
if(m == a)
{
if(i == 1)
{
printf("Bingo!");
}
else if(i <= 3)
{
printf("Lucky You!");
}
else if(i <= N)
{
printf("Good Guess!");
}
exit(0);
}
else if(m > a)
{
printf("Too big\n");
}
else
{
printf("Too small\n");
}
}
printf("Game Over");
return 0;
}
(4)实验分析
问题1:编译错误
原因:没有加头文件#include<stdlib.h>
解决办法:经检查后在程序最开始加上了#include<stdlib.h>头文件
问题2:结果错误
原因:没有考虑m<0的情况
解决办法:经过检查在for语句中加入一条if语句(m<0)
(5)本题PTA提交列表
3、求奇数和
(1)题目
本题要求计算给定的一系列正整数中奇数的和。
(2)流程图
(3)源代码
#include <stdio.h>
int main()
{
int number,sum=0;
do
{
scanf("%d",&number);
if(number % 2 != 0 && number > 0)
{
sum += number;
}
}
while(number > 0);
printf("%d",sum);
return 0;
}
(4)实验分析
问题:答案错误
原因:while()语句中的条件判断错误
解决办法:将while(number <= 0) 改为while(number > 0)
(5)本题PTA提交列表
(四)博客互评
一只猫の磊☀:http://www.cnblogs.com/8426224ll/p/7847221.html
姚庆虎:http://www.cnblogs.com/yaole10086/p/7851074.html
任佳鹏:http://www.cnblogs.com/rjp123/p/7859004.html