首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言循环结构程序设计详解

C语言循环结构程序设计详解

作者头像
晚霞的不甘
发布2025-12-23 10:17:21
发布2025-12-23 10:17:21
2080
举报

一、C语言循环结构概述

C语言提供了三种循环结构:for、while、do-while,用于重复执行代码块直到满足特定条件。

二、for循环

基本语法

代码语言:javascript
复制
for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体
}

示例代码

代码语言:javascript
复制
#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循环的变体

代码语言:javascript
复制
#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循环

基本语法

代码语言:javascript
复制
while (条件表达式) {
    // 循环体
}

示例代码

代码语言:javascript
复制
#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循环

基本语法

代码语言:javascript
复制
do {
    // 循环体
} while (条件表达式);

示例代码

代码语言:javascript
复制
#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语句

代码语言:javascript
复制
#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语句

代码语言:javascript
复制
#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;
}

六、嵌套循环

示例代码

代码语言:javascript
复制
#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:斐波那契数列

代码语言:javascript
复制
#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:判断质数

代码语言:javascript
复制
#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:水仙花数

代码语言:javascript
复制
#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:冒泡排序

代码语言:javascript
复制
#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:数字金字塔

代码语言:javascript
复制
#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:阶乘计算

代码语言:javascript
复制
#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:最大公约数和最小公倍数

代码语言:javascript
复制
#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:素数筛法(埃拉托斯特尼筛法)

代码语言:javascript
复制
#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. 减少循环内部计算

代码语言:javascript
复制
// 优化前
for (int i = 0; i < strlen(str); i++) {
    // ...
}

// 优化后
int len = strlen(str);
for (int i = 0; i < len; i++) {
    // ...
}

1. 使用寄存器变量

代码语言:javascript
复制
register int i;
for (i = 0; i < 1000; i++) {
    // 频繁使用的变量
}

1. 循环展开

代码语言:javascript
复制
// 普通循环
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. 无限循环

代码语言:javascript
复制
// 错误示例
int i = 0;
while (i < 10) {
    printf("%d ", i);
    // 忘记 i++ 会导致无限循环
}

// 正确写法
int i = 0;
while (i < 10) {
    printf("%d ", i);
    i++;
}

1. 数组越界

代码语言:javascript
复制
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语言循环结构的核心概念和应用技巧。建议多加练习,逐步提高编程能力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档