介绍
在本实验中,你将学习如何在 C 编程中实现条件循环。你将从理解 while
循环的基础开始,然后探索如何使用 break
和 continue
指令来控制循环的执行。此外,你还将学习如何使用条件语句过滤数组元素,并通过各种指令优化循环效率。在本实验结束时,你将掌握条件循环的基本概念及其在 C 编程中的实际应用。
在本实验中,你将学习如何在 C 编程中实现条件循环。你将从理解 while
循环的基础开始,然后探索如何使用 break
和 continue
指令来控制循环的执行。此外,你还将学习如何使用条件语句过滤数组元素,并通过各种指令优化循环效率。在本实验结束时,你将掌握条件循环的基本概念及其在 C 编程中的实际应用。
在这一步中,你将学习 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)为止。
在这一步中,你将学习 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
语句才会停止break
语句会立即退出循环以下是另一个示例,展示了 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
在这一步中,你将学习 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;
}
让我们分解这段代码:
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
用于存储过滤后的元素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;
}
展示的关键优化技术包括:
使用优化标志编译并运行程序:
## 使用基本优化编译
gcc -O2 loop_optimization.c -o loop_optimization
./loop_optimization
## 使用高级优化编译
gcc -O3 loop_optimization.c -o loop_optimization
./loop_optimization
额外的优化建议:
-O2
或 -O3
编译器标志在本实验中,你将学习 C 编程中 while 循环的基础知识,包括如何使用 break
和 continue
指令来控制循环的流程。你还将探索如何使用条件语句过滤数组元素,并通过各种指令优化循环效率。在本实验结束时,你将掌握如何在 C 中实现条件循环,以解决各种编程问题。