这个作业属于那个课程 | 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 输出格式:在一行中输出蠕虫爬出井的时间,以分钟为单位。
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
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(flag==0)→ 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
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提交列表及说明
我的代码: 在本次作业完成过程中,我已经学习了三种不同的循环语句以及它们之间的差异.当题目指定了循环次数,用for语句更清晰.当题目没指定循环次数,则用while或者do-while语句去实现循环.而for语句,while语句,do-while语句在循环流程中顺序不同,for语句和while语句是当条件满足才会进入循环,而do-while语句无论循环条件是否满足,至少会执行一次循环.此外,在作业完成过程中,我学习了二进制与十进制的转换,以及数组的定义与调用,当使用字符串的函数时,要添加头文件#include
1.部分正确:一开始思路是定义一个num表示光棍数,逐渐增加光棍的位数,直到可以整除x为止,输出最小的s和n,提交发现运行超时.
2.答案错误:经过修改,我发现无论我的x为何值,当位数增大时,无法输出最小的解。
3.部分正确:我又将代码修改回去,将if-else语句添加括号括起来,但对值无影响,还是部分正确.
4.部分正确:这时我将题目数据做了一次除法,我发现好像这题的值是一次接着一次输出的,并不是一次输出,所以我想num/x输出作为值得第一位,但我num定义为1,可能比x小,这时第一位为0,答案错误.
5.编译错误:我发现num可能小于x,所以我重新增加限制条件,当多打了一个括号.导致编译错误.
6.部分正确:我将num2.代码互评
同学(1)的代码:
代码差异:
1.定义变量不同,我多定义了一个flag表示判断的变量,当做标志.
2.我用的swtich语句分情况讨论,同学(1)用的if-else语句分情况讨论.
3.字符型变量的输入方式不同,我用的scanf("%c",&ch);而同学(1)用的ch=getchar();
4.同学(1)的代码更加简单,清晰.
我的代码:
同学(2)的代码:
代码差异:
1.定义变量不同,同学(2)定义了一个字符型数组,数组长度为50,由于使用字符串的函数,同学(2)添加头文件#include
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学习体会