C 语言实例 – 循环输出区间范围内的奇数/偶数(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在 C 语言编程中,循环结构与条件判断是实现复杂逻辑的基础工具。本文以“循环输出区间范围内的奇数/偶数”这一经典实例为切入点,系统讲解如何通过 for
、while
等循环结构结合条件语句(如 %
取模运算符),实现对指定范围数字的筛选与输出。无论是编程新手还是有一定基础的开发者,都能通过本文掌握从简单案例到复杂场景的解决方案,并理解程序设计中的核心思维模式。
一、基础概念解析
1.1 循环结构:程序的“重复执行器”
循环是编程中实现重复操作的核心机制,C 语言提供了三种主要循环结构:
for
循环:适用于已知循环次数的场景,语法简洁直观。while
循环:当循环条件在初始阶段不确定时使用,灵活性较高。do-while
循环:与while
类似,但保证循环体至少执行一次。
比喻说明:
想象你在自动售货机前反复投币买饮料,for
循环就像按固定次数操作(如买 5 瓶),while
循环则像根据余额动态调整购买次数,do-while
则确保你至少买一瓶再判断是否继续。
1.2 条件判断:程序的“智能决策者”
条件语句(如 if-else
)用于根据逻辑条件执行不同分支代码。在奇偶数判断中,关键操作是 取模运算符 %
:
number % 2 == 0
表示该数是偶数number % 2 == 1
表示该数是奇数
扩展思考:
取模运算的底层原理是求除法的余数,例如 7 % 3
的结果是 1(因 3×2=6,余 1)。这种特性使其成为判断奇偶性的高效工具。
二、基础案例:固定区间内的奇数/偶数输出
2.1 固定区间的奇数输出
需求:输出 1 到 10 之间的所有奇数。
代码实现:
#include <stdio.h>
int main() {
printf("1到10之间的奇数:\n");
for (int i = 1; i <= 10; i++) {
if (i % 2 == 1) {
printf("%d ", i);
}
}
return 0;
}
运行结果:
1到10之间的奇数:
1 3 5 7 9
代码解析:
for
循环遍历 1 到 10 的所有整数if
条件判断当前数是否为奇数(余数为 1)- 满足条件则打印该数
2.2 扩展:偶数输出与循环结构替换
需求:输出同一区间内的偶数,并改用 while
循环实现。
代码示例:
#include <stdio.h>
int main() {
int i = 1;
printf("1到10之间的偶数:\n");
while (i <= 10) {
if (i % 2 == 0) {
printf("%d ", i);
}
i++;
}
return 0;
}
运行结果:
1到10之间的偶数:
2 4 6 8 10
对比分析:
for
循环将初始化、条件判断和迭代操作集中在一个语句中,适合已知范围的场景while
循环需手动维护循环变量i
,但逻辑清晰度稍低,适合动态范围
三、进阶案例:用户自定义区间
3.1 动态输入区间范围
需求:允许用户输入起始值 start
和结束值 end
,输出其中的奇数/偶数。
代码实现:
#include <stdio.h>
void print_numbers(int start, int end, char type) {
printf("输出 %d 到 %d 的 %s 数:\n", start, end, (type == 'e') ? "偶" : "奇");
for (int i = start; i <= end; i++) {
if (type == 'e' && i % 2 == 0) {
printf("%d ", i);
} else if (type == 'o' && i % 2 == 1) {
printf("%d ", i);
}
}
printf("\n");
}
int main() {
int start, end;
char choice;
printf("请输入起始值:");
scanf("%d", &start);
printf("请输入结束值:");
scanf("%d", &end);
printf("请选择输出类型(e=偶数,o=奇数):");
scanf(" %c", &choice); // 注意空格处理
print_numbers(start, end, choice);
return 0;
}
输入示例:
请输入起始值:5
请输入结束值:15
请选择输出类型(e=偶数,o=奇数):o
输出结果:
输出 5 到 15 的 奇 数:
5 7 9 11 13 15
关键点解析:
- 函数封装:将输出逻辑封装到
print_numbers
函数中,提高代码复用性 - 输入处理:
scanf(" %c", &choice)
中的空格用于忽略前一个scanf
的换行符- 参数
type
通过字符'e'
/'o'
控制输出类型
- 条件分支:通过
if-else
结合type
参数实现多条件判断
3.2 错误处理与边界条件优化
问题场景:用户输入 start > end
(如起始值 20,结束值 10)时,程序会进入死循环。
解决方案:在循环前添加区间有效性检查,并逆序遍历:
void print_numbers(int start, int end, char type) {
// ... 其他代码 ...
if (start > end) {
for (int i = start; i >= end; i--) {
// 判断逻辑保持不变
}
} else {
for (int i = start; i <= end; i++) {
// 判断逻辑保持不变
}
}
}
四、高级技巧与扩展应用
4.1 位运算优化奇偶判断
虽然 %
运算符直观,但位运算更高效:
if (i & 1) { // 判断是否为奇数(二进制最后一位为1)
// 执行奇数操作
}
原理:
二进制中,奇数的最后一位始终是 1。i & 1
的结果即为该位的值(1 或 0)。
4.2 分支合并与代码简化
通过数学公式直接生成奇数/偶数序列:
// 输出偶数
for (int i = start; i <= end; i += 2) {
printf("%d ", i);
}
适用条件:当起始值与类型一致时(如 start
为偶数且输出偶数)。
五、总结与实践建议
通过本文的实例,我们掌握了以下核心能力:
- 循环结构(
for
/while
)的灵活应用 - 条件判断(
if-else
、%
取模、位运算)的逻辑实现 - 用户输入与动态区间的处理技巧
下一步学习方向:
- 尝试将程序改写为函数指针形式,实现更灵活的输出逻辑
- 添加多线程支持,同时输出奇数和偶数
- 将代码封装为可复用的库函数
掌握这些基础后,开发者可以轻松应对如“统计区间内奇数和”“筛选质数”等进阶问题。编程的本质是逻辑的拆解与重构,本文的案例正是这一过程的最佳实践。
关键词自然嵌入点:
- 在标题和小标题中直接使用关键词
- 在代码示例的注释中提及“循环输出区间范围内的奇偶数”
- 在结论部分强调该主题的实践价值