C博客作业02--循环结构
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
-
while循环
- while循环与for循环一样,都要先判断循环条件才能进入循环体。
- while循环一定要注意循环体内变量的变化,否则易死循环。
- 比起for循环,while循环更适用于无法事先判断循环次数的循环。
-
do-while循环
- 与其他循环相比较,do-while循环的特点是会先进入循环体再判断循环条件,即无论循环条件是否为真,循环体都会被执行一次。
-
break和continue语句
- break语句:直接跳出整个循环,提前结束循环,进入循环后面的语句。
- continue语句:跳过continue后面的语句不执行,结束本次循环,继续下一次循环。
-
嵌套循环
- 外循环执行一次,内循环要执行一轮,所以一定要注意内循环中是否有变量要重置。
- 在内循环中如果有break,是跳出内循环,而外循环继续。
1.2 本章学习体会
- 作业难度上升,作业量也开始变大。
- 做题的速度没有之前快,但相对来说花在写代码上的时间也更多了,代码量变大。
- 代码量大概在1100左右。
2.PTA实验作业
2.1简单计算器
2.1.1 伪代码
定义字符型变量ch、oldch用了存储用户输入的字符;定义一个整型变量num,当用户输入的字符为数字时,将数值存储到num中;定义一个整型变量result,用于存储并输出计算的结果;定义一个flag=0,用于判断用户是否输入非法字符。
if ch为数字
then num = ch - '0'+ num*10
else switch(oldch)
if oldch为非法字符 then flag=1
else 做相应计算
end if
end if
if flag=0 then 输出result
end if
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
10/0= | ERROR | 除法分母为0的数据 |
1【2= | ERROR | 有非法字符的数据 |
1+2= | 3 | 正常数据 |
2.1.4 PTA提交列表及说明
提交列表说明:
1.部分正确:没有定义一个flag判断之前的数据中是否出现了不合法的情况,导致特殊情况时输出的结果错误。
2.答案正确:定义一个变量flag,通过判断flag的值来判断之前的数据中是否出现了不合法的情况。
2.2龟兔赛跑
2.2.1 伪代码
定义time、rabbit、turtle分别表示时间、兔子跑的路程、乌龟跑的路程。
for i = 1 to i = time do
rabbit += 9;turtle += 3;
if i % 10 == 0 then
if rabbit > turtle then
if time - i >= 30 then
turtle += 90;i += 30;
else turtle += 3 * (time - i);break;
end if
end if
end if
end for
判断rabbit和turtle的大小,按要求输出结果。
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
7 | _ 63 | 不足10分钟的数据 |
20 | _ 90 | 正常数据 |
242 | @_@ 726 | 正常数据 |
2.2.4 PTA提交列表及说明
1.部分正确:在VS上测试时只用了PTA上给的数据,答案正确后就直接提交了,后发现没有判断兔子休息时时间已不足半小时的情况。
2.答案正确:在兔子休息的if语句里再嵌套一个if语句,用来判断剩余时间是否大于等于30分钟,后进行相应计算。
2.3水仙花数
2.3.1 伪代码
定义一个函数int fact(int m,int n),用来计算幂次方。
for i = fact(10, n - 1) to i = (fact(10, n) - 1) do
item = i;sum = 0;
for j = 1 to j = n do
num = item % 10;sum += fact(num, n);item = item / 10;
end for
if i == sum then printf("%d\n", i);
end if
end for
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 | 153、370、371、407 | 正常数据 |
7 | 1741725、4210818、9800817、9926315 | 正常数据 |
2.3.4 PTA提交列表及说明
1.部分正确:第一次提交时使用了pow函数,答案都是正确的,但运行超时。
2.答案正确:这次提交计算幂次方使用了自己写的函数,而不是直接用pow函数。
3.代码互评
同学代码:
#include <stdio.h>
int main()
{
int t = 0;
int tortoise = 0;
int rabbit = 0;
int trabbit = 0;
int T;
int ret = 0;
scanf("%d", &T);
while (t != T)
{
tortoise += 3;
if (!ret)
{
trabbit++;
rabbit += 9;
}
t++;
if (trabbit % 10 == 0 )
{
if (rabbit > tortoise)
{
ret = 1;
trabbit += 30;
}
}
if (t == trabbit)
{
ret = 0;
}
}
if (rabbit > tortoise)
{
printf("^_^ %d", rabbit);
}
else if (rabbit < tortoise)
{
printf("@_@ %d", 3*T);
}
else
{
printf("-_- %d", 3*T);
}
return 0;
}
我的代码:
#include <stdio.h>
int main()
{
int time;
int rabbit;
int turtle;
int i;
scanf("%d", &time);
rabbit = 0;
turtle = 0;
for (i = 1; i <= time; i++)
{
rabbit += 9;
turtle += 3;
if (i % 10 == 0)
{
if (rabbit > turtle)
{
if (time - i >= 30)
{
turtle += 90;
i += 30;
}
else
{
turtle += 3 * (time - i);
break;
}
}
}
}
if (rabbit > turtle)
{
printf("^_^ %d",rabbit);
}
else if (rabbit < turtle)
{
printf("@_@ %d",turtle);
}
else
{
printf("-_- %d", rabbit);
}
return 0;
}
1.同学的代码是在兔子休息时,乌龟的路程依旧一分钟一分钟的往上加,而我直接将乌龟的路程加上90,时间也加上30分钟。
2.相比起同学的代码,我这种方法效率会更高一些。