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

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

0.展示PTA总分

  • 单循环结构

  • 嵌套循环

1.本章学习总结

1.1 学习内容总结

  • for循环 用于条件明朗的情况下 进行比较简单的循环

    for(int i;i---进入循环的条件;每次循环进行的操作)
    {
       //进入循环后 进行的操作
        do
    }
    
  • while和do-while的循环(适用于条件很清楚的情况下)

    • **while:条件不满足无法进入循环 **
    • do-while:条件即使不满足也会进入循环 如果满足继续do里面的循环,即至少循环一次
   1.while(进入循环的条件,不满足时终止)
    {
                  进入循环后的操作
         }
   2.do
    {
                 进入循环后的操作//此操作至少执行一次
       }while(进入循环条件);

  • break和continue

    • break:直接跳出一轮循环,注意,当不值一轮循环时只能跳出一轮循环,不能同时跳出内循环外循环
    • continue:跳出它的语句后不执行下面的程序 但是会继续进行循环
    • 外循环一次,内循环一轮
    break 不止能运用在 switch 语句中还能用在循环中
    continue 一般用在循环中
    

1.2 本章学习体会

如果没预习作业,第二天上课可能会一脸懵逼,学习了伪代码 但是并不是很会运用正在尝试进行,对于嵌套循环的内容,感觉数学不好,就会写的有些懵逼,所以要认真学习数学啊!嵌套循环内容不熟悉,题写得不够多,写的慢,老是问同学,经常会把等号写成赋值。在每次写循环时应该先在草稿纸上列出基本思路,在进行做题,搞清楚内循环和外循环的关系。

这周因为排练原因 pta 的进度很慢,导致一下子写很多题,所以对题目一下子无法消化太多,打算之后在进行复习

希望能继续努力吧!

代码量

周次 累计代码量(行)
7.8 613

2.PTA实验作业

2.1 龟兔赛跑

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

2.1.1 伪代码

  • rabbitS 和 tortoiseS 分别是兔子的路程和乌龟的路程
  • rabbitrunTime = 10 设置先让兔子跑十分钟 后面每次rabbitrunTime --到零都进行判断
  • inputTime是用户输出的时间;restTime=-1是兔子休息时间 让它等于-1是为了防止跟后面的数据处理产生矛盾冲突
for inputTime=用户输入的值 to inputTime = 0 do
    tortoiseS += 3;//乌龟一直跑
    if rabbitrunTime-- > 0 then rabbitS += 9;//兔子刚开始跑10分钟 每分钟跑9米
    end if
    if (rabbitrunTime == 0) //兔子跑完了10分钟
        if (rabbitS > tortoiseS) then restTime = 30;//如果兔子快 则兔子休息30分钟
            else rabbitrunTime = 10;//否则继续跑10分钟
    end if
    if (restTime-- == 0) then rabbitrunTime = 10;//如果休息完了则兔子又继续跑10分钟
    end if
end for
    //判断三种结果
    if (rabbitS > tortoiseS) then 输出兔子赢了
    else if (rabbitS < tortoiseS) then 输出乌龟赢了
    else 输出平局
    end if

2.1.2 代码截图

2.1.3 造测试数据

inputTime(输入数据) 输出数据 说明
246 @_@ 738 乌龟赢了
1 _ 9 兔子赢了
90 -_- 270 平局

2.1.4 PTA提交列表及说明


1.编译错误:刚开始的时候令restTime= 0 与后面restTime-- == 0起冲突了 ,所以一开始restTime的初始化应该不等于0
2-3.部分正确:直接用time乘时间 这道题应该是要累加来写
4-5.部分正确:换了个方法 固定了time 没有进行灵活变换 逻辑发生了错误

2.2 于龙遇见日期,又哭了!

于龙最近非常烦,因为他正面对一大堆日期数据愁眉不展,原因是那些日期书写的极其不规范,不仔细辨别根本认不清是哪一天。
以下每个日期中的三个数,年月日的位置是不确定的,假设其中最大的数表示年份,1-12范围的数表示月份,1-31范围的数表示日期,如果月日的范围都是1-12则按前月后日的顺序识别。
例如:
2/3-123 识别为0123年2月3日,合法;
13+12+45 识别为0045年12月13日,合法;
12=3=13 识别为0013年12月3日,合法;
29,2,2019 识别为2019年2月29日,这一天不存在,不合法;
12@12#12 识别为0012年12月12日,合法;
35.36.37 识别为0037年XX月XX日,XX超出月份和日期范围,不合法;
113030 识别为0030年11月30日,合法;

现在于龙要编程判断一下那些日期到底是否合法,你们说他能编出来吗。
别问了,于龙又哭了,特别伤心!

2.2.1 伪代码

  • day-month-year设置三个变量 分别用来存储日月年 op1,op2用来输入字符
  • item flag用来进行最大值的交换和判断
