Вычисление медианы набора данных в C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь вычислять медиану набора данных на языке программирования C. Практикум охватывает следующие этапы: чтение и сортировка массива чисел, нахождение среднего элемента или среднего арифметического двух средних элементов, и вывод медианы. Пошаговые инструкции проведут вас через процесс реализации этих задач с использованием языка программирования C, включая функции для чтения, сортировки и вывода массива. Этот практикум предоставляет практический подход к пониманию и применению методов статистического анализа на языке C.

Чтение и сортировка массива

В этом шаге вы узнаете, как читать массив чисел и сортировать его в подготовке к вычислению медианы. Мы будем использовать язык программирования C для выполнения этой задачи.

Сначала создадим файл на C для реализации чтения и сортировки массива:

cd ~/project
nano median_calculator.c

Теперь добавьте следующий код в файл:

#include <stdio.h>

#define MAX_SIZE 100

// Функция для чтения элементов массива
void readArray(int arr[], int *n) {
    printf("Введите количество элементов (макс. %d): ", MAX_SIZE);
    scanf("%d", n);

    printf("Введите %d элементов:\n", *n);
    for (int i = 0; i < *n; i++) {
        scanf("%d", &arr[i]);
    }
}

// Функция для сортировки массива с помощью алгоритма пузырьковой сортировки
void sortArray(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;
            }
        }
    }
}

// Функция для вывода массива
void printArray(int arr[], int n) {
    printf("Отсортированный массив: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    return 0;
}

Компилируем и запускаем программу:

gcc median_calculator.c -o median_calculator
./median_calculator

Пример вывода:

Введите количество элементов (макс. 100): 5
Введите 5 элементов:
42
15
7
23
11
Отсортированный массив: 7 11 15 23 42

Давайте разберем код:

  1. Функция readArray() позволяет пользователю ввести элементы массива.
  2. Функция sortArray() использует алгоритм пузырьковой сортировки для упорядочения элементов в порядке возрастания.
  3. Функция printArray() отображает отсортированный массив.
  4. Функция main() связывает эти функции вместе.

Алгоритм пузырьковой сортировки имеет сложность O(n²), что просто в понимании, но не является наиболее эффективным для больших наборов данных.

Нахождение среднего элемента или среднего арифметического двух средних

В этом шаге вы расширите предыдущую программу для вычисления медианы, найдя средний элемент или среднее арифметическое двух средних элементов в отсортированном массиве.

Откройте существующий файл и измените код:

cd ~/project
nano median_calculator.c

Обновите код новой функцией для вычисления медианы:

#include <stdio.h>

#define MAX_SIZE 100

// Предыдущие функции (readArray, sortArray, printArray) остаются без изменений

// Новая функция для вычисления медианы
float calculateMedian(int arr[], int n) {
    // Если количество элементов нечетное, вернуть средний элемент
    if (n % 2 != 0) {
        return arr[n / 2];
    }

    // Если количество элементов четное, вернуть среднее арифметическое двух средних элементов
    int mid1 = arr[(n / 2) - 1];
    int mid2 = arr[n / 2];
    return (mid1 + mid2) / 2.0;
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    // Вычислить и вывести медиану
    float median = calculateMedian(arr, n);
    printf("Медиана: %.2f\n", median);

    return 0;
}

Компилируем и запускаем обновленную программу:

gcc median_calculator.c -o median_calculator
./median_calculator

Пример вывода для нечетного количества элементов:

Введите количество элементов (макс. 100): 5
Введите 5 элементов:
42
15
7
23
11
Отсортированный массив: 7 11 15 23 42
Медиана: 15.00

Пример вывода для четного количества элементов:

Введите количество элементов (макс. 100): 6
Введите 6 элементов:
42
15
7
23
11
8
Отсортированный массив: 7 8 11 15 23 42
Медиана: 13.00

Ключевые моменты вычисления медианы:

  1. Для нечетного количества элементов медиана — это средний элемент.
  2. Для четного количества элементов медиана — это среднее арифметическое двух средних элементов.
  3. Массив должен быть отсортирован перед вычислением медианы.

Функция calculateMedian() обрабатывает оба случая:

  • Использует целочисленное деление для нахождения индекса среднего элемента.
  • Проверяет, является ли количество элементов нечетным или четным.
  • Возвращает соответствующее значение медианы.

Вывод Медианы

В этом заключительном шаге вы улучшите программу вычисления медианы, чтобы предоставить более подробный вывод и продемонстрировать различные способы представления медианы.

Откройте существующий файл для внесения окончательных изменений:

cd ~/project
nano median_calculator.c

Обновите код, улучшив форматирование вывода:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

// Предыдущие функции (readArray, sortArray, printArray, calculateMedian) остаются без изменений

void printDetailedMedianInfo(int arr[], int n, float median) {
    printf("\n--- Подробности вычисления медианы ---\n");
    printf("Общее количество элементов: %d\n", n);
    printf("Элементы массива: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n\nВычисление медианы:\n");

    if (n % 2 != 0) {
        printf("Нечетное количество элементов\n");
        printf("Индекс среднего элемента: %d\n", n / 2);
        printf("Средний элемент: %d\n", arr[n / 2]);
    } else {
        printf("Четное количество элементов\n");
        printf("Два индекса средних элементов: %d и %d\n", (n / 2) - 1, n / 2);
        printf("Средние элементы: %d и %d\n", arr[(n / 2) - 1], arr[n / 2]);
    }

    printf("\nОкончательная медиана: %.2f\n", median);
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);

    float median = calculateMedian(arr, n);

    // Вывод отсортированного массива
    printArray(arr, n);

    // Вывод подробной информации о медиане
    printDetailedMedianInfo(arr, n, median);

    return 0;
}

