C语言I博客作业08
这个作业属于哪个课程 | C语言程序设计II |
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-1/homework/11610 |
我在这个课程的目标是 | 掌握break、continue语句的使用,以及他们的区别,了解多层循环结构如何跳出多层循环,使用循环输出乘法表,了解循环嵌套的循环次数,简化代码 |
这个作业在那个具体方面帮助我实现目标 | pta实验作业、同学代码互评。 |
参考文献 | C语言程序设计(3)、C primer plus |
学号 | <20208956> |
1.PTA实验作业(20分/题) | |
请再此处列出自己的排名图片。 | |
![]() |
从PTA题目集中选出2个你最满意的题目完成以下内容,选择题目难度越大,分值越高,每题20分(每项5分),内容要求如下:
1.1 题目名1 字符菱形
题目内容描述
输入数据含有若干组的数据,每组数据包括一个可见字符c和一个整数n(1≤n≤30)。 以键盘输入^Z或遇到文件结束符时结束数据输入。
输出以c为填充字符,边长为n的菱形,每个菱形之后都输出一个换行符。
1.1.1数据处理
数据表达:定义字符型变量c,整型变量n,c、n分别为输入的字符和边长。用i、j分别表示行列。
数据处理:先使用一个for(i=1;i<=n;i++)确定从上至n行,再嵌套for(j=1;j<=n-i;j++)确定每行输出的空格数(每行空格有多少列)for(j=1;j<=2*i-1;j++)表示字符所在的列,用来循环输出字符。当循环输出字符结束后输出换行。
for(i=1;i<=n-1;i++)表示下半部分的行数与上部分一样的思路,只不过算出行列的算式不一样,for(j=1;j<=i;j++)用来输出空格的循环,for(j=1;j<=2*n-1-2*i;j++)输出字符的循环,字符数量与上部分刚好成相反的变化,
1.1.2实验代码截图
1.1.3 造测试数据
输入样例 | 输出样例 | 说明 |
---|---|---|
A 5 B 3 | ![]() |
A\B为填充字符 边长分别为5、3 |
A 3 B 3 | ![]() |
A\B为填充字符 边长分别为3、3 |
根据PTA提交列表,简要描述调试程序碰到的问题及解决办法。
提交列表说明:
1.编译错误主要是修改的时候不小心删掉了一些符号。
2.运行超时:但是使用while循环的时候跳出循环的条件是scanf("%c %d",&c,&n)=='EOF',跳不出while语句,死循环了。后来将''去掉了但答案错误。
3.答案错误:输出时A与B的菱形之间出现了一个与A边长一样的空格棱形,意味着输入多了什么,从提交列表也看得出来,这里卡了很久,我最终还是没找到原因,后来去问助教才知道在scanf中的%d后面还需加一个空格,因为如果没有这表示A 5 B 3中5后面的空格被当作字符输入了但是没有得到新的n所以会出现一个与A边长一样的棱形。
1.2 题目2 Wifi密码
A-1;B-2;C-3;D-4;把一系列题目的答案按照卷子上给出的对应关系翻译成 wifi 的密码。这里简单假设每道选择题都有 4 个选项,有且只有 1 个正确答案。
1.2.1 数据处理
数据表达:首先定义了mn两个整型变量,n表示行数,n是用来表示数组中的第几个数,再接着定义了啊,a,b两个字符型变量用来输入选项和对错。最后定义了一个数组(t[n])。用来保存得到的密码的每位数。用i表示行数,用j表示输入字符数。
数据处理:使用两层for循环对行数和列数进行计算,输入完后判断答案是否正确,对应到相应的密码并存入数组。
最后使用for循环依次将存入的数从数组中输出。用if语句简化问题。
1.2.2 实验代码截图
1.2.3 造测试数据
输入样例 | 输出样例 | 说明 |
---|---|---|
![]() |
132 | 三位密码 |
![]() |
130 | 无输入时输出0 |
![]() |
13224143 | 8位 |
1.2.4 PTA提交列表及说明
1.之前我的第二层循环j是小于等于4,因为我觉得我用scanf输入的是两个,一行只有四个,但是输出的结果却超过了n位。调试后发现在if语句时一次只判断一个,每行一共四次输入,每次输入两个,所以循环次数为8.
2.在最后输出数组的时候出了错误。漏了一位。
2.代码互评(5分)
同学代码截图
1
2
自己代码截图
1.第一位同学的代码使用了数组,函数、自定义函数,系统性很强。我目前水平还不够,还写不出。
2.第二位同学与第一位的风格相似,但有很多细节的处理方式不同,都非常值得学习。
3.我没有用到数组,按照平常的思路来,在判断素数是否达一百的这个地方,因为我没想出来怎么计数(每输出15个将计数变量初始化)于是就用另一段代码算出当输出100个素数时输入m的值,然后就判断输入值与m的大小即可。要是题目换了就得改代码,没有系统性。
3.学习总结(15分)
3.1 学习进度条(5分)
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
第八周 | 18 | 220 | printf,scanf的使用,以及int类型 | |
第九周 | 22 | 231 | if语句分支结构、调用数学函数 | |
第十周: | 25 | 255 | for、while、do...while语句、字符型数据的使用 | switch语句多分支结构、break语句和continue语句 |
第十一周 | 28 | 600左右 | switch语句,逻辑运算符,数组,自定义函数 | 多个循环结构的嵌套使用容易出错 |
第十二周 | 27 | 680左右 | 无新的知识点 | 排序问题 |
第十三周 | 25 | 400左右 | 巩固switch语句、const限定符、short int、long int、long long int、unsigned整数类型 | 无 |
第十四周 | 20 | 500 | 宏定义、多种循环结构的使用 | for循环与while循环之间的转换 |
第十五周 | 19 | 700 | break,continue语句的使用,九九乘法表,水仙花数··· | 数组的使用,菱形字符··· |
3.2 累积代码行和博客字数(5分)
3.3 学习内容总结和感悟(5分)
3.3.1 学习内容总结
3.3.2 学习体会
这周学习了break、和continue语句。
continue语句和break语句的区别是:break语句只用于循环体和switch语句中,continue只能用于循环语句。continue语句只结束本次循环,而不终止整个循环的执行。而break语句则是结束整个循环过程。break语句用来跳出循环时遇到多层循环嵌套时,break只能跳出离它最近的循环体,所以多层循环使用break跳出时得一层一层的来。
我查阅相关资料找到多层循环跳出可以使用使用goto语句;借用c++异常处理中的throw抛出异常从多重循环出来;把嵌套循环写成函数,使用return语句结束函数。后面两个方法还不太懂。
goto语句想跳哪里都可以。