Calcular a Mediana de um Conjunto de Dados em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a calcular a mediana de um conjunto de dados em programação C. O laboratório cobre os seguintes passos: leitura e ordenação de um array de números, localização do elemento do meio ou da média dos dois elementos do meio, e impressão da mediana. As instruções passo a passo guiam você através do processo de implementação dessas tarefas usando programação C, incluindo funções para leitura, ordenação e impressão do array. Este laboratório fornece uma abordagem prática para compreender e aplicar técnicas de análise estatística em C.

Ler e Ordenar o Array

Neste passo, você aprenderá a ler um array de números e ordená-lo em preparação para calcular a mediana. Usaremos programação C para realizar esta tarefa.

Primeiro, vamos criar um arquivo C para implementar a leitura e ordenação do array:

cd ~/project
nano median_calculator.c

Agora, adicione o seguinte código ao arquivo:

#include <stdio.h>

#define MAX_SIZE 100

// Função para ler os elementos do array
void readArray(int arr[], int *n) {
    printf("Digite o número de elementos (máximo %d): ", MAX_SIZE);
    scanf("%d", n);

    printf("Digite %d elementos:\n", *n);
    for (int i = 0; i < *n; i++) {
        scanf("%d", &arr[i]);
    }
}

// Função para ordenar o array usando o algoritmo de ordenação por bolhas
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]) {
                // Trocar elementos
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// Função para imprimir o array
void printArray(int arr[], int n) {
    printf("Array ordenado: ");
    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;
}

Compile e execute o programa:

gcc median_calculator.c -o median_calculator
./median_calculator

Exemplo de saída:

Digite o número de elementos (máximo 100): 5
Digite 5 elementos:
42
15
7
23
11
Array ordenado: 7 11 15 23 42

Vamos decompor o código:

  1. A função readArray() permite a entrada de dados do usuário para os elementos do array.
  2. A função sortArray() usa o algoritmo de ordenação por bolhas para organizar os elementos em ordem crescente.
  3. A função printArray() exibe o array ordenado.
  4. A função main() conecta essas funções.

O algoritmo de ordenação por bolhas tem uma complexidade de tempo de O(n²), que é simples de entender, mas não é o mais eficiente para conjuntos de dados grandes.

Encontrar o Elemento do Meio ou a Média dos Dois Meios

Neste passo, você estenderá o programa anterior para calcular a mediana encontrando o elemento do meio ou a média dos dois elementos do meio em um array ordenado.

Abra o arquivo existente e modifique o código:

cd ~/project
nano median_calculator.c

Atualize o código com uma nova função para calcular a mediana:

#include <stdio.h>

#define MAX_SIZE 100

// Funções anteriores (readArray, sortArray, printArray) permanecem as mesmas

// Nova função para calcular a mediana
float calculateMedian(int arr[], int n) {
    // Se o número de elementos for ímpar, retorna o elemento do meio
    if (n % 2 != 0) {
        return arr[n / 2];
    }

    // Se o número de elementos for par, retorna a média dos dois elementos do meio
    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);

    // Calcular e imprimir a mediana
    float median = calculateMedian(arr, n);
    printf("Mediana: %.2f\n", median);

    return 0;
}

Compile e execute o programa atualizado:

gcc median_calculator.c -o median_calculator
./median_calculator

Exemplo de saída para um número ímpar de elementos:

Digite o número de elementos (máximo 100): 5
Digite 5 elementos:
42
15
7
23
11
Array ordenado: 7 11 15 23 42
Mediana: 15.00

Exemplo de saída para um número par de elementos:

Digite o número de elementos (máximo 100): 6
Digite 6 elementos:
42
15
7
23
11
8
Array ordenado: 7 8 11 15 23 42
Mediana: 13.00

Pontos-chave sobre o cálculo da mediana:

  1. Para um número ímpar de elementos, a mediana é o elemento do meio.
  2. Para um número par de elementos, a mediana é a média dos dois elementos do meio.
  3. O array deve estar ordenado antes de calcular a mediana.

