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

一、PTA实验作业

题目1:梅森数

1. 本题PTA提交列表

2. 设计思路

  • 第一步:定义整型变量i=2,j=2,n,mersenne,count=0
  • 第二步:输入正整数n
  • 第三步:当i<=n时进入循环, mersenne=pow(2,i)-1,进入下一步
  • 第四步:当j<=mersenne时,进入循环。如果mersenne%j==0,结束本次循环;如果j>sqrt(mersenne),输出mersenne,count=count+1
  • 第五步:j=j+1
  • 第六步:当j>mersenne时,结束循环,n=n+1,重新执行步骤3、4、5
  • 第七步:当i>n时,结束循环
  • 第八步:如果count=0,输出None

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

1.最开始写代码时,是想先判断出小于pow(2,i)-1的数有哪些为素数,然后再判断出符合条件的梅森数,写一半后发现不知道如何写出判断是否为梅森数的代码,纠结了好久,想了好久都想不出来,后来仔细想了想,我可以先算出pow(2,i)-1的数,再判断它是否为素数,这样会简单点。
2.忽略了没有梅森数时的情况
代码只写到这里就结束了,没有考虑到没有梅森数时的这种情况

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

1. 本题PTA提交列表

2. 设计思路

  • 第一步:定义整型变量i=1,j=1,n,repeat,mark,sum=0,max,min;定义浮点型变量score,repeat存放做运算的次数,mark存放输入的成绩,score存放减去一个最高分和一个最低分后的平均分
  • 第二步:输入repeat和n,输入第一个成绩mark,sum=sum+mark;max=mark;min=mark;
  • 第三步:i<=repeat时进入循环,如果i!=1,输入n和mark,max=mark;min=mark;sum=mark;
  • 第四步:j<=n-1输入下一个成绩mark
  • 第五步:如果mark>max,max=mark;
  • 第六步:如果mark<min,min=mark;
  • 第七步:sum=sum+mark,j=j+1,重复步骤4-7
  • 第八步:当j>n-1时,结束循环,i=i+1,重复步骤3-7
  • 第九步:当i>repeat时,结束循环
  • 第十步:sum=sum-max-min
  • 第十一步:score=sum*1.0/(n-2)
  • 第十二步:输出score的值

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

写好代码后,repeat=1时,输出的score是正确的,但是当repeat>1时,输出的score就是错误的了,就是图上这样
调试后发现当开始第二次循环时,sum的值有问题
应该在第二次循环开始时重新赋值

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

1. 本题PTA提交列表

2. 设计思路

  • 第一步:定义整型变量i=1,j=1,repeat,mark,n,count1=0,count2=0,count3=0,count4=0,count5=0,k=1,count1、count2、count3、count4和count5用来累计不同等级的人数,n表示有几个学生,repeat代表做运算的次数
  • 第二步:输入repeat和n的值
  • 第三步:当i<=repeat时,进入循环。count1=0,count2=0,count3=0,count4=0,count5=0 如果i!=1,再次输入n的值
  • 第四步:当j<=n时,输入mark的值
  • 第五步:如果mark=1,count1=count1+1
  • 第六步:否则如果mark=2,count2=count2+1
  • 第七步:否则如果mark=3,count3=count3+1
  • 第八步:否则如果mark=4,count4=count4+1
  • 第九步:否则mark=5,count5=count5+1
  • 第十步:j=j+1,重复执行步骤4-10
  • 第十一步:当j>n时,结束循环
  • 第十二步:输出“1:”
  • 第十三步:当k小于count1时,输出“*”,k=k+1,重复执行本条指令,直到k>=count1时,输出“\n”
  • 第十四步:输出“2:”
  • 第十五步:当k小于count2时,输出“*”,k=k+1,重复执行本条指令,直到k>=count2时,输出“\n”
  • 第十六步:输出“3:”,
  • 第十七步:当k小于count3时,输出“*”,k=k+1,重复执行本条指令,直到k>=count3时,输出“\n”
  • 第十八步:输出“4:”,
  • 第十九步:当k小于count4时,输出“*”,k=k+1,重复执行本条指令,直到k>=count4时,输出“\n”
  • 第二十步:输出“5:”,
  • 第二十一步:当k小于count5时,输出“*”,k=k+1,重复执行本条指令,直到k>=count5时,输出“\n”

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

最开始编写本题代码时,统计出了不同等级的人数,但是不知道如果实现不同等级*的累加情况,想了好久也换了好几种不同的写法,可是都实现不了像题目那样输出,询问同学后,有了一点思路,但结果还是错,就像图上这样,用dev c调试后,发现我应该先输出“1:” ,像图上这样,而不能将它放在循环里面,放在循环里,当该等级没有时,就什么也输不出来