Компилируем и запускаем обновленную программу:

gcc median_calculator.c -o median_calculator
./median_calculator

Пример вывода для нечетного количества элементов:

Введите количество элементов (макс. 100): 5
Введите 5 элементов:
42
15
7
23
11
Отсортированный массив: 7 11 15 23 42

--- Подробности вычисления медианы ---
Общее количество элементов: 5
Элементы массива: 7 11 15 23 42

Вычисление медианы:
Нечетное количество элементов
Индекс среднего элемента: 2
Средний элемент: 15

Окончательная медиана: 15.00

Пример вывода для четного количества элементов:

Введите количество элементов (макс. 100): 6
Введите 6 элементов:
42
15
7
23
11
8
Отсортированный массив: 7 8 11 15 23 42

--- Подробности вычисления медианы ---
Общее количество элементов: 6
Элементы массива: 7 8 11 15 23 42

Вычисление медианы:
Четное количество элементов
Два индекса средних элементов: 2 и 3
Средние элементы: 11 и 15

Окончательная медиана: 13.00

Основные улучшения в этом шаге:

  1. Добавлена новая функция printDetailedMedianInfo().
  2. Предоставлена исчерпывающая информация о вычислении медианы.
  3. Показаны различные сценарии для нечетного и четного количества элементов.
  4. Улучшено понимание пользователем вычисления медианы.

Резюме

В этом лабораторном практикуме вы изучили, как читать массив чисел, сортировать их с помощью алгоритма сортировки пузырьком и подготовить данные для вычисления медианы. Отсортированный массив затем выводится на консоль, демонстрируя успешное выполнение первого этапа. Алгоритм сортировки пузырьком, хотя и прост для понимания, имеет временную сложность O(n²), что может быть не самым эффективным для больших наборов данных. Следующие шаги будут сосредоточены на нахождении медианы отсортированного массива.

Следующий этап включает в себя определение среднего элемента или среднего арифметического двух средних элементов, в зависимости от размера массива. Этот шаг обеспечит точное вычисление и представление медианы пользователю.