C语言 do-while循环详解与经典实战

月亮慢半拍
月亮慢半拍
发布时间:2026-10-16| 5人浏览过
原创

本文详细讲解C语言中do-while循环的执行原理、控制符用法及典型应用场景。通过阶乘求和、二分查找、字符串处理及猜数字游戏等实例,展示如何正确使用变量初始化、随机数种子设置以及循环终止条件判断。

结果:掌握do-while循环的核心机制

do-while 循环是 C 语言中的一种后测试循环结构。与 while 或 for 循环不同,它的特点在于“先执行,后判断”,这意味着无论条件是否满足,循环体内的代码块至少会被执行一次。这在某些需要至少执行一次初始操作(如菜单选择、数据录入校验)的场景中非常有用。

准备条件:理解语法结构与控制流

第1步:书写基本语法

入口为 do 关键字,动作是执行大括号 {} 内的语句序列,重要参数是 while(表达式) 后的分号 ;(此处极易遗漏),完成状态为当表达式的值为假(0)时跳出循环。

do {
    // 循环体语句
} while (表达式); 

注意:这里的循环语句可能是一条单条语句,也可以是一段复合语句。

第2步:执行流程与图片对照

程序首先进入 do 块执行内部逻辑,随后计算 while 中的条件。若条件为真,则跳回 do 继续;若为假,则退出循环。

第3步:突破点控制 break 与 continue

Break:直接强制结束整个当前循环。以下示例中,当计数器达到 5 时,打印在输出到 4 后立即终止。

int i = 1;
do {
    if (i == 5) break;
    printf("%d ", i);
    i++;
} while (i <= 10);
// 结果为:1 2 3 4

Continue:跳过本次循环中 continue 之后的语句,直接进入 while 的条件判断环节。如果在 continue 前没有递增计数器,极易导致死循环。

int i = 1;
do {
    if (i == 5) continue; // 跳过打印和递增?不,需看具体位置。通常放在逻辑中间
    // 如果 continue 后面还有自增操作,会导致无限循环
    printf("%d ", i);
    i++;
} while (i <= 10); // 假设改为 continue 在无自增情况下的风险演示

若将 i++ 置于 if 之后且 continue 之前未包含自增,程序会在 5 处反复检查条件,造成光标闪烁般的死循环效果。务必确保所有路径均能推进循环变量。

真实操作顺序:多场景代码实战

第1步:阶乘计算的循环实现

目的:分别使用三种循环求出指定数字的阶乘。
入口与动作:输入整数 n,通过迭代累乘得出结果。

  1. For 循环:适合已知循环次数的场景。需注意循环变量的边界判定。
