C语言博客作业02循环结构

1.本章学习总结

1.1 思维导图

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

学习感受:经过这一周对于循环结构的学习,我在c语言编程上有了很大的进步,同时让我对c语言的学习有了更深层次的理解。首先,印象最深的是循环结构能够需要反复执行某个功能,这个对于人类来说枯燥无比的工作让计算机来实现再合理不过了。循环结构的运用给程序的编写带来了许多好处,比如缩短了代码长度,以及增加了代码的可读性。在需要反复执行某一个功能时,循环结构是最佳选择,否者,代码将会极度冗长。就个人而言,相对于之前的分支结构来说,循环结构更考验编程者对于代码本身的理解,更需要在编程时有一条清晰的思路。其次,本周学习使我对与暑假自学时的一些混淆的知识点进行了梳理,比如之前一直搞混的while循环和do-while循环还有break语句和continue语句。与此同时,在原有的基础上学习了十分方便的伪代码的使用,受益颇深。再次,在后面对于循环嵌套的学习过程以及pta练习中,能够明显感受到编程的难度在提高。不管是之前的顺序结构还是分支结构,总体上难度都不高;而到了循环结构,就需要编程者去细心思考构建每一个循环体,包括什么时候进入循环,什么时候跳出循环;而更深入的循环的嵌套,就更需要去思考每一轮要做些什么、每一步要做什么以及循环之间的关系是什么......在我进行pta编程过程中就出现过循环停不下来、进入不了循环、循环关系没有搞清楚等情况,有时候真的让人头疼,好在有助教和同学们的帮助,这些问题得到解决。
不理解的地方:关于在输入一系列字符时,getchar()和scanf(“%c”, )的区别,尤其是它们对空白字符的处理上存在困惑

1.2.2 代码累计

2.PTA总分

2.1截图PTA中循环结构2次题目集的排名得分

2.2 我的总分:

循环结构(单层):175
嵌套的循环:115
总得分:290

3.PTA实验作业

3.1 PTA题目1

兔子每分钟跑9米,乌龟每分钟跑3米。兔子每十分钟回头看,如果兔子在乌龟前面,则兔子睡觉30分钟。在规定的时间内判断胜负。

3.1.1 算法分析

  • 定义变量T放输入的总时间、变量sTortoise为乌龟跑的路程、变量sRabbit为兔子跑的路程、time记录已经跑完的时间、sign作为缓冲兔子睡觉的时间
  • sign=0 sTortoise=0 sRabbit=0
  • for time=1 to T do
    • sTortoise++;//乌龟一直跑
    • if sign==0 then sRabbit+=9
    • else sign--;
    • end if
    • if time%100&&sign0 then//只有当time为10的倍数且兔子此时不在睡觉且兔子在乌龟前面时兔子才睡觉
      • if sRabbit>sTortoise then sign=30;
      • end if
    • end if
  • if sTortoise==sRabbit then 输出乌龟赢了 //讨论三种结果
  • end if
  • else if sTortoise>sRabbit then 输出兔子赢了
  • end if
  • else 输出平局

3.1.2 代码截图

3.1.3 测试数据

3.1.4 PTA提交列表及说明

  • Q1:刚做的时候用让一个变量不断做从一加到十来解决每十分钟回头看的问题。
  • A1:后来参考了舍友的代码采用变量%10==0的方法来处理,使得代码更加简短了。
  • Q2:一开始没有考虑到兔子睡觉时获胜的情况,于是当兔子睡觉时直接让time加上30,结果导致时间溢出。
  • A2:换了一种思路来解决这个问题,定义了一个sign来作为兔子睡觉时的缓冲,这样可以让时间直接每次加1。

3.2 PTA题目2

输入正整数n,按从小到大的顺序输出所有不超过2的n次方-1的梅森数,每行一个。如果没有,输出None。

3.2.1 算法分析

  • 定义变量n放输入的正整数、变量num和i为循环变量、decide判断是否有满足条件的数
  • for num=2 to n do
    • number=2^num-1
    • flag=1;//每轮初始化
    • for i=2 to sqrt(number)do
      • if number%i==0 then
        • flag=0;
        • break;//退出循环
      • end if
    • if flag==1 then
      • 输出 number
      • decide=1;
    • end if
  • if decide==0 then 输出None
  • end if

3.2.2 代码

3.2.3 测试数据

3.2.4 PTA提交列表及说明

  • Q1:一开始没有考虑到完全没有的情况(看漏了题目),导致只能部分正确
  • A1:后来补加了一个decide变量来判断是否有梅森素数

3.3 PTA题目3

输入一个正整数repeat做repeat次下列运算:输入一个正整数n,表示有n个学生打分,分数划分为1~5这5个等级用*打印出如下形式的统计结果直方图。

3.3.1 算法分析

  • 定义变量repeat放输入的repeat、数组num存放各个分数的打分人数、i j k l为循环变量,grade代表分数,n存放每轮输入的打分同学个数
  • for i=0 to repeat-1 do
    • 输入 n
    • for j=0 to n-1 do
      • 输入 grade
      • num[grade]++;
    • for k=1 to 5 do
      • 输出k:
      • for l=1 to num[k] do
        • 输出*
      • 输出\n
      • num[k]=0//没轮结束归零初始化
  • 结束

3.3.2 代码

3.3.3 测试数据

3.3.4 PTA提交列表及说明

  • Q1:一开始打出代码后确实满足了pta中的测试数据,而实际上,没有考虑到当repeat不为1时的情况。后来在Dev上面测试repeat为2的情况,发现这个时候的每个分数的值在累计。结论为:由于没有在每轮(repeat大循环)后把数组初始化。
  • A1:后来我在每轮repeat循环之前加了一个初始化的语句,解决了问题。

4.代码互评

4.1 代码截图

同学代码截图:

自己的代码截图:

4.2 二者的不同

1.两个代码都能够达到题目的要求
2.同学的代码主要是在数学上去找关系,利用数学函数fabs去解决对称的情况。整体上代码简洁思路清晰。添加上注释会使可读性增加。
3.自己的代码主要是从每行输入的角度来考虑问题的解决方法。没有像同学那样去找数学关系,用两个变量去记录输出的位置。思路较明确,但代码较长。

原文地址:https://www.cnblogs.com/fanfaniscute/p/9859120.html