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

一、PTA实验作业

题目1:7-4 换硬币

1.本题PTA提交列表

C语言博客作业--嵌套循环_第1张图片

2. 设计思路

  • 1.定义整数型变量money,count,total分别用来存放要换的零钱,换法个数和硬币数量和,定义整数型变量fen1.fen2.fen5分别代表一分两分五分的数量
  • 2.赋初值,count=0,total=0
  • 3.输入money
  • 4.枚举法,讨论所有可能的五分钱的个数情况
  • 5.枚举法,讨论所有可能的两分钱的个数情况
  • 6.枚举法,讨论所有可能的一分钱的个数情况
  • 7.判断是否符合1fen1+2fen2+5*fen5==money,若是,则total=fen1+fen2+fen5,count++,并输出各种换法情况
  • 8.输出count的值

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

  • 1.本题思路清晰也很相似与课本例题,但是却有个大坑,导致无论DevC++运行再怎么正确,输入再多数据测试和调试都无济于事....这种情况下请回到 最初开始的地方:认真审题!!一步一步对照要求!!!
  • 1232223-20171111194333841-304618309.png

这是一句看似容易理解但是会忽略其重点的:按5.2.1分循环+从大到小 输出==先尽可能多地输出5fen的数量然后2fen,1fen。如果意识到这个问题后就会发现一开始的代码确实不符合题意,下面是正确(上)错误(下)进行对比,一目了然
1232223-20171111124921669-331939438.png
1232223-20171111124933122-1912142515.png

题目2:7-7 歌唱比赛评分系统

1.本题PTA提交列表

C语言博客作业--嵌套循环_第2张图片

2. 设计思路

1.定义整数型变量n,repeat分别代表评委的数量和选手的数量,i,k分别代表循环次数,point代表各个评委给出的分数,point1和point2分别代表第一个评委和第二个评委给出的分数
2.输入repeat的值
3.赋初值,i=1,k=1
4.分别输入n,point1,point2的值
5.sum=point1+point2,先把point1和point2的值保留到sum里去
6.利用if语句进行比较,使max等于point1,point2中较大的值,min等于较小的值
7.输入后面评委给出的分数point
8.sum=sum+point, 每输出一个point值就加到sum里
9.利用if语句语句把每个point值与max和min进行比较,使最大值在max,最小值在min
10.k=k++;
11.重复步骤7,直到k>n-2
12.sum=sum-min-max
13.sore=sum/(n-2)
14.输出score的值
15.sum=0; 清空sum的值进入下一轮的循环
16.i=i++
17.重复步骤4,直到i<=repeat

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

  • 1.运行后答案错误
    C语言博客作业--嵌套循环_第3张图片

  • 2.进行调试监视变量
    C语言博客作业--嵌套循环_第4张图片
    从左边的变量可以看出point的赋值出现了错误,于是查看point输入语句,发现point的定义是double型,但是输入时误用%d-整数型
  • 3.把point的输入语句修改成%lf后输出正确答案
    C语言博客作业--嵌套循环_第5张图片
  • 4.但是事情远没有想象中那么简单,PTA依然显示答案错误,于是进行调试和多组数组测试
    C语言博客作业--嵌套循环_第6张图片
    遗憾的是依然输出正确答案,调试已经起不了太大作用了,在一番纠结和耗掉大量精力以后选择向学长请教,在和学长一同探讨下发现了问题所在:n应该按题意放在repeat的循环下输入
    1232223-20171111121019919-81919501.png
  • 5.在改正了n的输入位置后提交显示格式错误,终于不是答案错误已经使成功了一大步了,在分析后得知应该是最后的输出score需要换行,于是终于得到了来之不易的答案正确

题目3:7-8 餐饮服务质量调查打分

1.本题PTA提交列表

C语言博客作业--嵌套循环_第7张图片

2. 设计思路

  • 1.定义整数型变量n,repeat,grade,i,k,a分别代表学生数,重复统计,学生所给的分数和循环次数,定义整数型变量count1.2.3.4.5分别代表相应分数对应的人数
  • 2.输入repeat的值
  • 3.赋初值:i=1,k=1,a=1
  • 4.输入n的值
  • 5.赋值:count1.2.3.4.5=0 (确保每次循环count被清空)
  • 6.输入grade的值
  • 7.利用 switch(grade) 来对应累加count1.2.3.4.5
  • 8.k++; 重复步骤6直到k>n
  • 9.输出 1:
  • 10,输出*
  • 11.a++; 重复步骤10直到a>count1
  • 12.换行
  • 13.count2.3.4.5类似于9的操作
  • 14.i++,重复步骤4,直到i>repeat

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

  • 1.思路不清晰:纠结于如何让*紧随于1:后面而且还能多次循环输出
  • 解决方法:在一番尝试后找到思路,发现把1:放在需要累加*的循环外不要换行即可紧随
  • 2.答案错误,进行调试
    C语言博客作业--嵌套循环_第8张图片
    C语言博客作业--嵌套循环_第9张图片

