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

一、PTA实验作业

题目1:换硬币


1. 本题PTA提交列表

2. 设计思路

  • 1定义整型变量a5,b2,c1,d,x,count
  • 2输入代换的零钱数额x
  • 3定义count的起始值为0
  • 4 a5=x/5,b2=x/2,c1=x,d=a5+b2+c1
  • 5 重复以下步骤,直到5a5+2b2+c1=x时,count++,输出fen5:a5, fen2:b2, fen1:c1, total:d
  • 6 c1=c1-1,不断减少c1的值,带入上述关系式,当c1<=0执行下一步
  • 7 b2=b2-1,不断减少c1的值,带入上述关系式,当b2<=0执行下一步
  • 8 a5=a5-1,当a5<=0时停止循环
  • 9 最后输出满足条件的数组个数count

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

一开始编程时没有好好思考嵌套的顺序,导致输出的顺序不正确,发现错误后调整了嵌套的内外顺序

但是,提交后发现部分正确,在仔细阅读题目后发现题目要求按5分、2分和1分硬币的数量依次从大到小的顺序输出,

在重新思考后把循环输出的顺序改为递减输出,但是运行结果依旧不满足要求

继续运行调试发现自己改代码时输出时的对应a与c错误,改正后运行正确,提交正确。

题目2:梅森数


1. 本题PTA提交列表

2. 设计思路

  • 1定义整型变量i,j,number,n
  • 2输入正整数n
  • 3如果n=1,输出None
  • 4 i=2,当i<=n时循环下面步骤
  • 5 number=pow(2,i)-1
  • 6 j=2,当j<number时循环执行下列步骤
  • 7 若不满足number%j=0,则j++,可执行下一步,若满足则结束循环
  • 8 若j>number/2,则输出满足该条件的number值,i++

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

在没很好的思考下就直接编写,运行后有许多漏洞,出现数值的重复输出问题


自己就想用break停止再执行输出相同的数据且让不必要的数值不要输出,

但是,执行后虽然没有同样数值重复输出的问题,却把所有可能的数值都输出,

调试后发现,在执行break语句后,会执行下面的printf语句,导致数据都输出,不满足要求

在借鉴课本,重新思考后,修改了自己的编辑,调整后运行正确。

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


1. 本题PTA提交列表


2. 设计思路

  • 1 定义浮点型变量循环次数repeat,评委n,分数a,最小min,最大max,循环变量i,j,k,总分sum,最终得分score
  • 2 输入repeat的值
  • 3 k=1,当k<=repeat时执行循环以下步骤
  • 4 输入评委n的值
  • 5 sum=0,min=100,max=0
  • 6 i=1,i<=n时循环执行以下步骤
  • 7 输入分数a
  • 8 如果a>=max则max=a;如果min>=a则min=a
  • 9 sum=sum+a;i++
  • 10score=(sum-min-max)*1.0/(n-2),并保留两位小数的形式输出score的值,k++

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

开始写代码时,自己的思维还不够清晰,想利用循环直接得出sum的最终值,找到最大最小值,

但编辑时把b=a这个赋值的位置放错,造成每次判断条件之前b都已经和a相等,不正确

在修改后,运行发现结果与pta上的呈现相同,但是提交后发现答案错误,

在助教的提醒下发现是自己没有考虑运行次数

在经过调试改正后上交pta发现依旧答案错误,但是Dev-c++运行结果都符合

自己在可能出现的pta要求上修改,发现依旧答案错误,后在同学的提醒下考虑每次的换行问题,添加换行符后正确

二、同学代码结对互评

1 互评同学名称:何君霞,刘艳钦

2 代码截图

歌唱比赛评分系统

君霞的代码

#include<stdio.h>
int main()
{
  int repeat,i,n,j;                        //repeat表示运算次数,n表示评委人数,ij为循环变量
  double score,max,min,sum,average;        //score表示得分,max表示最高分数,min表示最低分数,sum表示分数总和,average表示最终结果
  scanf("%d\n",&repeat);                   //输入repeat
	for(i=1;i<=repeat;i++){                  //做repeat次运算
	  max=0;
	  min=0;
	  sum=0;
	  scanf("%d\n",&n);                      //输入n和第一个得分
    scanf("%lf",&score);
    min=max=sum=score;	                   //先让最大值,最小值,和总和等于第一个分数
		for(j=1;j<n;j++){                    
			scanf("%lf",&score);                 //输入下一个分数
			sum+=score;                          //sum等于分数的累加
			while(score>max)                     //如果输入的分数比最大值大,则让最大值等于该分数
			    max=score;
      while(score<min)                     //如果输入的分数比最小值大,则让最小值等于该分数
          min=score;
	    }
	  average=(sum-min-max)*1.0/(n-2);       //最终结果为去掉最大值,去掉最小值,剩余成绩的平均分
	  printf("score:%.2f\n",average);        //输出结果并换行,进行下一次运算
	}
    return 0;
}

艳钦的代码

#include <stdio.h>
int main ()
{
	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的值进入下一轮循环
}
  return 0;
}  

我的代码

#include<stdio.h>
int main()
{
  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);
	}
	return 0;
}

3.我的代码和同学的代码不同在哪里?有哪些各自的优势?你更喜欢哪种代码风格?

我的思路是把所有的数在循环中一次性比较,直接从一开始就定义min=100的最大,max=0的最小,保证一开始就能满足条件赋值,自己循环比较赋值

君霞的思路是先输入一个数,把min,max都等于该数后下一个数与上一个数循环的比较

艳钦的思路是先输出两个数比较,得出min,max,再输第三个数与min,max比较再输入其他数循环比较,最后思路都相同,都想要利用总数减去min,max计算最后总分

艳钦的代码比较长,但是她的代码定义直接明了,注释清晰,君霞代码的定义也比我规范易懂,注释也比较用心了然,整体的代码较简洁,自己的代码虽然简洁,但是在代码的定义上还不够,在不了解评分范围时也不及艳钦君霞适用

我喜欢君霞的代码风格。

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

四、本周学习总结

1.你学会了什么?

1 函数定义的一般形式:

函数类型 函数名(形参)//函数首部

{
函数实现过程 //函数体
}

2 函数:自定义函数、库函数

3 函数首部后面不能加分号,它和函数体一起构成完整的函数定义,但是函数声明时记得加分号

4 形参表不能写成doubler,h

5 C程序执行首先从主函数main()开始函数调用时,主函数才停止执行,转执行相应的函数,再返回主函数继续执行

6 形参实参数量顺序一一对应,只允许实参单向把值赋给形参,形参的改变不影响实参

7 局部变量(作用范围仅限函数内部)全局变量(全部有效,两者同名时函数中局部变量起作用)

8 静态变量赋初值只在第一次调用有效,以后都用前一次调用保留的值

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

1 函数的调用不够熟练,形参实参的对应转换

2 较复杂的嵌套循环,在思维和数学的方面不够敏感,如pta里的菱形那题

3 return返回值的使用,多个返回值时的使用

4 这周学习了很多概念名称,对于他们的使用和限制不够清晰,理解不够

5 打pta时发现要培养敏锐的细节意识,换不换行,换行放在哪里,要好好注意

posted @ 2017-11-11 16:31  hahaha233  阅读(663)  评论(5编辑  收藏  举报