【C语言实战(8)】C语言循环结构(do-while):解锁编程新境界
目录
- 一、do-while 循环基本语法与执行流程
- 1.1 do-while 循环语法格式与特点
- 1.2 do-while 与 while 循环区别
- 1.3 do-while 循环适用场景
- 二、do-while 循环实战案例(一)
- 2.1 实战:简易计算器
- 2.2 实战:输入密码,错误则重新输入
- 2.3 do-while 循环确保至少执行一次的优势
- 三、do-while 循环实战案例(二)
- 3.1 实战:统计输入字符串的长度(不使用 strlen 函数)
- 3.2 实战:计算斐波那契数列前 n 项(n 由用户输入)
- 3.3 三种循环结构(for、while、do-while)适用场景对比
一、do-while 循环基本语法与执行流程
1.1 do-while 循环语法格式与特点
在 C 语言中,do-while循环是一种后测试循环结构,其语法格式如下:
do {// 循环体代码
} while (条件表达式);
它的特点是 “先执行,后判断”。也就是说,无论条件表达式一开始是否成立,循环体中的代码都会至少执行一次。之后,每次循环体执行完毕,才会去判断条件表达式。如果条件表达式为真(非零值),则继续执行循环体;如果条件表达式为假(零值),则终止循环。
例如,下面这段代码使用do-while循环输出 1 到 5 的数字:
#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循环是先判断条件,再执行循环体,其语法格式为:
while (条件表达式) {// 循环体代码
}
如果一开始条件表达式就为假,那么while循环的循环体一次都不会执行。
而do-while循环是先执行循环体,再判断条件,这就保证了循环体至少会被执行一次 。
例如:
#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循环可以确保用户至少有一次输入的机会。例如,要求用户输入一个正整数,如果输入不符合要求(非正整数),则提示用户重新输入,直到输入正确为止。
#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;
}
- 菜单展示与选择场景:在一些控制台应用程序中,需要展示菜单给用户,并根据用户的选择执行相应的操作。无论用户如何选择,菜单都需要先展示一次。例如:
#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循环实现的简易计算器程序,它可以实现加、减、乘、除四种基本运算,并支持用户多次计算,选择退出:
#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 次则提示 “账户锁定”:
#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。以下是实现代码:
#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的值即为字符串的长度 。
运行效果如下:
请输入一个字符串:hello
字符串的长度是:5
3.2 实战:计算斐波那契数列前 n 项(n 由用户输入)
斐波那契数列是一个经典的数列,其特点是从第三项开始,每一项都等于前两项之和。以下是使用do-while循环计算斐波那契数列前n项的代码,其中n由用户输入:
#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 时,运行结果如下:
请输入要计算的斐波那契数列项数:5
斐波那契数列的前 5 项是:
0 1 1 2 3
3.3 三种循环结构(for、while、do-while)适用场景对比
- for 循环:
- 适用场景:适用于已知循环次数的场景。例如,遍历数组、执行固定次数的操作等。它的语法结构清晰地将循环的初始化、条件判断和更新部分放在一起,使代码具有良好的可读性和可维护性。
- 示例:
// 遍历数组
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);
}
- while 循环:
- 适用场景:适用于循环次数未知,但可以根据某个条件来判断是否继续循环的场景。例如,读取文件内容直到文件末尾、根据用户输入来决定是否继续循环等。在每次迭代之前检查条件,如果条件为真,则执行循环体。
- 示例:
// 读取用户输入,直到输入0结束
int num;
while (1) {printf("请输入一个数字(输入0结束):");scanf("%d", &num);if (num == 0) {break;}printf("你输入的数字是:%d\n", num);
}
- do-while 循环:
- 适用场景:适用于需要确保循环体至少执行一次的场景。例如,获取用户输入并进行校验、展示菜单并等待用户选择等。它先执行循环体,然后再判断条件 。
- 示例:
// 展示菜单并获取用户选择,直到用户选择退出
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循环。通过合理选择循环结构,可以使代码更加简洁、高效和易于理解。