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 语言编程中,循环结构与条件判断是实现复杂逻辑的基础工具。本文以“循环输出区间范围内的奇数/偶数”这一经典实例为切入点,系统讲解如何通过 forwhile 等循环结构结合条件语句(如 % 取模运算符),实现对指定范围数字的筛选与输出。无论是编程新手还是有一定基础的开发者,都能通过本文掌握从简单案例到复杂场景的解决方案,并理解程序设计中的核心思维模式。


一、基础概念解析

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 

代码解析

  1. for 循环遍历 1 到 10 的所有整数
  2. if 条件判断当前数是否为奇数(余数为 1)
  3. 满足条件则打印该数

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 

关键点解析

  1. 函数封装:将输出逻辑封装到 print_numbers 函数中,提高代码复用性
  2. 输入处理
    • scanf(" %c", &choice) 中的空格用于忽略前一个 scanf 的换行符
    • 参数 type 通过字符 'e'/'o' 控制输出类型
  3. 条件分支:通过 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% 取模、位运算)的逻辑实现
  • 用户输入与动态区间的处理技巧

下一步学习方向

  1. 尝试将程序改写为函数指针形式,实现更灵活的输出逻辑
  2. 添加多线程支持,同时输出奇数和偶数
  3. 将代码封装为可复用的库函数

掌握这些基础后,开发者可以轻松应对如“统计区间内奇数和”“筛选质数”等进阶问题。编程的本质是逻辑的拆解与重构,本文的案例正是这一过程的最佳实践。


关键词自然嵌入点

  • 在标题和小标题中直接使用关键词
  • 在代码示例的注释中提及“循环输出区间范围内的奇偶数”
  • 在结论部分强调该主题的实践价值

最新发布