当前位置: 首页 > news >正文

【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 循环适用场景

  1. 需要先执行一次操作的场景:比如在一些初始化操作中,无论后续条件如何,某些操作都需要先执行一次。例如,在一个数据处理程序中,可能需要先读取一次数据文件的头部信息,然后根据头部信息中的某些标志来决定是否继续读取文件内容。
  2. 用户输入校验场景:在需要获取用户输入并进行校验时,使用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;
}
  1. 菜单展示与选择场景:在一些控制台应用程序中,需要展示菜单给用户,并根据用户的选择执行相应的操作。无论用户如何选择,菜单都需要先展示一次。例如:
#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;
}

在这段代码中:

  1. 首先定义了变量n用于存储用户输入的项数,i用于记录当前计算到第几项,初始值为 0,first和second分别表示斐波那契数列的前两项,初始值为 0 和 1,nextTerm用于存储下一项的值。
  2. 通过scanf获取用户输入的项数n,并检查n是否为正整数,如果不是则提示错误并结束程序。
  3. 使用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)适用场景对比

  1. for 循环
    • 适用场景:适用于已知循环次数的场景。例如,遍历数组、执行固定次数的操作等。它的语法结构清晰地将循环的初始化、条件判断和更新部分放在一起,使代码具有良好的可读性和可维护性。
    • 示例
// 遍历数组
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);
}
  1. while 循环
    • 适用场景:适用于循环次数未知,但可以根据某个条件来判断是否继续循环的场景。例如,读取文件内容直到文件末尾、根据用户输入来决定是否继续循环等。在每次迭代之前检查条件,如果条件为真,则执行循环体。
    • 示例
// 读取用户输入,直到输入0结束
int num;
while (1) {printf("请输入一个数字(输入0结束):");scanf("%d", &num);if (num == 0) {break;}printf("你输入的数字是:%d\n", num);
}
  1. 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循环。通过合理选择循环结构,可以使代码更加简洁、高效和易于理解。

http://www.dtcms.com/a/464811.html

相关文章:

  • 面向Qt/C++开发工程师的Ai提示词(附Trae示例)
  • sqlite 使用: 01-源码编译与使用
  • Django视图进阶:快捷函数、装饰器与请求响应
  • 企业营销网站的建设网站开发响应式
  • 掌握DMA基于GD32F407VE的天空星的配置
  • 基于腾讯云的物联网导盲助手设计与实现(论文+源码)
  • Vue3打造高效前端埋点系统
  • 框架--Maven
  • 【Java集合】
  • 停止Conda开机自动运行方法
  • 湘潭市高新建设局施工报建网站wordpress 宕机
  • 复杂结构数据挖掘(二)关联规则挖掘 Association rule mining
  • Windows 上安装 PostgreSQL
  • 基于JETSON/x86+FPGA+AI的5G远程驾驶座舱时延验证方案
  • 支持向量机(SVM)完全解读
  • 单片机学习日记
  • 重庆网站制作多少钱app设计开发哪家好
  • AI大模型学习(17)python-flask AI大模型和图片处理工具的从一张图到多平台适配的简单方法
  • 如何通过 7 种解决方案将文件从PC无线传输到Android
  • Word 为每一页设置不同页边距(VBA 宏)
  • wordpiece、unigram、sentencepiece基本原理
  • css word-spacing属性
  • 使用 python-docx 库操作 word 文档(2):在word文档中插入各种内容
  • 中企动力销售工作内容白城网站seo
  • 从0死磕全栈之Next.js 企业级 `next.config.js` 配置详解:打造高性能、安全、可维护的中大型项目
  • 在JavaScript中,const和var的区别
  • 【SDR课堂第36讲】RFSOC PS软件开发入门指南(一)
  • 学做网站中国设计网站导航
  • [嵌入式系统-84]:NPU/TPU/LPU有指令集吗?
  • 光伏安全协议-安全责任协议书8篇