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

1.本章学习总结

1.1思维导图

1475011-20181028191632449-1199637784.png

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

1.2.1学习体会

本周学习了循环结构,在之前学习分支结构的时候就涉及到了循环结构中的for循环,这周的又新学了while和do-while两种循环,了解到了三种循环的差异。for循环常用于循环次数可数的条件,while循环与do-while循环均适用于循环次数不可数的条件,但while是前进行条件判断,后循环,而do-while循环则是先进行一次循环后再判断条件是否成立,适用于循环次数未知,但至少要进行一次的循环。在学习循环语句的基础上,又深入了解了嵌套循环,嵌套循环的优点就是可以完成单层循环所解决不了的循环问题,但是嵌套循环相对于单层循环来说,其巡行效率低,一旦循环次数很大,程序运行的时间会非常长。在学习分支结构时,学到的break和continue语句,在本周的循环结构中又学习到了其不同的用法,break语句不仅适用于switch语句,也可以用于循环语句中。与break语句用法相似的,又学到了一种return语句,在循环结构中可以使用return来提前结束程序。

1.2.2代码累计

1475011-20181028134549593-1179379762.png

2.PTA总分

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

1475011-20181028133805949-775416600.png

1475011-20181028133823723-153978181.png

2.2我的总分

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

3.PTA实验作业

3.1PTA题目1

二进制转十进制
输入一组二进制字符,输出其对应的十进制数。当输入回车键时,输入结束。若输入非二进制字符,输出error input!

3.1.1 算法分析

  • 算法分析一(数组)
·定义一个字符型数组 binaryNumber[MAX]用于储存字符串,整形变量i(用于for循环计数)、length(二进制字符的长度)、decimalism(十进制)
·gets(binaryNumber)//输入二进制字符串
·length=strlen(binaryNumber)//计算二进制字符串的长度
·for i=0 to i<length do
   if binaryNumber[i]=='1' 或者 binaryNumber[i]=='0' then //将二进制转换为十进制
     if binaryNumber[i]=='1' then
       decimalism=decimalism+pow(2,length-1-i)
     else
       decimalism=decimalism
     end if
   else
     输出:error input!
     goto out; //将代码转到out处,结束程序
   end if
 end for
 输出:十进制数
 out:
  • 算法分析二(非数组)
·定义字符型二进制数ch、整型十进制数decimalism
·while (ch=getchar())!='\n' do //判断输入的字符是否为换行符
   if ch=='1' 或者 ch=='0' then
     decimalism=decimalism*2+ch-'0' //将字符型变量转化为字符型常量
   else
     输出:error intput!
     return 0 (goto out)   //直接结束程序(将程序跳转到out处,结束程序)
   end if
 end while
 输出:十进制数
 (out)

3.1.2 代码截图

代码一

1475011-20181028140220482-1367580237.png

代码二

1475011-20181028140245089-66690077.png

代码三

1475011-20181028140306566-177307720.png

3.1.3 测试数据

1475011-20181028140635563-1352784618.png

3.1.4 PTA提交列表及说明

1475011-20181028140655889-982020759.png

Q:之前程序所得到的值均是正确的,逻辑也是对的,为什么只是部分正确
A:这个问题我想了很久,一直找不到答案,后来在同学的提醒下,我才发现这道题应该用字符型变量来做,而我最早的做法只用到了整型变量来做。
Q:当明白要用字符型变量来做后的第一思路是什么?
A:当时看到这题的第一思路是用数组来做,暑假时有涉及到数组类型的题目,就想着用数组来做。
Q:后面不用数组的方法是怎么想到的?
A:当时第一思路是用数组的方法,就局限于此,并没有想到如果不用数组,这题该怎么做,但是我们还没有开始学习数组的有关知识,于是就像助教求助,弄懂了其他的方法。
Q:不用数组的做法中为什么会想到goto out 与return 0 两种结束程序的方法。
A:最开始用的是goto out的做法,因为当时刚学习goto out语法没多久,就直接拿来用了,然后return 0的方法是当时跟同学讨论的时候突然想到的,用dev运行证实了return 0的可行性,在后来的上课过程中,老师也讲到了return 0的用法,进一步证实了return 0的可行性。

3.2 PTA题目2

餐饮服务质量调查打分
输入一个正整数repeat (0<repeat<10),做repeat次下列运算:
输入一个正整数n(1≤n≤20),表示有n个学生被邀请来给自助餐厅的食品和服务质量打分,分数划分为1~5这5个等级(1表示最低分,5表示最高分),试统计调查结果,并用*打印出如下形式的统计结果直方图。

3.2.1 算法分析