int main() {
    int n = 0, i = 0, mux = 1;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) { // 修正原文 i
  1. While 循环:在循环首部增加变量增量。
int main() {
    int i = 0, n = 0, mux = 1;
    scanf("%d", &n);
    while (i < n) {
        i++;
        mux *= i;
    }
    printf("mux=%d", mux);
    return 0;
}
  1. Do-while 循环:反向递减累乘。
int main() {
    int i = 0, mux = 1;
    scanf("%d", &i); 
    // 避免死循环,正常做法通常不首选do-while做阶乘,仅作演示
    int temp = i;
    while(temp > 0) {
        mux *= temp;
        temp--;
    }
    printf("mux=%d", mux);
    return 0;
}

第2步:级数求和 1! + 2! + ... + N!

目的:掌握循环嵌套时的变量重置问题。
动作:外层循环控制项数 m,内层计算 m 的阶乘。关键点是在每次内层循环开始前,必须将阶乘累加器 mux 重置为 1,否则会产生累积错误。

int main() {
    int sum = 0, mux = 1;
    for (int i = 1; i <= 3; i++) {
        mux *= i;     // 继承上一次的结果
        sum += mux;   // 累加到总和
    }
    printf("sum = %d", sum);
    return 0;
}

此写法比重新计算阶乘更高效,利用了数学上的连续递推关系。

第3步:有序数组的二分查找

目的:在已排序的数组中高效定位目标值。
重要参数:左指针 left、右指针 right 和中点 mid。
可观察的完成状态:找到元素打印下标,若 left > right 则说明未找到。

int main() {
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int k = 7;
    int sz = sizeof(arr)/sizeof(arr[0]);
    int left = 0, right = sz - 1, mid;
    while (left <= right) {
        mid = (left + right) / 2;
        if (arr[mid] < k) {
            left = mid + 1; // 缩小范围至右半边
        } else if (arr[mid] > k) {
            right = mid - 1; // 缩小范围至左半边
        } else {
            printf("找到了,下标为:%d\n", mid);
            break;
        }
    }
    if (left > right)
        printf("找不到\n");
    return 0;
}

相较于顺序遍历,二分查找的时间复杂度为 O(log N),在处理大规模数据时优势显著。

第4步:从两端向中间汇聚的字符串替换

目的:模拟动态打印过程。
动作:定义原始字符串和目标填充星号串。通过 while(left <= right) 循环,同时从左端 arr2[left] 和右端 arr2[right] 填充字符,直至相遇。

#include <string.h>
#include <stdio.h>
#include <Windows.h>
int main() {
    char arr1[] = "welcome to xi'an!!!";
    char arr2[] = "*******************";
    int left = 0, right = strlen(arr1) - 1;
    while (left <= right) {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        Sleep(1000);  // 暂停1秒
        system("cls"); // 清屏
        left++; right--;
    }
    return 0;
}

运行该段代码可直观看到文字逐字显现的动画效果。需要注意 Sleep 和 system 依赖于 Windows 环境头文件。

第5步:带重试限制的登录验证

目的:限制尝试次数。
动作:利用 for 循环限定最大 3 次输入机会。字符串比较严禁使用 ==,必须调用 strcmp 函数。

#include <string.h>
#include <stdio.h>
int main() {
    char pwd[20] = { 0 };
    int m;
    for (m = 0; m < 3; m++) {
        scanf("%s", pwd);
        if (strcmp(pwd, "2022") == 0) {
            printf("密码正确,进入系统\n");
            break;
        } else {
            printf("密码错误\n");
        }
    }
    if (m == 3) printf("退出系统\n");
    return 0;
}

完成判断:综合案例——猜数字游戏

第1步:解决随机数重复问题

C 语言的 rand() 返回伪随机数。若不初始化种子,每次程序启动都会返回相同的序列。通过在 main 开头调用 srand((unsigned int)time(NULL)),引入时间戳作为种子,确保每次运行的随机性。

第2步:限定随机数范围

rand() % 100 + 1 能够将大范围数值映射至 1~100 之间。

第3步:完整交互逻辑

结合 menu、game 函数与 do-while 循环构建主框架。

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void menu() {
    printf("* 1. play * 0. exit *
");
}

void game() {
    int random = rand() % 100 + 1;
    int guess = 0;
    while (1) {
        printf("猜一个数: ");
        scanf("%d", &guess);
        if (guess < random) printf("猜小了\n");
        else if (guess > random) printf("猜大了\n");
        else { printf("恭喜猜对!\n"); break; }
    }
}

int main() {
    srand((unsigned int)time(NULL)); // 仅在主函数初始化一次
    int input = 0;
    do {
        menu();
        scanf("%d", &input);
        switch(input) {
            case 1: game(); break;
            case 0: printf("退出游戏\n"); break;
            default: printf("输入无效\n"); break;
        }
    } while(input); // 输入非0即真,循环继续
    return 0;
}

此架构清晰展示了如何将子功能模块化,并利用 do-while 保证至少显示一次菜单的交互体验。

简要总结

以上就是关于C语言do-while循环语句的详细解析与实战指南,涵盖了从基础语法到复杂游戏开发的多个维度。更多关于C语言编程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。