【C语言实战(6)】解锁C语言循环密码:for循环实战探秘

目录

  • [一、for 循环基础大揭秘](#一、for 循环基础大揭秘)
    • [1.1 for 循环基本语法与执行流程](#1.1 for 循环基本语法与执行流程)
    • [1.2 for 循环三要素(初始化、条件判断、更新)](#1.2 for 循环三要素(初始化、条件判断、更新))
    • [1.3 for 循环执行顺序图解](#1.3 for 循环执行顺序图解)
    • [1.4 for 循环与分支结构嵌套基础](#1.4 for 循环与分支结构嵌套基础)
  • [二、for 循环实战案例(一)](#二、for 循环实战案例(一))
    • [2.1 实战:计算 1 到 100 的累加和](#2.1 实战:计算 1 到 100 的累加和)
    • [2.2 实战:输出 100 以内的所有偶数](#2.2 实战:输出 100 以内的所有偶数)
    • [2.3 循环变量控制与边界条件处理](#2.3 循环变量控制与边界条件处理)
  • [三、for 循环实战案例(二)](#三、for 循环实战案例(二))
    • [3.1 实战:打印九九乘法表](#3.1 实战:打印九九乘法表)
    • [3.2 实战:计算 n 的阶乘(n 由用户输入)](#3.2 实战:计算 n 的阶乘(n 由用户输入))
    • [3.3 for 循环嵌套使用技巧与注意事项](#3.3 for 循环嵌套使用技巧与注意事项)

一、for 循环基础大揭秘

1.1 for 循环基本语法与执行流程

在 C 语言中,for循环是一种常用的循环结构,其一般语法结构如下:

c 复制代码
for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体
}
  • 初始化表达式:用于初始化循环控制变量,它只会在循环开始前执行一次。
  • 条件表达式:每次循环迭代前会检查该条件,若为真(非零值),则执行循环体;若为假(零值),则结束循环。
  • 更新表达式:在每次循环体执行结束后执行,通常用于更新循环控制变量的值,使循环逐渐逼近结束条件。

例如,下面这段代码使用for循环来打印数字 1 到 5:

c 复制代码
#include <stdio.h>

int main() {
    int i;
    for (i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    return 0;
}

在这个例子中,i = 1是初始化表达式,i <= 5是条件表达式,i++是更新表达式。循环从i为 1 开始,每次循环打印i的值,然后i自增 1,直到i大于 5 时循环结束。

1.2 for 循环三要素(初始化、条件判断、更新)

  1. 初始化:初始化是for循环的起始准备阶段,它为循环控制变量赋初始值。这个初始值决定了循环从何处开始。比如在前面打印 1 到 5 的例子中,i = 1将循环变量i初始化为 1,这意味着循环将从 1 开始计数 。初始化表达式在整个for循环过程中仅执行一次。若在for循环外部已经对循环变量进行了初始化,那么在for循环的初始化表达式部分可以省略,但分号不能省略。例如:
c 复制代码
int i = 1;
for (; i <= 5; i++) {
    printf("%d ", i);
}
  1. 条件判断:条件判断是控制循环是否继续执行的关键。它是一个逻辑表达式,其结果决定了循环的走向。当条件表达式的值为真时,循环体将被执行;当条件表达式的值为假时,循环立即终止,程序继续执行for循环之后的代码。在上述例子里,i <= 5作为条件表达式,只要i小于等于 5,循环就会持续进行,一旦i大于 5,循环结束。如果省略条件表达式,就相当于条件永远为真,会导致死循环,例如:
c 复制代码
for (i = 1; ; i++) {
    // 这里会形成死循环,因为没有条件判断来结束循环
}
  1. 更新:更新部分用于在每次循环体执行完毕后,对循环控制变量进行修改,使循环逐渐朝着结束的方向发展。通常使用自增(++)或自减(--)运算符来实现变量的更新。在打印 1 到 5 的代码中,i++使i的值每次循环后增加 1,从而逐步接近并最终超过条件判断中的上限 5,促使循环结束。也可以使用其他方式来更新变量,比如i = i + 2,这样i每次会增加 2。更新表达式也可以省略,但同样需要在循环体中加入适当的代码来改变循环变量,以避免死循环,例如:
c 复制代码
for (i = 1; i <= 5;) {
    printf("%d ", i);
    i++; // 这里在循环体中更新变量,若没有这行代码会导致死循环
}

1.3 for 循环执行顺序图解

为了更直观地理解for循环的执行顺序,我们可以通过流程图来展示,如下:

c 复制代码
@startuml
start
:初始化表达式;
:检查条件表达式;
if (条件表达式为真) then (yes)
    :执行循环体;
    :更新表达式;
    :检查条件表达式;
    if (条件表达式为真) then (yes)
        :执行循环体;
        :更新表达式;
        :检查条件表达式;
        if (条件表达式为真) then (yes)
            :执行循环体;
            :更新表达式;
            :检查条件表达式;
            if (条件表达式为真) then (yes)
                :执行循环体;
                :更新表达式;
                :检查条件表达式;
                if (条件表达式为真) then (yes)
                    :执行循环体;
                    :更新表达式;
                    :检查条件表达式;
                else (no)
                    stop
                endif
            else (no)
                stop
            endif
        else (no)
            stop
        endif
    else (no)
        stop
    endif
else (no)
    stop
endif
@enduml
  1. 首先执行初始化表达式,对循环变量进行初始化。
  2. 接着检查条件表达式,如果条件为真,执行循环体。
  3. 循环体执行完毕后,执行更新表达式,对循环变量进行更新。
  4. 再次检查条件表达式,若为真,重复步骤 2 和步骤 3;若为假,循环结束,程序继续执行后续代码。

1.4 for 循环与分支结构嵌套基础

在 C 语言编程中,for循环常常会与分支结构(如if - else、switch等)进行嵌套,以实现更复杂的逻辑控制。嵌套的基本概念就是在一个结构内部包含另一个结构。

  1. for循环与if - else嵌套:当需要在循环过程中根据不同的条件执行不同的操作时,可以使用for循环与if - else的嵌套。例如,我们要打印 1 到 10 之间的奇数和偶数,并分别标记:
c 复制代码
#include <stdio.h>

int main() {
    int i;
    for (i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            printf("%d是偶数\n", i);
        } else {
            printf("%d是奇数\n", i);
        }
    }
    return 0;
}

在这个例子中,for循环控制变量i从 1 遍历到 10。在每次循环中,通过if - else分支结构判断i是奇数还是偶数,并打印相应的信息。

  1. for循环与switch嵌套:当有多种条件需要根据不同的值进行处理时,for循环与switch的嵌套就派上用场了。比如,根据用户输入的数字,打印对应的星期几的英文单词缩写(假设输入 1 到 7 分别对应周一到周日),并且可以多次输入:
c 复制代码
#include <stdio.h>

int main() {
    int num, i;
    for (i = 1; i <= 3; i++) { // 假设只进行3次输入操作
        printf("请输入一个1到7之间的数字: ");
        scanf("%d", &num);
        switch (num) {
            case 1:
                printf("Mon\n");
                break;
            case 2:
                printf("Tue\n");
                break;
            case 3:
                printf("Wed\n");
                break;
            case 4:
                printf("Thu\n");
                break;
            case 5:
                printf("Fri\n");
                break;
            case 6:
                printf("Sat\n");
                break;
            case 7:
                printf("Sun\n");
                break;
            default:
                printf("输入错误,请输入1到7之间的数字\n");
        }
    }
    return 0;
}

这里for循环控制输入操作的次数,每次输入一个数字后,通过switch语句根据数字的值打印对应的星期缩写。如果输入的数字不在 1 到 7 之间,通过default分支提示输入错误。

二、for 循环实战案例(一)

2.1 实战:计算 1 到 100 的累加和

计算 1 到 100 的累加和是一个经典的编程练习,使用for循环可以轻松实现。下面是具体的 C 语言代码:

c 复制代码
#include <stdio.h>

int main() {
    int sum = 0; // 用于存储累加结果,初始化为0
    int i;
    for (i = 1; i <= 100; i++) {
        sum += i; // 将当前的i值累加到sum中
    }
    printf("1到100的累加和为:%d\n", sum);
    return 0;
}

在这段代码中:

  1. 变量初始化:首先定义了一个变量sum,并初始化为 0,用于存储累加的结果。还定义了循环变量i,虽然这里没有直接初始化,但在for循环的初始化部分会对其进行初始化。
  2. for 循环的运用:for循环的初始化表达式i = 1,将循环变量i初始化为 1,表示从 1 开始累加。条件表达式i <= 100,确保i在 1 到 100 的范围内进行循环。更新表达式i++,每次循环结束后将i的值增加 1 ,以便遍历下一个数字。
  3. 累加操作:在循环体中,通过sum += i语句,将当前的i值累加到sum中。这样,当循环结束时,sum中存储的就是 1 到 100 的累加和。
  4. 结果输出:最后使用printf函数输出累加的结果。

2.2 实战:输出 100 以内的所有偶数

要输出 100 以内的所有偶数,可以利用for循环结合条件判断来实现。以下是实现代码:

c 复制代码
#include <stdio.h>

int main() {
    int i;
    for (i = 1; i <= 100; i++) {
        if (i % 2 == 0) { // 判断i是否为偶数,如果i除以2的余数为0,则i是偶数
            printf("%d ", i);
        }
    }
    printf("\n");
    return 0;
}

在这个代码中:

  1. 循环设置:for循环从i = 1开始,到i <= 100结束,遍历 1 到 100 的所有数字。
  2. 偶数判断:在循环体中,使用if (i % 2 == 0)条件判断语句来判断当前的i是否为偶数。这里用到了取模运算符%,它返回除法的余数。当i除以 2 的余数为 0 时,说明i能被 2 整除,即i是偶数。
  3. 输出偶数:如果i是偶数,就使用printf函数将其输出。最后换行输出,使结果更加清晰。

我们还可以对上述代码进行优化,直接从 2 开始,每次递增 2,这样可以减少不必要的判断,提高效率,优化后的代码如下:

c 复制代码
#include <stdio.h>

int main() {
    int i;
    for (i = 2; i <= 100; i += 2) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

2.3 循环变量控制与边界条件处理

在前面计算 1 到 100 的累加和以及输出 100 以内偶数的案例中,循环变量的控制和边界条件的处理至关重要。

  1. 循环变量控制
    • 初始值设定:合理设置循环变量的初始值是循环正确执行的第一步。在计算 1 到 100 的累加和时,将循环变量i初始化为 1,这符合从 1 开始累加的需求;在输出偶数的例子中,若采用普通方式从 1 开始遍历,初始值为 1,若优化后从 2 开始遍历偶数,则初始值为 2 。初始值的设定直接决定了循环从哪个数值开始处理。
    • 更新方式:循环变量的更新方式决定了循环的步长和走向。通常使用自增(++)或自减(--)运算符,也可以根据具体需求进行更复杂的更新。如在计算累加和中,i++使i每次增加 1,依次遍历 1 到 100 的每一个数;在优化后的输出偶数代码中,i += 2让i每次增加 2,直接遍历所有偶数,提高了效率。如果更新方式错误,比如忘记更新循环变量,就会导致死循环。
  2. 边界条件处理
    • 循环结束条件:正确设定循环结束条件是避免无限循环和获取正确结果的关键。在两个案例中,都使用i <= 100作为循环结束条件,确保只处理 100 以内(包括 100)的数字。如果将条件设置为i < 100,则计算累加和时会少加 100,输出偶数时会遗漏 100 这个偶数。
    • 特殊值处理:在实际编程中,还需要考虑一些特殊值的情况。例如在处理数字相关问题时,0 可能需要特殊对待。虽然在这两个案例中没有涉及,但在其他场景下,可能需要对 0 进行单独的判断和处理,以确保程序的正确性和健壮性。

三、for 循环实战案例(二)

3.1 实战:打印九九乘法表

打印九九乘法表是一个经典的编程示例,它很好地展示了for循环嵌套的应用。下面是使用 C 语言实现打印九九乘法表的代码:

c 复制代码
#include <stdio.h>

int main() {
    int i, j;
    for (i = 1; i <= 9; i++) { // 外层for循环控制行数,i从1到9
        for (j = 1; j <= i; j++) { // 内层for循环控制列数,j从1到当前的行数i
            printf("%d*%d=%-2d ", j, i, i * j); // 格式化输出乘法表达式,%-2d表示左对齐,占2个字符宽度
        }
        printf("\n"); // 换行,开始下一行的打印
    }
    return 0;
}

在这段代码中:

  1. 双层 for 循环的运用
    • 外层for循环for (i = 1; i <= 9; i++)控制乘法表的行数,i代表当前行号,从 1 到 9 循环。每一次外层循环的迭代,都会开始新的一行打印。
    • 内层for循环for (j = 1; j <= i; j++)控制每一行中乘法表达式的个数,j代表当前列号。注意内层循环的结束条件是j <= i,这意味着第一行只有 1 个乘法表达式(11),第二行有 2 个(12,2*2),以此类推,第九行有 9 个,这样就可以打印出下三角形状的九九乘法表。
  2. 输出格式控制
    • printf("%d*%d=%-2d ", j, i, i * j);语句用于格式化输出乘法表达式。%d是整数占位符,分别对应j(乘数)、i(被乘数)和i * j(乘积)。%-2d中的-表示左对齐,2表示输出宽度为 2 个字符。这样可以保证输出的乘法表整齐美观,每个乘积都占用相同的宽度,不会出现参差不齐的情况。
    • printf("\n");用于换行,当内层循环结束,即当前行的所有乘法表达式打印完毕后,执行换行操作,以便在下一行继续打印。

3.2 实战:计算 n 的阶乘(n 由用户输入)

阶乘是数学中的一个概念,正整数 n 的阶乘(记作 n!)是所有小于及等于 n 的正整数的乘积。例如,5! = 5 * 4 * 3 * 2 * 1 = 120。下面是使用 C 语言实现从用户处获取 n 并计算其阶乘的代码:

c 复制代码
#include <stdio.h>

int main() {
    int n, i;
    unsigned long long factorial = 1; // 使用unsigned long long类型以处理较大的阶乘结果,初始化为1
    printf("请输入一个正整数n: ");
    scanf("%d", &n);

    if (n < 0) {
        printf("负数没有阶乘,请输入正整数。\n");
    } else if (n == 0 || n == 1) {
        factorial = 1;
        printf("%d的阶乘是: %llu\n", n, factorial);
    } else {
        for (i = 1; i <= n; i++) {
            factorial *= i; // 累乘计算阶乘
        }
        printf("%d的阶乘是: %llu\n", n, factorial);
    }
    return 0;
}

在这段代码中:

  1. 变量定义与初始化:定义了n用于存储用户输入的整数,i作为循环变量,factorial用于存储阶乘的结果,并初始化为 1,因为任何数乘以 1 都等于其本身,这是阶乘计算的起点。这里使用unsigned long long类型是因为阶乘的结果增长非常快,普通的int类型很容易溢出,无法存储较大数的阶乘。
  2. 输入与判断:通过printf提示用户输入一个正整数n,然后使用scanf获取用户输入的值。接着对输入进行判断,如果n是负数,提示用户负数没有阶乘;如果n是 0 或 1,直接将阶乘结果设为 1 并输出,因为 0! 和 1! 都等于 1。
  3. for 循环计算阶乘:对于大于 1 的n,使用for循环来计算阶乘。for (i = 1; i <= n; i++)循环从 1 到n,在每次循环中,将当前的i值与factorial相乘,即factorial *= i,这样当循环结束时,factorial中存储的就是n的阶乘。
  4. 结果输出:最后使用printf函数输出n的阶乘结果。

3.3 for 循环嵌套使用技巧与注意事项

在前面打印九九乘法表和计算阶乘的案例中,我们已经涉及到了for循环的嵌套使用。以下是一些使用for循环嵌套时的技巧与注意事项:

  1. 内外层循环变量的关系:在嵌套循环中,内外层循环变量通常存在一定的逻辑关系。如在打印九九乘法表时,内层循环变量j的范围依赖于外层循环变量i,j从 1 到i,这决定了乘法表每一行的元素个数。在处理二维数组时,外层循环可能控制行索引,内层循环控制列索引,两者相互配合来遍历整个数组。合理设计这种关系是实现正确逻辑的关键 。
  2. 避免死循环:确保每个循环都有终止条件是避免死循环的关键。在打印九九乘法表的代码中,外层循环i从 1 到 9,内层循环j从 1 到i,它们都有明确的结束条件,不会导致死循环。如果不小心将循环条件写错,比如内层循环写成for (j = 1; ; j++),就会导致内层循环永远不会结束,从而形成死循环。另外,在循环体中修改循环变量时要格外小心,确保修改后的变量能使循环朝着结束的方向发展。
  3. 循环嵌套的深度:虽然理论上可以进行多层循环嵌套,但实际编程中应尽量避免过深的嵌套,一般不超过三层。因为嵌套层数过多会使代码可读性变差,维护难度增加,并且容易出现逻辑错误。如果确实需要复杂的逻辑,可以考虑将部分功能封装成函数,以简化代码结构。例如,在打印九九乘法表时,若要对乘法表进行更复杂的处理,如添加标题、边框等,可以将打印乘法表的核心逻辑封装成一个函数,在主函数中调用该函数,并添加其他相关的输出逻辑。
  4. 代码的可读性:使用有意义的变量名和适当的注释可以提高代码的可读性。在计算阶乘的代码中,n表示用户输入的数,i作为循环变量,factorial表示阶乘结果,这些变量名清晰地表达了其用途。同时,在关键的逻辑部分添加注释,如在判断输入和计算阶乘的地方,能让阅读代码的人更容易理解代码的功能和执行流程。
相关推荐
GilgameshJSS3 小时前
STM32H743-ARM例程15-RTC
c语言·arm开发·stm32·实时音视频
pu_taoc3 小时前
深入剖析:基于epoll与主从Reactor模型的高性能服务器设计与实现
服务器·c语言·c++·vscode
韧竹、6 小时前
数据结构之顺序表
c语言·数据结构
努力努力再努力wz11 小时前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
凤年徐11 小时前
【C++】string的模拟实现
c语言·开发语言·c++
迎風吹頭髮13 小时前
UNIX下C语言编程与实践59-UNIX TCP 数据传输:send 与 recv 函数的使用与数据处理
c语言·网络·unix
迎風吹頭髮13 小时前
UNIX下C语言编程与实践55-TCP 协议基础:面向连接的可靠传输机制与三次握手、四次挥手
c语言·网络·unix
迎風吹頭髮15 小时前
UNIX下C语言编程与实践35-UNIX 守护进程编写:后台执行、脱离终端、清除掩码与信号处理
java·c语言·unix
qiuiuiu41316 小时前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机