解决思路:从检测变量的值可以看出:count1累加后,count2.3.4.5无法累加,直接进入下一个循环,分析发现是错误多用了break语句,导致跳出for循环使其他count无法累加

  • 3.修改好2的错误后终于输出了正确答案,但是遇到做PTA有史以来第一次运行超时
    C语言博客作业--嵌套循环_第10张图片
    1232223-20171111131912138-638761540.png

解决思路:想办法使代码更加简短且运行效率提高,长时间思考代码后发现可以把 if的判断语句改成switch(grade)语句来提高运行效率

  • 4.当仍然处在改代码提高效率的骄傲中PTA却是答案错误.....没事,终于不是运行超时也是一种进步,大不了继续调试多数据测试
    C语言博客作业--嵌套循环_第11张图片
    C语言博客作业--嵌套循环_第12张图片

解决思路:在耗费了非常长的一段时间但是为找出任何错误后,求助于老师后得知,原来是冒号错误.....应该严格按照题目所用的冒号
跪着反思: 一定一定一定输出格式严格复制PTA的输出格式,连空格都不放过!!!

二、同学代码结对互评(2分)

刘艳钦同学

    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的值进入下一轮循环
}
林晓露同学

  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);
    }
  • 代码的不同点:对于从point中找出max和min的办法不同,我是利用上次输入一段数字按从大到小输出的思想,想先输入两个值来给max和min赋值,然后再一一比较,而她是利用题目所提及的边界值,直接使min=0,max=100,然后再一一比较
  • 我更喜欢她的代码风格,因为她的代码比我更简洁明了些,相对我的代码来说,她的代码的执行效率会更高,但是她的这种做法也有局限性,就是需要已知point的边界值,当然我的做法也有局限,就是必须得已知评委数大于等于3
  • 劣势:代码的整齐度有待提高,也是我需要进步的地方

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

PTA排名

1232223-20171111125101184-827492611.png

四、本周学习总结(1分)

1.你学会了什么?

- for循环的嵌套

即在for循环里面再加入一个或多个for循环(注:其它循环或if条件结构也可以加入)

for(表达式1;表达式2;表达式3){

       for(表达式1;表达式2;表达式3){

}

}

这里有内外两个循环,步骤为先执行外循环的表达式1和2然后再内循环的表达式1,2,3然后再执行外循环的表达式3.即当内循环全部执行完一次之后,再执行外循环。

  • 这周的pta作业中仍然出现了break和continue语句的用法模糊导致错误:重温——注: break跳出循环   continue:跳过这个循环,执行下一步

while(n) 的含义

当n=0时,退出这个循环,当n不等于0时,执行这个循环
事实上,C语言提供了一个条件 非零就可以为真的标准,而不是真就是1,假就是0。所以while(可以满足非零的表达式),例如while(n),程序就可以进入循环体里面。

循环结构中变量的作用域问题,全局变量,局部变量和变量的生命周期

  • 局部变量
    在函数内定义的变量(包括形参)
    作用范围: 本函数内部
  • 定义在复合语句内的变量
    作用范围: 复合语句内部
  • 全局变量
    在函数以外定义的变量,不从属于任一函数。
    作用范围: 从定义处到源文件结束(包括各函数)

PTA作业的总结:

  • 1.从本次耗时很长的错误都出现在没有完全符合题意中,反思一定一定要非常认真去理解清楚题目的要求,同时也总结出两小点关于如果DevC++运行正确而且调试实在找不出答案的话:
    <1> 回到最初的起点:eg:7-4,7-7 重新认真审题然后与自己的代码顺序思路一一对比
    <2> 是否是输出问题:eg:7-8的冒号问题还有之前各种输出空格问题 ,请以后一定要严格复制题目的输出范例,拒绝没效率地打代码
  • 2. switch语句比if语句的代码执行效率高 :eg:7-8

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

  • 进入嵌套循环结构后,代码的思路更加的复杂,而我的代码总是没办法那么简洁,相对同学的来说会更加复杂一些,需要学会有更好的思路来解题
  • 嵌套循环的算法描述不够清晰,想尝试流程图却无从下手,需要继续学习
  • 对打印菱形心形等题目还没完全掌握,处于一知半解的状态,要去查找更多相似的题型去实践去熟练
  • 对全局变量的运用类型,调用函数等还不够熟练,仍然需要继续努力学习
    eg.局部变量的易错题
    C语言博客作业--嵌套循环_第13张图片
    C语言博客作业--嵌套循环_第14张图片

转载于:https://www.cnblogs.com/lyq622/p/7817970.html

你可能感兴趣的:(c/c++)