二、同学代码结对互评

1.互评同学名称

李金谣

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

我的代码

#include<stdio.h>
int main()
{
	int i,j,repeat,mark,n,count1=0,count2=0,count3=0,count4=0,count5=0;
	int k=1;
	n>=1&&n<=20;
	repeat>0&&repeat<10;
	scanf("%d\n%d\n",&repeat,&n);
	for(i=1;i<=repeat;i++){ 
count1=0,count2=0,count3=0,count4=0,count5=0;//累计不同等级的人数
  if(i!=1){scanf("%d\n",&n);}	
	 for(j=1;j<=n;j++){
	 scanf("%d",&mark);
	  if(mark==1){
	   	count1++;//统计出1的人数
	  }
	  else if(mark==2){
        count2++; //统计出2的人数

		 }
   	  else if(mark==3){
   	  	count3++;//统计出3的人数
		 }
	  else if(mark==4){
	   	count4++;//统计出4的人数
	  }
	  else
	  count5++;//统计出5的人数
    }
    printf("1:");
    for(k=1;k<=count1;k++){
    	printf("*");	}
    printf("\n");
    printf("2:");
    for(k=1;k<=count2;k++){
		printf("*");    }
    printf("\n");
    printf("3:");	
    for(k=1;k<=count3;k++){
	    printf("*");}
    printf("\n");
    printf("4:");
    for(k=1;k<=count4;k++){  
    	printf("*");}
    printf("\n");
    printf("5:"); 
    for(k=1;k<=count5;k++){
    		printf("*");}
   	if(i!=repeat)printf("\n");} 
	return 0; 
 } 

同学的代码

#include<stdio.h>
int main()
{
	int i,j,repeat,score,n,total1,total2,total3,total4,total5; //定义整型变量i,j,score存放成绩
	int a,b,c,d,e;  //定义整型变量total1存放一分累加的星号,total2存放两分累加的星号
	scanf("%d",&repeat);//整型变量total3存放三分累加的星号,total4存放四分累加的星号
	for(i=1;i<=repeat;i++)//整型变量total5存放五分累加的星号//
	{                 //输入运算次数repeat//
		total1=0;
		total2=0;
		total3=0;
		total4=0;
		total5=0; //对五个total变量初始化赋值//
		scanf("%d",&n);  //输入评委人数n//
		for(j=1;j<=n;j++)
		{
			scanf("%d",&score);  //输入成绩score//
		if(score==1) total1++;
	    else if(score==2) total2++;
	    else if(score==3) total3++;
	    else if(score==4) total4++;
	    else total5++; //累加星号的数量//
	    }
	    printf("1:");  //打印星级评分表//
	    for(a=1;a<=total1;a++)  //循环打印星号,下同//
		{
		printf("*");
	    }
		printf("\n2:");
		for(b=1;b<=total2;b++)
		{
		printf("*");
	    }
		printf("\n3:");
		for(c=1;c<=total3;c++)
		{
		printf("*");
	    }
		printf("\n4:");
		for(d=1;d<=total4;d++)
		{
		printf("*");   
		}
		printf("\n5:");
		for(e=1;e<=total5;e++)
		{
		printf("*");
	    }
		printf("\n"); //换行后结束程序//
	}
	return 0;
}

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

代码的差异不是很大,我的变量会少一些,但是我的注释偏少,可读性低,同学的注释明显比我多,看起来会更加的清晰
易懂。
更喜欢同学的代码,因为可读性高,后续的题目中自己也会多注意注释这个问题,增加自己代码的可读性。
三、截图本周题目集的PTA最后排名
PTA排名

四、本周学习总结

1.你学会了什么?

1.学到了可以自己定义函数,调用函数

double cylinder(double r,double h);//声明函数

2.函数定义的一般形式:

double cyclinder(double r,double h)//函数类型、函数名、形式参数表
{
                           //这部分为函数体,是函数实现过程
}

3.return语句只能返回一个值
4.实参可以传递给形参,但是形参不会影响到实参的值

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

1.嵌套循环的题目对我来说有难度,pta上菱形的那道题就做了好久,主要是下半部分要输出的时候,找不出空格与行数之间的关系式,输出时只有上半部分是正常的,下半部分的不忍直视,想了一天多才勉强想出来空格与行数的关系,而且字母的递增递减刚开始也不知道如何实现,后来想起作业中好像有做过类似的,就去翻出来看。
2.对于全局变量和局部变量,题目复杂一点的话,还是会懵逼,会搞混掉
3.函数调用并不是很懂,课堂派上那两题填写代码的不会填,而且还看不太懂

posted @ 2017-11-11 12:02  hoppp  阅读(360)  评论(6编辑  收藏  举报