c语言第六次作业

(一)改错题

错误信息1:

1242134-20171113130553109-547908946.jpg

错误原因: do while的形式最后的while的后面有;
改正方法: 在while后面加一个;
错误信息2:

1242134-20171113130558296-1546406139.png

错误原因: 1是整形n是整形所以得数是0或1
改正方法: 把1改为1.0
错误信息3:

1242134-20171115090630906-234817851.png

错误原因:%f与%lf精确度有差
改正方法:将%f改为%lf

(二)学习总结

1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
while(1)和for(;;)表示的是无限循环,
2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
第一个应该用for循环

1242134-20171114223301546-721288915.png
1>for循环:适合于循环次数是已知的。

第二个应该用while循环

1242134-20171114223648312-1764301459.png
2>while:适合于循环次数是未知的。

第三个应该用do while循环

1242134-20171114223538421-689897009.png
3>do while:适合于循环至少执行一次的。

3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
(要求分别用for语句、while语句、do while语句和无限循环四种循环语句实现,并说明你认为哪种形式更合适?)
#include <stdio.h>
int main()
{
    int x,i=0;
    double t,sum=0;
    
    for(;1;)
    {
        scanf("%d",&x);
    
        if(x==-1)
        {
            break;
        }
        else
        {
            sum=sum+x;
            i++;
        }
    }
    t=sum/i;
    printf("%f",t);
}
#include <stdio.h>
int main()
{
    int x,i=0;
    double t,sum=0;
    
    while(1)
    {
        scanf("%d",&x);
    
        if(x==-1)
        {
            break;
        }
        else
        {
            sum=sum+x;
            i++;
        }
    }
    t=sum/i;
    printf("%f",t); 
}
#include <stdio.h>
int main()
{
    int x,i=0;
    double t,sum=0;
    do{
        scanf("%d",&x);
        sum=sum+x;
        i++;
    }while(x!=-1);
    sum=sum-x;
    i=i-1;
    t=sum/i;
    printf("%f",t); 
}
用do...while语句比较好,至少执行一次。
4.运行下面程序,输入1到10,结果分别是什么?为什么?
(1)
#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;
}
(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;
}
结果1:

1242134-20171115092725624-615092471.png

break是执行完上边语句后直接跳出不再运行。<1>输入1时不符合if语句,执行了s=s+n,<2>输入2时运行if语句,结束语句,后面的数输入无效。所以s=1.
结果2:

1242134-20171115092728671-1987243009.png

continue是不执行后面的语句,直接再重新运行。<1>输入奇数时不符合if语句,执行了s=s+n,<2>偶数全部从新执行循环语句。

(三)实验总结

7-1 求给定精度的简单交错序列部分和(10 分)
(1)题目

本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。

(2)流程图

1242134-20171113204848046-1175593828.png

(3)源代码
#include <stdio.h>
#include<math.h>
int main()
{
    int i,m,n;
    double sum=0,eps,t;
    n=1;
    i=1;
    scanf("%lf",&eps);
    
    while(1.0/i>eps)
    {
        t=pow((-1),n+1);
        sum=sum+1.0/i*t;
        n=n+1;
        i=i+3;
    }
    t=pow((-1),n+1);
    sum=sum+1.0/i*t;
    printf("sum = %.6f",sum);
    
}
(4)实验分析
问题1:最后输出为0.000000
原因: i是整形直接用1/i最后结果为0.
解决办法:将1改为1.0
问题2:输出结果不对
原因: 式子错误,t的正负错误。
解决办法:t=pow((-1),n);改为t=pow((-1),n+1);
(5)本题PTA提交列表

1242134-20171113132747265-1479795384.png

7-2 猜数字游戏(20 分)
(1)题目

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

(2)流程图

1242134-20171113205019109-1639659647.png
1242134-20171113205022109-2097023413.png

(3)源代码
#include <stdio.h>
int main()
{
    int i,n=0,a,N; 
    scanf("%d",&i);
    scanf("%d",&N);
    while(n<=N)
    {
        scanf("%d",&a);
        n=n+1;
        if(a<0)
        {
            printf("Game Over\n");
            break;
        }
        if(i>a)
        {
            printf("Too small\n");
            
        }
        else if(i<a)
        {
            printf("Too big\n");
            
        }
        else
        {
            
            if(n==1)
            {
                printf("Bingo!\n");
                break;
            }
            else if(n>1&&n<=3)
            {
                printf("Lucky You!\n");
                break;
            }
            else if(n>3&&n<=N)
            {
                printf("Good Guess!\n");
                break;
            }
            else
            {
                printf("Game Over\n");
                break;
            }
        }
        
    } 
    
}
(4)实验分析
问题:格式错误
原因: 每一个输出语句最后没有加“\n”
解决办法:输出语句中加“\n”
(5)本题PTA提交列表

1242134-20171113133142984-2120142570.png

7-3 求奇数和(10 分)
(1)题目

本题要求计算给定的一系列正整数中奇数的和。

(2)流程图

1242134-20171113204852624-23976050.png

(3)源代码
#include <stdio.h>
int main()
{
    int a,sum;
    sum=0;
    while(1)
    {
        scanf("%d",&a);
        if(a<=0)
            break;
        if(a%2==1)
        {
            
            sum=sum+a;
        }
    }
    printf("%d",sum);
}
(4)实验分析
问题:运行超时
原因:没有考虑结尾为0
解决办法:if条件语句中将a<0,改为a<=0
(5)本题PTA提交列表

1242134-20171113133146874-1388042922.png

(四)博客互评

风里你在:http://www.cnblogs.com/GX201701-/p/7828562.html
许天笑:http://www.cnblogs.com/snxtx/p/7824427.html
ShizukaiRi:http://www.cnblogs.com/Reloaded/p/7825734.html

转载于:https://www.cnblogs.com/HGD980425/p/7837319.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值