(一)改错题
序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数)。
输入输出样例:
Input eps:1E-4
s = 0.835699
源程序(有错误的程序)
#include
int main()
{
int flag,n;
double eps,item,s;
printf("Input eps: ");
scanf("%f",&eps);
flag = 1;
s = 0;
n = 1;
do{
item = 1/ n;
s = s + flag * item;
flag = -flag;
n = n + 3;
}while( item < eps)
printf( "s = %f\n",s);
return 0;
}
错误信息1:
错误原因:缺少“;”,语句无法结束。
错误原因:double型输入时l不可省略,应为%lf
改正方法:
错误原因4:![](http://images2017.cnblogs.com/blog/1242160/201711/1242160-20171119121624124-1988651068.png)
错误信息:运行结果错误
改正方法:将<改为>=
错误原因5:少绝对值
错误信息:少绝对值
改正方法:while( item < eps)改为while( fabs(item) < eps),并在头文件中加上# include
(二)学习总结
1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
while(1): while(1)其中1代表一个常量表达式1是非零值,代表逻辑真,他永远不会等于0,所以while的循环条件永远为真, 循环会一直执行下去,即无限循环。
保证这种循环能正常执行:除非设置break等类似的跳出循环语句循环才会中止。
for(;;): for后的圆括号中,第一个分号前的内容是执行第一次循环前执行的,第二个分号前的内容是每次执行前都要判断的(如果该处表达式的值为真,那么执行循环体,如果为假,那么就跳出循环体),第二个分号后的内容是每执行完一次循环体后执行的 。;;中间没有限制条件,所以循环不会停止。
保证这种循环能正常执行:第2个分号前有限制条件且该条件必然会变成真,循环才会停止。另一种停止的方法在循环体中使用break跳出循环体。
2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
循环次数已知:用for语句。for属于计数型循环。表达式2控制次数。例如:打印1-100的值用for(int i=1;i<=100 ;i++);
循环次数未知,但循环条件在进入循环时明确:用while语句。while属于当型循环;
循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确:用do while语句。do属于直到型循环;
3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
要求分别用for语句、while语句、do while语句三种循环语句实现,并说明你认为哪种形式更合适?
for语句:
# include
int main ()
{
int m,i,n,sum;
double average;
sum = 0;
scanf("%d",&m);
for(i = 1;i<=m;i++)
{
scanf("%d",&n);
if(n == -1)
{
break;
}
else
{
sum = sum+n;
}
}
average = (double)sum/m;
printf("%.1f",average) ;
return 0;
}
while语句
# include
int main ()
{
int m,sum,i;
double average;
sum = 0;
i = 0;
while(1)
{
scanf("%d",&m);
if(m == -1)
{
break;
}
else
{
sum = sum+m;
I++;
}
}
average=sum/i;
printf("%.2f",average);
return 0;
}
do while语句
# include
int main()
{
int m,sum,i;
double average;
sum = 0;
i = 0;
do
{
scanf("%d",m);
sum = sum+m;
i++;
}while(m!=-1);
average = sum/i;
printf("%f",average);
return 0;
}
我认为用do while循环语句更合适。因为循环次数未知(即一批学生),且循环条件在进入循环时未知,需要在循环体中明确;并且do while循环语句使用广泛。
4.运行下面程序,输入1到10,结果分别是什么?为什么?
结果(1):
原因:第一个循环程序使用了break跳出语句,而第二个循环程序使用了continue语句。break语句结束整个循环过程,不再判断执行循环的条件,而continue语句只结束本次循环,而不终止整个循环的执行。break语句结束整个循环过程,不再判断执行循环的条件。第一个程序中当输入1时(n%2==0)成立所以执行break语句,跳出循环体,输出s=1。第二个程序中输入1到10,当if语句成立结束本次循环(不是终止整个循环),否则执行本次循环。
(三)实验总结
1.求给定精度的简单交错序列部分和
(1)题目
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
注意:循环条件的写法
(2)流程图
(3)源程序
#include
#include
int main (void)
{
int N,n,m;
double eps,item,S,sum;
scanf("%lf",&eps);
n=1.0;
m=1.0;
item=1.0;
S=0;
if(eps>=item)
{
S=1.0;
}
while(fabs(item)>eps)
{
item=(double)m/n;
S+=item;
n=n+3;
m=-m;
}
printf("sum = %lf",S);
return 0;
}
(4)实验分析
问题:
原因:没有声明数学函数
解决方法:
(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
int main (void)
{
int i,x,N,y;
scanf("%d %d",&x,&N);
i=1;
while(i<=N)
{
scanf("%d",&y);
if(y<0)
{
printf("Game Over\n");
break;
}
else if(y>x)
{
printf("Too big\n");
}
else if(yN)
{
printf("Game Over\n");
}
return 0;
}
(4)实验分析
(5)本题PTA提交列表
3.求奇数和
(1)题目
本题要求计算给定的一系列正整数中奇数的和。
注意:第一个值为负的情况。Sum初值
(2)流程图
(3)源程序
#include
int main (void)
{
int N,sum=0;
do
{
scanf("%d",&N);
if(N%2==1)
{
sum+=N;
}
else
{
sum=sum;
}
}
while(N>0);
printf("%d",sum);
return 0;
}
(4)实验分析
问题1:答案错误
原因:while里的条件写错,应为执行条件,不是结束条件
解决方法:将<=改为>
(5)本题PTA提交列表
(四)博客互评
蕊薏同学:http://www.cnblogs.com/123ruike/p/7851176.html
王映丹同学:http://www.cnblogs.com/windsky-1999/p/7838107.html
楠有乔木同学:http://www.cnblogs.com/hbnydxxdkjwy/p/7846940.html