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

一、PTA实验作业

题目1:7-1 查询水果价格

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。
输入格式:

输入在一行中给出用户连续输入的若干个编号。

输出格式:

首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

1. 本题PTA提交列表

2. 设计思路

  • 第一步:定义整型变量i存放次数, choice存放用户选择,double price 表示价格;
  • 第二步:显示菜单,用printf()函数形式分别换行输出;
  • 第三步:不用输入,直接进入for循环:for(i=1;i<=5;i++);
  • 第四步:在for内输入用户选择;
  • 第五步:判断choice是否为0,是则程序结束;否则,继续执行下一步;
  • 第六步:使用switch()结构,对四种水果选择进行不同价格给出;
  • 第七步:若不是输入四种水果对应编号,输出0;
  • 第八步:输出价钱price,保留两位小数;

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

  • (1)首先编译过程中的思路可以的情况下,不知道如何用代码表述出来,在【主动输入0时,程序结束】这里会想着直接用break,调试时,也发现会跳出去,没法得到结果,知道不能这样写,该换种表达法;


  • (2)调试时无法进入下一步:调试改正.....



题目2:7-4 换硬币

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

1. 本题PTA提交列表

2. 设计思路

  • 第一步:定义整型变量零钱数额x,fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”,count:换法个数且int count=0;
  • 第二步:输入零钱数额x;
  • 第三步:进入for循环:for(fen5 = x/5; fen5>0; fen5--),fen5 = x/5算出总的fen5钱数,每有一个就在总钱x上作相应减少;
  • 第四步:同第三步for循环,对fen2处理;
  • 第五步:同第三步for循环,对fen1处理;
  • 第六步:检查是否fen55+fen22+fen1*1==x满足,若不满足即出现错误,修改;
  • 第七步:若满足fen55+fen22+fen1*1==x,则输出各硬币数量及硬币总数量:fen5:%d, fen2:%d, fen1:%d, total:%d ",fen5,fen2,fen1,fen5+fen2+fen1;
  • 第八步:换法个数作相应增加,跳出循环;
  • 第九步:继续循环,直至x==0;
  • 第十步:输出换法个数;

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

  • (1)一开始的结果输出与答案差别很大,思路是有的,但转化成程序语言后发现无法实现题目里的效果:
    接着调试,还发现count没有初始值,循环也未用break跳出,导致出现多次count=0,;

  • (2)答案与输出结果不同,总是会多出count一行,经过调试发现把输出的count写进了循环里,需要提到循环外面;

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

为学生歌唱比赛设计一个评分系统,评分规则如下:共有n名评委给分(0~100分),要求去掉一个最高分,去掉一个最低分,剩余成绩的平均分为最终得分。输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数n(3≤n≤10),表示有n个评委,输入n个成绩,输出最终得分,结果保留小数点后两位。

1. 本题PTA提交列表

2. 设计思路

  • 第一步:定义整型变量grade存放成绩,float score,n个成绩,repeat正整数,i大循环次数,j内循环次数,float score存放最后得分;
  • 第二步:输入正整数repeat,提示循环次数;
  • 第三步:进入for大循环:for(i=1;i<=repeat;i++),保证每输入一个成绩都能有同样的操作执行;
  • 第四步:定义输入成绩的总分数int sum=0,定义int max=0&&int min=100,保证输入的后续成绩与min、max分别对比后能最后去掉min、max;
  • 第五步:输入n:scanf("%d",&n);
  • 第六步:进入小循环:for(j=1;j<=n;j++)来比较出最大最小值;
  • 第七步:计算出总分:sum=sum+grade,内循环结束;
  • 第八步:计算出去掉小循环得出的min、max后的sum;
  • 第九步:计算最后得分:score=1.0*sum/(n-2);
  • 第十步:按题目要求输出:printf("score:%.2f ",score);

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

  • (1)一开始的这题碰到的问题就是不知道怎么实现把最大最小值用嵌套循环的方式找出来,然后询问他人后明白了要先赋予值然后在循环里要做的就是不断与输入的成绩进行比较,得出相应的值;
  • (2)按自己原来的思路是把成绩grade直接都先给min、max,这里的grade是可以实现循环后改变的,但结果错误:

接着调试程序,发现一开始score就已经出现了答案,说明在一开始的赋值上就出现问题了,应该把min、max初始值改掉;

  • (3)接着(2)后:int min=0;max=100,运行发现还是错误的,

        继续调试,发现循环竟然是进不去的,说明在条件满足上不符合,得修改,询问同学,知道应该令min=100,max=0,否则否则任何值都比0大,比100小,无法正确得出答案,设置断点位置进入;

二、同学代码结对互评

1.互评同学名称:龚顺德

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

我的代码:

	int i,j,grade,repeat,n;//i大循环次数,j内循环次数 
	float score;

	scanf("%d",&repeat);
	for(i=1;i<=repeat;i++){
			int sum=0;
    int	max=0;
	
    int	min=100;//定义好最大最小,方便后续赋值 不能定义min=o,max=100;否则人和值都比0大,比100小 
			scanf("%d",&n);
		for(j=1;j<=n;j++){
			scanf("%d",&grade);
			if(grade<min)//输入的成绩不断比较大小,赋到相应的min、max中 
		    min=grade;
			if(grade>max)
			max=grade;
			sum=sum+grade;
			
	}
		sum=sum-min-max;
		score=1.0*sum/(n-2);
printf("score:%.2f
",score);
	

互评同学代码:

{
	int repeat,n,i,k,l,max,min,begin,all,num;
	double score;
	scanf("%d",&repeat);
	for(begin=1;begin<=repeat;begin++){
	scanf("%d",&n);
	all=0;
	scanf("%d",&num);
	all=all+num;
	max=num;
	min=num;
	for(i=1;i<=n-1;i++){
		scanf("%d",&num);
		all=all+num;
	    if(num>max) max=num;
	    else if(num<min) min=num;
    }	
	all=all-max-min;
	score=all/((n-2)*1.0);
	printf("score:%.2f
",score);
}

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

  • (1)基本上的思路是一样,没相差太大;不同的就是他用了我一开始想到的把min、max都赋值num,可是他能实现,而我不行,他max=num;
    min=num;与我的int max=0,int min=100;放的位置不同,导致各自运行程序的时候会出现差异;
  • (2)他的没有注释,读起来不太方便,使用了分支结构,定义变量感觉会比自己的更严谨,比较能接受自己的这种代码,相对简单明了,易于接受;

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

四、本周学习总结

1.你学会了什么?

  • (1)嵌套循环(即多重循环)的熟练化,记得上次写博客时就已经有学过循环,只是真正会用还无法做到,在又经过一周的PTA习题和老师讲解,对循环的使用知道了大多数情况下如何取用能让解决一个问题时的程序量减少(即为什么要使用循环和如何实现循环);
  • (2)确定循环条件和循环体,并使用break语句处理多循环问题;
  • (3)用do-while语句构成的循环,在while后的表达式为零时结束循环;
  • (4)平时要注意找正确循环体,易错就是不知道怎么把信息里需要循环的东西用嵌套循环程序语言经过有限次表达出来,课堂派里的题目在让自己补充程序的时候错的最多,总是错,意识到在读一个程序方面还不够;

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

  • (1)不能正确找出循环体,以及用你程序表达出循环,说明嵌套循环还是存在问题;
  • (2)PTA里的题目还是不能写出来,比如【7-3 编程打印空心字符菱形、7-5 梅森数】等,老师的思路理解但自己独立写还是不行;
  • (3)课堂派里需要补充程序的经常错误;
原文地址:https://www.cnblogs.com/78tian/p/7800130.html