1.展示PTA总分
单循环结构:
嵌套循环:
2.本章学习总结
2.1. 学习内容总结
1.while循环
在上一周我们已经学习了for循环,这一周还有学习了一种循环——while循环。相比较于for循环while的应用更为广泛,for循环一般用于已知次数的循环,而while循环的次数不定,通常需要最先判断条件为真进入循环,最后判断条件 为假方可跳出循环。
一般形式:
while ( 表达式 )
{
循环体语句;
}
其特点:1.while的循环体语句中必须包含能最终改变循环条件真假性的操作,
2.结构简单只有一个判断表达式和循环体语句(块),便于直接将程序设计思路转化为语句。
2.do-while循环
while语句和for语句都是先进行条件表达式的判断,为真才进入循环,否则一次循环也不执行。do-while语句则无论如何都会执行一次循环,因为这种语句都是先进循环体一次后再判断条件的。
一般形式:
···
do
{
循环体语句;
}while ( 表达式 );
···
其特点:1.循环体中或之前要有初始化,还要有可以改变真假性的语句
2.先进循环体再判断,注意while后要加‘;’。
3.循环控制:break语句及continue语句
- 如果循环有多条件时,可由表达式和break共同控制,break语句强制提前结束循环,不执行其后的循环体语句,通常与if语句连用,判断为真时才执行,若break执行无需条件则永远不会执行循环体中break后面的语句。
- continue语句是跳出循环体后面的循环体语句,继续下一次循环,通常与if语句连用
区别:break用于结束循环,continue语句仅跳过后面语句执行下一轮循环。break还有用于switch语句,而continue只用于循环结构。
4.扩展goto语句
在嵌套循环的PTA题集中有用到的,其实是同学教我的,goto语句也是一个循环控制语句也叫无条件转移语句,其格式如下:goto 语句标号;其中语句标号是按照标识符写的符号,放在一行语句的前面,标号后面加‘:’。语句标号起标识语句的作用,与goto 语句配合使用。C语言不限制程序中使用标号的次数,但各标号不得重名。但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
例子如下:
5.嵌套循环结构
看一段代码,是PTA上的打印九九乘法表
在这道例题中我们把里面的循环叫嵌套循环(或者多重循环),大循环中嵌套了小循环。需要注意的是内外层变量的初始化,以及内层语句对变量的更改是否会影响下一次循环。
2.2本章学习体会
学习感受
一到循环结构整体的难度就加大了,如果没有真正掌握VS的调试技巧真的很难彻底理解嵌套循环的执行,也很难弄懂循环的思路,总之还是要多刷题多实践,感觉这一块还要再加强,还有就是要充分地提前预习,不然上课还是会理解不够深入,还有就是应该更加独立思考,不要一有难题就百度或者问同学。
代码量统计
第7周:416 第八周:485
3.PTA实验作业
7-6水仙花数
3.1.1伪代码
定义变量:N表示整数位数,m表示最大值,n表示最小值; i,j,k是循环变量; M表示当前循环时的数,number储存幂次积,num储存每一位数,sum储存累加和。
伪代码:
读入一个数N为整数位数
求出m和n的值
设置最外层循环:for (i = n; i < m; i++)
将每次i的值赋给M,并初始化sum;
设置第二层循环:for (j = 1; j <= N; j++)
求各位数并统计N次幂累加和
判断sum是否等于i(即那次循环判断的数)
输出。
3.1.2代码截图
3.1.3造测数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 | 153 370 371 407 | sample |
4 | 1634 8208 9474 | simple |
3.1.4PTA提交列表及说明
第一次:提交没有处理好i和m的关系还在循环中用了pow函数导致运行超时(死循环)
第二次:通过调试解决,引用了M来储存每次判断的数,用nunber来储存每位数的N次幂,忘记循环后初始化,用了pow函数所以最后一个测试点(数据稍微大一点)又超时了。
第三次:把pow函数用for循环代替终于对了。
7.2梅森数
3.2.1伪代码
定义变量:N表示指数,i,j表示循环变量;num表示待判断的数,leap是辅助变量
伪代码:
读入一个数作为最大指数N
设置最外层循环:for (i = 1; i <= N; i++)
求出每个num
用常规的素数循环判断,输出,改变leap的值
判断leap是否为0,输出。
3.2.2代码截图
3.2.3造测数据
输入数据 | 输出数据 | 说明 |
---|---|---|
6 | 3 7 31 | sample |
2 | 3 | 仅有一个 |
1 | 空集 | 没有 |
3.2.4PTA提交列表及说明
注:只截最后一次
第一次:(在VS上自己调试)没有办法正确得出None的情况
第二次:将判断移到循环外面,引入leap,正确了。
7-1 求n以内最大的k个素数以及它们的和
3.3.1伪代码
定义变量:n表示最大值,k表示个数,sum用于储存累加和,num用于确认输出格式;i,j是循环变量,flog是辅助变量,用于判断是否累加(即是否为素数)
伪代码:
读入最大值和要求的素数个数
设置最外层循环:for (i = 1; i<=m; i++)
判断素数一般循环,中改变flog,num
在循环中判断flog和num的值,确定输出格式
循环中用到goto end和goto out语句
n自减
判断n goto final;
输出
3.3.2代码截图
3.3.3造测数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1000 10 | 997+991+983+977+971+967+953+947+941+937=9664 | sample |
12 6 | 11+7+5+3+2=28 | sample |
10 1 | 7=7 | 最小值 |
10000 10 | 9973+9967+9949+9941+9931+9929+9923+9907+9901+9887=99308 | 最大值 |
3.3.4提交列表及说明
第一次:我想从大到小执行循环,结果一直是0=0,后来发现sum从一开始第一次被初始化后就无法改变
第二次:低级错误,内层for循环第二个表达式多了等号,素数等于白判断了,答案错误
第三次:通过小数据逐步调试找到上述错误,改后提交通过。
4.代码互评
查询水果价格
我的代码:
同学代码1:
同学代码2:
和同学1的不同:这位同学用的是if-else语句,循环体用的是while语句,而我用的是for循环和switch-case语句。
和同学2的不同:这位同学的菜单打印用的是整句输出,而我用了多个printf,并且我们循环变量的初值和条件不同。