一、PTA实验作业
题目1:打印沙漏
① 本题PTA提交列表
②设计思路(包括流程图)
先确定沙漏需用的行数以及最多可用的符号数,根据行数分别打印空格、字符。
③本题调试过程碰到问题及PTA提交列表情况说明
提交列表前三次是行数a计算错误= = 忘记当时a是怎么算的了= = ,后来重新思考了a的计算方程,得出a=sqrt((n+1)/2)。(因为那时还没布置这份作业= = 没有记下来)
调试过程中的主要问题是空格数j及符号数k的输出问题:
错误1:输出符号数 k 时没有将 k 与循环变量 i 联系起来,并且k的递加也出现错误:for(k=2*a-1;k>=1;k-=2)
当时是想,第一行符号数k应该为2*a-1个,然后第二行比第一行少2个,直到k=1。
但是for(k=2*a-1;k>=1;k-=2)的意思应该是,循环(2*a-1)/2次,也就是如果输入19个符号,倒三角形的行数为3行,2*a-1=5, 而5满足>1,所以,执行循环体一次,然后k-2=3也>1,执行循环体一次,3-2=1,执行循环体一次,一共执行三次循环体。并且每行的a不变,所以每行输出的符号数保持不变。
错误2:空格数j在下半部分沙漏的时候没有修正,仍然为for(j=1;j<i;j++)
改正后为for(j=i;j>1;j--),认为只要将上半部分沙漏的 j 的代码倒过来就好了,调试结果为
错在没有意识到此时的行数i与上半部分沙漏的行数i不一样,不可照搬,于是改为for(j=1;j<a-i;j++),正确。
题目2:约分最简式
① 本题PTA提交列表
②设计思路(包括流程图)
设计一个子函数cacu,求n与m的最大公因数v,再将n与m分别除以v,得最简分式。
③本题调试过程碰到问题及PTA提交列表情况说明
PTA提交的前几次是由于思路不对,计算方法出错:
先是判断n与m的大小,如果n=m则:n=1,m=1;如果n>m,则以m的次数为循环,for(i=1;i<=m;i++)依次判断i是否同时为m与n的公因子,如果是,则m=m/i,n=n/i。当n<m同理。
这样的错误,在输入数值较低的分式时看不出毛病,但若输入大数值,则不能化为最简,原因在于,当n与m在逐渐化小的同时,for循环的判断条件不变,i没有重置,故当循环终止时分数不能化为最简。
改进方法为在n/i,m/i之后设一个i=1让i重置。
题目3:整除光棍
① 本题PTA提交列表
②设计思路(包括流程图)
逐渐增加光棍的位数,直到可以整除x
为止。先设一个光棍数1,以该光棍除以x取余后的数为k,用一个数列记录k/x取整的数,再以k增加光棍位数,即k=10*(k%x)+1,也就是每次的被除数都在变化,而除数则仍然为x,直到可以整除光棍,则输出数列。
③本题调试过程碰到问题及PTA提交列表情况说明
PTA前5次为15分的设计思路与现在的不一样,原先为:直接从1开始逐渐增加光棍数直到可以整除x为止,这样的缺点在于如果一个数很大,则双精度都不足记录数据。
中间5次0分的设计思路则为以数列依次记录k/x的取整部分,但其中出现的问题有:
有一种情况是在输出序列之后有七位数乱码,另一种情况是前面有数列前两位为0需去除。第一种情况的乱码不知问题出在哪,重新打了一个代码之后问题解决,但重新出现的问题为输出序列前出现无用的0。思考后在代码前加个条件if((k/x==0&&i!=0)||k/x!=0),及else条件进行分类,并先设序列为0,当数组为0时并下标i也为零则不存储数据,直到第一个不为零的数出现开始进行存储,问题解决,如上图流程图。而后面两次17分的PTA提示“段错误”,一开始不明白是什么意思,但我试着修改了一下数组的元素个数,从50改到100,依旧提示“段错误”,然后再改为1000,则答案正确。
二、同学代码结对互评
1.我的代码、同学互评代码截图(7-11 素数对猜想)
①我的代码
②同学的代码(李怡婷)
2.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
同学的代码:设了一个子函数,子函数可以把整个用户程序按照功能进行结构化的组织。还可降低复杂性。并且for循环的次数为sqrt(n),有效降低时间复杂度。整体看起来简洁明了,浅显易懂和有组织。
我的代码:设置的变量数多,看起来混乱不堪,且变量p的设置让人难以理解,整体看起来拖沓,思绪不清晰,for循环的次数为n,不能有效减低时间复杂度。
我更喜欢同学代码的风格,思路清晰,且合理地运用了子函数,整体代码简短明了,易于读懂。
三、截图本周题目集的PTA最后排名。
四、本周学习总结
对for循环及while循环的应用有更深入的了解,且经过pta的练习后基本能熟练运用循环体,但做题过程中有许多需要注意的细节,如变量类型、for循环的条件次数、算法结构等,最主要的就是设计思路了,常因为思路不清晰走了许多弯路,导致算法十分复杂,不仅难以理解且时间复杂度不能有效降低。觉得接下来的学习中,理清思路是十分需要重视的,要加强自己的逻辑思维能力,并多加练习。