重复,重复,不断地重复——循环结构程序设计
1.循环结构的意义
编写一程序,输出:
老狼老狼几点钟?1点钟
老狼老狼几点钟?2点钟
老狼老狼几点钟?3点钟
…
老狼老狼几点钟?11点钟
老狼老狼几点钟?12点钟
死方法:复制粘贴
#include<iostream>
using namespace std;
int main(){
cout<<"老狼老狼几点钟?1点钟"<<endl;
cout<<"老狼老狼几点钟?2点钟"<<endl;
cout<<"老狼老狼几点钟?3点钟"<<endl;
//中间的太多就不展示了
cout<<"老狼老狼几点钟?11点钟"<<endl;
cout<<"老狼老狼几点钟?12点钟"<<endl;
return 0;
}
这种方法对付规模比较小的问题还可以。但是到成千上万的数据量就很困难了。
"活"方法:使用for
循环。
2.for循环
在程序的编写中,我们常常会遇到需要执行大量重复语句的情况。这个时候我们就需要循环结构了。for
循环基本语法如下:
for(表达式1;表达式2;表达式3)
语句或语句块;
表达式1
只执行一次,常用来初始化条件。
表达式2
在for
循环每次开始前执行。为循环终止条件。如果为真就继续执行后面的语句,否则就跳出循环,不再执行后面的语句。
表达式3
在for
循环每次结束后执行。一般为改变循环变量的值。
那么上面的例子就可以写成这样:
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=12;i++)
cout<<"老狼老狼几点钟?"<<"i"<<"点钟"<<endl;
return 0;
}
我们在表达式1
中定义了一个变量i
。注意:这个变量只允许在for
循环内部使用。出了for
循环就立刻销毁。
这里的i++
的效果等同于i=i+1;
三个表达式均可省略。此时的for(;;)
代表死循环,即无法跳出的无限循环。只有一个;
的语句叫做空语句。
思考:如果for循环后面只有一个空语句(如下文)会发生什么呢?有什么作用呢?
int i;
for(i=1;i<=10;i++);
cout<<i<<endl;
3.break和continue
break
代表跳出循环。continue
代表跳过本次循环。
例题
1
1
1:试写一程序,从
1
1
1开始依次输出自然数。遇到
7
7
7的倍数就终止。
#include<iostream>
using namespace std;
int main(){
for(int i=1;;i++)//这里不明确循环终止条件,所以先空着
{
if(i%7==0) break;//跳出循环
cout<<i<<" ";
}
cout<<endl;
return 0;
}
输出:1 2 3 4 5 6
例题2::试写一程序,依次输出 1 1 1到 10 10 10。跳过 7 7 7的倍数。
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=10;i++)
{
if(i%7==0) continue;//跳过这一次循环
cout<<i<<" ";
}
cout<<endl;
return 0;
}
输出:1 2 3 4 5 6 8 9 10
通过以上两个程序,基本上就可以了解break
和continue
的区别了。
注意:switch
语句里的break
只有跳出switch
语句的功能,并不能与这里的break
混为一谈,但它们的基本功能都是一样的。
4.while循环和do while循环
4.1.while循环
当我们使用循环时不确定循环的次数,就可以使用while
循环。
while(表达式)
语句或语句块;
while
括号里面的表达式就相当于for
循环括号里面的表达式2,为循环终止条件。如果为真就继续执行后面的语句,否则就跳出循环,不再执行后面的语句。
4.2.例题——一尺之棰
题目描述
《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a a a 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除 2 2 2,向下取整)。第几天的时候木棍的长度会变为 1 1 1?
输入格式
输入一个正整数 a a a,表示木棍长度。
输出格式
输出一个正整数,表示要第几天的时候木棍长度会变为 1 1 1。
输入输出样例
输入 #1
100
输出 #1
7
提示
数据保证, 1 ≤ a ≤ 1 0 9 1 \le a\le 10^9 1≤a≤109。
示例程序:
#include<iostream>
using namespace std;
int main(){
int a,day=1;//从第一天开始
cin>>a;
while(a>1)//只要长度大于1就继续锯木棍
{
day++;//天数加一
a/=2;//隐式类型浮点型转换成整型就相当于四舍五入
}
cout<<day<<endl;
return 0;
}
4.3.do while循环
通常,我们使用的都是像for
和while
这样的“当”型循环。先判断再执行,有可能一次都不执行。但有的时候我们需要**先执行再判断。这样至少执行一次**的循环被称为“直到”型循环。通常使用do whlie
语句实现。
do
语句或语句组
while(表达式);//不要忘了;
4.4.例题——判断偶数
题目描述
重复输入一个正整数,输出它是否是偶数。输入-1代表输入结束。
输入输出样例
输入#1
100
2021
109
0
-1
输出#1
1
0
0
1
END
程序示例:
#include<iostream>
using namespace std;
int main(){
int tmp;//必须在do while外定义
do
{
cin>>tmp;
if(tmp==-1)cout<<"END"<<endl;//判断是否结束
else cout<<(tmp%2==0)<<endl;//输出是否是偶数
}while(tmp!=-1);//记得加分号
return 0;
}
5.多重循环
5.1.多重循环语法
类似于分支结构的嵌套,循环结构也可以嵌套。可以使用for
,while
和do while
。例如for
循环的嵌套。
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
语句或语句组
注意:break
和continue
都只能跳出当前层循环,不可以直接把多重循环全部跳出。
5.2.例题——数字直角三角形
题目描述
给出 n n n,请输出一个直角边长度是 n n n 的数字直角三角形。所有数字都是 2 2 2 位组成的,如果没有 2 2 2 位则加上前导 0 0 0。
输入格式
输入一个正整数 n n n。
输出格式
输出如题目要求的数字直角三角形。
输入输出样例
输入 #1
5
输出 #1
0102030405
06070809
101112
1314
15
提示
数据保证, 1 ≤ n ≤ 13 1\le n\le13 1≤n≤13。
分析题意
通过观察,我们知道,这个三角形有以下特征:
- 它的每一层的数的个数是递减的,由n个数递减到1个数。
- 三角形中的每个数是递增的。
- 输出数字时不足两位要用0补位。
先满足第一个条件:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)//控制三角形的层数
for(int j=1;j<=n-i+1;j++)//控制三角形每一层数的个数
return 0;
}
为了满足第二个条件,我们可以定义一个变量num
专门存储要输出的数。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,tmp=1;//记得初始化
scanf("%d",&n);
for(int i=1;i<=n;i++)//控制三角形的层数
{
for(int j=1;j<=n-i+1;j++)//控制三角形每一层数的个数
printf("%d",tmp++);//输出后直接自增,等同于printf("%d",tmp);tmp=tmp+1;
puts("");//输出一个换行
}
return 0;
}
满足第三个条件很简单,将输出时的占位符换成%02d
就可以了。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,tmp=1;//记得初始化
scanf("%d",&n);
for(int i=1;i<=n;i++)//控制三角形的层数
{
for(int j=1;j<=n-i+1;j++)//控制三角形每一层数的个数
printf("%02d",tmp++);//输出后直接自增,等同于printf("%d",tmp);tmp=tmp+1;
puts("");//输出一个换行
}
return 0;
}
这就是完整的程序了。以后写程序也可以按照这个步骤来。一步一步剖析整个程序,实现每个功能。
6.课后作业
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育