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

1.本章学习总结

1.1 思维导图

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

1.2.1 学习体会

  • 本章主要学习了循环结构的相关知识,主要为while,do-while,for的语句运用,附有continue和break的使用区别,要求能通过循环的多层嵌套解决复杂的问题,例如做一个计算器、做一个数组图、打印一张公式表、多次查询价格等问题,原本只能进行一次执行的程序,通过对循环结构的学习,能在规定限次能重复进行,大幅度提高了解决代码问题的效率。
  • 代码的难度已经显著提升,做题时需要先精读题目,理清思路,然后在纸上将不同数据带来的不同结果罗列,找到它的规律,再进行代码设计,这样能提高代码的准确性。当代码答案出现问题时,通过利用devC++的调试方法能帮助我顺利找到错误点。当然,合适的变量名和适当的备注也能使代码的解读更清晰。
  • 虽然知识点的范围变广,但从学习来看没有什么疑问。这些技巧的运用,也让我在代码练习中得心应手,相信在下章的函数学习后,就能设计规模较大的代码,能深入地了解计算机程序的奥秘。

1.2.2 代码累计

2.PTA总分

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


2.2 我的总分:

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

3. PTA实验作业

3.1 PTA题目1

输入一个整数,输出每个数字对应的拼音。

3.1.1 算法分析

思路:进行多个变量定义,先进行正负号判断,并将负数转为正数;再用单层循环语句for计算出这个数的位数,用来决定后面的for循环语句的循环次数,并用digit区分每位数的数字;然后用switch-case语句枚举出零到九每个数字的拼音,并在非最后一个数字的数字后加上空格;最后再进行单个数字‘0’时的判断。

定义n为数字位数,b为临时变量,digit为每位数的数字,number为输入数字
输入number
if number<0 then //判断数字是否小于0,若是则输出fu ,并转为正值
    number=-number
    输出"fu "
end if 
b=number
for n=0 to b>=1 do //通过b的计算次数判断数字位数,并赋给a
    b=b/10
end if 
for n to n>0 do //通过循环,把每位数都输出拼音
    n=n-1 //位数计数
    digit=number/pow(10,n)
    digit=digit%10 //计算第几位数时的数字
end for 
switch digit//通过枚举将每个数字的音节列出,并判断选择 
    若是0则输出"ling" 退出判断 
    若是1则输出"yi"   退出判断
    若是2则输出"er"   退出判断
    若是3则输出"san"  退出判断
    若是4则输出"si"   退出判断
    若是5则输出"wu"   退出判断
    若是6则输出"liu"  退出判断
    若是7则输出"qi"   退出判断
    若是8则输出"ba"   退出判断
    若是9则输出"jiu"  退出判断
if n>0 then
	输出空格 //将倒数第2位之前的位数后都加上空格
end if 
if number==0 then
    输出"ling" //分开判断满足于0时的情况
end if 

3.1.2 代码截图

3.1.3 测试数据

3.1.4 PTA提交列表及说明

  • Q1:在代码的输入中会有些像scanf中输入&,语句结尾有分号的细节不注意,造成编译错误
  • A1:这次原因是case里的冒号用的是中文标点,后改用英文输入法输入冒号。
  • Q2:没有针对只有输入‘0’时的拼音输出,造成答案只有部分正确
  • A2:在代码的末尾加上一个if语句进行判断,当number为‘0’时应该输出的单个拼音‘ling’。
  • Q3:针对类似这种需要拆分每个字符进行逐一判断的题目
  • A3:需要将不同情况造成的不同结果进行逐一判断,特殊情况特殊分析,并要注重最后的答案输出格式是否符合要求;如结尾不能有空格时,需要将首次输出或末次输出进行分开讨论。

3.2 PTA题目2

模拟简单运算器的工作,只能进行加减乘除运算,四种运算符按从左到右的顺序计算。

3.2.1 算法分析

思路:定义两个变量分别为运算符两侧的数字,定义op为字符变量输入运算符,通过if语句判断是否为非法运算符或除数为0,再进行switch-case语句枚举四则运算符进行运算,直到运算符为等号时退出循环,并进行判断是否为正常退出循环的结果,最后输出。

