循环结构

循环结构

基本概念

循环结构是程序中用于重复执行某段代码的控制结构。当我们需要多次执行相同或相似的操作时,使用循环结构可以避免代码重复,使程序更加简洁高效。

循环结构代码的核心特点是:

  1. 重复执行某段代码,直到满足特定条件

  2. 通常包含初始化、循环条件判断和更新循环变量三个部分

在编程语言中,常见的循环结构有 for 循环和 while 循环两种基本形式。

for 循环

for 循环是一种常用的循环结构,通过维护一个循环控制变量,并不断判断循环控制变量是否满足某个特定条件,进而控制循环的进行。由于循环控制变量变化的范围在 for 循环中需要明确规定,for 循环的循环次数往往很轻松就能求出,所以它主要被用于明确知道循环次数的情境下。

循环控制变量是一个用于控制循环的变量,通过不断自我迭代变为新的数值。当循环控制变量不满足循环条件的时候,循环就会停止。循环控制变量的命名和一般变量的命名基本是一致的,但是也有一些约定:

  1. 由于循环控制变量在循环中一般会经常用到,所以往往大家倾向于取一个简短一点的名字。
  2. 在数学中,我们通常使用 依次作为 “循环控制变量” 的名称,例如 这个表达式,其中的 就类似于 “循环控制变量” 。在各大编程语言中,我们也会依次优先使用 作为 “循环控制变量” 的名称(和数学的习惯保持一致)。

C++ 中的 for 循环

在 C++ 中,for 循环的基本语法如下:

for (循环控制变量的初始化语句; 循环条件; 循环控制变量的更新语句) {
    // 循环体,重复执行的代码
}

例如:

for (int i = 0; i < 5; i++) {
    cout << i << " ";  // 输出:0 1 2 3 4
}

for 循环的执行流程:

  1. 执行循环控制变量的初始化语句(int i = 0),只执行一次
  2. 判断循环条件(i < 5),如果为真,执行循环体;如果为假,退出循环
  3. 执行循环体内的代码
  4. 执行循环控制变量的更新语句(i++
  5. 返回第 2 步,重复执行

需要特别注意的是,在 C++ 中,for 循环的三个部分都可以省略,但是分号 ; 不能省略。例如:

int i = 0;
for (; i < 5;) {
    cout << i << " ";  // 输出:0 1 2 3 4
    i++;
}

Java 中的 for 循环

在 Java 中,for 循环的语法与 C++ 基本相同:

for (循环控制变量的初始化语句; 循环条件; 循环控制变量的更新语句) {
    // 循环体,重复执行的代码
}

例如:

for (int i = 0; i < 5; i++) {
    System.out.print(i + " ");  // 输出:0 1 2 3 4
}

for 循环的执行流程:

  1. 执行循环控制变量的初始化语句(int i = 0),只执行一次
  2. 判断循环条件(i < 5),如果为真,执行循环体;如果为假,退出循环
  3. 执行循环体内的代码
  4. 执行循环控制变量的更新语句(i++
  5. 返回第 2 步,重复执行

需要特别注意的是,在 Java 中,for 循环的三个部分都可以省略,但是分号 ; 不能省略。例如:

int i = 0;
for (; i < 5;) {
    System.out.print(i + " ");  // 输出:0 1 2 3 4
    i++;
}

Python 中的 for 循环

Python 中的 for 循环与 C++ 和 Java 有所不同,它主要用于遍历可迭代对象(如列表、元组、字符串等)。此时,通过 for 循环,i 会依次自赋值为可迭代对象中的每个元素,然后执行循环体。当可迭代对象的每一个元素都被遍历完之后,循环就会结束。

for 变量 in 可迭代对象:
    # 循环体,重复执行的代码

例如:

for i in range(5):  # range(5) 生成包含 0,1,2,3,4 这五个数的序列 
    print(i, end=" ")  # 输出:0 1 2 3 4

Python 中使用 range() 函数来生成一个一定范围的可迭代序列:

  • range(n): 生成 0 到 n-1 的整数序列
  • range(start, end): 生成 start 到 end-1 的整数序列
  • range(start, end, step): 生成 start 到 end-1 的整数序列,步长(即相邻两个数之间的差)为 step

例如: range(1,10,2) 生成的序列为 [1, 3, 5, 7, 9],range(1,10,3) 生成的序列为 [1, 4, 7]。

如果你想像 C++ 或 Java 的语法一样使用 Python 的代码,你可以参考下面的例子:

// 这是 C++/Java 中的 for 循环
for(int i=a;i<b;i+=c){
    // 循环体,重复执行的代码
}

上面这段 C++/Java 代码等价于 Python 中的下面这段代码:

# 这是 Python 中的 for 循环
for i in range(a,b,c):
    # 循环体,重复执行的代码

例题 1:多组输入 a+b II

题意

组数据,每组数据包含两个正整数 ,请你输出对应的 的值。

思路

在此题中,我们已经明确地知道了数据组数为 ,所以可以直接使用 for 循环控制循环 次,每次输入两个整数并输出它们的和。

代码实现

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;  // 定义变量 n
    cin >> n;  // 输入 n
    for (int i = 1; i <= n; i++) {  // 循环 n 次
        int a, b;  // 定义变量 a 和 b
        cin >> a >> b;  // 输入 a 和 b
        cout << a + b << endl;  // 输出 a+b 的值
    }
    
    return 0;  // 结束程序
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  // 创建Scanner对象
        int n = scanner.nextInt();  // 输入 n
        for (int i = 1; i <= n; i++) {  // 循环 n 次
            int a = scanner.nextInt();  // 输入 a
            int b = scanner.nextInt();  // 输入 b
            System.out.println(a + b);  // 输出 a+b 的值
        }
        scanner.close();  // 关闭Scanner对象
    }
}
n = int(input())  # 输入 n
for i in range(1, n + 1):  # 循环 n 次
    a, b = map(int, input().split())  # 输入 a 和 b
    print(a + b)  # 输出 a+b 的值

