C语言程序设计第六次作业
1改错题
(一)改错题
序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数)。
输入输出样例:
Input eps:1E-4
s = 0.835699
错误的源程序:
#include<stdio.h>
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;
}
错误信息:
错误原因:在循环while语句后未加分号导致错误。
改正方法:在“while”后加分号即可。
错误信息:
经过运行本人发现如上错误,经检查得知
错误原因:定义“item”运算是由于其是double型所以应使结果未浮点型。
改正:把“1”改为“1.0”即可。
错误信息:本人继续运行程序发现仍然是如上错误
错误:后来本人发现在输入函数中定义类型有错误,不应该为“%f”
改正:应该改为"%lf"变为double型变量即可。
继续运行结果领本人觉得不可思议,结果仍然如上:
之后发现错误:while语句内循环结束条件错误。
改正:将"<"改为">="即可。
改正后输出结果如下:
与预期结果相符改错完毕,此处附加改正的源程序:
#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 = %f\n",s);
return 0;
}
2学习总结
1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
此处while语句内条件代表循环条件,只要为非零数即可循环。所以里面只要是非零数即可,即无限循环语句,"for(;😉"语句表示循环语句为空,没有循环条件,也表示无限循环;为保证这两个程序正常运行就要在循环内加入循环条件并且配合"break"用来跳出循环。
2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
在循环次数已知的情况下用for语句较好对应的题目有循环结构一中的统计字符问题——本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。本题给定了循环次数,所以用for循环更好。
其次在循环次数未知的情况下但循环条件明确,应使用while语句——寻找250,对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。本题只需要在while(1)的无限循环内给定循环判定条件以及break结束即可。
对于循环次数未知且循环条件进入循环未知应该使用do...while语句——爬动的蠕虫,一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
本题需要先执行一次循环条件才可以计算爬行时间并让答案正确。
3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
要求分别用for语句、while语句、do while语句和无限循环四种循环语句实现,并说明你认为哪种形式更合适?
首先用for语句是对于确定的次数进行循环,此处无法运用for语句因为次数未知,但是可以使用“for语句的无限循环”也就是“for(;;)”,源程序如下:
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
for(;;)
{
scanf("%d",&grade);
if(grade!=-1)
{
sum=sum+grade;
i++;
}
else
{
break;
}
}
average=(double)sum/i;
printf("%f",average);
return 0;
}
while语句的程序(对于未知次数的循环):
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
while(grade!=-1)
{
scanf("%d",&grade);
sum=sum+grade;
i++;
}
average=(double)(sum+1)/(i-1);
printf("%f",average);
return 0;
}
此程序在不知道输入数字为多少是(不给定-1时)无法使用。
do...while语句:
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
do
{
scanf("%d",&grade);
sum=sum+grade;
i++;
}
while(grade!=-1);
average=(double)(sum+1)/(i-1);
printf("%f",average);
return 0;
}
无限循环语句:
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
while(1)
{
scanf("%d",&grade);
if(grade!=-1)
{
sum=sum+grade;
i++;
}
else
{
break;
}
}
average=(double)sum/i;
printf("%f",average);
return 0;
}
for语句的使用也只能是无限循环的形式,while与do...while语句在输入的数字未知时无法使用,所以相比较而言使用无限循环更合适。
4.运行下面程序,输入1到10,结果分别是什么?为什么?
#include<stdio.h>
int main()
{
int n,s,i;
s = 0;
for(i = 1; i <= 10; i++)
{
scanf("%d",&n);
if(n % 2 == 0)
break;
s = s + n;
}
printf("s = %d\n",s);
return 0;
}
结果如下:
因为循环控制语句“break”的作用,在判断输入数字与2求余时若不符合直接就控制语句结束跳出语句,导致在1后面的数字无法参与程序的运行。
(2)
#include<stdio.h>
int main()
{
int n,s,i;
s = 0;
for(i = 1; i <= 10; i++)
{
scanf("%d",&n);
if(n % 2 == 0)
continue;
s = s + n;
}
printf("s = %d\n",s);
return 0;
}
运行结果如图:
因为continue 语句只控制当前语句结束,在继续进行程序运行,不会直接使程序结束,接下来输入的数字继续参与程序运行,两个程序体现了两个语句的区别,break语句,若条件第一次不符合直接结束程序,而continue语句只结束当前语句,接下来继续参与程序运行,而不会直接结束语句。
3实验总结
(1)求给定精度的简单交错序列部分和
1.流程图:
2.源程序:
#include <stdio.h>
#include <math.h>
int main()
{
double eps = 0.0,sum = 0.0,n = 1.0,flag = 1.0,m = 0.0;
scanf("%lf",&eps);
do
{
m = flag / (3 * n - 2);
sum = sum + m;
flag = -flag;
n++;
}
while(fabs(m)>eps);
printf("sum = %.6f",sum);
return 0;
}
问题:do...while语句while括号内判断条件错误,本应为循环条件。如图:
解决方法:将判断条件改为循环的条件即可,即fabs(m)>eps 。
提交列表:
(2)猜数字游戏
1.流程图:
2.源程序:
#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;
}
问题:当i初始值为1时,循环次数应该不大于本人设定的结束次数N,而最开始本人因范围设定错误导致错误。
解决方法:把最初本人写入的“i<N”改为“i<=N”即可。
错误:判断条件句if时让本人犯了一个低级错误,定义的猜的数字与随机数相等时运算符使用错误,使用了赋值运算符导致结果错误。
解决方法:把“=”改为“==”即可。
提交列表:
(3)求奇数和
1.流程图:
2.源程序:
#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;
}
本题运用了while语句的无限循环,运行过程中未出现较大问题。
提交列表:
4博客互评
以下是本人与三位同学的博客互评,相互学习借鉴。
李晓晓:http://www.cnblogs.com/Reloaded/p/7825734.html
许天笑:http://www.cnblogs.com/snxtx/p/7824427.html
任佳鹏:http://www.cnblogs.com/rjp123/p/7859004.html