
一、C语言循环结构概述
C语言提供了三种循环结构:for、while、do-while,用于重复执行代码块直到满足特定条件。
二、for循环
基本语法
for (初始化表达式; 条件表达式; 更新表达式) {
// 循环体
}示例代码
#include <stdio.h>
int main() {
// 示例1:打印1-10
printf("1-10的数字:");
for (int i = 1; i <= 10; i++) {
printf("%d ", i);
}
printf("\n");
// 示例2:计算1-100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
printf("1-100的和:%d\n", sum);
return 0;
}for循环的变体
#include <stdio.h>
int main() {
// 省略初始化表达式
int i = 1;
for (; i <= 5; i++) {
printf("%d ", i);
}
printf("\n");
// 省略更新表达式
int j = 1;
for (; j <= 3;) {
printf("%d ", j);
j++;
}
printf("\n");
// 无限循环
/*
for (;;) {
printf("无限循环\n");
}
*/
return 0;
}三、while循环
基本语法
while (条件表达式) {
// 循环体
}示例代码
#include <stdio.h>
int main() {
// 示例1:计算1-100的和
int sum = 0, i = 1;
while (i <= 100) {
sum += i;
i++;
}
printf("1-100的和:%d\n", sum);
// 示例2:用户输入验证
int password;
printf("请输入密码(123456):");
scanf("%d", &password);
while (password != 123456) {
printf("密码错误,请重新输入:");
scanf("%d", &password);
}
printf("登录成功!\n");
return 0;
}四、do-while循环
基本语法
do {
// 循环体
} while (条件表达式);示例代码
#include <stdio.h>
int main() {
// 示例1:至少执行一次
int count = 0;
do {
printf("这是第%d次执行\n", ++count);
} while (count < 3);
// 示例2:菜单选择
int choice;
do {
printf("\n=== 菜单 ===\n");
printf("1. 开始游戏\n");
printf("2. 设置\n");
printf("3. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("开始游戏...\n");
break;
case 2:
printf("进入设置...\n");
break;
case 3:
printf("退出程序\n");
break;
default:
printf("无效选择,请重新输入!\n");
}
} while (choice != 3);
return 0;
}五、循环控制语句
break语句
#include <stdio.h>
int main() {
// 在循环中找到第一个满足条件的数
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0 && i % 5 == 0) {
printf("找到第一个能被7和5整除的数:%d\n", i);
break;
}
}
// 在switch中使用break
int num = 2;
switch (num) {
case 1:
printf("数字1\n");
break;
case 2:
printf("数字2\n");
break;
default:
printf("其他数字\n");
}
return 0;
}continue语句
#include <stdio.h>
int main() {
// 打印1-10中的奇数
printf("1-10中的奇数:");
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
printf("%d ", i);
}
printf("\n");
// 跳过特定数字
printf("跳过数字5:");
for (int i = 1; i <= 10; i++) {
if (i == 5) {
continue;
}
printf("%d ", i);
}
printf("\n");
return 0;
}六、嵌套循环
示例代码
#include <stdio.h>
int main() {
// 打印九九乘法表
printf("=== 九九乘法表 ===\n");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d×%d=%-2d ", j, i, i * j);
}
printf("\n");
}
// 打印直角三角形
printf("\n=== 直角三角形 ===\n");
int rows = 5;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= i; j++) {
printf("* ");
}
printf("\n");
}
// 打印等腰三角形
printf("\n=== 等腰三角形 ===\n");
for (int i = 1; i <= rows; i++) {
// 打印空格
for (int j = 1; j <= rows - i; j++) {
printf(" ");
}
// 打印星号
for (int k = 1; k <= 2 * i - 1; k++) {
printf("*");
}
printf("\n");
}
return 0;
}七、经典例题讲解
例题1:斐波那契数列
#include <stdio.h>
int main() {
int n;
printf("请输入要生成的斐波那契数列项数:");
scanf("%d", &n);
long long a = 0, b = 1, next;
printf("斐波那契数列前%d项:\n", n);
for (int i = 1; i <= n; i++) {
if (i == 1) {
printf("%lld ", a);
} else if (i == 2) {
printf("%lld ", b);
} else {
next = a + b;
printf("%lld ", next);
a = b;
b = next;
}
}
printf("\n");
return 0;
}例题2:判断质数
#include <stdio.h>
#include <math.h>
int isPrime(int n) {
if (n < 2) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0;
for (int i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (isPrime(num)) {
printf("%d是质数\n", num);
} else {
printf("%d不是质数\n", num);
}
// 找出100以内的所有质数
printf("\n100以内的质数:\n");
for (int i = 2; i <= 100; i++) {
if (isPrime(i)) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}例题3:水仙花数
#include <stdio.h>
#include <math.h>
int main() {
printf("水仙花数(三位数):\n");
for (int num = 100; num < 1000; num++) {
int hundreds = num / 100;
int tens = (num % 100) / 10;
int units = num % 10;
int sum = pow(hundreds, 3) + pow(tens, 3) + pow(units, 3);
if (sum == num) {
printf("%d = %d³ + %d³ + %d³\n",
num, hundreds, tens, units);
}
}
return 0;
}例题4:冒泡排序
#include <stdio.h>
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前:");
printArray(arr, n);
bubbleSort(arr, n);
printf("排序后:");
printArray(arr, n);
return 0;
}例题5:数字金字塔
#include <stdio.h>
int main() {
int rows;
printf("请输入金字塔的行数:");
scanf("%d", &rows);
for (int i = 1; i <= rows; i++) {
// 打印前导空格
for (int j = 1; j <= rows - i; j++) {
printf(" ");
}
// 打印递增数字
for (int j = 1; j <= i; j++) {
printf("%d", j);
}
// 打印递减数字
for (int j = i - 1; j >= 1; j--) {
printf("%d", j);
}
printf("\n");
}
return 0;
}八、综合练习题
练习1:阶乘计算
#include <stdio.h>
int main() {
int n;
long long factorial = 1;
printf("请输入一个正整数:");
scanf("%d", &n);
if (n < 0) {
printf("错误:负数没有阶乘!\n");
} else {
for (int i = 1; i <= n; i++) {
factorial *= i;
}
printf("%d! = %lld\n", n, factorial);
}
return 0;
}练习2:最大公约数和最小公倍数
#include <stdio.h>
int main() {
int a, b, gcd, lcm;
printf("请输入两个正整数:");
scanf("%d %d", &a, &b);
// 计算最大公约数
int x = a, y = b;
while (y != 0) {
int temp = y;
y = x % y;
x = temp;
}
gcd = x;
// 计算最小公倍数
lcm = (a * b) / gcd;
printf("%d和%d的最大公约数是:%d\n", a, b, gcd);
printf("%d和%d的最小公倍数是:%d\n", a, b, lcm);
return 0;
}练习3:素数筛法(埃拉托斯特尼筛法)
#include <stdio.h>
#include <string.h>
#define MAX 1000
int main() {
int isPrime[MAX + 1];
memset(isPrime, 1, sizeof(isPrime)); // 初始化为都是素数
isPrime[0] = isPrime[1] = 0; // 0和1不是素数
// 埃拉托斯特尼筛法
for (int i = 2; i * i <= MAX; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= MAX; j += i) {
isPrime[j] = 0;
}
}
}
printf("1-%d之间的素数:\n", MAX);
int count = 0;
for (int i = 2; i <= MAX; i++) {
if (isPrime[i]) {
printf("%d ", i);
count++;
if (count % 10 == 0) printf("\n");
}
}
printf("\n总共%d个素数\n", count);
return 0;
}九、循环优化技巧
1. 减少循环内部计算
// 优化前
for (int i = 0; i < strlen(str); i++) {
// ...
}
// 优化后
int len = strlen(str);
for (int i = 0; i < len; i++) {
// ...
}1. 使用寄存器变量
register int i;
for (i = 0; i < 1000; i++) {
// 频繁使用的变量
}1. 循环展开
// 普通循环
for (int i = 0; i < 100; i++) {
process(i);
}
// 循环展开
for (int i = 0; i < 100; i += 4) {
process(i);
process(i + 1);
process(i + 2);
process(i + 3);
}十、常见错误和注意事项
1. 无限循环
// 错误示例
int i = 0;
while (i < 10) {
printf("%d ", i);
// 忘记 i++ 会导致无限循环
}
// 正确写法
int i = 0;
while (i < 10) {
printf("%d ", i);
i++;
}1. 数组越界
int arr[5] = {1, 2, 3, 4, 5};
// 错误:数组越界
for (int i = 0; i <= 5; i++) {
printf("%d ", arr[i]);
}
// 正确
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}通过以上详细讲解和丰富的例题,相信你已经掌握了C语言循环结构的核心概念和应用技巧。建议多加练习,逐步提高编程能力。