目录
- [一、do-while 循环基本语法与执行流程](#一、do-while 循环基本语法与执行流程)
-
- [1.1 do-while 循环语法格式与特点](#1.1 do-while 循环语法格式与特点)
- [1.2 do-while 与 while 循环区别](#1.2 do-while 与 while 循环区别)
- [1.3 do-while 循环适用场景](#1.3 do-while 循环适用场景)
- [二、do-while 循环实战案例(一)](#二、do-while 循环实战案例(一))
-
- [2.1 实战:简易计算器](#2.1 实战:简易计算器)
- [2.2 实战:输入密码,错误则重新输入](#2.2 实战:输入密码,错误则重新输入)
- [2.3 do-while 循环确保至少执行一次的优势](#2.3 do-while 循环确保至少执行一次的优势)
- [三、do-while 循环实战案例(二)](#三、do-while 循环实战案例(二))
-
- [3.1 实战:统计输入字符串的长度(不使用 strlen 函数)](#3.1 实战:统计输入字符串的长度(不使用 strlen 函数))
- [3.2 实战:计算斐波那契数列前 n 项(n 由用户输入)](#3.2 实战:计算斐波那契数列前 n 项(n 由用户输入))
- [3.3 三种循环结构(for、while、do-while)适用场景对比](#3.3 三种循环结构(for、while、do-while)适用场景对比)
一、do-while 循环基本语法与执行流程
1.1 do-while 循环语法格式与特点
在 C 语言中,do-while循环是一种后测试循环结构,其语法格式如下:
c
do {
// 循环体代码
} while (条件表达式);
它的特点是 "先执行,后判断"。也就是说,无论条件表达式一开始是否成立,循环体中的代码都会至少执行一次。之后,每次循环体执行完毕,才会去判断条件表达式。如果条件表达式为真(非零值),则继续执行循环体;如果条件表达式为假(零值),则终止循环。
例如,下面这段代码使用do-while循环输出 1 到 5 的数字:
c
#include <stdio.h>
int main() {
int i = 1;
do {
printf("%d ", i);
i++;
} while (i <= 5);
return 0;
}
在这个例子中,首先会执行printf("%d ", i);和i++;这两条语句,输出 1 并将i增加到 2。然后判断i <= 5条件,由于此时i为 2,条件成立,继续执行循环体。如此反复,直到i变为 6 时,条件i <= 5不成立,循环终止。
1.2 do-while 与 while 循环区别
while循环是先判断条件,再执行循环体,其语法格式为:
c
while (条件表达式) {
// 循环体代码
}
如果一开始条件表达式就为假,那么while循环的循环体一次都不会执行。
而do-while循环是先执行循环体,再判断条件,这就保证了循环体至少会被执行一次 。
例如:
c
#include <stdio.h>
int main() {
int a = 10;
while (a < 5) {
printf("while循环体执行,a的值为:%d\n", a);
a++;
}
a = 10;
do {
printf("do-while循环体执行,a的值为:%d\n", a);
a++;
} while (a < 5);
return 0;
}
在上述代码中,while循环由于初始条件a < 5不成立,循环体不会执行。而do-while循环不管条件如何,先执行一次循环体,然后再判断条件,当条件不成立时才结束循环。
1.3 do-while 循环适用场景
- 需要先执行一次操作的场景:比如在一些初始化操作中,无论后续条件如何,某些操作都需要先执行一次。例如,在一个数据处理程序中,可能需要先读取一次数据文件的头部信息,然后根据头部信息中的某些标志来决定是否继续读取文件内容。
- 用户输入校验场景:在需要获取用户输入并进行校验时,使用do-while循环可以确保用户至少有一次输入的机会。例如,要求用户输入一个正整数,如果输入不符合要求(非正整数),则提示用户重新输入,直到输入正确为止。
c
#include <stdio.h>
int main() {
int num;
do {
printf("请输入一个正整数:");
scanf("%d", &num);
if (num <= 0) {
printf("输入错误,请输入正整数!\n");
}
} while (num <= 0);
printf("您输入的正整数是:%d\n", num);
return 0;
}
- 菜单展示与选择场景:在一些控制台应用程序中,需要展示菜单给用户,并根据用户的选择执行相应的操作。无论用户如何选择,菜单都需要先展示一次。例如:
c
#include <stdio.h>
int main() {
int choice;
do {
printf("菜单:\n");
printf("1. 选项1\n");
printf("2. 选项2\n");
printf("3. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("您选择了选项1\n");
break;
case 2:
printf("您选择了选项2\n");
break;
case 3:
printf("退出程序\n");
break;
default:
printf("无效选择,请重新选择\n");
}
} while (choice != 3);
return 0;
}
在这个例子中,菜单会先展示给用户,然后根据用户的输入进行相应处理,直到用户选择退出选项。
二、do-while 循环实战案例(一)
2.1 实战:简易计算器
下面是一个使用do-while循环实现的简易计算器程序,它可以实现加、减、乘、除四种基本运算,并支持用户多次计算,选择退出:
c
#include <stdio.h>
int main() {
int choice;
float num1, num2, result;
do {
// 显示菜单
printf("\n简易计算器\n");
printf("1. 加法\n");
printf("2. 减法\n");
printf("3. 乘法\n");
printf("4. 除法\n");
printf("0. 退出\n");
printf("请选择操作(0-4): ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入两个数: ");
scanf("%f %f", &num1, &num2);
result = num1 + num2;
printf("%.2f + %.2f = %.2f\n", num1, num2, result);
break;
case 2:
printf("请输入两个数: ");
scanf("%f %f", &num1, &num2);
result = num1 - num2;
printf("%.2f - %.2f = %.2f\n", num1, num2, result);
break;
case 3:
printf("请输入两个数: ");
scanf("%f %f", &num1, &num2);
result = num1 * num2;
printf("%.2f * %.2f = %.2f\n", num1, num2, result);
break;
case 4:
printf("请输入两个数: ");
scanf("%f %f", &num1, &num2);
if (num2 != 0) {
result = num1 / num2;
printf("%.2f / %.2f = %.2f\n", num1, num2, result);
} else {
printf("错误:除数不能为零!\n");
}
break;
case 0:
printf("感谢使用,再见!\n");
break;
default:
printf("无效选择,请重试。\n");
}
} while (choice != 0);
return 0;
}
在这个程序中,首先使用do-while循环确保菜单至少显示一次。在循环体中,通过switch语句根据用户的选择执行相应的运算操作。当用户选择 0 时,choice != 0条件为假,循环终止,程序结束。
2.2 实战:输入密码,错误则重新输入
以下是使用do-while循环实现输入密码功能的代码,最多允许用户输入 3 次密码,若输入正确则提示 "登录成功",超过 3 次则提示 "账户锁定":
c
#include <stdio.h>
#include <string.h>
int main() {
char password[20];
int attempts = 0;
const char correctPassword[] = "123456";
do {
printf("请输入密码(剩余尝试次数:%d): ", 3 - attempts);
scanf("%s", password);
attempts++;
if (strcmp(password, correctPassword) == 0) {
printf("登录成功!\n");
return 0;
} else if (attempts == 3) {
printf("账户锁定!\n");
} else {
printf("密码错误,请重试!\n");
}
} while (attempts < 3);
return 0;
}
在这段代码中,定义了一个attempts变量来记录用户输入密码的次数,初始值为 0。每次循环中,提示用户输入密码,并将输入的密码与预设的正确密码进行比较。如果密码正确,输出 "登录成功!" 并结束程序;如果密码错误且尝试次数小于 3,提示用户重新输入;当尝试次数达到 3 次时,提示 "账户锁定!" 。
2.3 do-while 循环确保至少执行一次的优势
在上述两个案例中,do-while循环确保至少执行一次的特性发挥了重要作用。
对于简易计算器案例,如果使用while循环,在某些情况下,可能由于初始条件不满足而导致菜单一次都不显示,用户无法进行任何操作。而do-while循环保证了菜单至少显示一次,用户可以看到操作选项并进行选择。
在密码输入案例中,do-while循环确保用户至少有一次输入密码的机会。如果使用while循环,并且初始条件设置不当(例如,一开始就判断密码是否正确),可能会导致用户还未输入密码,程序就因为条件不满足而结束。
总的来说,当我们需要确保某些操作(如获取用户输入、展示菜单等)至少执行一次时,do-while循环是一个非常合适的选择,它能使程序的逻辑更加合理,用户体验更好。
三、do-while 循环实战案例(二)
3.1 实战:统计输入字符串的长度(不使用 strlen 函数)
在 C 语言中,我们可以使用do-while循环来统计输入字符串的长度,而不依赖于标准库函数strlen。以下是实现代码:
c
#include <stdio.h>
int main() {
char str[100];
int length = 0;
printf("请输入一个字符串:");
scanf("%s", str);
do {
length++;
} while (str[length] != '\0');
printf("字符串的长度是:%d\n", length);
return 0;
}
在这段代码中,我们首先定义了一个字符数组str来存储用户输入的字符串,以及一个变量length用于统计字符串长度,初始值为 0。然后通过scanf函数获取用户输入的字符串。
在do-while循环中,每次循环将length增加 1,然后检查str[length]是否为字符串结束符'\0'。如果不是,则继续循环;如果是,则说明已经遍历到字符串末尾,循环结束。此时length的值即为字符串的长度 。
运行效果如下:
c
请输入一个字符串:hello
字符串的长度是:5
3.2 实战:计算斐波那契数列前 n 项(n 由用户输入)
斐波那契数列是一个经典的数列,其特点是从第三项开始,每一项都等于前两项之和。以下是使用do-while循环计算斐波那契数列前n项的代码,其中n由用户输入:
c
#include <stdio.h>
int main() {
int n, i = 0, first = 0, second = 1, nextTerm;
printf("请输入要计算的斐波那契数列项数:");
scanf("%d", &n);
if (n <= 0) {
printf("请输入正整数!\n");
return 1;
}
printf("斐波那契数列的前 %d 项是:\n", n);
do {
if (i <= 1) {
nextTerm = i;
} else {
nextTerm = first + second;
first = second;
second = nextTerm;
}
printf("%d ", nextTerm);
i++;
} while (i < n);
return 0;
}
在这段代码中:
- 首先定义了变量n用于存储用户输入的项数,i用于记录当前计算到第几项,初始值为 0,first和second分别表示斐波那契数列的前两项,初始值为 0 和 1,nextTerm用于存储下一项的值。
- 通过scanf获取用户输入的项数n,并检查n是否为正整数,如果不是则提示错误并结束程序。
- 使用do-while循环来计算并输出斐波那契数列的前n项。在循环中,根据i的值来确定当前项的值。如果i小于等于 1,当前项就是i本身;否则,当前项是前两项之和。然后更新first和second的值,为下一次计算做准备。最后输出当前项,并将i增加 1 。当i达到n时,循环结束。
例如,当用户输入 5 时,运行结果如下:
c
请输入要计算的斐波那契数列项数:5
斐波那契数列的前 5 项是:
0 1 1 2 3
3.3 三种循环结构(for、while、do-while)适用场景对比
- for 循环 :
- 适用场景:适用于已知循环次数的场景。例如,遍历数组、执行固定次数的操作等。它的语法结构清晰地将循环的初始化、条件判断和更新部分放在一起,使代码具有良好的可读性和可维护性。
- 示例:
c
// 遍历数组
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
- while 循环 :
- 适用场景:适用于循环次数未知,但可以根据某个条件来判断是否继续循环的场景。例如,读取文件内容直到文件末尾、根据用户输入来决定是否继续循环等。在每次迭代之前检查条件,如果条件为真,则执行循环体。
- 示例:
c
// 读取用户输入,直到输入0结束
int num;
while (1) {
printf("请输入一个数字(输入0结束):");
scanf("%d", &num);
if (num == 0) {
break;
}
printf("你输入的数字是:%d\n", num);
}
- do-while 循环 :
- 适用场景:适用于需要确保循环体至少执行一次的场景。例如,获取用户输入并进行校验、展示菜单并等待用户选择等。它先执行循环体,然后再判断条件 。
- 示例:
c
// 展示菜单并获取用户选择,直到用户选择退出
int choice;
do {
printf("菜单:\n");
printf("1. 选项1\n");
printf("2. 选项2\n");
printf("3. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("您选择了选项1\n");
break;
case 2:
printf("您选择了选项2\n");
break;
case 3:
printf("退出程序\n");
break;
default:
printf("无效选择,请重新选择\n");
}
} while (choice != 3);
总的来说,在选择循环结构时,需要根据具体的需求和场景来决定。如果明确知道循环次数,优先使用for循环;如果循环次数不确定且可能一次都不执行,使用while循环;如果需要确保循环体至少执行一次,使用do-while循环。通过合理选择循环结构,可以使代码更加简洁、高效和易于理解。