C语言程序设计第六次作业——循环结构(2)

(一)改错题
序列求和:输入一个正实数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:

   错误原因:缺少“;”,语句无法结束。

  改正方法:

  错误信息2:

  错误原因:double型输入时l不可省略,应为%lf
  改正方法:

  错误信息3:

  错误原因:两整型相除为整型 
改正方法:

   错误原因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):

结果(2):

原因:第一个循环程序使用了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)流程图
C语言程序设计第六次作业——循环结构(2)_第1张图片

(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)流程图
C语言程序设计第六次作业——循环结构(2)_第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)实验分析

问题:C语言程序设计第六次作业——循环结构(2)_第3张图片

原因:C语言程序设计第六次作业——循环结构(2)_第4张图片

解决方法:C语言程序设计第六次作业——循环结构(2)_第5张图片

(5)本题PTA提交列表

3.求奇数和
(1)题目
本题要求计算给定的一系列正整数中奇数的和。
注意:第一个值为负的情况。Sum初值
(2)流程图
C语言程序设计第六次作业——循环结构(2)_第6张图片

(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

你可能感兴趣的:(C语言程序设计第六次作业——循环结构(2))