循环

| 这个作业属于哪个班级 |


| ---- | ---- | ---- |
| 这个作业的地址 |
| 这个作业的目标 | 学习循环结构内容,包括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只能用于循环。
breakcontinue只能用于所在的单层循环,所以在嵌套循环的时候要特别注意

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提交列表说明


前两个答案错误是因为没有注意到输出格式,如打印结果时应先输出五分硬币最多的情况,再输出两分
最多的情况,最后输出一分最多的情况

posted @ 2020-11-22 00:15  Y-smile  阅读(204)  评论(0编辑  收藏  举报