C语言编程题库与实战:数组排序与平均值计算

3星 · 超过75%的资源 需积分: 41 9 下载量 35 浏览量 更新于2024-11-11 1 收藏 567KB TXT 举报
"C语言机试题库,包含填空题和编程题,用于企业内部培训,更新至2008年9月。" 本文将详细分析两个C语言编程题目,旨在帮助读者理解C语言的基本概念和操作技巧。 第一个题目涉及数组的排序。问题的核心是实现一个名为`fun`的函数,该函数接受一个整数数组`a`和数组大小`n`作为参数,其目的是找到数组中的最大值和次大值,并交换它们的位置。原始代码已完成了找到最大值和次大值的任务,但在实际交换元素时出现了错误。在注释中找到的两行交换代码: ```c t=a[0];a[0]=a[m1];a[m1]=t; t=a[1];a[1]=a[m2];a[m2]=t; ``` 这里,代码试图交换数组的第一个元素`a[0]`与最大值索引对应的元素`a[m1]`,以及数组的第二个元素`a[1]`与次大值索引对应的元素`a[m2]`。然而,这种方法假设数组始终至少有两个元素,这在n=1或n=2时可能会导致错误。正确的做法是在交换之前检查`n`的值,确保至少有三个元素存在,或者调整交换逻辑以适应不同情况。 第二个题目要求计算一组浮点数的平均值和中位数。函数`fun`接收一个浮点数数组`s`,数组长度`n`,以及一个指向平均值的指针`aver`。目标是计算数组的平均值并存储到`*aver`,同时返回中位数。注意,题目要求中位数应四舍五入到最接近的整数。原始代码缺少计算中位数的部分。计算平均值的循环是正确的,但需要添加额外的代码来确定中位数,例如,对数组进行排序,然后根据数组长度的奇偶性计算中位数。 以下是完成后的`fun`函数示例: ```c #include <stdlib.h> int fun(float *s, int n, float *aver) { float ave = 0.0, t = 0.0; int count = 0, k, i; for (k = 0; k < n; k++) t += s[k]; ave = t / n; *aver = ave; // 排序数组 for (i = 0; i < n - 1; i++) { for (k = 0; k < n - 1 - i; k++) { if (s[k] > s[k + 1]) { t = s[k]; s[k] = s[k + 1]; s[k + 1] = t; } } } // 计算中位数 float median; if (n % 2 == 0) median = (s[n / 2 - 1] + s[n / 2]) / 2; else median = s[n / 2]; return (int)round(median); } // main 函数示例 int main() { float arr[] = {80.5607, 290.5985, 1.5886, 4}; int n = sizeof(arr) / sizeof(arr[0]); float average; printf("原始数组: "); for (i = 0; i < n; i++) printf("%.2f ", arr[i]); printf("\n"); int median = fun(arr, n, &average); printf("平均值: %.2f\n中位数: %d\n", average, median); return 0; } ``` 通过这两个题目,我们可以复习到C语言中的数组操作、循环、条件判断、函数定义、指针使用以及数值计算等基础知识。此外,还涉及到了数组排序(冒泡排序)和寻找数组中位数的方法,这些都是C语言编程中常见的问题解决技巧。