重复,重复,不断地重复——循环结构程序设计

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只执行一次,常用来初始化条件
    表达式2for循环每次开始前执行。为循环终止条件。如果为真就继续执行后面的语句,否则就跳出循环,不再执行后面的语句。
    表达式3for循环每次结束后执行。一般为改变循环变量的值

那么上面的例子就可以写成这样:

#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

通过以上两个程序,基本上就可以了解breakcontinue的区别了。

    注意: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 1a109

示例程序:

#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循环

    通常,我们使用的都是像forwhile这样的“型循环先判断再执行有可能一次都不执行。但有的时候我们需要**先执行再判断。这样至少执行一次**的循环被称为“直到型循环。通常使用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.多重循环语法

    类似于分支结构的嵌套,循环结构也可以嵌套。可以使用forwhiledo while。例如for循环的嵌套。

for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
            语句或语句组

    注意:breakcontinue都只能跳出当前层循环,不可以直接把多重循环全部跳出。

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 1n13

分析题意

通过观察,我们知道,这个三角形有以下特征:

  1. 它的每一层的数的个数递减的,由n个数递减到1个数。
  2. 三角形中的每个数递增的。
  3. 输出数字时不足两位要用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.课后作业

循环结构题单 - 洛谷

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子教编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值