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


    一、PTA实验作业

    题目1:7-4 换硬币

    1.本题PTA提交列表

    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++运行再怎么正确,输入再多数据测试和调试都无济于事....这种情况下请回到 最初开始的地方:认真审题!!一步一步对照要求!!!

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

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

    1.本题PTA提交列表

    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.运行后答案错误

    • 2.进行调试监视变量

      从左边的变量可以看出point的赋值出现了错误,于是查看point输入语句,发现point的定义是double型,但是输入时误用%d-整数型

    • 3.把point的输入语句修改成%lf后输出正确答案

    • 4.但是事情远没有想象中那么简单,PTA依然显示答案错误,于是进行调试和多组数组测试

      遗憾的是依然输出正确答案,调试已经起不了太大作用了,在一番纠结和耗掉大量精力以后选择向学长请教,在和学长一同探讨下发现了问题所在:n应该按题意放在repeat的循环下输入

    • 5.在改正了n的输入位置后提交显示格式错误,终于不是答案错误已经使成功了一大步了,在分析后得知应该是最后的输出score需要换行,于是终于得到了来之不易的答案正确

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

    1.本题PTA提交列表

    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.答案错误,进行调试

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

    • 3.修改好2的错误后终于输出了正确答案,但是遇到做PTA有史以来第一次运行超时

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

    • 4.当仍然处在改代码提高效率的骄傲中PTA却是答案错误.....没事,终于不是运行超时也是一种进步,大不了继续调试多数据测试

    解决思路:在耗费了非常长的一段时间但是为找出任何错误后,求助于老师后得知,原来是冒号错误.....应该严格按照题目所用的冒号
    跪着反思: 一定一定一定输出格式严格复制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
    ",score);   //输出答案
      sum=0;                       //清空sum的值进入下一轮循环
    }
    
    
    林晓露同学
    
      double repeat,n,a,min,max,i,j,k;//repeat循环运算,n评委,a为输入的分数//
    	double score,sum;//最终得分与求和//
    	scanf("%lf
    ",&repeat);
    	for(k=1;k<=repeat;k++){//repeat次循环运算//
    	  	scanf("%lf
    ",&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
    ",score);
    	}
    
    
    • 代码的不同点:对于从point中找出max和min的办法不同,我是利用上次输入一段数字按从大到小输出的思想,想先输入两个值来给max和min赋值,然后再一一比较,而她是利用题目所提及的边界值,直接使min=0,max=100,然后再一一比较
    • 我更喜欢她的代码风格,因为她的代码比我更简洁明了些,相对我的代码来说,她的代码的执行效率会更高,但是她的这种做法也有局限性,就是需要已知point的边界值,当然我的做法也有局限,就是必须得已知评委数大于等于3
    • 劣势:代码的整齐度有待提高,也是我需要进步的地方

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

    PTA排名

    四、本周学习总结(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.局部变量的易错题

  • 相关阅读:
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    121.Best Time to Buy and Sell Stock---dp
    136.Single Number---异或、位运算
    141.Linked List Cycle---双指针
    Restful接口设计
    socket网络编程
    107.Binary Tree Level Order Traversal II
  • 原文地址:https://www.cnblogs.com/lyq622/p/7817970.html
Copyright © 2020-2023  润新知