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

0.展示PTA总分

1.本章学习总结


1.1 学习内容总结

1.1.1 循环结构

  • for循环

    • 定义初始值时,先判断是否满足条件,如果满足,则运行for 语句内的程序,周而复始,直到不满足条件。如果不满足,则退出for 循环
  • while循环

    • while 语句类似for,只是运行语句内程序后不再有其他运算,而是直接判断是否满足条件,若满足,则再次运行语句内程序,判断是否满足条件。直到不满足条件时,退出while 语句
  • do-while循环

    • do while ,与while 的区别是多了一个do ,效果就是运行到do while 时,不先判断是否满足条件,而是先运行一遍do while内的语句,再判断,剩下的就和while 相同了 注意:while后面的分号一定不要忘记了!!
  • 嵌套循环

    • 顾名思义,就是在一个循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算
  • continue&break

    • continue:是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。
    • break:是打破的意思,(破了整个循环)所以看见break就退出一层循环。

1.1.2 字符

  • 大小写字符的转换
    • 小写转换为大写:定义一个字符型变量op,则op+'A'-'a'的结果即为大写
    • 大写转换为小写:定义一个字符型变量op,则op-'A'+'a'的结果即为小写
  • 转义字符
    • 一般转义字符:\n(换行)、\'(单引号)、\"(双引号)、\\(反斜杠)、\t(横向跳格)
    • 八进制转义字符: \ddd(1~3位八进制整数所代表的字符)
    • 十六进制转义字符:\xhh(1~2位十六进制整数所代表的字符)

1.2 本章学习体会

1.2.1 学习感受

  • 这两周学习进度开始变快了,PTA题目集的难度也在增加,有很多题目刚拿到手的时候是懵懵的无从下手,经过老师的课堂讲解后开始理清思路,终于能够解决出来啦
  • 初步认识了函数的运用,感觉用上函数之后整体代码变得更加简洁容易阅读,但是函数的使用我还是不太熟练,需要多加练习
  • 经历第一次上机考试,我觉得平常还是要多多写代码才能从容应对,要不然上机还是会脑袋空空呜呜呜
  • 有几道PTA题目一直解不出来,总有那么一两个测试点没过,然后我就拿去问同学,结果同学快被我的代码搞自闭了 最后修改完看到答案正确的时候真的超开心!!希望今后还能保持对C语言的热情继续努力学习 耶

1.2.2 代码量总结

PTA题集 单循环结构 嵌套循环 总计
代码量 515 412 927

2.PTA实验作业


2.1 PTA题目1

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

2.1.1 伪代码

定义整型变量change为待换的零钱;digit5为5分硬币个数;digit2为2分硬币个数;digit1为1分硬币个数;count为总的换法,初始值设为0;total为总的硬币个数;rest为5分硬币换完之后剩下的钱;left5为5分硬币的最多数量;left2为2分硬币的最多数量
输入change
	left5 = change / 5; /*算出5分硬币最多的数量,然后从最多的开始往下递减*/
	for (digit5 = left5;digit5>=1;digit5--)
		rest = change -(5*digit5);
		left2 = rest / 2;
	        	算出2分硬币最多的数量,然后从最多的开始往下递减
			算出1分硬币的数量
				输出各硬币个数及硬币总数
				count++;	
	end for
	输出总共的换法;

2.1.2 代码截图

2.1.3 造测试数据

  • 由于该题输出答案较多,我在这里只输出最终count的结果
输入数据 输出数据 说明
13 4 题目所给数据
15 6 rest能够整除2的数据
100 461 最大值数据

2.1.4 提交列表及说明

1.部分正确:一开始我把printf("fen5:%d, ", digit5);放在第一层for循环,发现输出后5fen会少掉,只剩下2fen和1fen的数据
2.编译错误:修改之后从vs复制过来时操作失误没删掉原来的错误代码直接在它的下面粘贴了...
3.答案正确:把printf("fen5:%d, ", digit5);放在第二层循环里面,这样就不会少输出了

