0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
- while语句
while的执行顺序
while (表达式)
{
语句;
}
当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。
(注意后面的执行语句不论有多少行,就算只有一行也要加“{}”使代码更不容易出错)
下面写一个程序实现此功能:计算 (1-1/3+1/5-1/7+1/9-1/11…)4 的值。
# include <stdio.h>
int main(void)
{
int i = 1;
int j = 1;
double sum = 0; //结果肯定是小数, 所以要定义成double或float型
while (1.0/i > 1e-6) /*当1/i小于10的-6次方时停止循环。这个循环条件是自己定的, 定得越小最后的结果就越精确。注意1一定要写成小数的形式即1.0*/
{
sum += (1.0 / i) * j;
i+=2;
j = -j; //实现正负交替
}
sum *=4;
printf("sum = %lf
", sum); //double是%lf, 取6位小数是%.6
return 0;
}
输出结果是:
sum = 3.141591
*while和for的比较
在 for 循环的格式中,表达式 1、表达式 2 和表达式 3 在 while 循环中一个也不少,只不过不像 for 循环那样写在一起,而是分开写。在 while 循环中,循环变量 i 在定义的时候就给它赋初值,i++则是写在 while 的循环体内。只有循环判断表达式与 for 一样,都是写在其后的括号中。
for循环的目的是为了限制循环体的执行次数,使结果更精确。
while循环的目的是为了反复执行语句或代码块。
当程序中需要用到循环结构时,for 循环和 while 循环都可以使用,(没有给出循环次数的时候用while循环更好)具体如何选择要根据实际情况分析。比如死循环往往就是用 while(1)
*do while语句
do{
输入的内容
}while(表达式);
do-while 和 while 循环非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。和 while 循环主要的区别是 do-while 的循环语句保证会执行一次),然而 while 循环中就不一定了。
*break 和continue 区别以及用法
break 再循环中的作用是 跳出一个循环或者结束一个循环
continue立即结束本次循环,继续执行下一次循环
#include<stdio.h>
void main()
{
int sum,i;
sum=0;
for(i=1;i<=100;i++)
{
sum=sum+i;
if(i==2)
{
printf("执行continue");
continue;
}
if(i==4)
{
printf("执行break");
break;
}
printf("sum=%d",sum);
}
printf("循环结束");
}
这个的运行结果为: sum=1;
执行continue;
sum=6;
执行break 循环结束
运行结束。
for (i=0;i<5;i++)
{
if (i==3) break;
x=x + "The number is " + i + ...;
}
// 只输出 0 , 1 , 2 , 到3就跳出循环了
---
for (i=0;i<=5;i++)
{
if (i==3) continue;
x=x + "The number is " + i + ...;
}
// 不输出3,因为continue跳过了,直接进入下一个循环
*嵌套循环
注意事项
1.使用循环嵌套时,内层循环和外层循环的循环控制变量不能相同。
2.尽量避免太多和太深的循环嵌套结构
while (condition1)
{
statement(s);
while (condition2)
{
statement(s);
... ... ...
}
... ... ...
}
2.PTA实验作业
2.1龟兔赛跑
2.1.1 伪代码
int main()
{
int T;
int rabbitDistance=0;
int TortoiseDistance=0;
int i;
int flag=1;
int runTime=0;
int restTime=0;
scanf("%d", &T);
for (i = 1; i <= T; i++)
每过一分钟乌龟走的路程增加3
利用flag变量的值来判断时候到达十分钟
从而判断兔子走的路程是否要加上9
runTime++;
if (rabbitDistance == TortoiseDistance)
{
输出 -_-, rabbitDistance);
}
else if (rabbitDistance < TortoiseDistance)
{
输出@_@ TortoiseDistance);
}
else
{
输出^_^ , rabbitDistance);
}
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
8 | _ 72 | 兔子胜出 |
16 | _ 90 | 兔子胜出 |
32 | @_@ 96 | 乌龟胜出 |
2.1.4 PTA提交列表及说明
部分正确是由于当时间每过十分钟后兔子行走的路程与乌龟行走的路程比较后,若情况兔子走的路程比乌龟少的时候则程序没有问题,但是如果兔子路程比乌龟多的时候也就是第一个十分钟和第二个十分钟的时候,时间的衔接出现了问题,即我的错误的做法是直接将乌龟走的时间加上30,路程加上90,但是按照这样的方法来进行的话程序是明显会出现问题的,最终利用了一个for循环,并用了flag变量控制if语句的进入,使得程序正确
2.2 求幂级数展开的部分和
2.2.1 数据处理
double fact(int x);
int main()
{
double sum = 1;
double x;
double pow;
int n;
int m;
scanf("%lf", &x);
for (n = 1;; n++)
{
pow = 1;
for (m = 1; m <= n; m++)
{
求每一项的分子
}
利用定义的函数求每一项的整项
if 判断最后一项的绝对值是否小于0.00001
}
printf("%.4f", sum);
return 0;
}
double fact(int x)
{
double sumFact = 1;
for (int i = 1; i <= x; i++)
{
求阶乘作为分母
}
返回值sumFact;
}
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 | 20.0855 | |
4 | 54.5981 | |
5 | 148.4132 |
2.2.4 PTA提交列表及说明
一开始对函数还不太了解,简单的看过一次书,对函数的调用和定义都还不太了解,导致计算上的错误
2.3梅森数
2.3.1 数据处理
int main()
{
int n;
int number;
int i;
int m;
double sum;
int b;
scanf("%d", &n);
if (n >= 2)
{
for (i = 2; i <= n; i++)
{
记录2 的i次方-1的值
计算根号b的值并记录
for (m = 2; m < sum; m++)
{
if 判断是否为素数,若否则推出循环
}
if为素数输出number
}
}
else
若否输出None
return 0;
}
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
5 | 3 7 31 | |
6 | 3 7 31 | |
16 | 3 7 31 127 8191 |
2.3.4 PTA提交列表及说明
部分正确原因一开始把b = pow(2, i) - 1;sum = sqrt(b);放在了for循环之外使number在i=2是=时即在第一次循环时就等于7得第二个if语句无法进入,从而无法输出第一个数值3.
3.代码互评
自己代码截图
同学代码截图
1.调用函数的顺序不同
2.判断最后一项的绝对值小于0.00001时我用的时if语句,而这位同学用的时while语句
3.上面的代码都是把分母“求阶乘”作为单独一个分支计算,分子“求乘方”是用过调用pow函数的方式。但是这样的代码比较繁琐,每计算一项加和,都要重新计算一遍阶乘,而且不断调用pow函数也加大了开销。
同学代码截图
方法不同这位同学对于数列中的每一项,后一项的值=前一项值*(x/i),其中i表示项数。
这种方法节省 代码量和计算量相对简洁,时比较理想的做法