第1题:m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。

请添加图片描述

C试题

第1题m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。

ChatGPT回答如下:

主要考察了以下几个知识点:

  1. 数组的定义和使用;
  2. 函数的定义和使用;
  3. 循环的使用;
  4. 条件语句的使用;
  5. 算术运算符和比较运算符的使用。

该程序的解题思路:

  1. 首先,定义一个函数,该函数接受一个整数类型的数组作为参数;
  2. 然后,计算该数组中所有元素的平均值;
  3. 接下来,使用循环遍历整个数组,统计低于平均分的人数,并将低于平均分的分数存放在一个新的数组中;
  4. 最后,返回低于平均分的人数以及低于平均分的分数所构成的数组。

这个程序的关键在于对数组的遍历和条件判断的使用。需要注意的是,当输入的数组为空或所有成绩都等于平均分时,特殊处理是必要的。

解法一:

#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 存放低于平均分的人数,函数的返回值也是低于平均分的人数。

函数的实现过程分为两个步骤:

  1. 遍历 score 数组,求出所有成绩的总和,计算平均分 avg
  2. 再次遍历 score 数组,将低于平均分的分数存放到 below 数组中,并记录低于平均分的人数 count
  3. count 赋值给 m,并返回 count

main 函数中,我们定义了一个 score 数组,调用 fun 函数进行计算,并输出低于平均分的人数和分数。

注意:这个解法假设了输入的 score 数组中至少有一个成绩。如果 score 数组为空,或者所有成绩都等于平均分,那么返回的人数和分数都应该是 0。

在编写这个程序时,有几个注意事项需要注意:

  1. 确保输入的数组不为空,因为如果数组为空,计算平均分将会出错。

  2. 要考虑所有成绩都等于平均分的情况,因为这种情况下,没有低于平均分的分数。

  3. 确保输出的数组长度不超过原始数组长度,因为低于平均分的学生数量可能为零。

  4. 考虑输入数组中的分数可能不是整数,因此需要使用浮点数来计算平均分。

  5. 确保代码中的变量名称和函数名称具有描述性,以便更好地理解代码。

这些注意事项可以帮助您编写更健壮和可靠的代码。

解法二:使用动态内存

#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 的解法类似,都是先计算平均分,然后遍历数组,将低于平均分的分数存放在另一个数组中。不同的是,这个解法使用了指针和动态内存分配来操作数组,这样可以避免预先确定数组大小的问题。

回答结果是否让你满意,欢迎指正。

猜你喜欢

转载自blog.csdn.net/zp1990412/article/details/130720810