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

posted @ 2017-11-14 00:49  郭zx  阅读(5159)  评论(5编辑  收藏  举报