c博客作业
0.展示PTA总分
嵌套循环
单循环
1.本章学习总结
1.1 本章学习内容
a.循环语句类型
-
1.
while
语句,循环中常用语句之一;
while是知道循环条件但是不知道循环次数,而是用某一项的值来控制循环,且先判断循环条件,再确定是否执行循环体,不确定条件的开始,只知道条件的结束,这时我们常用该语句,例:P68用格雷戈里公式求π的近似值,只知道最后一项绝对值,故条件为while(fabs(item)>0.0001)
; -
2.
for
语句,该语句是我们最熟悉的循环语句
for语句中,用两个分号分隔三个表达式,但for后面没有分号,因为for与其后的循环语句合起来作为一条完整的语句,for语句知道循环次数,故for语句的循环特别好控制; -
3.
do-while
语句,for语句与while语句都是在循环前先判断条件,满足条件后才会进入循环,而do-while语句则是先执行循环体,再判断循环条件,所以不管判断条件如何,总会至少执行一次循环体;
b.break与continue
-
1.
break
语句用于循环语句中,可以强制结束当前循环,忽略后面的语句,跳出循环体,一般我们在判断条件时会用break来结束循环以输出我们需要的值; -
2.
continue
语句也同样用于循环语句,同样它也可以结束循环,但是结束的是本次循环,且不跳出循环体,忽略continue后面的所有语句并开始下一次循环;
c.嵌套循环
-
1.在之后的代码中,运算量越来越大,需要判断的条件越来越多,一个循环已经不足以承担了,所以这时候我们会使用嵌套循环:for+for;for+while;while+while、、、
-
2.在嵌套循环中,内层循环进行完整的一轮(n次)后跳出循环时外层循环进行一次;
d.补充知识点
-
1.min的初值:输入的第一个数;比所有数都大的数;
-
2.所有字符数据减去‘0’转为数字;
-
3.getchar()中每次只接收一个字符,剩下的储存在计算机中;
1.2本章学习体会
-
随着循环结构的学习,代码量越来越大,特别是到了嵌套循环,代码量特别大,计算量也大起来,而循环部分最特别的点,在我看来就是思路,也就是对程序的设计,因为嵌套循环的出现一道题往往有许多不同的解法,特别明显的感受就是PTA上一个又一个的运行超时,所以对于这部分清晰简洁的思路是最重要的
-
周数 代码量 八 500~550 九 680~700 代码总量 1180~1250
2.PTA实验作业
2.1 7-8 念数字
2.1.1 伪代码
- ```先确定调用的数字num;
存放num的copy;
确定num位数的mask;
if(数字<0)
在输出前加"fu"
end if
while(copy>9)
用mask确定数的位数
将copy不断除十方便确定位数
end while
while(mask>0)
输出num的每一位上的数字
if(i==1)
执行switch输出拼音
end if
else
执行另一个switch语句
end else
将读过的数去掉
将mask位数减少
end while```
2.1.2代码截图
2.1.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
-600 | fu liu ling ling | 负数数据 |
1234 | yi er san si | 正常数据 |
2.1.4PTA提交列表及说明
2.部分正确:在多次的运行超时后,我多次修改也没有办法,所以我觉得应该是自己的方法出了问题,所以我重新开始编写代码;
但是部分正确却是空格问题,最初我的代码只有这部分```
![](https://img2018.cnblogs.com/blog/1778794/201910/1778794-20191020005221251-1044349483.png)
```所以当输出不是负数是第一个输出的拼音前有空格```
3.为了让正数第一个拼音输出前不带空格所以我要确定是第几次输出拼音,只有第一次输出的拼音前不能带空格,所以我用了i计数,修改后答案正确;
##2.2 7-9 龟兔赛跑
###2.2.1伪代码
```输入乌龟,兔子二者的距离:turtle,rabitte;
输入时间time;
输入计时数据i,语句判断数据flag,语句执行数据j;
调用时间time;
for(i=1;i<=time;i++)
{
乌龟的距离=乌龟距离重复+3
if(flag==1)
{
计算兔子的距离
}
if(时间流动有十分钟,并且兔子比乌龟快)
{
将flag值变为0,并初始化j的值
}
end if;
}
end if;
else
{
为了实现兔子休息30分钟
j++;
}
end else;
if(j==30)
{
重新将1赋值给flag,以便兔子休息后重新跑计算
此时的乌龟相当于加上90
}
end if;
当时间全部跑完后,计算数据
end for;
输出结果```
###2.2.2代码截图
![](https://img2018.cnblogs.com/blog/1778794/201910/1778794-20191020011948777-551251238.png)
![](https://img2018.cnblogs.com/blog/1778794/201910/1778794-20191020012016894-1811573950.png)
###2.2.3造测试数据
| 输入数据 | 输出数据 | 说明 |
| ------------ | -------------- | ------ |
| 9 | ^_^ 81 | 不足十分钟 |
| 242 | @_@ 726 | 正常数据 |
|34|@_@ 102|兔子休息时输掉比赛|
|24|^_^ 90|兔子休息时胜利|
###2.2.4PTA提交列表及说明
![](https://img2018.cnblogs.com/blog/1778794/201910/1778794-20191020093315308-827229951.png)
- 1.答案错误及前两个部分正确:答案错误是所有的数据都错误,部分正确中却不包括题目例子,我用了许多次逐语句调试发现数据计算存在问题
- 2.答案错误及部分正确:针对前面的错误我之前的代码修改很多次都没有办法,所以只能重新编写程序,而这次的错误出现在j上,主要在于j陷入死循环,即乌龟无法加入90,主要原因在于else语句出了问题,也就是格式上有问题,所以else语句无法进入,修改后答案正确
##2.3 7-6水仙花数
###2.3.1 伪代码
int 代表位次的N;
int 确定位次的mask;
mask = 1;
int 复制最初的mask的copy
int 程序进行时当前mask的值now;
int 边缘最大值max
int 当前数字求出的数字resultr;
int 循环数i;
int 需要记录当前数字的次方值need
need = 1;
int 计算和all;
int n;
int copy1;
调用N
将赋值给i,n;
while (N > 1)
{
mask不断乘10,;
N不断减一;
}
end while;
将mask的值赋给copy与copy1;
求出max;
for (mask; mask < max; mask++)
{
将此时的mask赋给now
用copy1保留copy的最初值
while (copy > 0)
{
用mask与copy相除求result;
将n赋给i,进入循环
while (i > 0)
{
need经过不断运算得到当前result的n次方
i--;
}
end while
累加all,将need不断加起来
去掉算出的数字,使mask位数减一
copy位数减一
初始化need
}
end while
if (all == now)
printf("%d\n", now);
初始化all
改变mask的值,将now赋给它,以便进入最初的循环体
}
end while```
2.3.2 代码截图
2.3.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 | 175 370 371 407 | 正常数据 |
4 | 1634 8208 9474 | 四位数 |
5 | 54748 92727 93084 | 五位数 |
7 | 1741725 4210818 9800817 9926315 | 七位数 |
2.3.4PTA提交列表及说明
- 答案错误:不仅是PTA,在vs上我也是多次答案错误,导致很多次调试用3做数据时一个数都没有,主要原因就是值的初始化,我的一些数据在运算后下一次使用时仍保留上次的数据,所以为了使运算正确,我在每次循环后都对值进行初始化
3.代码互评
水仙花数
include<stdio.h>
include<math.h>
double x_sum(int x,int N);
int main()
{
int N;//位数
int number;
int sum ;
int y;//处理已计算部分位数的数字
int x;//用于储存拆分下来的数字
int min;
int max;
scanf("%d",&N);
min = pow(10, N - 1);
max = pow(10, N);
for (number=min; number < max; number++)
{
y = number;
sum = 0;
do
{
x = y % 10;
y = y / 10;
sum += x_sum(x,N);
} while (y > 0);
if(sum==number)
{printf("%d\n", sum);
}
}
return 0;
}
double x_sum(int x, int N)
{
int i = 1;
int sum = 1;
for (i = 1; i <= N; i++)
{
sum *= x;
}
return sum;
}
不同:1.这份代码在计算上比起我的更简便一些,使用了函数,和math.h,让整个程序的计算更容易;
2.关于数字的计算,我的代码是从数字第一个开始算起,所以我的计算会有些麻烦,而这份代码的计算是从数的最后一位,比我的简单一些;
3.在计算各个数字的次方和中,我是再使用了一个循环,嵌套在前面的循环中,而这份代码是用了函数计算,很方便,所以各个方面这份代码的可读性比我的要好许多;
include <stdio.h>
include <math.h>
int main()
{
int n;
int sum;
int num;
int i=1;
int t_num; //用来保存num的值,代替num的值去做运算;
int digit; //用来保存num的每一位数;
int n_digit; //用来保存num的每一位数的开方;
scanf("%d", &n);
for (num = pow(10, n - 1); num <= pow(10, n) + 1; num++)
{
sum = 0;
t_num = num;
while (sum <= num&&t_num != 0) //如果在还未计算结束时发现sum>num就提前退出,加快程序进程;
{
n_digit = 1;
digit = t_num % 10;
for(i=1;i<=n;i++) //计算digit的n次方;
{
n_digit *= digit;
}
t_num /= 10;
sum += n_digit;
}
if(sum==num)
printf("%d\n", num);
}
return 0;
}
不同:1.该代码的加快程序进程很有想法,确实避免了计算机的许多工作,而我的就很麻烦了
2.循环上计算很简单,基本上每层循环语句都很少