【C语言实战(8)】C语言循环结构(do-while):解锁编程新境界

目录

  • [一、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 循环适用场景

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

在这段代码中:

  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 时,运行结果如下:

c 复制代码
请输入要计算的斐波那契数列项数:5
斐波那契数列的前 5 项是:
0 1 1 2 3 

3.3 三种循环结构(for、while、do-while)适用场景对比

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

相关推荐
小青龙emmm5 小时前
2025级C语言第二次周测(国教专用)题解
c语言·开发语言·算法
学习路上_write5 小时前
FREERTOS_互斥量_创建和使用
c语言·开发语言·c++·stm32·单片机·嵌入式硬件
程序猿编码7 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
charlie1145141918 小时前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数
white-persist8 小时前
【攻防世界】reverse | Reversing-x64Elf-100 详细题解 WP
c语言·开发语言·网络·python·学习·安全·php
Want5958 小时前
C/C++贪吃蛇小游戏
c语言·开发语言·c++
雨落在了我的手上10 小时前
C语言入门(二十二):字符函数和字符串函数(2)
c语言
qq_4017004114 小时前
嵌入式用Unix时间的优势及其C语言转换
服务器·c语言·unix
智者知已应修善业19 小时前
【51单片机普通延时奇偶灯切换】2023-4-4
c语言·经验分享·笔记·嵌入式硬件·51单片机
晚风(●•σ )19 小时前
C++语言程序设计——11 C语言风格输入/输出函数
c语言·开发语言·c++