2.2 PTA题目2

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。
首先在屏幕上显示以下菜单:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

2.1.1 伪代码

定义函数listMenu为屏幕显示菜单
定义整型变量time为查询的次数,choice为用户的选择
listMenu();
	for (time = 1;time <= 5;time++)/*限制查询次数*/
		输入用户选择choice;
		输出1~4编号对应的水果单价
		else if (choice == 0) break;/*若用户输入0则直接跳出循环*/
		end else if
                else
			printf("price = 0.00\n");/*输入其他不合法字符则显示0.00*/
		end else
	end for

void listMenu()
{
	/*显示菜单*/
}

2.2.2 代码截图

2.2.3 造测试数据

输入数据 输出数据 说明
-1 0 2 price=0.00 不合法数据
1 2 3 3 4 4 price = 3.00 price = 2.50 price = 4.10 price = 4.10 price = 10.20 超过5次查询的数据
1 3 price = 3.00 price = 4.10 合法数据

2.2.4 提交列表及说明

1.部分正确:其中一个测试点是格式错误,是有一个price输出等号两边忘记打空格了
2.部分正确:另外一个测试点纠结了很久,后来发现是因为我在最后else输出后打了个break,其实输入非法数据没要求跳出程序

2.3 PTA题目3

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。

2.3.1 伪代码

定义整型变量number为输入数据,mask用于计算最高位数,初始值为1,t用于存放number,bit用于存放每一位数字
输入number
当number为负数,设置number=-number,并输出"fu "
	t = number;/*t用于存放number并带入下面运算*/
	while (t >= 10)
		算出输入的number有几位数
		再算出最大的十百千万单位 在下面用来除余取值
	end while
	do
		输出各个位数
		switch(bit)
	        输出对应数字的拼音并break;
		end switch
		设置空格以符合格式
		取余降位并进入下一次运算
	 while (mask > 0);
end do-while

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
-600 fu liu ling ling sample负数
0 ling
9 jiu 个位数
123456789 yi er san si wu liu qi ba jiu 九位数
120 yi er ling 零结尾

2.3.4 提交列表及说明

1.格式错误:在最后if(mask>=10)的条件判断中,我将10打成了0,导致总会输出空格,将其修改完毕之后便正确了

3.代码互评

3.1 龟兔赛跑

  • 同学代码截图

  • 我的代码截图

  • 代码异同

    1.两段代码都能实现题目要求的功能
    2.我的方法偏向数学化,因为我只能想到数学方法 首先用for循环累加每一分钟的奔跑距离,计算出兔子和乌龟开始到第一次平局的时间是90min,然后加入到if语句的条件判断中来控制兔子的里程累加情况,最后用选择结构来输出结果
    3.同学也是使用累加的方法来计算每一分钟兔子和乌龟的奔跑距离,定义一个rest来存储兔子的休息时间30分钟,再用选择结构输出结果
    4.我和该同学的代码在某种程度上有相似之处,都运用了for循环累加分钟数,并用选择结构输出结果,但是我的会更偏向数学化,自己先算出平局时间以及每个时间段兔子的奔跑情况,而该同学更偏向还原题目,自主运算较少

3.2 换硬币

  • 同学代码截图

  • 我的代码截图

  • 代码异同

    1.两段代码都能实现题目要求的功能
    2.我的方法是用for循环递减5分硬币的个数,再嵌套一个for循环递减2分硬币的个数,每次循环后换法总数加一,然后分开输出各个面额硬币的个数及硬币总数
    3.同学的方法是先计算出5分硬币最多的情况,然后依次递减,将结果一次性输出
    4.我和该同学的代码在某种程度上有相似之处,都运用了循环来解决题目要求的递减格式,不过我是所有情况都放在循环里面输出,该同学则是先计算出第一种情况再进行循环运算

posted @ 2019-10-20 20:04  陈璧君  阅读(547)  评论(5编辑  收藏  举报