C语言博客作业--嵌套循环

一、PTA实验作业

题目1:换硬币


1. 本题PTA提交列表

1233791-20171110131106200-222763059.png

2. 设计思路

  • 1定义整型变量a5,b2,c1,d,x,count
  • 2输入代换的零钱数额x
  • 3定义count的起始值为0
  • 4 a5=x/5,b2=x/2,c1=x,d=a5+b2+c1
  • 5 重复以下步骤,直到5a5+2b2+c1=x时,count++,输出fen5:a5, fen2:b2, fen1:c1, total:d
  • 6 c1=c1-1,不断减少c1的值,带入上述关系式,当c1<=0执行下一步
  • 7 b2=b2-1,不断减少c1的值,带入上述关系式,当b2<=0执行下一步
  • 8 a5=a5-1,当a5<=0时停止循环
  • 9 最后输出满足条件的数组个数count

3.本题调试过程碰到问题及解决办法

1233791-20171110163335794-856941349.png

一开始编程时没有好好思考嵌套的顺序,导致输出的顺序不正确,发现错误后调整了嵌套的内外顺序

1233791-20171110163343247-714529563.png

但是,提交后发现部分正确,在仔细阅读题目后发现题目要求按5分、2分和1分硬币的数量依次从大到小的顺序输出,

1233791-20171110163351138-628263142.png

在重新思考后把循环输出的顺序改为递减输出,但是运行结果依旧不满足要求

1233791-20171110163400419-244624169.png

继续运行调试发现自己改代码时输出时的对应a与c错误,改正后运行正确,提交正确。

题目2:梅森数


1. 本题PTA提交列表

1233791-20171110131129075-1869586949.png

2. 设计思路

  • 1定义整型变量i,j,number,n
  • 2输入正整数n
  • 3如果n=1,输出None
  • 4 i=2,当i<=n时循环下面步骤
  • 5 number=pow(2,i)-1
  • 6 j=2,当j<number时循环执行下列步骤
  • 7 若不满足number%j=0,则j++,可执行下一步,若满足则结束循环
  • 8 若j>number/2,则输出满足该条件的number值,i++

3.本题调试过程碰到问题及解决办法

1233791-20171111092847138-1232590645.png

在没很好的思考下就直接编写,运行后有许多漏洞,出现数值的重复输出问题

1233791-20171111093201825-1470244722.png

1233791-20171111092951934-216572935.png
1233791-20171111092939184-157310224.png

自己就想用break停止再执行输出相同的数据且让不必要的数值不要输出,

但是,执行后虽然没有同样数值重复输出的问题,却把所有可能的数值都输出,

调试后发现,在执行break语句后,会执行下面的printf语句,导致数据都输出,不满足要求

1233791-20171111101300122-746632499.png

在借鉴课本,重新思考后,修改了自己的编辑,调整后运行正确。

题目3:歌唱比赛评分系统


1. 本题PTA提交列表

1233791-20171110131236309-2107619310.png
1233791-20171110131250013-1289056313.png

2. 设计思路

  • 1 定义浮点型变量循环次数repeat,评委n,分数a,最小min,最大max,循环变量i,j,k,总分sum,最终得分score
  • 2 输入repeat的值
  • 3 k=1,当k<=repeat时执行循环以下步骤
  • 4 输入评委n的值
  • 5 sum=0,min=100,max=0
  • 6 i=1,i<=n时循环执行以下步骤
  • 7 输入分数a
  • 8 如果a>=max则max=a;如果min>=a则min=a
  • 9 sum=sum+a;i++
  • 10score=(sum-min-max)*1.0/(n-2),并保留两位小数的形式输出score的值,k++

3.本题调试过程碰到问题及解决办法

1233791-20171111094431700-166895595.png

开始写代码时,自己的思维还不够清晰,想利用循环直接得出sum的最终值,找到最大最小值,

但编辑时把b=a这个赋值的位置放错,造成每次判断条件之前b都已经和a相等,不正确

1233791-20171111094442559-1693101674.png

在修改后,运行发现结果与pta上的呈现相同,但是提交后发现答案错误,

在助教的提醒下发现是自己没有考虑运行次数

1233791-20171111110249528-1091350354.png

在经过调试改正后上交pta发现依旧答案错误,但是Dev-c++运行结果都符合

自己在可能出现的pta要求上修改,发现依旧答案错误,后在同学的提醒下考虑每次的换行问题,添加换行符后正确

二、同学代码结对互评

1 互评同学名称:何君霞,刘艳钦

2 代码截图

歌唱比赛评分系统

君霞的代码

