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

posted @ 2017-11-19 18:40  沐栀*  阅读(444)  评论(4编辑  收藏  举报