定义number1为前一个数字,number2为后一个数字,定义op读入运算符
输出数字number1 
do while op!='='//运用循环结构通过几个简单运算得出复杂运算的答案
    输入op,number2//每次输入一个运算符和后一个数
    if (op!='+'且op!='-'且op!='*'且op!='/'且op!='=')或(op=='/'且number2==0)) then 
    //判断是否有非法运算符或被除数为0
  	    输出"ERROR"
  	    退出循环
  	end if 
	switch 判断 op//判断运算符执行相应算法
	    若是'+'则number1=number1+number2 退出判断 
		若是'-'则number1=number1-number2 退出判断 
		若是'*'则number1=number1*number2 退出判断 
		若是'/'则number1=number1/number2 退出判断 
	end switch 
end do while//直到运算符出现等号则退出循环
if op=='=' then //判断是否为正常输出结果,若是则输出结果number1
    输出number1
end if 

3.2.2 代码截图

3.2.3 测试数据

3.2.4 PTA提交列表及说明

  • Q1:刚看这道题目时没有注意这道题目的计算器没有运算符优先级,只进行从左到右的运算,造成答案错误
  • A1:重新理清思路,将每个部分的运算按顺序进行。
  • Q2:对变量op是否为非法运算符或者除数为0的情况的判断条件不够全面,无法将需要输出”ERROR“的情况区分
  • A2:设计两个条件,当op同时不属于四则运算符中的任何一个时,为输入非法运算符;当op为除号且后一个数字为0时,为除数为0;二者满足其一即可输出”ERROR“并退出循环。
  • Q3:针对前一个运算结果影响到下一个运算结果的这类题目
  • A3:由于运算次数最少为1次,可选择“do-while”语句,先进行一次循环,再将每种运算区分,注意判断循环结束的标志,并注意题目要求判断的非法运算,最后还要判断是否为正常循环结束的结果才能输出答案。

3.3 PTA题目3

要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。

3.3.1 算法分析

定义i和n为计量数,定义num为规定层数,定义op用来读入字母
输入字母op和层数num
for i=(num+1)/2 to num do //循环输出上三角形部分
    for n=1 to i do //循环输出每层的部分
        if n==i 或 num+1-i==n then //判断字母在每行的位置
            输出字母ch
        else
            输出空格
    end for
    输出换行//每层换行 
    字母op加1//字母递增 
end for
op=op-2 //调整为该层的正确字母 
for i=i-2 to (num-1)/2 do //输出下三角形部分 
    for n=1 to i do//循环输出每层的部分 
        if n==i 或 mun+1-i==n then //判断字母在每行的位置
            输出字母op
        else
            输出空格
    end for
    输出换行//每层换行 
    op=op-1//字母递减 
end for

3.3.2 代码截图

3.3.3 测试数据

3.3.4 PTA提交列表及说明

  • Q1:菱形的特殊处在于它是个上下左右都对称的图形,所以对构成每个边的字母位置要求有着对称的类似点
  • A1:左右对称的字母,每行它们的位置加起来恰好是一个定值,利用公式能更好地对位置的判断。上下对称的字母,我选择将菱形分为上三角形和下三角形进行分层构造,判断条件类似,便于理解。
  • Q2:没有注意到输出菱形的后一个字母的后面是没有空格的,造成答案错误
  • A2:划动选择pta的测试答案时发现这个问题,把每行循环结束判断的常量条件改为随不同行的变化而改变的变量条件,解决了这个问题。
  • Q3:针对读入不同数据、输出相似图形的这类题目
  • A3:在做题前需要将数据变化的结果逐一罗列,找到它的变化规律,得出适合的变量公式,再进行程序设计,必要时可以将图形拆分进行构造。

4.代码互评

4.1 代码截图

  • 同学代码:

  • 我的代码:

4.2 二者的不同

相同点:
1.都运用do-while的语句构建循环结构,先执行一次循环内容再进行判断。
2.都通过switch-case语句判断读入的运算符,枚举判断运算法则。
不同点:
1.判断运算是否合法:我的代码通过一个if语句将非法运算统一判断;同学的代码则先判断是否为非法运算符,再判断除数是0的情况。
2.判断是否输出运算结果:我的代码通过判断读入字符是否为等号;同学的代码则是定义flag值,这种方法直观明了,值得我学习。

posted @ 2018-10-25 17:20  不凉々少年  阅读(366)  评论(0编辑  收藏  举报