【C++】C++程序结构入门之循环结构三-灵析社区

跟着小潘学后端

一、while循环和for循环

1.1 循环的打破与跳过

1.1.1 break 打破

当循环执行到break语句时,程序会跳出循环,不再执行循环体内剩余的语句,继续执行循环体外的语句。

演示如何使用break语句跳出循环:

#include <iostream>
using namespace std;

int main() {
    int i = 0;
    while (i < 10) {
        if (i == 5) {
            break; // 当i等于5时跳出循环
        }
        cout << i << endl;
        i++;
    }
    return 0;
}

该程序使用while循环打印0到10的数字,但是当i等于5时使用break语句跳出循环。程序输出如下:

0
1
2
3
4

1.1.2 continue 跳过

当循环执行到continue语句时,程序会跳过循环体内剩余的语句,直接进入下一次循环。



演示如何使用continue语句跳过循环体内的某些语句,直接进入下一次循环。

#include <iostream>
using namespace std;

int main() {
    int i = 0;
    while (i < 10) {
        i++;
        if (i == 5) {
            continue; // 当i等于5时跳过循环体内剩余语句,直接进入下一次循环
        }
        cout << i << endl;
    }
    return 0;
}

该程序使用while循环打印0到10的数字,但当i等于5时,使用continue语句跳过循环体内剩余语句,直接进入下一次循环。

以下是这个程序的输出结果:

1
2
3
4
6
7
8
9
10

1.1.3 总结

C++中break语句和continue语句都可以用于控制循环语句的执行流程,但它们的作用不同。

  1. break语句用于完全终止循环语句的执行,即跳出循环体。当程序执行到break语句时,循环语句会立即终止,程序将跳出循环体,继续执行循环语句之后的代码。break语句通常用于在满足某些条件时提前结束循环,以节省时间和资源。
  2. continue语句用于跳过当前循环中的某些语句,即跳过本次循环的剩余语句,直接进入下一次循环。当程序执行到continue语句时,循环语句会立即跳过本次循环的剩余语句,直接进入下一次循环。continue语句通常用于在满足某些条件时跳过本次循环,以提高循环效率。

1.2 循环使用场景

1.2.1 while循环

C++中的while循环通常用于在不知道循环次数的情况下进行遍历,或者在满足某个条件时重复执行某个代码块。

比如说常用于求余的短除法。

问题 1119 - 求各位数字之和

输入一个正整数 N(0≤N≤2147483647) ,求它的各位数字之和。

首先从题目获取可用信息,这是一个整数各数位求和的问题,所以关键点在于如何找出各数位;根据之前的拆位公式可以很轻松完成,但是这个数可能很大,也可能很小;如果按照最大数去设计变量再编写代码是一件相当繁琐的事。这里就可以利用循环将每次求出来的余数直接累加即可,但是这个数是不确定的,所以我们不知道循环次数,所以考虑使用while循环。

以下是代码展示:

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:正整数N
	//未知:各位数字之和sum
	//关系:拆位得到各数位再相加 
	//二、数据定义 
	int n,sum=0;
	//三、数据输入 
	cin>>n;
	//四、数据计算 
	while(n>0){
		sum+=n%10;
		n/=10;
	}
	//五、输出结果
	cout<<sum;

	return 0;	
}

1.2.2 for循环

C++中的for循环通常用于已知循环次数的情况下进行遍历或者重复执行某个代码块。

1065 - 字符图形1-星号矩形

打印字符图形。输出 n 行 n 列 *

首先从题目获取可用信息,打印出 n 行 n 列 * 的图形,n不确定肯定需要使用循环完成。 * 的每行数量从0开始到n结束,一共输出n行。所以循环次数是非常明显的,使用for循环。

以下是代码展示:

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
	//一、分析问题
	//已知:整数n 
	//未知:字符图形
	//关系:n行n列*

	//二、数据定义 
	int n;
	//三、数据输入 
	cin>>n;
	//四、数据计算 
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			//五、输出结果 
			cout<<"*";
		}
		cout<<endl;
	}
	return 0;	
}

