C语言程序设计第六次作业——循环结构(2)
(一)改错题
对源程序进行编译,发现有误
错误信息1:
错误原因:while语句后面,即printf前面的语句没有加;
改正方法:在while语句后面加上;
在编译,没有错误,但是运行出错了
错误信息2:
错误原因:在scanf语句中应输入%lf而非%f
改正方法:把scanf语句中的%f改成%lf,再把最后printf语句中的%f改成%.6f
运行结果仍不对
错误信息3:输出结果仍不对
错误原因:while语句判断条件不对,循环的执行条件为最后一项(item)大于精度(eps),而非小于。
改正方法:将while中的“item < eps”改为“item >= eps”。
错误信息4:结果仍然不对
错误原因:n被定义为了int性,在运算中难免会影响结果
改正方法:将“item = 1 / n”改为“item = 1.0 / n”.
再次运行,结果对了!
改正后代码为
#include<stdio.h>
int main()
{
int flag,n;
double eps,item,s;
printf("Input eps: ");
scanf("%lf",&eps);
flag = 1;
s = 0;
n = 1;
do
{
item = 1.0/ n;
s = s + flag * item;
flag = -flag;
n = n + 3;
}
while( item >= eps);
printf( "s = %.6f\n",s);
return 0;
}
(二)学习总结
1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
首先while(1)语句表示无限循环,即括号内语句为1,表示条件为真,执行循环语句,while括号内可为任意合法语句。
for(;;)语句执行次数有限,括号内有三条语句,第一条只执行一次,然后执行第二条判断语句,若符合条件则执行循环体,然后执行第三条语句,再执行第二条语句判断是否符合条件……依次循环,若不符合则直接跳出循环。当括号内没有表达式时,可以无限循环。
2.一般情况下
(1)循环次数已知时用for(;;)语句,例如,循环结构(1)的6-1(求奇数分之一序列前N项和),定义输入的N项就明确了循环的次数,用for语句简单明了。
(2)循环次数未知,但循环条件在进入循环时明确时用while语句,例如,循环结构(2)的7-7(寻找250),这个题就没有定义循环次数,直到循环到找到250为止,所以用while语句更适合。
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确时用do while语句,例如,循环结构(2)的7-5(爬动的蠕虫),需要先进入循环再判断,所以用do while语句比较好。
3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。要求分别用for语句、while语句、do while语句三种循环语句实现,并说明你认为哪种形式更合适?
(1)for语句
#include<stdio.h>
int main()
{
int i;
double grade,sum=0,average;
for(;;)
{
scanf("%lf",&grade) ;
if(grade>=0)
{
sum=sum+grade;
i++;
average=sum/i;
}
else
{
break;
}
}
printf("average=%f",average);
return 0;
}
(2)while语句
#include<stdio.h>
int main(void)
{
double sum = 0,average,grade;
int i = 1;
scanf("%lf",&grade);
while(grade >= 0)
{
sum += grade;
scanf("%lf",&grade);
average = sum / i;
i++;
}
printf("average = %.2f",average);
return 0;
}
(3)do while语句
#include<stdio.h>
int main(void)
{
double sum = 0,average,grade;
int i = 1;
scanf("%lf",&grade);
if(grade < 0)
{
average = 0;
}
else
{
do
{
sum += grade;
scanf("%lf",&grade);
average = sum / i;
i++;
}
while(grade >= 0);
}
printf("average = %f",average);
return 0;
}
我认为while语句比较好,因为输入的学生成绩数量并不确定,用while语句可以实现无限循环,而且简单。
4.运行下面程序,输入1到10,结果分别是什么?为什么?
程序1输出结果为
程序2输出结果为
原因:两个程序的不同是程序1用break语句,程序2用continue语句。break是跳出循环体,执行循环外的语句,而第一个程序在输入2时就已经跳出循环了,所以答案为s=1;continue控制是结束本次循环,跳出本次未执行的循环语句,再执行下一次循环语句,直到结束。这个语句求的是1-10的奇数和,所以答案为s=25。
(三)实验总结
(1)题目:求给定精度的简单交错序列部分和
(2)流程图:
(3)源代码:
#include <stdio.h>
#include <math.h>
int main()
{
double eps,item,S = 0;
int denominator = 1,flag = 1;
item = 1.0;
scanf("%lf",&eps);
if(eps >= item)
{
S = 1.0;
}
while(fabs(item) > eps)
{
item = flag *1.0 / denominator;
S = S + item;
flag = -flag;
denominator = denominator + 3;
}
printf("sum = %.6f",S);
return 0;
}
(4)实验分析:
问题:在Devc++上编译运行没错,但是在pta上提交却不对。
原因:少考虑了一种情况。
解决办法:加上s=1的情况。
(5)本题PTA提交列表:
(1)题目:猜数字游戏
(2)流程图:
(3)源代码:
#include <stdio.h>
int main()
{
int num,N,i,a;
i = 1;
scanf("%d %d",&num,&N);
do
{
scanf("%d",&a);
if(a < 0)
{
printf("Game Over");
break;
}
else if(a == num && i <= N)
{
if(i == 1)
{
printf("Bingo!");
break;
}
else if(i <= 3)
{
printf("Lucky You!");
break;
}
else if(i > 3 && i <= N)
{
printf("Good Guess!");
break;
}
}
else if(i > N)
{
printf("Game Over");
break;
}
else if(a > num)
{
printf("Too big\n");
}
else if(a < num)
{
printf("Too small\n");
}
i++;
}
while(num != a);
return 0;
}
(4)实验分析:
问题:部分不能输出正确结果
原因:选择条件中部分语句中的大小关系没理清,导致运行混乱
解决办法:通过请教同学,得以改正
(5)本题PTA提交列表:
(1)题目:求奇数和
(2)流程图:
(3)源代码:
#include <stdio.h>
int main()
{
int N,sum=0;
while(1)
{
scanf("%d",&N);
if(N%2!=0&&N>0)
{
sum+=N;
}
if(N<=0)
{
break;
}
}
printf("%d",sum);
return 0;
}
(4)实验分析:
问题:不能得出正确结果
原因:没有考虑N<=0的情况
解决办法:加上这种情况,结束程序
(5)本题PTA提交列表:
(四)博客互评
http://www.cnblogs.com/english123-/p/7853709.html
http://www.cnblogs.com/Reloaded/p/7825734.html
http://www.cnblogs.com/fkh1/p/7845653.html