C试题
第1题:m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。
ChatGPT回答如下:
主要考察了以下几个知识点:
- 数组的定义和使用;
- 函数的定义和使用;
- 循环的使用;
- 条件语句的使用;
- 算术运算符和比较运算符的使用。
该程序的解题思路:
- 首先,定义一个函数,该函数接受一个整数类型的数组作为参数;
- 然后,计算该数组中所有元素的平均值;
- 接下来,使用循环遍历整个数组,统计低于平均分的人数,并将低于平均分的分数存放在一个新的数组中;
- 最后,返回低于平均分的人数以及低于平均分的分数所构成的数组。
这个程序的关键在于对数组的遍历和条件判断的使用。需要注意的是,当输入的数组为空或所有成绩都等于平均分时,特殊处理是必要的。
解法一:
#include <stdio.h>
int fun(int score[], int n, int below[], int *m)
{
int sum = 0;
int avg;
int count = 0;
for (int i = 0; i < n; i++) {
sum += score[i];
}
avg = sum / n;
for (int i = 0; i < n; i++) {
if (score[i] < avg) {
below[count++] = score[i];
}
}
*m = count;
return count;
}
int main()
{
int score[] = {
80, 90, 70, 60, 85, 77};
int below[6];
int m;
int count = fun(score, 6, below, &m);
printf("Below average score count: %d\n", count);
printf("Below average scores: ");
for (int i = 0; i < m; i++) {
printf("%d ", below[i]);
}
printf("\n");
return 0;
}
函数 fun
接收四个参数:score
数组存放了 n
个人的成绩,below
数组用于存放低于平均分的分数,m
存放低于平均分的人数,函数的返回值也是低于平均分的人数。
函数的实现过程分为两个步骤:
- 遍历
score
数组,求出所有成绩的总和,计算平均分avg
。 - 再次遍历
score
数组,将低于平均分的分数存放到below
数组中,并记录低于平均分的人数count
。 - 将
count
赋值给m
,并返回count
。
在 main
函数中,我们定义了一个 score
数组,调用 fun
函数进行计算,并输出低于平均分的人数和分数。
注意:这个解法假设了输入的 score
数组中至少有一个成绩。如果 score
数组为空,或者所有成绩都等于平均分,那么返回的人数和分数都应该是 0。
在编写这个程序时,有几个注意事项需要注意:
-
确保输入的数组不为空,因为如果数组为空,计算平均分将会出错。
-
要考虑所有成绩都等于平均分的情况,因为这种情况下,没有低于平均分的分数。
-
确保输出的数组长度不超过原始数组长度,因为低于平均分的学生数量可能为零。
-
考虑输入数组中的分数可能不是整数,因此需要使用浮点数来计算平均分。
-
确保代码中的变量名称和函数名称具有描述性,以便更好地理解代码。
这些注意事项可以帮助您编写更健壮和可靠的代码。
解法二:使用动态内存
#include <stdio.h>
#include <stdlib.h>
void below_average(int arr[], int n, int *below_avg, int *num_below_avg) {
if (n == 0) {
*below_avg = NULL;
*num_below_avg = 0;
return;
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
double avg = (double)sum / n; // 计算平均分
int count = 0;
for (int i = 0; i < n; i++) {
if (arr[i] < avg) {
below_avg[count++] = arr[i]; // 存储低于平均分的分数
}
}
*num_below_avg = count; // 统计低于平均分的人数
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
int *scores = (int*)malloc(n * sizeof(int));
printf("请输入每个学生的分数:");
for (int i = 0; i < n; i++) {
scanf("%d", &scores[i]);
}
int *below_avg = (int*)malloc(n * sizeof(int)); // 低于平均分的分数
int num_below_avg; // 低于平均分的人数
below_average(scores, n, below_avg, &num_below_avg);
printf("低于平均分的分数如下:");
for (int i = 0; i < num_below_avg; i++) {
printf("%d ", below_avg[i]);
}
printf("\n低于平均分的人数为:%d\n", num_below_avg);
free(scores);
free(below_avg);
return 0;
}
这个 C 语言程序使用了动态内存分配。它首先从用户输入中获取学生分数并存储在数组中,然后调用 below_average
函数来计算低于平均分的分数和人数。该函数使用两个指针来接收低于平均分的分数和人数,以避免在函数内部分配内存。如果输入的数组为空,函数将返回一个空指针和0。否则,它计算数组中所有分数的平均值,并遍历整个数组以获取低于平均分的分数。最后,它统计低于平均分的人数并将其存储在指针变量中。最后,程序输出低于平均分的分数和人数,并释放动态分配的内存。
解法三:使用了指针来操作数组:
#include <stdio.h>
#include <stdlib.h>
void below_average(int *grades, int size, int *below, int *count) {
int sum = 0, avg, i;
for (i = 0; i < size; i++) {
sum += grades[i];
}
avg = sum / size;
*count = 0;
for (i = 0; i < size; i++) {
if (grades[i] < avg) {
below[(*count)++] = grades[i];
}
}
}
int main() {
int grades[] = {
80, 90, 70, 60, 85 };
int size = sizeof(grades) / sizeof(grades[0]);
int *below = malloc(size * sizeof(int));
int count;
below_average(grades, size, below, &count);
printf("There are %d grades below the average:\n", count);
for (int i = 0; i < count; i++) {
printf("%d\n", below[i]);
}
free(below);
return 0;
}
这个解法与使用 Python 的解法类似,都是先计算平均分,然后遍历数组,将低于平均分的分数存放在另一个数组中。不同的是,这个解法使用了指针和动态内存分配来操作数组,这样可以避免预先确定数组大小的问题。