A função calculateMedian() lida com ambos os casos:

  • Usa divisão inteira para encontrar o índice do meio.
  • Verifica se o número de elementos é ímpar ou par.
  • Retorna o valor apropriado da mediana.

Imprimir a Mediana

Neste passo final, você aprimorará o programa de cálculo da mediana para fornecer uma saída mais detalhada e demonstrar diferentes maneiras de apresentar a mediana.

Abra o arquivo existente para fazer as modificações finais:

cd ~/project
nano median_calculator.c

Atualize o código com formatação de saída aprimorada:

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

#define MAX_SIZE 100

// Funções anteriores (readArray, sortArray, printArray, calculateMedian) permanecem as mesmas

void printDetailedMedianInfo(int arr[], int n, float median) {
    printf("\n--- Detalhes do Cálculo da Mediana ---\n");
    printf("Número total de elementos: %d\n", n);
    printf("Elementos do array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n\nCálculo da Mediana:\n");

    if (n % 2 != 0) {
        printf("Número ímpar de elementos\n");
        printf("Índice do elemento do meio: %d\n", n / 2);
        printf("Elemento do meio: %d\n", arr[n / 2]);
    } else {
        printf("Número par de elementos\n");
        printf("Dois índices dos elementos do meio: %d e %d\n", (n / 2) - 1, n / 2);
        printf("Elementos do meio: %d e %d\n", arr[(n / 2) - 1], arr[n / 2]);
    }

    printf("\nMediana Final: %.2f\n", median);
}

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

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

    float median = calculateMedian(arr, n);

    // Imprimir o array ordenado
    printArray(arr, n);

    // Imprimir informações detalhadas sobre a mediana
    printDetailedMedianInfo(arr, n, median);

    return 0;
}

Compile e execute o programa atualizado:

gcc median_calculator.c -o median_calculator
./median_calculator

Exemplo de saída para um número ímpar de elementos:

Digite o número de elementos (máximo 100): 5
Digite 5 elementos:
42
15
7
23
11
Array ordenado: 7 11 15 23 42

--- Detalhes do Cálculo da Mediana ---
Número total de elementos: 5
Elementos do array: 7 11 15 23 42

Cálculo da Mediana:
Número ímpar de elementos
Índice do elemento do meio: 2
Elemento do meio: 15

Mediana Final: 15.00

Exemplo de saída para um número par de elementos:

Digite o número de elementos (máximo 100): 6
Digite 6 elementos:
42
15
7
23
11
8
Array ordenado: 7 8 11 15 23 42

--- Detalhes do Cálculo da Mediana ---
Número total de elementos: 6
Elementos do array: 7 8 11 15 23 42

Cálculo da Mediana:
Número par de elementos
Dois índices dos elementos do meio: 2 e 3
Elementos do meio: 11 e 15

Mediana Final: 13.00

Melhorias-chave neste passo:

  1. Adicionada uma nova função printDetailedMedianInfo().
  2. Fornece informações abrangentes sobre o cálculo da mediana.
  3. Mostra diferentes cenários para um número ímpar e par de elementos.
  4. Melhora a compreensão do usuário sobre o cálculo da mediana.

Resumo

Neste laboratório, você aprendeu a ler um array de números, ordená-los usando o algoritmo de ordenação por bolhas e preparar os dados para calcular a mediana. O array ordenado é então impresso no console, demonstrando o sucesso da conclusão do primeiro passo. O algoritmo de ordenação por bolhas, embora simples de entender, possui uma complexidade de tempo de O(n²), o que pode não ser o mais eficiente para conjuntos de dados grandes. Os passos subsequentes se concentrarão em encontrar a mediana do array ordenado.

O próximo passo envolve identificar o elemento do meio ou a média dos dois elementos do meio, dependendo do tamanho do array. Este passo garantirá que a mediana seja calculada e apresentada ao usuário com precisão.