循环
| 这个作业属于哪个班级 |
| ---- | ---- | ---- |
| 这个作业的地址 |
| 这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
| 姓名 | 喻文康 |
0 我的Pta总分
1. 本章学习总结
1.1 for循环语法
语法: for(表达式1;表达式2;表达式3) { } ,其中表达式1是循环初始状态,表达式2是循环控制条件,
表达3是循环一次后执行的语句。
样例: for(int i = 1 ; i < 9 ; i++) { printf("%d",i); }
注意: for(;;)
的结尾不能放分号,如果有分号,则代表这个for循环的循环体是一个空语句
用法:适用于已知循环次数的程序,而对于条件控制的未知循环次数的循环,用while循环和do
while循环则更适合。
1.2 while循环和do while循环
语法: while(循环控制条件) { 循环体 },do { 循环体 }while(循环控制条件);
样例: while(i<9) { printf("%d",i); i++; }
do{ printf("%d",i); i++; }while(i<9);
相同点: 都适用于条件控制的循环
不同点: while(){}
循环的循环体执行次数可以为0,即不进入循环体,而do{}while();
循环是先执行
循环体,再判断循环条件满不满足,所以do{}while();
循环的循环体执行的次数至少为1。
另外,两种循环的while()
语句也不同,while(){}
循环的后面是不加分号的,而do{} while();
循环的后面是有分号的,所以经常会搞混淆。
1.3 break
语句和continue
语句
语法:break
语句用于跳出循环或者switch结构,continue
语句用于跳过下面的语句并继续执行循环
样例:while(i<9) { if(i>5) break;//跳出循环 printf("%d",i); i++; }
while(i<9) { if(i>5) continue;//跳过后面的语句 printf("%d",i); i++; }
注意:break
可用于跳出switch
语句和循环语句,而continue
只能用于循环。
break
和continue
只能用于所在的单层循环,所以在嵌套循环的时候要特别注意
1.4 循环嵌套
语法: 即在一个循环(外循环)的循环体中放入另外有一个循环(内循环)
样例:while(i<9) { for(int j = 1 ; j < 9 ; j++) { printf("%d",j); } i++; }
注意:这样就可以实现循环嵌套,不过,在使用循环嵌套时,也要注意嵌套的数量,一旦嵌套的循环变多
那么对于代码的解读也会增加难度,使代码变得更加复杂,另外,在嵌套循环中,就格外要求代码缩进,代码
缩进不仅可以使代码更美观,还可以有利于对代码的解读和分析。
2 编程技巧总结
2.1 嵌套循环跳出多层循环
在嵌套循环中,因为break
只能跳出当前循环,而如果想要在跳出循环后继续跳出外层循环的话,就会较为
麻烦,当然也可以使用go to
语句,不过go to
语句容易破坏程序流程结果,所以不建议使用,不过可以
定义一个flag
变量来构造一个是否跳出循环的开关,这样就有利于解决跳出多层循环的困扰。
2.2 清除缓冲区的非法字符
目前所学的清空非法字符一般是getchar()
和scanf("%c",&ch)
两个语句,但两个都只能清除一个非法字符
而当非法字符较多时,就只能引入循环,且在未知循环次数的情况下,只能用while()
循环和do{}while();
循环,就显得较为复杂,而在看学长学姐的博客时,学到了一种清除非法字符的函数fflush(stdin)
,这样,
在清空非法字符的时候就可以缩短代码长度做到代码简化处理。
2.3 全局变量和局域变量
作为初学者,我常常会定义很多全局变量来解决一个问题,但这样就会使得代码可读性降低,尤其是在变量一
多的情况下,就很难去区分每个变量的作用,其实有些变量是不需要在整个程序中用到的,这时候我们就可以
定义局域变量,就能更好地区分每个代码的作用和意义了。如上述的例子中for(int i = 1 ; i < 9 ; i++)
这里面的变量i就是for循环里的局域变量了。另外,各个局域变量之间是不影响的,但并不建议定义的局域
变量重名。且尽量使用有意义的命名
2.4 图形打印
在打印图形时,对于有规则的图形,常常需要用到循环嵌套,既要控制各行的内容,还要控制单行里的空格数
尤其是当图形的行数很多的时候,对于一行行去打印是非常痛苦的,所以我们可以定义一个函数来进行这项操
作,这样不仅可以分割代码,还有利于后面程序的续写与改进。另外,在看学长学姐的博客时,还发现一些知
识点,具体如下:
2.5 四则运算
特别注意:=
是赋值操作,而==
是等于;在进行赋值操作时,左边只能是单个变量,且要注意变量赋值时数
据是否会丢失(如乘除时是否需要类型转换),变量类型与数据类型是否一致。
3 Pta实验作业
3.1 数列求和问题
流程图如下:
3.1.2 代码截图
3.1.3 Pta提交列表说明
在编写代码的过程中,第一次没有看到这个题目要求
其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。
所以导致答案错误,但在自己调试的时候及时发现了,并对最后一个判断的数进行了控制
3.2 图形打印问题
2020-4-循环嵌套 7-4 打印九九口诀表 (15分)
3.2.1 数据处理
我的想法是,首先需要一个控制行数的变量N,和当前需要打印的所在行数line,然后通过观察图形的规律
发现单个表达式都是该单元所在列数乘以行数,而打印图形时单行打印的,所以可以在外面先放好行的循环,
然后再在里面放列的递增循环,相乘就能得到想要的值,然后打印出来,在下一行循环开始前换行就完成了。
3.2.2 代码截图
3.2.3 PTA提交列表及说明
在代码编写的过程中,为了保证打印的表格美观,所以要控制每个表达式所占的格数,一开始因为忘记
了右补空格的方法,所以在第一次调试的时候发生了格式错误,后来经过复习,知道在%
后加一个-号改
成%-xd
就可以改正这个错误。
3.3 自选一题,介绍printf调试如何检查错误
2020-4-循环嵌套 7-8 换硬币 (20分)
3.3.1 单步调试截图
printf调试不仅可以看到流程是否进入某个分支,还可以监控变量的值,具体如下:
运行后结果如下:
3.3.2 代码截图
Pta提交列表说明
前两个答案错误是因为没有注意到输出格式,如打印结果时应先输出五分硬币最多的情况,再输出两分
最多的情况,最后输出一分最多的情况