【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循环。通过合理选择循环结构,可以使代码更加简洁、高效和易于理解。

相关推荐
小莞尔2 小时前
【51单片机】【protues仿真】基于51单片机温度测量系统
c语言·单片机·嵌入式硬件·物联网·51单片机
晓风凌殇2 小时前
单片机按键检测与长短按识别实现
c语言·单片机
坚持编程的菜鸟4 小时前
LeetCode每日一题——螺旋矩阵
c语言·算法·leetcode·矩阵
机器视觉知识推荐、就业指导5 小时前
C语言中的预编译是什么?何时需要预编译?
c语言·开发语言
一碗绿豆汤9 小时前
C语言-函数
c语言
闭着眼睛学算法9 小时前
【双机位A卷】华为OD笔试之【模拟】双机位A-新学校选址【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od
草莓工作室9 小时前
AT指令解析:TencentOS Tiny AT指令解析源码分析1-TencentOS Tiny 简介
c语言·物联网·嵌入式·at指令·4g模组
无限进步_11 小时前
扫雷游戏的设计与实现:扫雷游戏3.0
c语言·开发语言·c++·后端·算法·游戏·游戏程序
Yupureki12 小时前
从零开始的C++学习生活 8:list的入门使用
c语言·c++·学习·visual studio