C 语言中的条件循环

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何在 C 编程中实现条件循环。你将从理解 while 循环的基础开始,然后探索如何使用 breakcontinue 指令来控制循环的执行。此外,你还将学习如何使用条件语句过滤数组元素,并通过各种指令优化循环效率。在本实验结束时,你将掌握条件循环的基本概念及其在 C 编程中的实际应用。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

理解 While 循环

在这一步中,你将学习 C 编程中 while 循环的基础知识。While 循环是一种强大的控制结构,它允许你在特定条件为真时重复执行一段代码。

让我们创建一个简单的 C 程序来演示 while 循环的基本语法。打开 VSCode 编辑器,在 ~/project 目录下创建一个名为 while_loop_example.c 的新文件。

cd ~/project
touch while_loop_example.c
#include <stdio.h>

int main() {
    int count = 1;

    while (count <= 5) {
        printf("Current count: %d\n", count);
        count++;
    }

    return 0;
}

让我们分解这段代码:

  • int count = 1; 初始化一个计数器变量
  • while (count <= 5) 创建一个循环,只要 count 小于或等于 5,循环就会继续
  • printf() 显示 count 的当前值
  • count++ 在每次迭代中递增计数器

编译并运行程序:

gcc while_loop_example.c -o while_loop_example
./while_loop_example

示例输出:

Current count: 1
Current count: 2
Current count: 3
Current count: 4
Current count: 5

以下是另一个示例,展示了带有用户输入的 while 循环:

#include <stdio.h>

int main() {
    int number;

    printf("Enter numbers (enter 0 to stop):\n");

    number = 1;  // 初始化为非零值
    while (number != 0) {
        printf("Enter a number: ");
        scanf("%d", &number);

        if (number != 0) {
            printf("You entered: %d\n", number);
        }
    }

    printf("Loop ended. Goodbye!\n");

    return 0;
}

这个示例展示了如何使用 while 循环进行交互式输入,直到满足特定条件(输入 0)为止。

在 While 循环中应用 Break 指令

在这一步中,你将学习 C 编程中的 break 指令,它允许你在满足特定条件时提前退出循环。break 语句提供了一种立即终止当前循环并继续执行循环后语句的方式。

让我们在 ~/project 目录下创建一个名为 break_loop_example.c 的新文件,来演示 break 的用法:

cd ~/project
touch break_loop_example.c
#include <stdio.h>

int main() {
    int number;

    printf("Enter numbers to find the first multiple of 10:\n");

    while (1) {  // 无限循环
        printf("Enter a number: ");
        scanf("%d", &number);

        if (number % 10 == 0) {
            printf("Found a multiple of 10: %d\n", number);
            break;  // 当找到 10 的倍数时退出循环
        }

        printf("Not a multiple of 10. Try again.\n");
    }

    printf("Loop terminated after finding a multiple of 10.\n");

    return 0;
}

让我们分解这段代码:

  • while (1) 创建一个无限循环,直到遇到 break 语句才会停止
  • 当用户输入一个能被 10 整除的数字时,break 语句会立即退出循环
  • 如果数字不能被 10 整除,循环会继续提示输入

以下是另一个示例,展示了 break 在更复杂场景中的用法:

#include <stdio.h>

int main() {
    int sum = 0;
    int count = 0;
    int input;

    printf("Enter numbers (enter a negative number to stop):\n");

    while (1) {
        printf("Enter a number: ");
        scanf("%d", &input);

        if (input < 0) {
            break;  // 如果输入负数,则退出循环
        }

        sum += input;
        count++;
    }

    if (count > 0) {
        printf("Average of entered numbers: %.2f\n", (float)sum / count);
    } else {
        printf("No numbers were entered.\n");
    }

    return 0;
}

这个示例展示了 break 如何用于:

  • 在满足特定条件时停止收集输入
  • 计算输入数字的平均值
  • 提供循环终止的灵活性

编译并运行程序,查看 break 指令的工作原理:

gcc break_loop_example.c -o break_loop_example
./break_loop_example

在 While 循环中使用 Continue 指令

在这一步中,你将学习 C 编程中的 continue 指令,它允许你跳过当前循环迭代并进入下一次迭代。continue 语句提供了一种基于特定条件选择性执行或跳过循环部分内容的方式。

让我们在 ~/project 目录下创建一个名为 continue_loop_example.c 的新文件,来演示 continue 的用法:

cd ~/project
touch continue_loop_example.c
#include <stdio.h>

int main() {
    int number;
    int sum_even = 0;
    int count_even = 0;

    printf("Enter 10 numbers to calculate the sum and count of even numbers:\n");

    int i = 0;
    while (i < 10) {
        printf("Enter number %d: ", i + 1);
        scanf("%d", &number);

        // 跳过奇数
        if (number % 2 != 0) {
            printf("Skipping odd number: %d\n", number);
            continue;  // 进入下一次迭代
        }

        sum_even += number;
        count_even++;

        i++;
    }

    if (count_even > 0) {
        printf("Sum of even numbers: %d\n", sum_even);
        printf("Count of even numbers: %d\n", count_even);
        printf("Average of even numbers: %.2f\n", (float)sum_even / count_even);
    } else {
        printf("No even numbers were entered.\n");
    }

    return 0;
}

让我们分解这段代码:

  • 程序要求用户输入 10 个数字
  • if (number % 2 != 0) 检查数字是否为奇数
  • continue 跳过奇数的当前迭代的剩余部分
  • 只有偶数会被加入总和并计数

以下是另一个示例,展示了 continue 在更复杂条件下的用法:

#include <stdio.h>

int main() {
    int number;
    int positive_count = 0;
    int negative_count = 0;

    printf("Enter numbers (enter 0 to stop):\n");

    while (1) {
        printf("Enter a number: ");
        scanf("%d", &number);

        // 如果输入 0,则退出循环
        if (number == 0) {
            break;
        }

        // 跳过零
        if (number == 0) {
            continue;
        }

        // 统计正数和负数的数量
        if (number > 0) {
            positive_count++;
        } else {
            negative_count++;
        }
    }

    printf("Positive numbers count: %d\n", positive_count);
    printf("Negative numbers count: %d\n", negative_count);

    return 0;
}

这个示例展示了 continue 如何用于:

  • 跳过特定值
  • 基于条件选择性处理数字
  • 提供更灵活的循环控制

编译并运行程序,查看 continue 指令的工作原理:

gcc continue_loop_example.c -o continue_loop_example
./continue_loop_example

使用条件语句过滤数组元素

在这一步中,你将学习如何在 C 编程中使用条件语句和循环来过滤数组元素。过滤允许你根据特定条件从数组中选择特定的元素。

让我们在 ~/project 目录下创建一个名为 array_filtering.c 的新文件,来演示数组元素的过滤:

cd ~/project
touch array_filtering.c
#include <stdio.h>

#define MAX_SIZE 10

int main() {
    int numbers[MAX_SIZE];
    int filtered_even[MAX_SIZE];
    int filtered_count = 0;

    // 输入数组元素
    printf("Enter %d numbers:\n", MAX_SIZE);
    for (int i = 0; i < MAX_SIZE; i++) {
        printf("Enter number %d: ", i + 1);
        scanf("%d", &numbers[i]);
    }

    // 过滤偶数
    printf("\nFiltered Even Numbers:\n");
    for (int i = 0; i < MAX_SIZE; i++) {
        if (numbers[i] % 2 == 0) {
            filtered_even[filtered_count] = numbers[i];
            filtered_count++;
            printf("%d ", numbers[i]);
        }
    }

    printf("\n\nTotal even numbers: %d\n", filtered_count);

    return 0;
}

让我们分解过滤过程:

  • 我们创建了两个数组:numbers 用于存储输入,filtered_even 用于存储过滤后的元素
  • 第一个循环从用户那里读取 10 个数字
  • 第二个循环使用条件语句过滤偶数
  • if (numbers[i] % 2 == 0) 检查数字是否为偶数
  • 符合条件的元素被存储在 filtered_even 数组中

以下是一个更复杂的示例,展示了多重过滤条件:

#include <stdio.h>

#define MAX_SIZE 10

int main() {
    int numbers[MAX_SIZE];
    int prime_numbers[MAX_SIZE];
    int prime_count = 0;

    // 输入数组元素
    printf("Enter %d numbers:\n", MAX_SIZE);
    for (int i = 0; i < MAX_SIZE; i++) {
        printf("Enter number %d: ", i + 1);
        scanf("%d", &numbers[i]);
    }

    // 过滤质数
    printf("\nFiltered Prime Numbers:\n");
    for (int i = 0; i < MAX_SIZE; i++) {
        // 跳过小于 2 的数字
        if (numbers[i] < 2) continue;

        int is_prime = 1;
        for (int j = 2; j * j <= numbers[i]; j++) {
            if (numbers[i] % j == 0) {
                is_prime = 0;
                break;
            }
        }

        // 将质数添加到过滤后的数组中
        if (is_prime) {
            prime_numbers[prime_count] = numbers[i];
            prime_count++;
            printf("%d ", numbers[i]);
        }
    }

    printf("\n\nTotal prime numbers: %d\n", prime_count);

    return 0;
}

