第四单元 循环结构程序设计
学习背景与目标:
程序设计中常遇到循环结构即反复执行某一条语句或一个语句块。进而出现循环语句实现重复事情的执行。
学习for、while、do-while 循环语句的使用方法,并且如何使用循环嵌套结构。以及break continue语句的作用,使用结果。
一、while语句
1)含义:
先计算表达式的值(一般为循环条件)的值,当表达式的值为真(循环条件成立)时,去执行一次循环体。与if语句不同的是,执行完一次循环后,while语句又回到开始处,继续计算和判断表达式的真假,决定是否再次执行循环体。也就是当表达式成立时,不断重复执行循环体,又称为当形循环。
例如:输出十个@
int i=1;
while(i<=10){
printf("@");
i++;
}
2)注:
①死循环:如果将循环体中的语句"i++"漏了,则程序会一直执行"printf("@");"语句,永远也不会结束。
②注意循环条件表达式和循环控制变量的变化,决定循环体被执行的次数。
3)应用举例
等差数列求和运算
#include<iostream>
using namespace std;
int main(){
int i=100,x=0,y=0;
while(i>0){
i--;
x=i%8; 取余运算
if(x==1) y++; 记录x==1有几种
}
cout<<y<<endl;
return 0;
}
二、do-while语句
1)格式:
do{
循环体
}while(表达式);
含义:先执行一次循环体,然后判断表达式是否成立,则返回继续执行循环体,直到表达式不成立,才退出循环。(直到循环型)
do-while语句与while语句都可以实现循环结构,区别是:前者先执行循环体,再判断表达式。所以至少执行一次循环体。
2)
举例:
求一个正整数的各位数字之和
#include<iostream>
using namespace std;
int main(){
int n,s=0;
scanf("%d",&n);
do{
s+=n%10; n!=0时整除一次取余即依次
n/=10; 取得每一位上的数字
}while(n!=0);
printf("%d\n",s);
return 0;
}
三、for语句
在实际应用中,如果重复执行的操作(循环体)次数是固定的,已知的,则一般使用for语句。
格式:for(表达式1;表达式2;表达式3){
循环体
}
裴波纳契数列
前两个数均为1,接下来每个数都等于前面两个数之和。
#include<iostream>
using namespace std;
int main(){
int k;
cin>>k;
int k1=1,k2=1;k3=1;
for(int i=3;i<=k;i++){
k3=k1+k2;
k1=k2; //迭代法
k2=k3;
}
cout<<k3<<endl;
return 0;
}
四、循环嵌套(几重有几个循环语气嵌套)
在一个循环语句的循环体里嵌套另一个循环语句
举例:与7无关的数
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
int flag1=1,flag2=1;
if(i%7==0) flag1=0;
int x=i; flag 标记与7无关为1有关
while(x&& flag2){ 为0
if(x%10==7) flag2=0;
x=x/10;
}
cout<<ans<<endl;
return 0;
}
五、break和continue语句
背景:循环结构中,有时需要提前跳出循环体,或者忽略本次循环的后续语句而去执行下一次循环。
1)break语句(结束循环)
循环体中遇到break语句,就会立刻跳出循环体,执行循环结构后面的语句。
①例如:
判断数字中是否有数字7的时候,一旦出现"x%10==7",则说明x是与7相关的数,就可以用break语句立刻退出当前的while循环,提高程序效率。
2)continue语句
循环体中遇到continue语句,就会忽略本次循环的后续语句而去执行下一次循环。
①例如:与7无关的数
当一个数是7的倍数,即"i%7==0"时,说明该数已经是7的倍数了,此时,就不需要再判断i的某一位是否为7了。所以,可以用continue忽略本次循环的后续语句,而去执行下一次循环,判断下一个数。
3)二者应用举例
①例如:判断一个数是否为素数即如果平方根后有一个能整除则其前一定有一个比它小的整数,利用for语句即可完成。
六、程序的调试与跟踪
1)静态查错
检查的问题:语句的顺序、思路、逻辑是否有误;语法是否有误,关键字是否录入错误、变量是否没有定义就使用、变量的大小写问题、用错标点符号等。
①变量未赋初值
②中间运算结果越界
③if-else语句混乱
if语句可以没有else语句与之匹配;else语句总是与它前面的、最近的if语句匹配。
④实数比较出错
2)通过添加输出语句调试程序
加调试结果检验是否正常运行
动态调试用增加动态调试语句进行动态调试,提交之前把这些动态调试语句注释掉。
3)借助IDE的调试工具实施单步跟踪
学习心得
循环结构较分支结构明显难了许多也高级许多。首先要分析问题,寻求解决问题的方法。而且条件表达式也特别重要,一旦没有条件表达式,就会陷入死循环。题做起来也明显需要很长的时间,还要加强对课本的理解以及注重培养自己的分析问题能力。通过多做这一方面的题还是对自己写程序有很大的提高的。
感受:最大的感受在于解决一个问题的方向,有了方向,多加注意细节,问题也就很轻松解决,没有思路没有分析,程序是写不出来的。解决问题首先要耐下心来思考,寻求解决该问题最恰当的方法,搭配正确的语句结构,正确使用表达式。由此更清晰的认识到做任何事情都应该脚踏实地,认真思考,寻求正确的方向。