二、嵌套循环

概念

嵌套循环是指在一个循环结构中嵌套另一个循环结构,内层循环结构的循环次数由外层循环结构控制。嵌套循环通常用于需要对多维数据进行遍历或处理的情况。

C++中的嵌套循环结构通常采用for循环嵌套的方式实现,其基本语法如下:

for (循环变量1的初始化; 循环变量1的条件; 循环变量1的更新) {
    for (循环变量2的初始化; 循环变量2的条件; 循环变量2的更新) {
        // 执行语句
    }
}

其中,外层循环控制循环次数,内层循环在外层循环的每一次迭代中都会执行一次,直到内层循环的条件不满足为止。

下面是一个简单的嵌套循环的例子,用于输出九九乘法表:

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        cout << j << "*" << i << "=" << i * j << " ";
    }
    cout << endl;
}

这段代码中,外层循环变量i从1到9遍历,内层循环变量j从1到i遍历,输出乘法表的每一行。

当然在C++中,循环嵌套不只使用for,还可以使用while循环。

比如:while循环嵌套while循环。

while()
{
  while()
  {
  }
}

比如:while循环嵌套for循环。


while() {
	for(;;){
	}
}

搭配的格式并不固定,主要还是要考虑到使用场景,while循环适合不确定次数或者满足某个条件下使用,for循环更适合确定次数。

问题一:1422 - 数字矩形(1)

从键盘读入一个整数 n,输出如下图形。

1.分析问题

  1. 已知:整数 n
  2. 未知:图形
  3. 关系:n行n列的数字,数字为行的值。

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义 
	int n;

3.输入数据

从键盘读入整数n。

	//三、数据输入 
	cin>>n;

4.数据计算

既然想要打印出图形,就要思考是如何输出的?

首先可以肯定的是按照行输出,所以我们一次性要将整行的内容输出完。
例如n = 5,那么每行就是5个数字,所以循环次数就是5;如果n = 6,那么循环6次;因此可以推出,循环的次数就是n。

for(int j=1;j<=n;j++){
	
		}

输出完每行的内容,就要考虑输出几行。如果n = 3,就要输出3行的数字;如果n=5,就要输出5行的数字;因此可以推出需要输出n行。

	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){

		}
	}

5.输出结果

输出的数字是行的值,所以刚好可以使用i的值。注意i为行的循环,j为整行的内容循环。不要输出j,不然就会得到12345的结果。

在完整输出一行内容后注意需要进行换行。

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:整数 n
	//未知:图形
	//关系:n行n列的数字,数字为行的值。
	//二、数据定义 
	int n;
	//三、数据输入 
	cin>>n;
	//四、数据计算 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			//五、输出结果 
			cout<<i;
		}
		cout<<endl;
	}
	return 0;	
}

问题二:1363 - 数字矩形(2)

从键盘读入一个整数 n,输出如下图形。

1.分析问题

  1. 已知:整数n
  2. 未知:输出图形
  3. 关系:n行n列,每行数值从1递增到n

2.定义变量

根据分析的已知,未知按需要定义变量。

//二、数据定义
	int n;

3.输入数据

从键盘读入整数n。

//三、数据输入 
	cin>>n;

4.数据计算

本题和1422 - 数字矩形(1)题目基本相同,相同点是输出的格式一致,不同点在于输出的内容不一致。因此直接套用上一题的循环结构。

//四、数据计算
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){

		}
	}

5.输出结果

在1422 - 数字矩形(1)题目中,我们提到i为行数的循环值,j为行内容的循环值。这题的输出内容为n行n列,每行数值从1递增到n ;因此需要输出j的值。

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:整数n
	//未知:输出图形
	//关系:n行n列,每行数值从1递增到n 
	//二、数据定义
	int n;
	//三、数据输入 
	cin>>n;
	//四、数据计算
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			//五、输出结果
			cout<<j;
		}
		cout<<endl;
	}
	return 0;	
}