这个示例展示了:

  • 从输入数组中过滤质数
  • 使用嵌套循环检查质数
  • 将过滤后的元素存储在单独的数组中

编译并运行程序:

gcc array_filtering.c -o array_filtering
./array_filtering

示例输入和输出:

Enter 10 numbers:
Enter number 1: 5
Enter number 2: 12
Enter number 3: 7
Enter number 4: 15
...

Filtered Prime Numbers:
5 7

Total prime numbers: 2

使用指令优化循环效率

在这一步中,你将学习在 C 编程中使用各种指令和策略来优化循环效率的技术。我们将探索不同的方法来提高循环性能和可读性。

让我们在 ~/project 目录下创建一个名为 loop_optimization.c 的文件,来演示优化技术:

cd ~/project
touch loop_optimization.c
#include <stdio.h>
#include <time.h>

#define ARRAY_SIZE 10000

// 使用传统循环计算和的函数
int traditional_sum(int arr[], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum;
}

// 使用优化循环计算和的函数
int optimized_sum(int arr[], int size) {
    int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;

    // 循环展开技术
    int i;
    for (i = 0; i + 4 < size; i += 4) {
        sum1 += arr[i];
        sum2 += arr[i + 1];
        sum3 += arr[i + 2];
        sum4 += arr[i + 3];
    }

    // 处理剩余元素
    for (; i < size; i++) {
        sum1 += arr[i];
    }

    return sum1 + sum2 + sum3 + sum4;
}

int main() {
    int arr[ARRAY_SIZE];
    clock_t start, end;
    double cpu_time_used;

    // 初始化数组
    for (int i = 0; i < ARRAY_SIZE; i++) {
        arr[i] = i + 1;
    }

    // 传统求和
    start = clock();
    int traditional_result = traditional_sum(arr, ARRAY_SIZE);
    end = clock();
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("Traditional Sum: %d\n", traditional_result);
    printf("Traditional Loop Time: %f seconds\n", cpu_time_used);

    // 优化求和
    start = clock();
    int optimized_result = optimized_sum(arr, ARRAY_SIZE);
    end = clock();
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("Optimized Sum: %d\n", optimized_result);
    printf("Optimized Loop Time: %f seconds\n", cpu_time_used);

    return 0;
}

以下是另一个示例,展示了多种优化技术:

#include <stdio.h>

#define MAX_SIZE 1000

int main() {
    int numbers[MAX_SIZE];
    int even_sum = 0, odd_sum = 0;

    // 高效的初始化和求和
    for (int i = 0; i < MAX_SIZE; i++) {
        numbers[i] = i + 1;

        // 最小化分支的条件求和
        even_sum += (numbers[i] % 2 == 0) * numbers[i];
        odd_sum += (numbers[i] % 2 != 0) * numbers[i];
    }

    printf("Sum of Even Numbers: %d\n", even_sum);
    printf("Sum of Odd Numbers: %d\n", odd_sum);

    return 0;
}

展示的关键优化技术包括:

  1. 循环展开以减少循环开销
  2. 最小化分支预测
  3. 结合初始化和处理
  4. 使用乘法进行条件求和

使用优化标志编译并运行程序:

## 使用基本优化编译
gcc -O2 loop_optimization.c -o loop_optimization
./loop_optimization

## 使用高级优化编译
gcc -O3 loop_optimization.c -o loop_optimization
./loop_optimization

额外的优化建议:

  • 使用 -O2-O3 编译器标志
  • 尽量减少循环内的函数调用
  • 使用适当的数据类型
  • 避免不必要的计算
  • 考虑循环不变代码外提

总结

在本实验中,你将学习 C 编程中 while 循环的基础知识,包括如何使用 breakcontinue 指令来控制循环的流程。你还将探索如何使用条件语句过滤数组元素,并通过各种指令优化循环效率。在本实验结束时,你将掌握如何在 C 中实现条件循环,以解决各种编程问题。