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);