问题三:1066 - 字符图形2-星号直角

从键盘读入一个整数n,输出如下图形。

1.分析问题

  1. 已知:整数n
  2. 未知:输出图形
  3. 关系:n行,每行*数量从1递增到每行n

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义
	int n;

3.输入数据

从键盘读入整数n。

	//三、数据输入 
	cin>>n;

4.数据计算

在1422 - 数字矩形(1)和1363 - 数字矩形(2)题目中,输出的内容都是矩形形状。而本题要求输出三角形状。那么就不能直接套用循环结构的代码。

首先还是要分析每行的内容,每行的数量不一致,是从1递增的。数量刚好和行数相同,比如第一行就只有1个*,第二行有2个*…依次类推第n行有n个*。那么j和i必然有某种联系(i为行数,j为行内容) ,即j的最大值应该等于当前i的值。

//四、数据计算 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){

		}

	}

5.输出结果

按题目要求输出*即可。

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:整数n
	//未知:输出图形
	//关系:n行,每行*数量从1递增到每行n 
	//二、数据定义
	int n;
	//三、数据输入 
	cin>>n;
	//四、数据计算 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			//五、输出结果 
			cout<<"*";
		}
		cout<<endl;
	}
	return 0;	
}

三、练习

问题:1392 - 回文偶数?

小明发现有一类数非常有趣,他们正过来读和反过来读是一样的,比如:121、202、383 等,小明给这类数起了一个名字,叫做回文数。
请你写程序帮助小明找出所有 3 位的既是回文数,又是偶数的数,比如: 202 就是满足条件的数,而 121 虽然是回文数但不是偶数。

题解:1392 - 回文偶数?

问题:1090 - 同因查找

求出 10 至 1000 之内能同时被 2、3、7 整除的数,并输出。
每行一个。

题解:
1090 - 同因查找

问题:1393 - 与7无关的数?

一个整数,如果这个数能够被 7 整除,或者其中有一位是7,我们称为这个数是与 7 有关的数。比如: 14 能被 7 整除,17 有一位为 7 ,这两个数都是与 7有关的数。
请你编程求出1∼n(n≤999) 中,与 7 无关的数的总和是多少?
比如 1∼10 中与 7 无关的数的和为:1+2+3+4+5+6+8+9+10=48 。

题解:1393 - 与7无关的数?

问题:1091 - 奇数及偶数和

给出一个正整数 n(1≤n≤1000 ),求出 1,2,…n 中全部奇数和以及全部偶数的和。 例如:n=9 ;
奇数和 1+3+5+7+9=25 ;
偶数和 2+4+6+8=20 。


题解:1091 - 奇数及偶数和

问题:1395 - 小丽找数?

小丽同学想在1~n中找出这样的数,这个数的各个位的和不能被2整除也不能被5整除,比如3、12、25、30、100。这些数都满足各个位的和不能被2和5整除。
请你编程找出1~n中这些数有多少个?

题解:1395 - 小丽找数?

问题:1241 - 角谷猜想

本一位中学生发现一个奇妙的定理,请角谷教授证明,而教授无能为力,于是产生了角谷猜想。
猜想的内容:任给一个自然数,若为偶数则除以 2 ,若为奇数则乘 3 加 1 ,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为 1 。
请编写代码验证该猜想:求经过多少次运算可得到自然数 1 。



题解:1241 - 角谷猜想

问题:1265 - 爱因斯坦的数学题

爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨 2 阶,则最最后剩一阶,若每步跨 3 阶,则最后剩 2 阶,若每步跨 5阶,则最后剩 4阶,若每步跨 6 阶则最后剩 5 阶。
只有每次跨 7阶,最后才正好一阶不剩。
请问这条阶梯最少共有多少阶?

题解:1265 - 爱因斯坦的数学题

四、总结

以上就是今天的全部内容,结合循环一、循环二里面讲解的知识,那么关于循环结构部分我们已经介绍的相对详细。想要掌握牢固,还需要多多练习。

阅读量:313

点赞量:0

收藏量:0