while 循环

while 循环是另一种常用的循环结构,它在循环开始前检查条件,只要条件为真,就会重复执行循环体内的代码。由于不使用循环变量而只是单纯地判断循环条件,所以 while 循环的循环次数往往无法提前确定,所以它主要被用于知道循环进行的条件,但无法明确知道循环次数的情境下。

C++ 中的 while 循环

在 C++ 中,while 循环的基本语法如下:

while (循环条件) {
    // 循环体,重复执行的代码
}

例如:

int i = 0;
while (i < 5) {
    cout << i << " ";  // 输出:0 1 2 3 4
    i++;
}

while 循环的执行流程:

  1. 判断循环条件(i < 5),如果为真,执行循环体;如果为假,退出循环
  2. 执行循环体内的代码
  3. 返回第 1 步,重复执行

Java 中的 while 循环

在 Java 中,while 循环的语法与 C++ 基本相同:

while (循环条件) {
    // 循环体,重复执行的代码
}

例如:

int i = 0;
while (i < 5) {
    System.out.print(i + " ");  // 输出:0 1 2 3 4
    i++;
}

while 循环的执行流程:

  1. 判断循环条件(i < 5),如果为真,执行循环体;如果为假,退出循环
  2. 执行循环体内的代码
  3. 返回第 1 步,重复执行

Python 中的 while 循环

Python 中的 while 循环与 C++ 和 Java 类似:

while 循环条件:
    # 循环体,重复执行的代码

例如:

i = 0
while i < 5:
    print(i, end=" ")  # 输出:0 1 2 3 4
    i += 1

while 循环的执行流程:

  1. 判断循环条件(i < 5),如果为真,执行循环体;如果为假,退出循环
  2. 执行循环体内的代码
  3. 返回第 1 步,重复执行

例题 2:多组数据 a+b III

题意

有若干组数据,每组数据包含两个正整数 ,请你输出对应的 的值。如果输入的两个整数均为 ,则标志着上一组数据是最后一组数据,程序到这里已经处理完了所有的数据,可以停止运行了。

