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 函数定义的一般形式:
函数类型 函数名(形参)//函数首部
{
函数实现过程 //函数体
}