C语言I博客作业08
这个作业属于那个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9976 |
我在这个课程的目标是 | 熟练地掌握运用C语言,锻炼思维逻辑能力,为以后其他语言的学习打好基础. |
这个作业在那个具体方面帮助我实现目标 | 学习使用while和do-while语句实现次数不确定的循环,使用break语句处理多循环条件,以及了解while,do-while,for三种语句的差异 |
参考文献 | 《C语言程序设计》《C Primer Plus》百度百科 伪代码基本写法 |
1.PTA实验作业
1.1爬动的蠕虫
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0).
输入格式:输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:在一行中输出蠕虫爬出井的时间,以分钟为单位。
1.1.1数据处理
数据表达:用了变量height,time,N,U,D.height,time通过赋值得到的,N,U,D通过直接输入得到的.类型全为整型.
数据处理:height表示虫爬的高度,time表示耗费的时间,N表示井的深度,U和D分别表示一分钟虫上升和下降的距离.
所用表达式:time=0;height=0;height=height+U;time=time+1;height=height-D;time=time+2;
流程结构:定义变量height,time,N,U,D.
赋值并输入.
while height<N)
height←height+U;
if(height>N)
then[time=time+1;break;]
else[height=height-D; time=time+2;]
输出并返回函数值
1.1.2实验代码截图
1.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
12 3 1 | 11 | 使用题目数据进行测试 |
6 8 3 | 1 | 虫第一次上升就爬出井 |
15 5 3 | 11 | 虫第一次上升没爬出井 |
17 6 3 | 9 | 最后上升过程不足1分钟 |
8 4 2 | 5 | 最后上升过程恰好一分钟 |
1.1.4 PTA提交列表及说明
1.部分正确:我一开始认为是else语句没扩起来,所以我将else后的distance=distance-D;time=time+2;扩起来,但仍然是部分正确.
2.答案错误:我不理解错误在哪个地方,所以我重新浏览程序,我选择将height赋值为1,我认为可能虫爬上去只要N-1存,忽视了题目条件--蠕虫是趴在井底的.
3.部分正确:通过上一次答案错误,我知道我是某一处程序设计出错,但我依旧将注意力放在if-else上,导致再次部分正确.
4.部分正确:通过用DEVC++测试,我将time=time+2;改为time=time+1;导致答案错误,忽视if语句我用break跳出了.
5.编译错误:我找到了错误原因,当if(N<=U),我写的printf("1");答案错误,所以我将这一语句删除,但在修改时,有一个扩号没有删除.
1.2jmu-c-二进制转10进制
输入一组二进制字符,输出其对应的十进制数。当输入回车键时,输入结束。若输入非二进制字符,输出error input!
1.2.1数据处理
数据表达:用了变量ch,decimalism,flag.ch通过直接输入得到,decimalism和flag通过赋值得到.ch为字符型,flag和decimalism为整型.
数据处理:ch表示字符,decimalism表示十进制的值,flag表示判断的变量,当做标志.
所用表达式:decimalism=0;flag=0;decimalism=decimalism2+ch-'0';flag=1;
流程结构:定义变量ch,decimalism,flag.
decimalism←0;flag←0;
while ch!←'\n'
swtich(ch){
输入选项ch
if(ch'\n')→break;
if(ch'1'||ch=='0')→decimalism←decimalism2+ch-'0';
ch其他→printf("error input!");flag=1;}
if(flag0)→ printf("%d", decimalism);return 0;
1.2.2试验代码截图
1.2.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
11111111 | 255 | 与数目数据sample1等价 |
34 | error input! | 与数目数据sample2等价 |
111001 | 57 | 输入一组二进制字符 |
121 | error input! | 输入一组非二进制字符 |
11111111111 | 2047 | 随机输入一组字符 |
1.2.4PTA提交列表及说明
1.编译错误:switch语句中case 常量表达式后加的是分号,我的语句是case '\n';正确的是case '\n':.
2.部分正确:赋值与等于概念模糊,我的语句是if(flag=0),正确的语句是if(flag==0).
3.部分正确:少了一个语句,忽视了字符型常数可能是'\n'.应该要加一个case '\n':break;
1.3整除光棍
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1.
输入格式:输入在一行中给出一个不以5结尾的正奇数x(x<1000).
输出格式:在一行中输出相应的最小的s和n,其间以1个空格分隔.
1.3.1数据处理
数据表达:用了变量num,x,count;x通过直接输入得到,num和count通过赋值得到.类型全为整型.
数据处理:num表示光棍数,x表示输入的值,count表示光棍的位数.
所用表达式:count=num=1; num=num10+1;num%x==0;num=(num%x)10+1;count++;
流程结构:定义变量,赋初始值.
while num<x
num←num10+1;
while 1
if(num%x==0)
then[printf("%d %d",num/x,count);break;]
else[printf("%d",num/x);num=(num%x)10+1;count++;]
return 0;
1.3.2实验代码截图
1.3.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
31 | 3584229390681 15 | 与数目数据sample等价 |
9999 | 11112222333344445555666677778889 36 | 最大x |
1 | 1 1 | 最小x |
111 | 1 3 | x是光棍 |
53 | 20964360587 13 | 随机值 |
2 | 无值 | x为偶数 |
1.3.4PTA提交列表及说明
1.部分正确:一开始思路是定义一个num表示光棍数,逐渐增加光棍的位数,直到可以整除x为止,输出最小的s和n,提交发现运行超时.
2.答案错误:经过修改,我发现无论我的x为何值,当位数增大时,无法输出最小的解。
3.部分正确:我又将代码修改回去,将if-else语句添加括号括起来,但对值无影响,还是部分正确.
4.部分正确:这时我将题目数据做了一次除法,我发现好像这题的值是一次接着一次输出的,并不是一次输出,所以我想num/x输出作为值得第一位,但我num定义为1,可能比x小,这时第一位为0,答案错误.
5.编译错误:我发现num可能小于x,所以我重新增加限制条件,当多打了一个括号.导致编译错误.
6.部分正确:我将num<x时,num=num*10+1;但忘记增加光棍的位数.导致答案错误,加一个count++,答案正确.
2.代码互评
我的代码:
同学(1)的代码:
代码差异:
1.定义变量不同,我多定义了一个flag表示判断的变量,当做标志.
2.我用的swtich语句分情况讨论,同学(1)用的if-else语句分情况讨论.
3.字符型变量的输入方式不同,我用的scanf("%c",&ch);而同学(1)用的ch=getchar();
4.同学(1)的代码更加简单,清晰.
我的代码:
同学(2)的代码:
代码差异:
1.定义变量不同,同学(2)定义了一个字符型数组,数组长度为50,由于使用字符串的函数,同学(2)添加头文件#include<string.h>.
2.同学(2)求十进制数用的pow()函数,而我直接利用算法的思想将decimalism=decimalism*2+ch-'0';更加简单.
3.我的变量命名更加直白,见名知义.
4.输入字符型变量的方式不同.我用的scanf("%c",&ch);而同学(2)用的gets(op);这是值得我学习的地方.
5.所用循环语句不同,我用的while语句,同学(2)用的for语句.
3.学习总结
3.1学习进度条
周数/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较疑惑的问题 |
---|---|---|---|---|
第三周(10/08--10/12) | 12个小时 | 300行左右 | 定义函数,if-else,for循环语句 | 输入与输出格式,空语句 |
第四周(10/14--10/18) | 15个小时 | 250行左右 | for循环语句,基础的循环程序设计,数据的输出宽度 | 数据的输出宽度概念不太清晰,表达式的定义,空语句的定义 |
第五周(10/23--10/26) | 12个小时 | 350行左右 | 自定义函数的声明与调用,break跳出循环,while()循环语句 | 自定义函数的应用 |
第六周(10/30--11/01) | 18个小时 | 500行左右 | if-else的嵌套,学习逻辑运算,条件语句,字符类型以及字符型数据的输入与输出 | 对字符型数据的输入与输出了解太少,缺乏练习,没有理解到getchar()字符输入函数与putchar()字符输出函数以及它们的运用 |
第七周(11/05--11/07) | 24个小时 | 720行左右 | 使用switch语句的三种情况,在switch语句中使用break语句,数组的定义与使用 | continue语句的使用,for语句的嵌套循环 |
第八周(11/12--11/15) | 19个小时 | 810行左右 | 学习使用while和do-while语句实现次数不确定的循环,使用break语句处理多循环条件,以及了解while,do-while,for三种语句的差异 | ASCII码和char类型和int类型的转换,进制数转化的多种方式 |
3.2累积代码行和博客字数
3.3学习内容总结和感悟
3.3.1学习内容总结
3.3.2学习体会
在本次作业完成过程中,我已经学习了三种不同的循环语句以及它们之间的差异.当题目指定了循环次数,用for语句更清晰.当题目没指定循环次数,则用while或者do-while语句去实现循环.而for语句,while语句,do-while语句在循环流程中顺序不同,for语句和while语句是当条件满足才会进入循环,而do-while语句无论循环条件是否满足,至少会执行一次循环.此外,在作业完成过程中,我学习了二进制与十进制的转换,以及数组的定义与调用,当使用字符串的函数时,要添加头文件#include<string.h>.每个题目都有许多不同的解法,只是难易程度和思路不同,我们在学习中不能只局限于一种解法,而是应该尝试不同的解法去解答题目,拓展我们的思路,这也是巩固C语言学习的一种不错的方法,通过这样的学习,才能在以后的题目解答更得心应手.只有极其努力,才能看起来毫不费力!