思路

此题与例题一不同的是,我们在程序开始时并不能直接知道测试数据的组数,也就不能知道循环要执行的具体次数,此时我们可以使用 while 循环来解决这个问题。我们可以先输入一组 ,然后用 while 循环来判断 是否同时为 ,如果是,则退出循环;否则,在我们输出完两数之和 后,继续输入下一组 ,然后依次循环即可。

代码实现

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a, b;  // 定义变量 a 和 b
    cin >> a >> b;  // 输入 a 和 b
    while (a != 0 || b != 0) {  // 当 a 和 b 均不为 0 时
        cout << a + b << endl;  // 输出 a+b 的值
        cin >> a >> b;  // 输入下一组 a 和 b
    }
    return 0;  // 结束程序
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  // 创建Scanner对象
        int a = scanner.nextInt();  // 输入 a
        int b = scanner.nextInt();  // 输入 b
        while (a != 0 || b != 0) {  // 当 a 和 b 均不为 0 时
            System.out.println(a + b);  // 输出 a+b 的值
            a = scanner.nextInt();  // 输入下一组 a
            b = scanner.nextInt();  // 输入下一组 b
        }
        scanner.close();  // 关闭Scanner对象
    }
}
a, b = map(int, input().split())  # 输入 a 和 b
while a != 0 or b != 0:  # 当 a 和 b 均不为 0 时
    print(a + b)  # 输出 a+b 的值
    a, b = map(int, input().split())  # 输入下一组 a 和 b

循环控制语句

在循环结构中,有时我们需要更灵活地控制循环的执行流程。常用的循环控制语句有 break 和 continue,他们在各个编程语言中的作用基本是完全一样的,但为了方便各个语言的选手理解,我们针对 C++、Java 和 Python 三种语言分别进行了举例。

break 语句

break 语句用于立即退出当前循环,不再执行循环中的剩余语句。它通常与条件判断一起使用,当满足某个条件时,提前结束循环。

C++ 中的 break

// 在 C++ 中使用 break 查找数组中的特定元素
int arr[] = {3, 7, 2, 9, 5};
int target = 9;
int position = -1;

for (int i = 0; i < 5; i++) {
    if (arr[i] == target) {
        position = i;
        break;  // 找到目标元素后立即退出循环
    }
}

if (position != -1) {
    cout << "找到元素,位置是: " << position << endl;
} else {
    cout << "未找到元素" << endl;
}

Java 中的 break

// 在 Java 中使用 break 查找数组中的特定元素
int[] arr = {3, 7, 2, 9, 5};
int target = 9;
int position = -1;

for (int i = 0; i < arr.length; i++) {
    if (arr[i] == target) {
        position = i;
        break;  // 找到目标元素后立即退出循环
    }
}

if (position != -1) {
    System.out.println("找到元素,位置是: " + position);
} else {
    System.out.println("未找到元素");
}

Python 中的 break

# 在 Python 中使用 break 查找列表中的特定元素
arr = [3, 7, 2, 9, 5]
target = 9
position = -1

for i in range(len(arr)):
    if arr[i] == target:
        position = i
        break  # 找到目标元素后立即退出循环

if position != -1:
    print(f"找到元素,位置是: {position}")
else:
    print("未找到元素")

continue 语句

continue 语句用于跳过当前循环的剩余语句,直接进入下一次循环。它通常用于当某个条件满足时,跳过当前迭代,继续下一次迭代。

C++ 中的 continue

// 在 C++ 中使用 continue 打印 1 到 10 中的奇数
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {  // 如果 i 是偶数
        continue;  // 跳过当前循环
    }
    cout << i << " ";  // 只打印奇数
}
// 输出: 1 3 5 7 9

Java 中的 continue

// 在 Java 中使用 continue 打印 1 到 10 中的奇数
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {  // 如果 i 是偶数
        continue;  // 跳过当前循环
    }
    System.out.print(i + " ");  // 只打印奇数
}
// 输出: 1 3 5 7 9

