c博客作业02--循环结构
0.展示PTA总分
本章学习总结
1.1学习内容总结
1.1.1while语句
while(表达式1)
{
循环体语句;
}
do
{
循环体语句;
}while(表达式一);
do while语句和while主要的区别在于do while对于循环体中的语句先执行一次再判断条件,而while则是先判断条件再看是否执行循环体中的语句;而while语句和for同为循环语句,对于什么时候用while语句什么时候用for语句有一些区别,当不清楚循环次数时用while显然要简单一些,当清楚循环次数则用for;
1.1.2判断素数的一些技巧方法
我们来看下面这个例子
for(i=2;i<=m/2;i++)
{
循环语句;
}
or
for(i=2;i<=m;i++)
{
循环语句;
}
这虽然在一般的题中没有什么问题,但我觉得从时间角度来说,上面的句子节省了一半的循环时间,提高了程序的运行效率;所以我觉得在以后的编程中,多思考思考,也许能找到更好的方法来解决这些问题;
1.1.3 break和continue语句
举个例子:
for(i=1;i<=3;i++)
{
printf("*");
continue;
}
and
for(i=1;i<=3;i++)
{
printf("*");
break;
}
第一种输出的结果为‘’**‘’,而第二种输出的结果为‘’‘’,虽然都是跳出循环,但continue只是跳出这次循环,执行下次循环;而break则是跳出循环语句,不再执行它;当然break也可以用于switch语句;
1.1.4 嵌套循环
嵌套循环无非就是for中for,for中while,while中for;我觉得语法只要单独的掌握了for和while循环,嵌套循环就不是问题,我觉得重要的还是实际例子中的运用;比如初始化变量应该放在for中的哪个地方,以及何时恰当的运用break和continue,使语句恰当的执行;
1.1.5 通过超星学习通学习的知识
需要清空多余字符时用fflush(stdin);
清屏system(“cls”);
巩固了随机数rand(),它存在于#include<stdlib.h>;
随机种子srand(time(NULL));随机种子存在于#include<time.h>;
本章学习体会
1
在本章学习中,我觉得已经掌握了基本语法,差的只是实际中的运用,多做点题目,我觉得可以掌握,唯一让人就是这星期太多作业了,不是在预习的路上就是在预习,但也让人很充实,没有一点的偷懒;
2
上周总共代码量为300行
这周的代码量为400行,距离预定的差太多了,这周得再接再厉了;
2.PTA实验作业
2.1 题目名1
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。
2.1.1伪代码
数据处理:循环变量 int i,j;计算总和的int sum;取余后最后一位数:int num;去掉最后一位数的变量:int item;
定义变量
初始化变量sum;
输入变量N;
for(i=最小的N位数;i<=最大的N位数;i++)
{
初始化item=i,sum=0;
for(j=1;j<=N位数;j++)
{
取出最后一位数为num;
去掉最后一位数为item;
计算N位数的各个数字的立方和;
}
if(判断是否为水鲜花数)
{
输出
}
}
2.1.2代码截图
2.1.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 | 153\n370\n371\n407 | 最小数据,题目数据 |
7 | 1741725\n9800817\n9926315 | 最大数据 |
2 .4PTA提交列表
2.1.5说明
1.编译错误:未定义变量item
2.答案错误:sum没有在内部初始化,导致下一次循环有原来的值;通过调试,在内部初始化了sum=0;
3.答案错误:没有使item=i,导致每一次item都为原来的值,循环出不来;在一个for内使item=i;
4.部分正确:在改正了前两个后,还有一个在多次调用pow函数造成的运行超时问题;我直接造了一个po函数,让主函数直接调用它,虽然在vs上看不出有多少差别,但在pta上却通过了,事实证明自己写的函数应该比调用系统函数库里的要快一点;
2.2 题目名2
已知函数ex可以展开为幂级数1+x+x2/2!+x3/3!+⋯+xk /k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。
2.1.1伪代码
数据处理:输入实数double x和double sum;循环变量int i;阶乘double temp;
定义变量;
输入x;
for判断条件
{
阶乘temp;
求和sum;
}
输出sum;
2.1.2代码截图
2.1.3造数据测试
输入数据 | 输出数据 | 说明 |
---|---|---|
1.2 | 3.3201 | 题目数据 |
0 | 1.0000 | 最小数据 |
5 | 148.1432 | 最大数据 |
2.1.4PTA提交列表
2.1.5说明
1.运行超时:起先运行错误,我用vs结果显示5的时候,答案是负数,我就加了一个fabs,结果超时,就以为是调用的问题,解决:无法找出原因,就换了一个方法写;
2.答案错误:换了方法后显示答案错误,这种题用vs查错我也不会,设断点也不行,用printf输出也不行;解决:叫同学帮忙看后,才知道阶乘的定义错了,将int改为double就好了,以前知道但不以为然,这次让我浪费了这么多时间才让我长了教训
2.3题目名
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
2.3.1伪代码
数据处理:定义了循环变量int i;乌龟兔子的路程int rabbit;int tortoise;总时间int time;
定义变量;’
初始化路程;
输入时间;
for循环条件
{
乌龟兔子的路程;
if判断是否到了十分钟
if判断谁跑的远
if判断是否加了三十分钟超过了总时间time;
输出结果;
}
2.3.2代码截图
2.3.3造数据测试
输入数据 | 输出数据 | 说明 |
---|---|---|
242 | @_@ 726 | 最后未满30分钟的 |
9 | _ 81 | 未满10分钟的 |
40 | @_@ 120 | 刚好满30分的 |
2.3.4PTA提交列表
2.3.5说明
1.答案错误:未将兔子在跑中获胜的算进去。解决:放个if语句进去,判断满30和没满30的情况,分别输出
2.部分正确:输出平局是未将路程写进去,解决:将兔子或乌龟的路程放进去即可
代码互评
第一题
or
1.代码的复杂度不同,一个打印空心菱形用的的一段直接打印,一个用的两段打印上下
2.定义的变量一个多一个少,一个有用到字符变量
第二题
or
1.一个输入菜单时用了函数,一个直接打印
2.一个将==0的情况放在了switch语句里,一个单独用了一种情况