·定义打分次数repeat、打分人数n、各等级的计数变量count1、count2、count3、count4、count5、评分等级number、及用于for循环中的变量i、j;
·输入打分次数repeat;
·for i=1 to i=repeat do
   输入打分人数n
   令count1、count2、count3、count4、count5均为零    //每循环一次,计数清零
   for j=1 to j=n do
     输入:人们给出的分数
     switch (number)
       case 1:count1++;break;
       case 2:count2++;break;
       case 3:count3++;break;
       case 4:count4++;break;
       case 5:count5++;break;
     end switch
   end for
   输出1:     //用*打印本轮服务评分的直方图
   for j=1 to j=count1 do
     输出 *
   end for
   输出\n2:
   for j=1 to j=count2 do
     输出 *
   end for
   输出\n3:
   for j=1 to j=count3 do
     输出 *
   end for
   输出\n4:
   for j=1 to j=count4 do
     输出 *
   end for
   输出\n5:
   for j=1 to j=count5 do
     输出 *
   end for
   输出\n
 end for

3.2.2 代码截图

1475011-20181028152544467-1702256519.png
1475011-20181028152600435-1080436072.png

3.2.3 测试数据

  • 例一
    1475011-20181028153050902-949002684.png

  • 例二
    1475011-20181028153120590-654125784.png

3.2.4 PTA提交列表及说明

1475011-20181028152616613-552837557.png

Q:提交列表中多次错误的原因
A:之前做题是理解错题目的意思,当repeat大于1的时候,题目意思是:打印不同评价表的直方图,而我理解成了将评价表的直方图打印repeat次,所以我的做法在repeat=1的时候是对的,但是当repeat大于1的时候就不成立了。
Q:在发现理解错题目意思之后的再次修改中,答案错误的原因
A:当时修改程序的时候没有注意光标的位置,自认为光标在我想要的地方,在改完之后,提交代码后发现还是错误的情况下,再次检查代码,才发现修改的位置出错了。

3.3 PTA题目3

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

3.3.1 算法分析

·定义用于for循环中的变量i、j、中间行mid、行数n、字母ch、控制字符的变量num;
·输入ch、n;
·mid=n/2+1 //计算中间行数
·for i=1 to i=n do
   for j=1 to j=mid-i的绝对值 do
     输出:空格
   end for
   if i>mid then //菱形下半部分
     num=n+1-i
   else
     num=i  //菱形的上半部分
   end if
   for j=1 to j=2*num-1 do
     if j==1 或者 j==2*num-1 then 
       输出:ch+num-1
     else
       输出:空格
   end if
   end for
   输出:\n
   end for

3.3.2 代码截图

1475011-20181028153630694-2074215010.png

3.3.3 测试数据

  • 例一
    1475011-20181028153847932-1054146537.png

  • 例二
    1475011-20181028153912172-287864151.png

3.3.4 PTA提交列表及说明

1475011-20181028153656065-1239243008.png

Q:做这道题是的困惑
A:这种类型的题在小白菜中有遇到过,当时想着分为上、中、下三个部分做,当时只是粗略的看了一眼这道题,并没有深入地去思考。后来在我做这道题之前,老师就在课上讲解完了。当时听的时候理解,后来自己写的时候并没有很好的掌握,所以把这道题写到博客园中,一是加深对这道题的印象,二是,以后回头看博客园的时候可以知道,哦,原来当初我这道题掌握的不好,当初这道题是这么做的,可以跟以后的思路做一个比较。

4.代码互评

4.1 代码截图

同学的代码

1475011-20181028215533761-385047939.png

我的代码

1475011-20181028215601657-208462232.png

4.2 二者的不同

  • 着手点不同。
    • 该同学从函数的表达式入手,他发现了兔子与乌龟的路程存在着一种规律,每九十分钟一次循环;而我则是从题意着手,直接以兔子每跑十分钟一次回头为判断依据,进行程序编写。
  • 解题思路的不同。
    • 在该同学发现的规律来看,当时间是30、45、60的倍数时,兔子与乌龟跑的距离相等;当时间对90取余,余数小于30或者在45和60之间时,乌龟赢得比赛;其他条件成立时,兔子赢得胜利。与其代码相比,我的代码显得更简洁,不与要考虑那些情况。
  • 同样的题目,可以有不同的解法,虽然最终我们俩的结果是一样的,但是我觉得该同学的代码过于复杂,在平常的解题过程中不易想到,可以把题目想的简单一点,直接从题目入手,这样也可以使别人更容易地读懂代码。

转载于:https://www.cnblogs.com/Lay-549/p/9853508.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值