Python 中的 continue

# 在 Python 中使用 continue 打印 1 到 10 中的奇数
for i in range(1, 11):
    if i % 2 == 0:  # 如果 i 是偶数
        continue  # 跳过当前循环
    print(i, end=" ")  # 只打印奇数
# 输出: 1 3 5 7 9

嵌套循环

循环结构可以嵌套使用,即在一个循环内部包含另一个循环。嵌套循环通常用于处理多维数据或需要多层迭代的问题。同样,循环结构里面也可以包含选择结构语句,进而形成非常复杂的逻辑。

比如说,我们要打印一个长这个样的九九乘法表:

九九乘法表

(提示:\t 是制表符,用于让输出的内容像表格一样对齐)

// 在 C++ 中使用嵌套循环打印乘法表
for (int i = 1; i <= 9; i++) {  // 外层循环控制行
    for (int j = 1; j <= i; j++) {  // 内层循环控制列
        cout << j << "*" << i << "=" << i*j << "\t";
    }
    cout << endl;  // 每行结束后换行
}
// 在 Java 中使用嵌套循环打印乘法表
for (int i = 1; i <= 9; i++) {  // 外层循环控制行
    for (int j = 1; j <= i; j++) {  // 内层循环控制列
        System.out.print(j + "*" + i + "=" + (i*j) + "\t");
    }
    System.out.println();  // 每行结束后换行
}
# 在 Python 中使用嵌套循环打印乘法表
for i in range(1, 10):  # 外层循环控制行
    for j in range(1, i+1):  # 内层循环控制列
        print(f"{j}*{i}={i*j}", end="\t")
    print()  # 每行结束后换行

例题3:素数判断

题意

个数字,你需要依次判断每个数字是否为素数。

思路

首先,我们要循环 次,每次输入一个数字 ,然后判断 是否为素数。

判断一个数是否为素数,我们可以用试除法,即从 开始,一直试到 (由于因子都是成对出现的,所以其实完全不用试到 ,试到 其实就够了),如果在这个范围内都没有找到 的因子,那么 就是素数。

代码实现

#include <bits/stdc++.h>
using namespace std;
int main(){
    int T;  // 定义变量 T
    cin >> T;  // 输入 T
    for (int i = 1; i <= T; i++) {  // 循环 T 次
        int n;  // 定义变量 n
        cin >> n;  // 输入 n
        if (n == 1) {  // 如果 n 等于 1
            cout << "No" << endl;  // 特殊的,1 不是质数也不是合数,输出 No
            continue;  // 结束当前循环,进入下一次循环
        }
        bool is_prime = true;  // 定义变量 is_prime,表示 n 是否为素数
        // 我们先假设 n 是素数,接下来尝试可能的因子,如果发现 n 有因子,再认为 n 不是素数
        for (int j = 2; j < n; j++) {  // 从 2 开始试到 n-1
            if (n % j == 0) {  // 如果 n 能被 j 整除
                is_prime = false;  // 那么 n 不是素数
                break;  // 跳出循环
            }
        }
        if (is_prime) {  // 如果 n 是素数
            cout << "Yes" << endl;  // 输出 Yes
        } else {  // 如果 n 不是素数
            cout << "No" << endl;  // 输出 No
        }
    }
    return 0;  // 结束程序
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  // 创建Scanner对象
        int T = scanner.nextInt();  // 输入 T
        for (int i = 1; i <= T; i++) {  // 循环 T 次
            int n = scanner.nextInt();  // 输入 n
            if (n == 1) {  // 如果 n 等于 1
                System.out.println("No");  // 特殊的,1 不是质数也不是合数,输出 No
                continue;  // 结束当前循环,进入下一次循环
            }
            boolean isPrime = true;  // 定义变量 isPrime,表示 n 是否为素数
            // 我们先假设 n 是素数,接下来尝试可能的因子,如果发现 n 有因子,再认为 n 不是素数
            for (int j = 2; j < n; j++) {  // 从 2 开始试到 n-1
                if (n % j == 0) {  // 如果 n 能被 j 整除
                    isPrime = false;  // 那么 n 不是素数
                    break;  // 跳出循环
                }
            }
            if (isPrime) {  // 如果 n 是素数
                System.out.println("Yes");  // 输出 Yes
            } else {  // 如果 n 不是素数
                System.out.println("No");  // 输出 No
            }
        }
        scanner.close();  // 关闭Scanner对象
    }
}
T = int(input())  # 输入 T
for i in range(1, T + 1):  # 循环 T 次
    n = int(input())  # 输入 n
    if n == 1:  # 如果 n 等于 1
        print("No")  # 特殊的,1 不是质数也不是合数,输出 No
        continue  # 结束当前循环,进入下一次循环
    is_prime = True  # 定义变量 is_prime,表示 n 是否为素数
    # 我们先假设 n 是素数,接下来尝试可能的因子,如果发现 n 有因子,再认为 n 不是素数
    for j in range(2, n):  # 从 2 开始试到 n-1
        if n % j == 0:  # 如果 n 能被 j 整除
            is_prime = False  # 那么 n 不是素数
            break  # 跳出循环
    if is_prime:  # 如果 n 是素数
        print("Yes")  # 输出 Yes
    else:  # 如果 n 不是素数
        print("No")  # 输出 No

