C语言 do-while循环详解与经典实战
本文详细讲解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 4Continue:跳过本次循环中 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,通过迭代累乘得出结果。
- For 循环:适合已知循环次数的场景。需注意循环变量的边界判定。
int main() {
int n = 0, i = 0, mux = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++) { // 修正原文 i- 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;
}- 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语言编程技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









