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

1.本章学习总结

1.1思维导图

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

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代码累计

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

2.PTA总分

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

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

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

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 代码截图

代码一

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

代码二

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

代码三

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

3.1.3 测试数据

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

3.1.4 PTA提交列表及说明

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

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 代码截图

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

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

3.2.3 测试数据

  • 例一

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

  • 例二

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

3.2.4 PTA提交列表及说明

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

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 代码截图

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

3.3.3 测试数据

  • 例一

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

  • 例二

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

3.3.4 PTA提交列表及说明

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

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

4.代码互评

4.1 代码截图

同学的代码

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

我的代码

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

4.2 二者的不同

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


下一篇:SO_REUSEADDR的作用