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.局部变量的易错题

原文地址:https://www.cnblogs.com/lyq622/p/7817970.html