if(day > month&& day>year) then 把day的值一个一个轮流从后面交换给year
end if
if(month > year) then 把month和year交换变量
end if  //这里是判断最大值 并进行交换
if((month > 12 && month <= 31) && (day >= 1 && day <= 31)) then 如果月份不符合条件但日期符合条件就交换month和day的值
end if
if month和day都满足条件 then 开始判断是不是闰年
    if 是闰年 then 二月的时候超过29的day都是不合法的,其他月份按照正常的超过30 或 31的为不合法然后输出
    else 不是闰年 the 二月的时候超过28的day都是不合法的,其他月份同上 然后输出
    end if
else 都是不合法的 month和day都不满足条件
end if
    

2.2.2 代码截图





其实我都不忍直视我自己的代码 用举神的话来说就是非常不优雅

2.2.3 造测试数据

输入数据(年-月-日) 输出数据 说明
2/3-123 0123-02-03 合法数据
29,2,2019 Invalid Date! 这一天不存在,不合法
35.36.37 Invalid Date! 月份日期超出范围,不合法

2.2.4 PTA提交列表及说明


1-5 部分正确:几乎是因为最大值判断之后的交换(day > month&& day>year) 没有让它进行 一个一个移上去 而是直接让day和year交换 所以错了 看我的提交列表就知道我有多绝望,找到了好几天的bug
6-8.10-12 编译错误:因为修改太多次导致漏{}
12-14 部分正确:在闰年的时候没有对其他月份进行讨论和输出 只讨论和输出了2月 导致错误

2.3 编程打印空心字符菱形

本题目要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。所谓“空心菱形”是指:每行由两端为字母、中间为空格的字符串构成,每行的字符串中心对齐;上半部分相邻两行字符串长度差2,且字母从给定的起始字母逐一递增;下半部分与上半部分对称。

2.3.1 伪代码

  • letter,n分别是初始字母和 用户输入的高度

  • a 用来比较是不是第一行或者最后一行

  • b控制字母前的空格 可以与a判断是不是第一行或者最后一行

  • c控制行数

  • d = 1控制字母之间的空格数

  • m i用来进行循环

    先算出上部分的行数
    //先输出上半部分
    for 第一行 to 最后一行
        for 输出字母前的空格 to 输出每行第一个字母
        end for
    if 不是第一行 then 输出字母之后的空格 then 在输出每一行第二个字母
    else 只输出一个字母
    end if
    递进下一个字母 then 换行
    //输入下半部分
    对空格和字母等做好初始化准备
    算出下半部分的行数
    for 第一行 to 最后一行
        for 输出字母前的空格 to 输出每行第一个字母
        end for
        if 不是最后一行 then for 输出字母之间的空格数 to 第二字母输出
                           end for
        end if
    end for
        递减一个字母 再对空格之类的进行操作
    end
    

2.3.2 代码截图


2.3.3 造测试数据

输入数据(字母,高度) 输出数据 说明
B 5 B
C C
D D
C C
B
正常数据
C 7 C
D D
E E
F F
E E
D D
C
正常数据
这个表格没办法正常显示.. 实际上是个菱形字母挖空对称图形

2.3.4 PTA提交列表及说明


1-3. 部分正确: 只有上半部分一部分是对的
4. 答案错误:多输出一了一个字母 printf多打了
5. 部分正确;下半部分的字母之间的空格规律找不出来 因为上半部分的逻辑有些乱 所以换了个方法 找到能顺利写出的逻辑


3.代码互评

  • 3.1题目

    水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

    • 同学代码(朱振豪)
  • 自己代码

  • 相同点

    1.都是通过do-while语句来判断是否是水仙花数

  • 不同点

    1.他是直接利用数学函数pow(a,n) 而我自己造了一个函数 mypow(a,n) 我自己造函数是想着说 一位内如果用到pow(a,n)就要加入声明 <math.h> 所以在使用的时候 可能会增加运行时间 自己造函数可是防止运行超时

    2.他是直接利用循环来算出 各个位数的幂n次方之和是否等于其本身 ,而我自己重新造了一个函数来判断是否等于 等于则输出

    3.我们判断界限最小和最大的范围方式也不同 我是利用函数来判断和计算 他是利用循环

    4.整体思路都不太一样 我觉得他的太复杂了.....

  • 3.2题目

本题目要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。所谓“空心菱形”是指:每行由两端为字母、中间为空格的字符串构成,每行的字符串中心对齐;上半部分相邻两行字符串长度差2,且字母从给定的起始字母逐一递增;下半部分与上半部分对称。

  • 同学代码 (李凌)

  • 自己代码

  • 相同点

1.我们都是通过分成上下两个部分进行打印的

  • 不同点
    1.李凌同学的代码设置的变量比我的要少,代码行也比我的代码要简短,整体看下来没有我的那么复杂,思路也很明朗。

2.他会利用getchar来进行缓冲字符,而且善于利用continue来跳出循环,所以可以减少条件的使用,而我是多使用了一个判断语句来判断是不是第一行或者最后一行,所以我的代码行比他多变量也比他多,这点
我应该向他学习。

3.可能是因为他用手机来给我截屏所以在我看来他的代码的格式会没有那么规范,变量没有占一行,而是堆在了一起。

posted @ 2019-10-20 20:34  雪梨wink  阅读(612)  评论(2编辑  收藏  举报