C语言嵌套循环作业

一、PTA实验作业

题目1:7-4 换硬币

1. 本题PTA提交列表

2. 设计思路

  • 1、定义fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量,count:换法总数
  • 2、输入一个金额
  • 3、fen5从money/5开始,fen2从money/2开始,fen1从money开始,若fen55+fen22+fen1=money,输出结果,并且count累加一,然后fen5,fen2,fen1减去一
  • 4、当fen5或fen2或fen1小于等于0时退出循环
  • 5、输出count

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

  • 1、一开始我用的是从一开始依次累加的办法,但是这与题目结果是从大到小的样例不符合,所以答案一直错误。
  • 2、接着我犯了一个比较低级的错误,那就是忘了给count赋初值,所以虽然我在devc上得到的结果是对的,但到了pta就一直提示答案错误。这个错误向同学请教后才发现。

7-5 梅森数

1. 本题PTA提交列表

2. 设计思路

  • 1、定义n为给定的正整数,number为每次的2的n次方减1的值
  • 2、输入n
  • 3、如果n'等于1,直接输出None
  • 4、当i小于等于n时,number=2的i次方减1,i加一
  • 5、当j小于等于number/2+1时,如果number%j==0,退出循环;如果j>number/2 && number!=1,输出number并换行,j加一
  • 6、当j大于j大于number/2+1时,跳到步骤4
  • 7、当i大于n时,结束循环

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

  • 1、这题的错误明显是在j的循环条件判断错了,j应该要在小于number/2+1的时候循环,但我当时比较粗心,以为只要小于number/2就行了。多亏了devc的调试,我发现在i=2也就是刚开始时就无法进入循环,经过仔细观察,我才发现j的循环条件判断错误。

  • 2、上面问题改正后发现自己忘了写n=1的情况,所以又补充了一下,结果忘了在printf后面打分号,导致编译错误。

7-7 歌唱比赛评分系统

1. 本题PTA提交列表

2. 设计思路

  • 1、定义n为评委人数,repeat为重复计算次数,score为评委打的分数,sum为分数和,max为最大分数,min为最小分数
  • 2、输入repeat
  • 3、当i小于等于repeat时,输入评委数,输入第一个分数值,令sum=0,max和min=第一个输入的分数值;再将第一次输入的分数值的值赋给sum,i自增一
  • 4、当j小于n时,输入下一个分数值,sum=sum+score,如果输入的score大于max,令max=score,如果score小于min,令min=score,j自增一
  • 5、当j大于n时,sum=sum-max-min;输出平均值并跳到步骤3
  • 6、当i大于repea时,结束循环

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

-1、这题一开始我将输入n放在最外面,这样在repeat大于一的情况下就无法重复输入n在进行判断了。

  • 2、一开始,我将最大值最小值赋初值都放在第二个循环内,这样的话每次输入的分数都会变成最大最小值,与题意不符。
  • 3、上述两个问题在向同学请教并改正后,我再次提交,却又错了,我输入题目样例没错,然后又试了repeat大于一的情况才发现问题是我忘了每次循环后sum都要回到0,这样才不会影响下一次循环的结果。
  • 4、更改完上述问题后我再次提交,但又错了,我在devc上试了各种数据,都没发现错误,很郁闷的向同学请教,对比了他的代码,才发现在最后的输出结果我少了个换行符- -。

二、同学代码结对互评

1.互评同学名称:郑佳亮

2.我的代码、互评同学代码截图

  • 我的代码
#include<stdio.h>
int main ()
{
	int money,fen5,fen2,fen1,count=0;
	scanf("%d",&money);
	for(fen5=money/5;fen5>0;fen5--)
	for(fen2=money/2;fen2>0;fen2--)
	for(fen1=money;fen1>0;fen1--)
	if(fen5*5+fen2*2+fen1*1==money) {
	printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",fen5,fen2,fen1,fen5+fen2+fen1);
	count++;
}
	printf("count = %d",count);
	return 0;
}
  • 佳亮的代码
#include<stdio.h>
int main(void)
{
	int fen1,fen2,fen5,total,x,count;
	scanf("%d",&x);
	count=0;
	for(fen5=x/5;fen5>=1;fen5--)
	  for(fen2=x/2;fen2>=1;fen2--)
	    for(fen1=x;fen1>=1;fen1--)
	    if(fen1+fen2*2+fen5*5==x){
	    	count++;
	    	printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",fen5,fen2,fen1,fen1+fen2+fen5);
		}
		printf("count = %d",count);
		return 0;
}

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

点评:
a、看了佳亮的博客,我发现我们刚开始都犯了同一个错误,那就是循环条件是从一开始累加的,这样导致了结果与题目输出不符合。虽然从数学角度讲是正确的,但这不符合C语言题目要求,事实上,我有很多题目都是运算结果正确,但输出形式和题目有些许的偏差导致的错误,这一点我需要好好改正。
b、最后提交的代码上看,虽然题目输入金额使用x,我觉得将输入的金额用用money表示会更好,因为这样更见名知义。

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

四、本周学习总结

1.你学会了什么?

  • 1、从大的方面讲我学会了使用嵌套循环
  • 2、细节上,我从具体的题目中学会要把一些语句放在合适的循环条件中,就像歌唱比赛那一题,我将输入n,赋初值放在第二个循环内,使得数据的运行发生错误,导致结果错误
  • 3、还有,通过梅森数和菱形这两题,我学会了要判断好循环条件,梅森数中我漏了一个加一导致了结果错误,好在有devc可以帮助我

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

  • 1、嵌套循环虽然会了,但是我觉得自己并不熟练,还要多多练习
  • 2、做题的时候有时觉得不理解题目甚至毫无思路,我认为这可能是我数学知识不够丰富造成的,我应该试着提升一下自己逻辑思维能力
  • 3、做题时对题目输出要求不够仔细,我很多题都是错在与输出有些许差别上,虽然结果是对的,但是输出的时候确与答案不像,要么顺序不对(如换硬币),要么没有换行(如歌唱比赛),又或者循环包括范围太大(最后一题餐饮服务我的第二个循环范围过大,输出结果与答案一样,但就是提交时一直错误),这只能下次做题时更加细心来解决了!
posted @ 2017-11-11 14:37  网络1711王艺斌  阅读(1457)  评论(2编辑  收藏  举报