用 C 语言确定数据集的众数

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何用 C 语言确定数据集的众数。本实验涵盖以下步骤:

读取数字数组:你将学习如何在 C 语言中读取数字数组,这是确定数据集众数的关键第一步。该程序允许输入一组数字,并为频率分析做好准备。

计算频率以找到最常见的值:你将修改之前的程序,计算数组中每个数字的频率,并确定最常见的值(众数)。

打印众数:最后,你将打印出众数,即数据集中出现频率最高的值。

读取数字数组

在这一步中,你将学习如何在 C 语言中读取数字数组,这是确定数据集众数的关键第一步。我们将创建一个 C 程序,该程序允许输入一组数字,并为频率分析做好准备。

首先,让我们为众数计算程序创建一个新的 C 文件:

cd ~/project
nano mode_calculation.c

现在,将以下代码添加到该文件中:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int n, i;

    // 输入元素数量
    printf("输入元素数量 (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 输入数组元素
    printf("输入 %d 个整数:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 打印输入的数组以验证输入
    printf("输入的数组:");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

编译并运行该程序:

gcc mode_calculation.c -o mode_calculation
./mode_calculation

示例输出:

输入元素数量(最大 100): 5
输入 5 个整数:
3 4 2 4 1
输入的数组: 3 4 2 4 1

让我们来分析一下这段代码的关键部分:

  1. #define MAX_SIZE 100 设置了数组的最大限制,以防止溢出。
  2. scanf() 用于输入元素数量和数组值。
  3. 我们打印数组以验证输入是否被正确捕获。

这段代码展示了 C 语言中的基本数组输入,这对于我们的众数计算过程至关重要。在接下来的步骤中,我们将在此基础上进行频率计数并确定众数。

计算频率以找到最常见的值

在这一步中,我们将修改之前的程序,计算数组中每个数字的频率,并确定最常见的值(众数)。

打开现有文件并更新代码:

cd ~/project
nano mode_calculation.c

用以下实现替换之前的代码:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int frequencies[MAX_SIZE] = {0};
    int n, i, j, mode = 0, max_frequency = 0;

    // 输入元素数量
    printf("输入元素数量 (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 输入数组元素
    printf("输入 %d 个整数:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 计算每个数字的频率
    for (i = 0; i < n; i++) {
        int count = 1;
        for (j = 0; j < n; j++) {
            if (i!= j && numbers[i] == numbers[j]) {
                count++;
            }
        }
        frequencies[i] = count;

        // 跟踪众数
        if (count > max_frequency) {
            max_frequency = count;
            mode = numbers[i];
        }
    }

    // 打印频率
    printf("\n频率:\n");
    for (i = 0; i < n; i++) {
        printf("数字 %d 出现 %d 次\n", numbers[i], frequencies[i]);
    }

    // 打印众数
    printf("\n众数:%d (出现 %d 次)\n", mode, max_frequency);

    return 0;
}

编译并运行程序:

gcc mode_calculation.c -o mode_calculation
./mode_calculation

示例输出:

输入元素数量(最大 100): 6
输入 6 个整数:
2 3 4 2 2 5

频率:
2 出现 3 次
3 出现 1 次
4 出现 1 次
2 出现 3 次
2 出现 3 次
5 出现 1 次

众数: 2 (出现 3 次)

此实现中的关键点:

  1. 我们创建一个 frequencies 数组来存储每个数字的计数。
  2. 嵌套循环计算每个唯一数字的出现次数。
  3. 我们通过跟踪最大频率来跟踪众数。
  4. 该程序处理只有一个众数的情况。

打印众数

在这最后一步中,我们将增强众数计算程序,以处理多个众数,并提供更全面的统计信息输出。

打开现有文件并更新代码:

cd ~/project
nano mode_calculation.c

用以下实现替换之前的代码:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int frequencies[MAX_SIZE] = {0};
    int unique_numbers[MAX_SIZE];
    int n, i, j, unique_count = 0, max_frequency = 0;

    // 输入元素数量
    printf("输入元素数量 (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 输入数组元素
    printf("输入 %d 个整数:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 找出唯一数字及其频率
    for (i = 0; i < n; i++) {
        int is_unique = 1;
        for (j = 0; j < unique_count; j++) {
            if (numbers[i] == unique_numbers[j]) {
                is_unique = 0;
                break;
            }
        }

        if (is_unique) {
            unique_numbers[unique_count] = numbers[i];

            // 计算此唯一数字的频率
            int count = 0;
            for (j = 0; j < n; j++) {
                if (numbers[i] == numbers[j]) {
                    count++;
                }
            }
            frequencies[unique_count] = count;

            // 更新最大频率
            if (count > max_frequency) {
                max_frequency = count;
            }

            unique_count++;
        }
    }

    // 打印详细的众数信息
    printf("\n统计分析:\n");
    printf("数字总数:%d\n", n);
    printf("唯一数字数量:%d\n", unique_count);

    printf("\n频率分布:\n");
    for (i = 0; i < unique_count; i++) {
        printf("数字 %d: %d 次\n",
               unique_numbers[i], frequencies[i]);
    }

    // 打印众数
    printf("\n众数:\n");
    for (i = 0; i < unique_count; i++) {
        if (frequencies[i] == max_frequency) {
            printf("- %d (出现 %d 次)\n",
                   unique_numbers[i], frequencies[i]);
        }
    }

    return 0;
}

编译并运行程序:

gcc mode_calculation.c -o mode_calculation
./mode_calculation

示例输出:

输入元素数量(最大 100): 7
输入 7 个整数:
2 3 4 2 2 5 5

统计分析:
数字总数: 7
唯一数字数量: 4

频率分布:
数字 2: 3 次
数字 3: 1 次
数字 4: 1 次
数字 5: 2 次

众数:
- 2 (出现 3 次)

此版本的主要改进:

  1. 如果存在多个众数则进行处理
  2. 提供全面的统计概述
  3. 识别数据集中的唯一数字
  4. 显示频率分布

总结

在本实验中,你将学习如何在 C 语言中读取数字数组,并计算每个数字的频率以确定众数,众数是数据集中最常见的值。首先,你将创建一个 C 程序,该程序允许输入一组数字,并为频率分析做好准备。然后,你将修改该程序以计算每个数字的频率并确定众数。最后,你将把众数打印到控制台。

完成这些步骤后的关键学习要点如下:

  1. 如何使用 scanf() 函数在 C 语言中读取数字数组。
  2. 如何打印输入的数组以验证输入。
  3. 如何计算数组中每个数字的频率以找到最常见的值(众数)。