C 练习实例49(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在编程学习的旅程中,实践是提升技能的核心环节。本文将围绕「C 练习实例49」这一经典案例展开深度解析,帮助编程初学者和中级开发者理解其背后的算法逻辑与代码实现技巧。该实例通常涉及数组操作、循环控制以及数据统计等核心知识点,是巩固基础、培养问题解决能力的绝佳练习。通过本文的讲解,读者不仅能掌握具体代码的编写方法,还能深入理解编程思维的构建过程。
问题描述与需求分析
「C 练习实例49」的核心任务通常是:输入一串数字,统计每个数字出现的次数,并按数字从小到大输出结果。例如,输入数字序列 3 5 3 2 5 3
,则输出应为:
2: 1次
3: 3次
5: 2次
需求分解
- 输入处理:如何高效读取用户输入的数字序列?
- 数据统计:如何记录每个数字的出现次数?
- 排序输出:如何将统计结果按数字大小排序后展示?
这些问题的解决需要综合运用C语言的基础语法和算法设计能力。
核心知识点解析
1. 数组与循环控制
数组是C语言中存储和操作数据的核心结构。在本实例中,可以使用数组来记录每个数字的出现次数。例如,定义一个长度为10的数组 count[10]
,其中索引0到9分别对应数字0到9的计数器。
循环控制(如for
或while
循环)则用于遍历输入的数字序列,并更新对应的计数器。
比喻:
将数组想象成一个仓库,每个仓库的位置(索引)对应一种商品(数字),而库存数量(数组元素值)记录该商品的数量。循环则像仓库管理员,逐个检查新到的商品,并更新库存记录。
2. 数据排序与输出
统计完成后,需要将数字按大小排序。一种简单的方法是遍历数组,记录所有非零的数字,并使用排序算法(如冒泡排序或快速排序)对它们进行排序。
排序算法选择:
- 冒泡排序:适合小规模数据,逻辑直观,适合初学者理解。
- 快速排序:效率更高,但实现复杂度较高。
3. 输入的灵活处理
用户输入的数字序列可能以空格分隔,也可能以回车结束。需要设计代码灵活处理输入的结束条件。例如,可以使用scanf
的返回值判断输入是否结束,或通过getchar
逐字符读取。
代码实现与分步讲解
以下是一个基于数组和冒泡排序的完整代码示例:
#include <stdio.h>
#include <stdlib.h>
#define MAX_DIGIT 9
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main() {
int count[10] = {0}; // 初始化计数数组
int num, i = 0;
int digits[100]; // 存储所有输入的数字
printf("请输入数字序列(以非数字字符结束,如回车):\n");
// 读取输入并统计
while (scanf("%d", &num) == 1) {
digits[i++] = num; // 存储原始数字序列(用于后续统计)
if (num >= 0 && num <= 9) {
count[num]++; // 更新对应数字的计数器
}
}
// 提取需要输出的数字并排序
int uniqueCount = 0;
int uniqueDigits[10]; // 最多存储0-9的10个数字
for (int j = 0; j < 10; j++) {
if (count[j] > 0) {
uniqueDigits[uniqueCount++] = j;
}
}
// 对数字进行排序
bubbleSort(uniqueDigits, uniqueCount);
// 输出结果
printf("\n统计结果:\n");
for (int k = 0; k < uniqueCount; k++) {
printf("%d: %d次\n", uniqueDigits[k], count[uniqueDigits[k]]);
}
return 0;
}
代码分步解析
1. 输入处理
- 使用
scanf
循环读取输入,直到输入非数字字符(如回车)。 - 将每个合法数字(0-9)存储到
digits
数组中,并更新count
数组的对应计数器。
2. 提取唯一数字并排序
- 遍历
count
数组,将出现次数大于0的数字存入uniqueDigits
数组。 - 使用冒泡排序对
uniqueDigits
进行升序排列。
3. 输出结果
- 按排序后的数字顺序,输出每个数字及其出现次数。
优化与扩展
1. 性能优化
上述代码假设输入数字范围为0-9,若需处理更大的数字(如两位数或负数),可考虑以下改进:
- 哈希表(Hash Table):用键值对存储数字及其计数器,适合动态范围。例如:
// 伪代码示例 struct Entry { int number; int count; }; struct Entry hashTable[100];
- 动态内存分配:使用
malloc
根据实际需要分配内存,避免固定数组的局限性。
2. 输入验证与异常处理
- 在读取数字时,添加对非法输入的判断,例如:
if (num < 0 || num > 9) { printf("输入无效,仅接受0-9的数字!\n"); continue; }
3. 排序算法的选择
若输入规模较大(如十万级数据),冒泡排序的效率可能不足。此时可改用快速排序:
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
实际案例与调试技巧
案例1:输入 3 5 3 2 5 3
count
数组最终值为:count[2]=1
,count[3]=3
,count[5]=2
。- 排序后的
uniqueDigits
数组为[2, 3, 5]
,输出结果符合预期。
案例2:输入 0 0 0
- 输出应为:
0: 3次
。
调试技巧
- 打印中间结果:在关键步骤添加
printf
语句,例如:printf("当前数字:%d,count[%d] = %d\n", num, num, count[num]);
- 单元测试:针对不同输入场景(如空输入、全相同数字、最大数字)编写测试用例。
总结与延伸思考
通过「C 练习实例49」的分析,读者不仅掌握了数组、循环、排序等基础语法的综合应用,还学会了如何将实际问题分解为可执行的代码逻辑。这一过程体现了编程的核心思想:将复杂问题拆解为简单步骤,并通过代码实现每个步骤。
后续学习方向
- 数据结构进阶:探索哈希表、链表等结构在统计场景中的应用。
- 算法优化:研究更高效的排序算法(如归并排序、堆排序)。
- 实际应用:将统计逻辑扩展到文件读写、实时数据处理等领域。
编程学习如同建造一座高楼,每个实例都是夯实基础的一块砖石。希望本文能成为读者攀登技术高峰的阶梯之一!