C&C++快速入门

10、循环结构

1、课程目标

  • 掌握for、while、do-while三种循环
  • 理解break和continue的作用
  • 掌握嵌套循环的使用
  • 了解循环优化技巧

2、名词解释

术语 说明
for循环 计数循环,已知循环次数时使用
while循环 条件循环,先判断后执行
do-while 条件循环,先执行后判断,至少执行一次
break 立即退出当前循环
continue 跳过本次循环剩余代码,进入下一次
无限循环 没有终止条件的循环
循环不变量 循环中不会改变的值

3、代码实现

1. for循环

#include <stdio.h>

int main() {
    printf("=== for循环 ===\n\n");
    
    // 基础for循环
    printf("【1到10】\n");
    for (int i = 1; i <= 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    
    // 逆序遍历
    printf("\n【10到1】\n");
    for (int i = 10; i >= 1; i--) {
        printf("%d ", i);
    }
    printf("\n");
    
    // 步长不为1
    printf("\n【偶数】\n");
    for (int i = 0; i <= 20; i += 2) {
        printf("%d ", i);
    }
    printf("\n");
    
    // 多个循环变量
    printf("\n【多变量】\n");
    for (int i = 0, j = 10; i < j; i++, j--) {
        printf("i=%d, j=%d\n", i, j);
    }
    
    // 遍历数组
    printf("\n【遍历数组】\n");
    int arr[] = {10, 20, 30, 40, 50};
    int len = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < len; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    
    return 0;
}

2. while和do-while循环

#include <stdio.h>

int main() {
    printf("=== while和do-while ===\n\n");
    
    // while循环
    printf("【while循环】\n");
    int n = 5;
    while (n > 0) {
        printf("%d ", n);
        n--;
    }
    printf("\n");
    
    // do-while循环
    printf("\n【do-while循环】\n");
    n = 5;
    do {
        printf("%d ", n);
        n--;
    } while (n > 0);
    printf("\n");
    
    // 关键区别:条件一开始就为假时
    printf("\n【条件初始为假时】\n");
    n = 0;
    printf("while: ");
    while (n > 0) {
        printf("executed ");
    }
    printf("(未执行)\n");
    
    printf("do-while: ");
    do {
        printf("executed ");
    } while (n > 0);
    printf("(执行了1次)\n");
    
    return 0;
}

3. break和continue

#include <stdio.h>

int main() {
    printf("=== break和continue ===\n\n");
    
    // break: 查找第一个能被3整除的数
    printf("【break示例】\n");
    for (int i = 1; i <= 100; i++) {
        if (i % 3 == 0) {
            printf("找到: %d\n", i);
            break;  // 找到后退出循环
        }
    }
    
    // continue: 跳过某些元素
    printf("\n【continue示例】 跳过3的倍数:\n");
    for (int i = 1; i <= 10; i++) {
        if (i % 3 == 0) {
            continue;  // 跳过打印
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 在while中使用continue时要小心
    printf("\n【while中continue的陷阱】\n");
    int n = 0;
    while (n < 10) {
        n++;  // 必须在continue之前更新,否则死循环
        if (n == 5) {
            continue;
        }
        printf("%d ", n);
    }
    printf("\n");
    
    return 0;
}

4. 嵌套循环与标签

#include <stdio.h>

int main() {
    printf("=== 嵌套循环 ===\n\n");
    
    // 乘法表
    printf("【乘法表】\n");
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%d*%d=%-2d ", j, i, i*j);
        }
        printf("\n");
    }
    
    // break只能退出最内层循环
    printf("\n【break只退出一层】\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (j == 1) break;
            printf("(%d,%d) ", i, j);
        }
        printf("\n");
    }
    
    // 使用标志变量退出多层循环
    printf("\n【标志变量退出多层】\n");
    int found = 0;
    for (int i = 0; i < 3 && !found; i++) {
        for (int j = 0; j < 3 && !found; j++) {
            printf("checking (%d,%d)\n", i, j);
            if (i == 1 && j == 1) {
                printf("找到目标!\n");
                found = 1;
            }
        }
    }
    
    // 使用goto退出多层(不推荐,但在某些场景有用)
    printf("\n【goto退出多层】\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("(%d,%d) ", i, j);
            if (i == 1 && j == 1) {
                goto done;  // 跳转到标签
            }
        }
    }
done:
    printf("\n退出循环\n");
    
    return 0;
}

5. 循环在安全编程中的应用

#include <stdio.h>
#include <windows.h>

int main() {
    printf("=== 安全编程中的循环 ===\n\n");
    
    // 1. 超时重试机制
    printf("【超时重试】\n");
    int maxRetries = 3;
    int connected = 0;
    
    for (int i = 0; i < maxRetries && !connected; i++) {
        printf("尝试连接... (%d/%d)\n", i + 1, maxRetries);
        // 模拟连接尝试
        if (i == 2) {  // 假设第3次成功
            connected = 1;
            printf("连接成功!\n");
        } else {
            printf("连接失败\n");
            // Sleep(1000);  // 实际应用中会延时
        }
    }
    
    if (!connected) {
        printf("所有重试失败\n");
    }
    
    // 2. 读取数据直到结束
    printf("\n【模拟读取数据】\n");
    unsigned char data[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x00};  // "Hello"
    int pos = 0;
    
    while (data[pos] != 0x00) {
        printf("0x%02X ", data[pos]);
        pos++;
        if (pos > 100) break;  // 防止无限循环
    }
    printf("(END)\n");
    
    // 3. 遍历查找
    printf("\n【遍历查找进程】\n");
    DWORD pids[] = {1234, 5678, 9012, 3456};
    DWORD targetPid = 5678;
    int foundIndex = -1;
    
    for (int i = 0; i < 4; i++) {
        if (pids[i] == targetPid) {
            foundIndex = i;
            break;
        }
    }
    
    if (foundIndex != -1) {
        printf("找到PID %lu 在索引 %d\n", targetPid, foundIndex);
    } else {
        printf("未找到PID %lu\n", targetPid);
    }
    
    return 0;
}

6、课后作业

6.1、作业1:计算平均值

使用循环计算一个整数数组的平均值。

6.2、作业2:查找最大值

使用循环查找数组中的最大值和其索引。

6.3、作业3:素数判断

实现函数判断一个数是否为素数:

int IsPrime(int n);