C语言--嵌套循环
一、PTA实验作业
题目1:7-3 编程打印空心字符菱形
1. 本题PTA提交列表
2. 设计思路
- 1.定义4个整形变量height表示高度, meddle表示中心行数, i表示第i行, k循环计数,一个字符型变量ch表示输入字母;
- 2.输入ch、height;
- 3.若height=1,输出ch,结束程序,否则执行下一步;
- 4.若height>1,执行下一步,否则程序结束;
- 5.若ch>=65和ch<=71和height%2!=0同时成立,执行下一步,否则输出Error!;
- 6.Meddle=height/2+1;
- 7.i=1;
- 8.i++;
- 9.k=1;
- 10.输出一个空格,k++;
- 11.若k<=meddle-i,返回步骤10,否则执行下一步;
- 12.若i=1,输出ch;否则执行下一步;
- 13.i=i-1;
- 14.输出ch+i;
- 15.k=1;
- 16.输出一个空格,k++;
- 17.若k<=2*i-1,返回步骤16,否则执行下一步;
- 18.输出ch+i;
- 19.i++;
- 20.换行;
- 21.若i<=meddle,返回步骤8,否则执行下一步;
- 22.i=meddle-1;
- 23.i--;
- 24.重复步骤9~20;
- 25.若i>=1,返回步骤23,否则结束程序
3.本题调试过程碰到问题及解决办法
- 问题1:错误代码,忘记了把i加回原值,导致结果错误
改正后的代码:把i加回原值,结果正确
题目2:7-4 换硬币
1. 本题PTA提交列表
2. 设计思路
- 1.定义整型变量money表示需换零钱、 the_rest剩余的钱、 count1=0、 count2=0计数、 fen5=0表示5分硬币个数, fen2=0表示2分硬币个数, fen1=0表示1分硬币个数;
- 2.输入money;
- 3.若money%5=0或money%5>0&&money%5<3,执行下一步,否则执行步骤17;
- 4.Fen5=money/5-1;
- 5.Fen5--;
- 6.The_rest=money-5*fen5;
- 7.若the_rest%2=0,执行下一步骤,否则执行步骤13;
- 8.Fen2=the_rest/2-1;
- 9.Fen2--;
- 10.fen1=money-
5*fen5
-2*fen2
;count1++; - 11.输出fen5,fen2, fen1,fen5+fen2+fen1;
- 12.若fen2>=1,返回步骤9,否则执行下一步骤;
- 13.fen2=the_rest/2;
- 14.Fen2--;
- 15.fen1=money-
5*fen5
-2*fen2
;count2++; - 16.输出fen5,fen2, fen1,fen5+fen2+fen1;
- 17.若fen2>=1,返回步骤14,否则执行下一步;
- 18.若fen5>=1,返回步骤5,否则执行下一步;
- 19.若money%5>=3,执行下一步,否则程序结束;
- 20.Fen5=money/5;
- 21.重复步骤5~18;
- 22.输出count1+count2,结束程序
3.本题调试过程碰到问题及解决办法
- 问题1:考虑情况不全面,导致结果部分正确,有一些情况没能够列出来
解决办法:询问老师,请教同学,在舍友帮助下找出错误,重新制定算法
对我而言,换硬币这一题难点在于各种情况的考虑,如果一开始有一个情况没有考虑进去,最后的结果就会错。做这题的我做了挺多调试的,但其中有价值的调试并没有多少。因为错误主要是由于考虑情况不全而产生的,而我在调试的时候关注的却是在执行的过程中是不是变量没有正确变化。这关注点就错了。通过这一题,我深切地体会到,思路清晰周全真的很重要,不然费时又费力,效率会很低。
题目3:7-7 歌唱比赛评分系统
1. 本题PTA提交列表
2. 设计思路
- 1.定义整型变量repeat、n、 grade、 sum=0、 i、 j、flag、 min、 max,浮点型变量average;
- 2.输入repeat;
- 3.若repeat<=0或repeat>=10,输出Error! 否则执行下一步;
- 4.i=1;
- 5.i++;
- 6.输入n;
- 7.若n<3或n>10,输出Error! 结束程序,否则执行下一步;
- 8.输入grade;
- 9.Min=grade;max=grade;sum=grade;
- 10.j=2;
- 11.j++;
- 12.输入grade;
- 13.Flag=grade;
- 14.若flag<=min,min=flag,否则执行下一步;
- 15.若flag>=max,max=flag,否则执行下一步;
- 16.Sum=sum+grade;
- 17.若j<=n,返回步骤11,否则执行下一步;
- 18.Sum=sum-max-min;average=sum/(n-2);输出average;
- 19.若i<=repeat,返回步骤5,否则结束程序
3.本题调试过程碰到问题及解决办法
-问题1:min、max、和flag的初值应该在哪里定义,scanf语句要怎么放?
解决办法:这个问题是我在写出代码后运行测试的时候发现的,明明按照预想我只需要输入n个数就可以输出结果,但是运行测试的时候却要输入n+1个数才能输出结果。经过调试我发现,在内循环的最后一次循环中,scanf语句还要执行一次,而输进去的数字其实并没有参与后面的运算。原来是因为为了取出min(最小值)和max(最大值),我开始时把min和max的初值定义放在外循环中,并定义它们的初值为第一个grade,这样scanf语句就要放在外循环中,这样才能保证输入的第一个grade能赋给min和max;但是grade是要重复输入的,因此我在内循环里又放了一个scanf语句,这样在循环过程中就多出了一次scanf。最后我修改代码,把第一次成绩放在了外循环中,内循环从2开始,答案正确。
二、同学代码结对互评(2分)
1.互评题目及互评同学名称
互评题目:7-5 :梅森数
互评同学:李重蕖
2.我的代码、互评同学代码截图
1.我的代码
int n, number, i, j, r;//number表示要判断的数字、i和j都用于循环计数、r用于判断素数
scanf("%d", &n);
if(n>=20)
{
printf("Error!\n");
}
else if(n<=1)
{
printf("None\n");
}
else
{
for(i=2; i<=n; i++)
{
number=pow(2,i)-1;
r=1; //初始时为1
for(j=2; j<=number/2; j++)
{
if(number%j==0)
{
r=0; //不是素数r=0 ,跳出循环
break;
}
}
if(r==1)//是素数
{
printf("%d\n", number);
}
}
}
2.同学的代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
这一题我和李同学的思路基本相同,不同的地方在于对n范围的判断,我习惯先写n不符合题目要求时的的情况,而他则是先写了符合要求时的情况。他说先写符合要求再写不符合要求这样不容易漏掉某些情况,我觉得他说得对。在代码注释这方面,李同学的注释很多很细致,而我平时只习惯注释一些主要的判断点,其他注释很少,我觉得这一点我要向他学习。原本我这一题的代码对变量名是没有注释的,在他的提醒下,我加上了注释。在这一题上我觉得我和他的代码各有优势,但是从他的代码上我看到了很多良好的写代码习惯,这正是我缺少的。
三、截图本周题目集的PTA最后排名。
PTA排名
四、本周学习总结
1.你学会了什么?
我学会了怎么调用函数,明白了局部变量和全局变量的区别。现在调试程序的时候也不会太过于依赖调试,会先在脑子里按照自己的预想跟着自己的程序走一遍,然后寻找错误,如果还是找不到,再选择调试。这样虽然一开始的时候会没有直接用调试来得快,但是熟悉之后,我发现通过这样的方法我阅读程序会快一些,也更能理解什么是计算机的思维。
2.本周的内容,你还不会什么?
对于静态变量的使用还不是很会,当局部变量、全局变量和静态变量全部在一起的时候,这种题目我往往做不对。还有嵌套循环,有些题目还是不怎么熟悉做,特别是涉及到字符这一类的题目。