Calcular o Intervalo Interquartil (IQR) em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a calcular o Intervalo Interquartil (IQR) em programação C. O laboratório cobre as etapas para ler e ordenar um array de números, encontrar as posições dos primeiros e terceiros quartis (Q1 e Q3), e então calcular o IQR como a diferença entre Q3 e Q1. Ao final deste laboratório, você terá uma compreensão sólida de como realizar esta análise estatística usando C.

Ler e Ordenar o Array

Nesta etapa, você aprenderá como ler um array de números e ordená-lo em preparação para calcular o Intervalo Interquartil (IQR). Usaremos programação C para realizar esta tarefa.

Primeiro, vamos criar um arquivo de origem C para nosso cálculo de IQR:

cd ~/project
nano iqr_calculation.c

Agora, vamos escrever o código inicial para ler e ordenar um array:

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

#define MAX_SIZE 100

// Função para comparar inteiros para qsort
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

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

    // Ler o número de elementos
    printf("Digite o número de elementos (máximo %d): ", MAX_SIZE);
    scanf("%d", &n);

    // Entrada dos elementos do array
    printf("Digite %d inteiros:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // Ordenar o array
    qsort(numbers, n, sizeof(int), compare);

    // Imprimir o array ordenado
    printf("Array ordenado: ");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

Compile o programa:

gcc -o iqr_calculation iqr_calculation.c

Execute o programa e forneça um exemplo de entrada:

./iqr_calculation

Exemplo de saída:

Digite o número de elementos (máximo 100): 6
Digite 6 inteiros:
45 22 14 65 97 72
Array ordenado: 14 22 45 65 72 97

Vamos decompor o código:

  • Definimos um tamanho máximo de array de 100 elementos
  • A função compare() é usada pela qsort() para ordenar inteiros
  • Leitura do número de elementos da entrada do usuário
  • qsort() é usado para ordenar o array em ordem crescente
  • O array ordenado é então impresso

Encontrar as Posições Q1 e Q3 e Calcular IQR = Q3 - Q1

Nesta etapa, modificaremos o programa anterior para calcular o Intervalo Interquartil (IQR) encontrando as posições Q1 e Q3.

Abra o arquivo de origem anterior:

cd ~/project
nano iqr_calculation.c

Atualize o código para calcular o IQR:

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

#define MAX_SIZE 100

// Função para comparar inteiros para qsort
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

// Função para calcular Q1 e Q3
double calculateQuartile(int *arr, int n, double position) {
    int index = floor(position);
    double fraction = position - index;

    if (fraction == 0) {
        return arr[index - 1];
    } else {
        return arr[index - 1] * (1 - fraction) + arr[index] * fraction;
    }
}

int main() {
    int numbers[MAX_SIZE];
    int n, i;
    double q1, q3, iqr;

    // Ler o número de elementos
    printf("Digite o número de elementos (máximo %d): ", MAX_SIZE);
    scanf("%d", &n);

    // Entrada dos elementos do array
    printf("Digite %d inteiros:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // Ordenar o array
    qsort(numbers, n, sizeof(int), compare);

    // Calcular as posições Q1 e Q3
    double q1_pos = 0.25 * (n + 1);
    double q3_pos = 0.75 * (n + 1);

    // Calcular Q1 e Q3
    q1 = calculateQuartile(numbers, n, q1_pos);
    q3 = calculateQuartile(numbers, n, q3_pos);

    // Calcular IQR
    iqr = q3 - q1;

    // Imprimir resultados
    printf("Array ordenado: ");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    printf("Q1: %.2f\n", q1);
    printf("Q3: %.2f\n", q3);
    printf("IQR: %.2f\n", iqr);

    return 0;
}

Compile o programa atualizado:

gcc -o iqr_calculation iqr_calculation.c -lm

Execute o programa e forneça um exemplo de entrada:

./iqr_calculation

Exemplo de saída:

Digite o número de elementos (máximo 100): 7
Digite 7 inteiros:
12 15 18 22 25 30 35
Array ordenado: 12 15 18 22 25 30 35
Q1: 15.00
Q3: 30.00
IQR: 15.00

Pontos-chave no código:

  • calculateQuartile() lida com arrays de tamanho par e ímpar
  • Q1 é calculado no percentil 25
  • Q3 é calculado no percentil 75
  • IQR é calculado como Q3 - Q1
  • Usamos interpolação linear para posições não inteiras

Imprimir o IQR

Nesta etapa final, focaremos na formatação e apresentação dos resultados do Intervalo Interquartil (IQR) de forma clara e informativa.

Abra o arquivo de origem anterior:

cd ~/project
nano iqr_calculation.c

Atualize o código para aprimorar a saída do IQR e adicionar texto descritivo:

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

#define MAX_SIZE 100

// As funções anteriores permanecem as mesmas (compare e calculateQuartile)

int main() {
    int numbers[MAX_SIZE];
    int n, i;
    double q1, q3, iqr;

    // Limpar a tela para uma melhor apresentação
    printf("\033[2J\033[1;1H");

    // Introdução ao IQR
    printf("Calculadora de Intervalo Interquartil (IQR)\n");
    printf("===========================================\n\n");

    // Ler o número de elementos
    printf("Digite o número de elementos (máximo %d): ", MAX_SIZE);
    scanf("%d", &n);

    // Entrada dos elementos do array
    printf("Digite %d inteiros:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // Ordenar o array
    qsort(numbers, n, sizeof(int), compare);

    // Calcular as posições Q1 e Q3
    double q1_pos = 0.25 * (n + 1);
    double q3_pos = 0.75 * (n + 1);

    // Calcular Q1 e Q3
    q1 = calculateQuartile(numbers, n, q1_pos);
    q3 = calculateQuartile(numbers, n, q3_pos);

    // Calcular IQR
    iqr = q3 - q1;

    // Saída detalhada
    printf("\nResultados da Análise de Dados\n");
    printf("-----------------------------\n");
    printf("Conjunto de Dados Original: ");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n\n");

    // Saída formatada do IQR
    printf("Análise de Quartis:\n");
    printf("1º Quartil (Q1): %.2f\n", q1);
    printf("3º Quartil (Q3): %.2f\n", q3);
    printf("Intervalo Interquartil (IQR): %.2f\n", iqr);

    // Interpretação do IQR
    printf("\nInterpretação:\n");
    printf("O IQR representa a dispersão dos 50%% médios dos dados.\n");
    printf("Um IQR menor indica dados mais consistentes,\n");
    printf("enquanto um IQR maior sugere mais variabilidade.\n");

    return 0;
}

Compile o programa atualizado:

gcc -o iqr_calculation iqr_calculation.c -lm

Execute o programa e forneça um exemplo de entrada:

./iqr_calculation

Exemplo de saída:

Calculadora de Intervalo Interquartil (IQR)
===========================================

Digite o número de elementos (máximo 100): 7
Digite 7 inteiros:
12 15 18 22 25 30 35

Resultados da Análise de Dados
-----------------------------
Conjunto de Dados Original: 12 15 18 22 25 30 35

Análise de Quartis:
1º Quartil (Q1): 15.00
3º Quartil (Q3): 30.00
Intervalo Interquartil (IQR): 15.00

Interpretação:
O IQR representa a dispersão dos 50% médios dos dados.
Um IQR menor indica dados mais consistentes,
enquanto um IQR maior sugere mais variabilidade.

Melhorias-chave:

  • Comando para limpar a tela adicionado para melhor apresentação
  • Formatação de saída aprimorada
  • Incluída uma interpretação do IQR
  • Lógica de cálculo anterior mantida

Resumo

Neste laboratório, você aprendeu inicialmente como ler e ordenar um array de números em programação C. Criou um arquivo de origem C, escreveu o código inicial para ler os elementos do array e ordená-los usando a função qsort(). Em seguida, imprimiu o array ordenado para verificar o processo de ordenação.

Em seguida, você modificará o programa anterior para calcular o Intervalo Interquartil (IQR) encontrando as posições do primeiro quartil (Q1) e do terceiro quartil (Q3), e, em seguida, calculando o IQR como Q3 - Q1. Finalmente, você imprimirá o IQR calculado.