zoukankan      html  css  js  c++  java
  • C语言博客作业02--循环结构

    0.展示PTA总分、


    1.本章学习总结(2分)

    1.1 学习内容总结

    while语句

    • 它的一般形式为:
    while(表达式)
         循环体语句;
    
    • 注意事项:
      • 因为while语句只有2个成分(表达式和循环体语句),所以它需要另外加初始化部分。
      • 它是先判断循环条件,然后执行循环体语句,这点和for语句一样,使用时要注意循环条件判断的先后顺序是否会影响到程序运行的最后结果。
    • 与for语句的比较:

    do-while语句

    • 它的一般形式为:
    do{
    循环体语句
    }while(表达式);
    
    • 注意事项:
      • 它与while语句一样,都是在无法事先确定循环次数的时候使用的。
      • 与while语句及for语句的区别:do-while语句是先进入循环,执行过一次循环语句后才判断循环条件以决定下一次循环是否进行,而其他两种语句则是先判断循环条件再执行循环语句。因此,do-while语句适用于先循环、后判断循环条件的情况。
      • 我自己平常是比较少用do-while的,所以我就把上面while的例子改写了一下。即c03-单循环结构 7.3正负数个数

    break语句和continue语句

    • break语句的注意事项:

      • break语句可用于循环语句,强制循环结束,跳出循环,也可用于switch-case语句,跳出switch-case语句。
      • 在使用break语句时,应与if语句相搭配,满足条件才执行break,如果break语句前无条件语句,它将一直执行break语句,而永远无法执行break后的语句。
      • c03-单循环结构-7-10 jmu-c-二进制转10进制
    • continue语句:

      • 其作用是:跳过循环体中continue后的语句,继续下一次的循环,同样,它也需要与if语句搭配使用。
    • break语句与continue语句的区别:

      • break语句直接结束了循环,而continue语句只是跳过后面的句子继续循环。
      • break语句可用于循环语句和switch语句,而continue语句只能用于循环。

    嵌套循环

    1.2 本章学习体会

    • 关于循环,我觉着最重要的一点,就是要明确思路,因为循环这个东西,如果没有很清楚它的题意,思路不够清晰,我们就无法设计好循环的条件,没有办法让循环停在它应该结束的地方。而且,循环题吧,它特别不好找错,因为它很容易把人绕晕,当我们的循环得执行特别特别多次的时候,调试的难度就会变大。还有就是,我们在写每一个循环的时候,要决定好要用哪一个循环语句,不同循环语句的使用,写出来的效果也会不一样。然后,在写循环的代码的时候,就明显感觉到,题目变难了好多,以前一天可以写几道题,现在,一道循环题就够我改好久。害。> . <
      希望之后用得多了,可以熟练一点,一点点向又快又准靠近
    • 代码量:只计算最后一次提交的代码,c03-单循环结构有577行。c04-嵌套循环已经提交的有597行,加起来一共有1174行,感觉比之前多好多,是因为题目比较难吧应该比较勤奋吧应该,但是折算成天的话,算20天,每天的代码量就是59行,马上就变少了,(虽然感觉我每天写的好像不止是这个量)所以,还是要多写才行吧,下一次,希望我每天折算的代码量,可以先达到70行,emmm,循序渐进吧,一下子加太多感觉就像是在画大饼,达到目标的可能性太小了。

    2.PTA实验作业

    2.1 c04--嵌套循环-7-7 换硬币

    2.1.1 伪代码

    定义变量x存放输入的需要找零的总额,fen5放5分的个数,fen放2分的个数,fen1放1分的个数,total放总共的硬币个数,count放找零的方法总数;
    输入待换的零钱数额x;
    count=0;/*变量初始化*/
    计算满足5、2、1分硬币至少各有1个且5分硬币达到最多时,各种硬币的数量。
    输出第一种情况的数量。
    while fen5>=1        /*从5分开始递减,在这里其实可以改写为1,即恒成立*/
           while fen2>1    /*从两分开始递减*/
             fen2--               
             fen1+=2            
             计算总个数total
                       if fen5==0||fen2==0 then
                          break
                       end if
             输出各个变量的值
             count++
           end while
           fen5--                  
           分别重新计算2分及1分的个数以及总个数
                       if fen5==0||fen2==0 then
                          break
                       end if
           输出各个变量的值
           count++
    end while
    输出方法总数
    
    

    2.1.2 代码截图


    2.1.3 造测试数据

    注:输出数据过长,我就只写count的值好了。(理解一哈)

    输入数据 输出数据 说明
    9 count=1 输入的最小值
    99 count=451 输入的最大值
    19 count=11 输入的偏小的值
    88 count=353 输入的偏大的值

    2.1.4 PTA提交列表及说明

    • 说明:(按照我自己发现错误的顺序)
      • 部分正确:没有考虑到如果最开始的1分硬币有2个时,下一次的5分递减,应该重新算2分和1分的数量,而不是简单粗暴地2分加2个,1分加一个。
      • 部分正确:修改后,并没有意识到除了上述问题,还存在其他问题。
      • 部分正确:我以为我上一次的修改是错误的,针对上个问题,定义了一个flag来标记初始时1分硬币有2个的问题。
      • 部分正确:我突然意识到,每一次2分循环到只剩下1个的时候,下一次5分递减,2分硬币和1分硬币都应该重新算,但是循环条件有一点漏洞,会导致第一次结果的2分没有办法递减到1分。
      • 答案正确:我将之前繁琐的代码简化了一点,然后把循环条件修正,最终得到了正确答案。

    2.2 c03-单循环结构-7-11 简单计算器

    2.2.1 数据处理

    定义变量ch存放运算符,number放输入的用于计算的数,result放计算结果,falg用于标记是否输入了非法变量
    输入一个数,赋给result,便于接下来的计算
    while (ch = getchar()) != '='
             输入一个操作数
             if 运算符为+-*/中的一个 then
                       if number == 0 then
                      	flag = 1
    		        break
    	          else
    		        result = result / number
    		        continue
                      end if
            switch  ch
                  判断运算符并进行相应的计算,然后跳出switch语句
           else
    	           flag = 1;
    		   break;
           end if
    end while
    if flag == 0 then
    	输出结果
    else
    	输出错误提示  
    end if
    
    

    2.2.2 代码截图


    2.2.3 造测试数据

    输入数据 输出数据 说明
    2+3/0*8= ERROR 除数为0的情况
    3*2/2?2= ERROR 输入非法字符
    1+2= 3 简单的两个数的运算
    3*3/3+2-4= 1 涉及多个运算符的运算

    2.2.4 PTA提交列表及说明

    • 提交列表说明:(前面的错误存在多个,我是按照自己找出错误的顺序说明的)
      • 部分正确:忘记了题目要求,当输入非法字符时,应该要输出错误提示。
      • 部分正确:改正了上述问题后,我并没有发现我的条件句写反了,我把合法运算符的条件写成了非法运算符,然后再把合法时的情况包含在非法的情况下,这样讲可能会有点绕,emmm,总而言之,我的if条件句的判断句写错了。
      • 编译错误:打或的符号的时候,多敲了一个'|'
      • 部分正确:改正后,我并没有发现我在写除法运算的时候,多输入了一个数,导致读入数据混乱。
      • 答案正确:修改完上述问题之后,我得到了 一个正确的答案。

    2.3 c04--嵌套循环-7-6 水仙花数

    2.3.1 数据处理

    定义变量N存放输入的位数,max存放N位数的最大值,min放N位数的最小值,i用于循环计数,item放这个数各位数上的数,sum放各位数N次方的和,result放这个数各位数的N次方
    输入位数N
    for i=1 to N
       min=min*10
    end for  /*用for循环求最小值*/
    max = min * 10 - 1  /*求最大值*/
    for i = min to max   /*从最小值一直判断到最大值*/
              item = i
    	  sum = 0/*初始化*/
              while item != 0
                     result = 1;/*每次重新求一个数的各个位数的N次方和,都需要初始化为1*/
    			for n = 1 to N
    				result = result * (item % 10) /*累乘,达到求N次方的目的*/
    			end for
    			sum = sum + result  /*求和*/
    			item = item / 10
             end while
             if 和等于这个数本身
                       输出这个数
             end if
    end for
    
    

    2.3.2 代码截图


    2.3.3 造测试数据

    注:为了方便,我把原本的换行改为两个空格隔开。

    输入数据 输出数据 说明
    3 153 370 371 407 可取到的最小值
    7 1741725 4210818 9800817 9926315 可取到的最大值
    5 54748 92727 93084 中间值

    2.3.4 PTA提交列表及说明

    (我自己在vs调试了很多次,试了几个数据,所以看起来,提交列表可能没有那么多)

    • 提交列表说明:
      • 答案错误:一开始我看错了题目,以为判断水仙花数的条件是各位数的3次方和等于它本身,但题意是各位数的N次方和。
      • 部分正确:在重新阅读题目后,我做了修改,但是,因为我用了数学函数中的pow函数来求次方,所以导致了运行超时。
      • 答案正确:我用了一个for循环来代替pow函数求次方,这次运行速度明显加快。所以说,我们做题不仅仅要考虑到答案的正确性,也要考虑效率的问题,能不用数学函数就不用数学函数。

    3.代码互评(2分)

    3.1 c04--嵌套循环-7-7 换硬币

    • 同学代码截图

    • 自己代码截图

    • 分析与评价:

      • 1.关于思路:虽然两份代码都能达到题目的要求,但我的思路其实更像在解数学题,我用了比较多的算式,更像是算出来的答案,而对方用的,是穷举法,循环套循环,遇到正确的就输出。我的方法可能更费时间,(这里指的是解题的时间)因为我还得去算,而且,一旦我算错了,我的程序也就出错了,而对方的方法,没有太多的运算,就更精简。
      • 2.关于可读性:因为我的运算式子过多,尽管我的代码有注释,但可读性依然不强,因为阅读者还需要理解式子的含义,理解它为什么是这么算的;对方的代码可读性较强,虽然我没有加上注释,但依旧可以清楚地看出他的思路。
      • 3.关于运行次数:虽然我的代码较复杂,但由于我对题目的分析比较深入一些,所以我的循环次数就会比较少,而对方的代码需要一次次判断,循环次数就会比较多。
      • 4.总结:虽说结果相同,但方法不同的话,还是有很大的不同的。而我个人,更倾向于对方的代码,因为我觉着,很多时候就是因为数学方法过于繁琐才用程序来代替解决,而我用数学方法解题,就没有那种化繁为简的意义,所以我希望我以后的代码,更多时候能够想到的,不是数学的那一套,而是通过代码,用简单的语句来解决问题。

    3.2 c04--嵌套循环-7-4 编程打印空心字符菱形

    同学代码:

    自己代码截图


    • 分析与评价:
      • 1.关于思路:对于这一道题,我和她用的,都是for的嵌套循环,但我所用的if条件句更多,所以我的代码明显比较长,当然,这还有其他原因。我们大体思路是一样的,但是,她引入了一个绝对值函数,把上下两个对称的部分缩减为一个for循环,使得代码更精简。相较而言,我更像是原版,她更像是升级版。
      • 2.关于可读性:代码看懂的难易程度,我觉着我们是差不多的,唯一不同的是,我的代码是细分条件,她的代码是总结条件,所以她的代码比较简明,如果同时看这两份代码,她的代码可能会比我更快读懂,毕竟我的比较长嘛。
      • 3.总结:同样的题,同样的思路,写出来的代码也会有差别。用总结的方法感觉会更好一些。当然,总结的话,花费的思考时间可能会略多一些,但思考可以换来进步,也是应该的。写这个的时候,我想到了我们写的那个于龙遇到日期的神仙有趣题目,很多重复的输出其实是可以归类在一起的,虽然复制黏贴很方便,但是看代码的时候就很不方便了,所以我觉着吧,能简单就简单,能少就少,代码太长,后期阅读和修改都不方便。

    就这样啦,感谢阅读~

  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/yubing----/p/11681788.html
Copyright © 2011-2022 走看看