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←decimalism
2+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<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语言学习的一种不错的方法,通过这样的学习,才能在以后的题目解答更得心应手.只有极其努力,才能看起来毫不费力!

posted @ 2019-11-15 10:49  wllrky  阅读(312)  评论(1编辑  收藏  举报