#include<stdio.h>
int main()
{
  int repeat,i,n,j;                        //repeat表示运算次数,n表示评委人数,ij为循环变量
  double score,max,min,sum,average;        //score表示得分,max表示最高分数,min表示最低分数,sum表示分数总和,average表示最终结果
  scanf("%d\n",&repeat);                   //输入repeat
    for(i=1;i<=repeat;i++){                  //做repeat次运算
      max=0;
      min=0;
      sum=0;
      scanf("%d\n",&n);                      //输入n和第一个得分
    scanf("%lf",&score);
    min=max=sum=score;                     //先让最大值,最小值,和总和等于第一个分数
        for(j=1;j<n;j++){                    
            scanf("%lf",&score);                 //输入下一个分数
            sum+=score;                          //sum等于分数的累加
            while(score>max)                     //如果输入的分数比最大值大,则让最大值等于该分数
                max=score;
      while(score<min)                     //如果输入的分数比最小值大,则让最小值等于该分数
          min=score;
        }
      average=(sum-min-max)*1.0/(n-2);       //最终结果为去掉最大值,去掉最小值,剩余成绩的平均分
      printf("score:%.2f\n",average);        //输出结果并换行,进行下一次运算
    }
    return 0;
}

艳钦的代码

#include <stdio.h>
int main ()
{
    int i,k,n,repeat;       //n代表评委的数量,repeat代表选手的数量 
    double point1,point2,point,score,sum;        //point代表各个评委给出的分数,score代表最终所得分,sum代表 
    double max,min;                             //max代表最大值,min代表最小值 
    scanf("%d",&repeat);              //输入repeat的值
    for(i=1;i<=repeat;i++){           
    scanf("%d",&n);
    scanf("%lf",&point1);
    scanf("%lf",&point2);
    sum=point1+point2;
     if(point1>point2){          //判断point1和point2的大小关系
        max=point1;              //把较大的值赋给max
          min=point2;              //较小的值赋给min
        }
       else{
            max=point2;
              min=point1;
        }
  for(k=1;k<=n-2;k++){
    scanf("%lf",&point);        
    sum=sum+point;           //每输出一个point值就加到sum里去
      if(point>min){         //把每个point值进行比较,使最大值在max,最小值在min
        min=min;
        if(point>max){
            max=point;
        }
          else{
              max=max;
        }
    }
        else{
            min=point;
        }
  }
  sum=sum-min-max;        //总分减去一个最高分和一个最低分
  score=sum/(n-2);        //最后成绩等于平均分
  printf("score:%.2f\n",score);   //输出答案
  sum=0;                       //清空sum的值进入下一轮循环
}
  return 0;
}  

我的代码

#include<stdio.h>
int main()
{
  double repeat,n,a,min,max,i,j,k;//repeat循环运算,n评委,a为输入的分数//
    double score,sum;//最终得分与求和//
    scanf("%lf\n",&repeat);
    for(k=1;k<=repeat;k++){//repeat次循环运算//
        scanf("%lf\n",&n); //确定n的值,数值的赋值//
          sum=0;
        min=100;
        max=0;
     for(i=1;i<=n;i++){//循环得出最大最小值,和总和sum//
        scanf("%lfd",&a);
        if(a>=max)
         max=a;
    if(min>=a)
         min=a;
        sum=sum+a;
    }
    score=(sum-min-max)*1.0/(n-2);//计算最终得分//
    printf("score:%.2f\n",score);
    }
    return 0;
}

3.我的代码和同学的代码不同在哪里?有哪些各自的优势?你更喜欢哪种代码风格?

我的思路是把所有的数在循环中一次性比较,直接从一开始就定义min=100的最大,max=0的最小,保证一开始就能满足条件赋值,自己循环比较赋值

君霞的思路是先输入一个数,把min,max都等于该数后下一个数与上一个数循环的比较

艳钦的思路是先输出两个数比较,得出min,max,再输第三个数与min,max比较再输入其他数循环比较,最后思路都相同,都想要利用总数减去min,max计算最后总分

艳钦的代码比较长,但是她的代码定义直接明了,注释清晰,君霞代码的定义也比我规范易懂,注释也比较用心了然,整体的代码较简洁,自己的代码虽然简洁,但是在代码的定义上还不够,在不了解评分范围时也不及艳钦君霞适用

我喜欢君霞的代码风格。

三、截图本周题目集的PTA最后排名。

1233791-20171111130341981-1660538266.png

四、本周学习总结

1.你学会了什么?

1 函数定义的一般形式:

函数类型 函数名(形参)//函数首部

{
函数实现过程 //函数体
}

2 函数:自定义函数、库函数

3 函数首部后面不能加分号,它和函数体一起构成完整的函数定义,但是函数声明时记得加分号

4 形参表不能写成doubler,h

5 C程序执行首先从主函数main()开始函数调用时,主函数才停止执行,转执行相应的函数,再返回主函数继续执行

6 形参实参数量顺序一一对应,只允许实参单向把值赋给形参,形参的改变不影响实参

7 局部变量(作用范围仅限函数内部)全局变量(全部有效,两者同名时函数中局部变量起作用)

8 静态变量赋初值只在第一次调用有效,以后都用前一次调用保留的值

2.本周的内容,你还不会什么?

1 函数的调用不够熟练,形参实参的对应转换

2 较复杂的嵌套循环,在思维和数学的方面不够敏感,如pta里的菱形那题

3 return返回值的使用,多个返回值时的使用

4 这周学习了很多概念名称,对于他们的使用和限制不够清晰,理解不够

5 打pta时发现要培养敏锐的细节意识,换不换行,换行放在哪里,要好好注意

转载于:https://www.cnblogs.com/linxiaolu/p/7802025.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值