课后习题

习题 1:牛牛学数列

习题 2:牛牛学数列2

习题 3:最大的差

习题 4:牛牛学数列4

习题 5:牛牛学数列5

习题 6:各个数位之和

习题 7:栗酱数数

牛客代码笔记-牛栋 文章被收录于专栏

汗牛充栋,学海无涯。<br/> 内含算法知识点讲解,以及牛客题库精选例题。<br/> 学习算法,从牛栋开始。

全部评论

相关推荐

08-06 08:33
四川大学 Java
OPPO官方内推:卧槽!!!啥破公司啊!!!
投递OPPO等公司10个岗位
点赞 评论 收藏
分享
机智的大学生这就开摆:有些地方描述有点儿空泛。传感器直接说清是哪款,要不然对方都不知道问啥。然后freertos那里的描述也是,加上freertos就实现了实时性吗?可以说基于freertos的调度,结合xxx优化/xxx技术实现了xxx检测的实时性。同时freertos也能实现异步io,也能实现灵活的并行架构和高并发。 检测时效性的问题要考虑哪里需要时效性,摔倒检测需要通过中断实现,至于温度这种大惯量就不需要,方案细节理清楚。然后freertos那里提升响应速度用的消息队列不是太合适,可以说是用的notify反正和消息队列差不多,或者说指针传参来优化消息队列的值传递进而提升线程间通信效率。 但凡是搞过开发的看一眼你的简历就知道有问题了,需要重新整理技术路线优化一下。首先搞清楚技术路线,描述好软硬框架,体现性能优化/低功耗等。例如后续针对xxx功能进行了xxx的优化,实现了xxx成果(这里可以展开描述你使用的工具链,你是用的串口调试助手还是RTT来打印日志,有没有用systemview来优化任务的优先级大小避免乱序调度,或者使用了Ozone调试定位问题等)。 描述问题上例如视觉项目那里,基于xxx通信接口编写xxx传感器的驱动,实现了xxx功能,并提供了xxx数据处理/稳定性/精确度/异步调用。或者也可以统一描述为基于xxx、xxx、xxx通讯协议编写xxx、xxx、xxx传感器的驱动。后续再单独给这些传感器的数据处理/优化等进行描述。 最重要的一点,实习栏太少了,五六个月不至于只干了这么点,把实习项目描述清楚,把自己会的不管有没有让你做都写进去。你写了实习这栏,内容就不能比剩下的两个项目差多少了。 最后就是看看岗位jd,跟着描述修改你的专业技能以及项目的描述,这样被回复的概率才大。 希望你早日找到理想工作!祝好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务