C博客作业02--循环结构
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
-
循环结构的使用:
- for循环结构:第一个是初始化,第二个是条件语句,第三个是自处理语句。 循环时第一个语句只使用一次,然后判断是否满足第二个语句,满足则进入循环体。直到不满足循环体再跳出。
-
while循环结构:先对while()括号内的条件进行判断,若为真则进入循环,否则跳出循环。
-
do-while循环结构:先执行循环体中的表达式的内容,之后再进行循环条件的判断,决定是否进行下一次的循环。
-
总结:
- while循环结构与do-while循环结构的区别:while和do-while的区别在于判断条件的先后,即while是先判断,程序有可能不进入循环;do-while是后判断,就是说do-while无论是否满足条件都只是会进行一次循环。因此,同样的条件,两种循环的输出结过可能不同。
- for循环结构:第一个是初始化,第二个是条件语句,第三个是自处理语句。 循环时第一个语句只使用一次,然后判断是否满足第二个语句,满足则进入循环体。直到不满足循环体再跳出。
例如:不相同的情况:两种的输入值与循环条件相同,但是输入的值不满足循环条件,此时while不进入循环而do while会循环一次
如:
和
此时两种循环是不同的。
相同的情况:两种输入值与循环条件相同,同时进入循环的值与】满足循环条件,两者就是相同的。
如:
和
此时两种循环是相同的。
2. **for循环结构**与**while循环结构**的区别:再使用for语句时,for语句中的成分直接完成了对变量的初始化,条件的控制以及自处理语句,使程序可以直接进行;而while语句因为只有一个条件,因此需要在循环之前做好对变量的初始化等工作。但在执行起来,两者并没有很多区别。
-
循环语句的控制
- break:在执行循环语句时,break也起到控制循环的作用。当满足执行break的条件时,break强制循环结束,不再执行循环体中break之后的内容,并直接跳出循环。一般来说,在循环语句中,我们会用if与break搭配,当条件满足时,起到跳出循环的作用。(注意!!!在嵌套循环中,break之后只能跳出它所在的那一次循环,而不是全部)
- continue:与break不同,当执行到comtinue语句时,continue会跳过循环体中continue下面的语句,并结束本次循环,并进入下一次循环(注意!!!是只结束本次循环,而不是跳出循环!!!),在循环语句中,一般也是与 if搭配。
-
嵌套循环
- 顾名思义,嵌套循环就是在一个循环中包含着其他循环(也可以叫做外循环与内循环)。在使用嵌套循环时,我们需要保持自己的逻辑性,明确内外循环分别代表这什么,并控制好变量的初始化,循环的条件与结束,否则很容易出错甚至会死循环。
例如这道分硬币的题目:
只有首先明确了三个变量的初值(循环的开始),再一层层嵌套,最后利用if的判断输出结果。
- 顾名思义,嵌套循环就是在一个循环中包含着其他循环(也可以叫做外循环与内循环)。在使用嵌套循环时,我们需要保持自己的逻辑性,明确内外循环分别代表这什么,并控制好变量的初始化,循环的条件与结束,否则很容易出错甚至会死循环。
1.2 本章学习体会
- 两周下来,我们又学习了嵌套循环,函数以及一点数据类型。现在学习起来已经开始有点难度以及吃力了,学习C语言的时间也在加长,希望可以通过大量有效的练习来巩固已经学习完的知识。
- 嵌套循环:嵌套循环涉及了多次循环,需要在代码时有完整的逻辑。对于PTA中于龙的那道对日期合法性的判断还是不是很明白,不知道要怎么利用利用循环取判断日期的合法性。
- 函数的定义与使用:个人感觉函数的使用大幅减少了主函数的代码量,但是我在写程序时一旦需要定自己定义的函数如果过多,我就开始有点吃力了,个人感觉使用函数还是要多练习。
- 在这几周的学习中,特别是经过了第一次的机房考试后,我才可以感受到:只有自己一句一句写出来,经过调试和优化的代码才能真正成为你自己的代码,多与别人探讨,多独立思考,才能把学习到的知识真正变成自己的。从网上找的或是从同学那里参考的,或许短期之内会印象深刻,但是时间一长就会逐渐淡忘。你可以与同学讨论,对比同学与自己的想法与思路,最后再考虑是根据自己的私利优化还是借鉴同学的思路,最后再自己写出代码。(个人认为:思路可以参考借鉴,但是代码一定要自己写!!!)。开学已经快两个月了,但是直到现在,当写出了代码并全部正确时,心中还是会很高兴和激动。希望在今后的学习中,我还可以保持这样的状态一直努力下去。
- 代码量:
2.PTA实验作业
2.1 PTA题目1
c03-单循环结构
7-9 龟兔赛跑 (20 分)
本题要求:在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。
2.1.1 伪代码
#include<stdio.h>
int main()
{
定义乌龟跑的总距离 tortoiseSum;定义兔子跑的总距离 rabbitSum;定义时间T;定义rest用于判断是否休息,rest=0时奔跑,rest=30时休息;定义i;time用于循环
输入时间T。
令tortoiseSum = 0;rabbitSum = 0;rest = 0;
for time = 0 to T-1
{
tortoiseSum = tortoiseSum + 3;
if 时间为10的倍数time % 10 == 0 && rabbitSum兔子距离 > tortoiseSum乌龟距离&& 休息时间rest == 0
{
兔子休息时间加30;
}
if 休息时间等于0
{
兔子结束休息,开始奔跑rabbitSum = rabbitSum + 9;
}
else休息时间不为0
{
随着时间过去,休息时间减少rest--;
}
end if
}
end for
if (乌龟跑的总距离 > 兔子跑的总距离)
{
输出@_@ %d"和tortoiseSum
}
else if (乌龟跑的总距离 < 兔子跑的总距离)
{
输出^_^ %d"和 rabbitSum
}
else
{
输出-_- %d"和rabbitSum
}
end if
return 0;
}
2.1.2 代码截图
2.1.3 造测试数据
2.1.4 PTA提交列表及说明
说明:
1.部分正确:在第一次提交之后,出现部分错误:问题出现在循环结构中,第一次将第一个if和第二个if-else的位置写反,导致进入的条件判断先后出现问题,在time=10的倍数时,先判断
此时的rest,在第一个10分钟时休息时间本应加上30分钟,之后开始递减,但是此时因为位置写反,没有进行应该进行的递减,导致答案出现错误。
2.全部正确:将两个if的判断语句调换之后,全部正确。
2.2 PTA题目2
c03-单循环结构
7-10 jmu-c-二进制转10进制
输入一组二进制字符,输出其对应的十进制数。当输入回车键时,输入结束。若输入非二进制字符,输出error input!
2.2.1 伪代码
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
定义一个字符串num[1000]来储存输入的二进制数 ;定义i,item;sum;a
令item = 0;sign = 1;sum = 0;
输入数字
for i = 0 to num[i] > 0
{
if (num[i] != '0' && num[i] != '1')
{
item = 1;
输出error input!
break;
}
end if
}
end for
计算字符串的长度
if item等于0
{
for i = a - 1 to 0
{
逐位计算每一位二级制数转换的十进制数并累加sum = sum + sign * (num[i] - '0')
sign = sign * 2;
}
输出sum
}
end if
return 0;
}
2.2.2 代码截图
2.2.3 造测试数据
2.2.4 PTA提交列表及说明
说明:
1.部分正确:第一次使用数组和循环,通过取余数来将输入的数字一位一位取出来,并用数组来存储分离出来的每一个数,对题目给的样例也输出了正确答案,但是提交后却是部分正确,
之后调试发现,一旦输入的二进制数超过了10位,数据就会溢出。因此尝试把数组的定义改成long int。
2.部分正确:第一次改为long int之后提交仍然显示部分正确。
3.在VS中经过多次调试发现数组仍会溢出,因此想到用字符串的形式来存储数字字符,最终通过了所有测试点。
2.3 PTA题目3
c03-单循环结构
7-2 求幂级数展开的部分和
已知函数ex可以展开为幂级数1+x+x^2/2!+...+x^k/k!,现给定一个实数x,要求利用此幂级数部分和求ex 的近似值,求和一直继续到最后一项的绝对值小于0.00001。
2.3.1 伪代码
#include <stdio.h>
#include <math.h>
int main()
{
定义x, sum ,result,i
令sum,result=1.0
输入x
int i;
for i = 1 to
{
后一项均为前一项再乘(x/i)result = result *(x/i);
累加sum += result;
if 出现一项的绝对值小于0.00001。
{
结束循环break;
}
end if
}
end for
输出4位小数sum
return 0;
}
2.3.2 代码截图
2.3.3 造测试数据
2.3.4 PTA提交列表及说明
1.部分正确:一开始循环时将分子与分母都用pow函数进行计算,导致最后在程序在进行时运行超时了
2.全部正确:后来将循环过程中的pow函数计算改为根据前后项之间的联系来进行累加,就不会出现超时,答案全部正确
3.代码互评
3.1.1
7-10 任务06-02-02 于龙又又遇见日期,叕哭了!
同学代码:
我的代码:
两段代码的异同:
- 同:
- 都能实现题目的要求,对输入的日期进行合法的判断。
- 两段代码的总体思路上都是通过穷举法,将输入三个数据进行6种排列判断。
- 异
- 很明显,同学的代码虽然也是穷举法,但是很简洁;而我的代码明显太长了。
- 同学的代码主要使用函数来解决闰年等需要判断的量;而我全篇采用if来判断。
- 同学利用数组对6种排列方法进行输出;而我是用if语句对每一项进行判断,造成代码过长。
总结:这道题在写代码时一开始没有想的很多,就是利用if对6种情况判断,所以程序分成了三块类似的代码来判断,造成代码的过于冗长;而看来同学的代码后,我才发现同样是穷举法,但是同学巧妙的运用函数与数组,在达到目的的同时代码量不到我的三分之一。我同样也会数组,但是我在思考时没有想到使用它,因此,这也是我要向同学学习的地方,如何运用自己已经掌握的知识,而不是停留在最初级的写法。
3.1.2
7-10 jmu-c-二进制转10进制
同学代码:
我的代码:
两段代码的异同:
- 同:
- 两段代码都能实现题目要求,将二进制转为十进制。
- 都将数字用字符型的数据进行输入,来达到目的。
- 都使用了字符转数据的计算
- 异
- 同学的代码采用的时单个字符的存储;而我采用的是字符串的方式进行存储。
- 同学用来转进制的方式是在while循环中进行判断,合理时一边读取字符,一边进行计算转换;而我是在判断输入的二进制数合理时,对字符串的长度进行计算,最后利用循环计算。
总结:在这道题上,我和同学的想法大同小异,都想到了用字符型数据进行输入,主要区别就在单个字符的输入与字符串的输入以及代码的写法。个人认为两段代码都有自己的长处,可以互相学习,多多讨论。