Calcular o Valor Esperado de uma Distribuição Discreta em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderá a calcular o valor esperado de uma distribuição discreta na linguagem de programação C. O laboratório cobre os seguintes passos: leitura dos valores e probabilidades, cálculo do valor esperado somando o produto de cada valor e sua probabilidade correspondente, e impressão do resultado final. O programa permite aos utilizadores introduzir o número de resultados, os valores e as suas probabilidades respetivos, e, em seguida, apresenta os valores introduzidos para verificação. Este laboratório tem como objetivo proporcionar uma compreensão prática de probabilidade e combinatória usando C, uma habilidade valiosa em vários campos, como análise de dados, aprendizagem automática e tomada de decisões.

Ler Valores e Probabilidades

Neste passo, aprenderá a ler valores e probabilidades para calcular o valor esperado de uma distribuição discreta em C. Criaremos um programa que permite aos utilizadores introduzir múltiplos valores e as suas probabilidades correspondentes.

Primeiro, crie um novo ficheiro C no diretório ~/project:

cd ~/project
nano expected_value.c

Agora, escreva o código inicial para ler valores e probabilidades:

#include <stdio.h>

#define MAX_OUTCOMES 10

int main() {
    double values[MAX_OUTCOMES];
    double probabilities[MAX_OUTCOMES];
    int num_outcomes;

    printf("Introduza o número de resultados (máx. %d): ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Introduzir valores
    printf("Introduza os valores:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Introduzir probabilidades
    printf("Introduza as probabilidades:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilidade %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Imprimir a entrada para verificação
    printf("\nValores Introduzidos:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: %.2f, Probabilidade %d: %.2f\n",
               i + 1, values[i], i + 1, probabilities[i]);
    }

    return 0;
}

Compile e execute o programa:

gcc expected_value.c -o expected_value
./expected_value

Exemplo de saída:

Introduza o número de resultados (máx. 10): 3
Introduza os valores:
Valor 1: 10
Valor 2: 20
Valor 3: 30
Introduza as probabilidades:
Probabilidade 1: 0.2
Probabilidade 2: 0.5
Probabilidade 3: 0.3

Valores Introduzidos:
Valor 1: 10.00, Probabilidade 1: 0.20
Valor 2: 20.00, Probabilidade 2: 0.50
Valor 3: 30.00, Probabilidade 3: 0.30

Pontos chave a entender:

  • Usamos arrays para armazenar valores e probabilidades
  • MAX_OUTCOMES define o número máximo de resultados possíveis
  • scanf() é usado para ler a entrada do utilizador para valores e probabilidades
  • Imprimimos a entrada para verificar a introdução correta dos dados

Soma (valor*probabilidade) em Todos os Resultados

Neste passo, irá estender o programa anterior para calcular o valor esperado, computando a soma de cada valor multiplicado pela sua probabilidade.

Abra o ficheiro existente e modifique o código:

cd ~/project
nano expected_value.c

Atualize o código para calcular o valor esperado:

#include <stdio.h>

#define MAX_OUTCOMES 10

int main() {
    double values[MAX_OUTCOMES];
    double probabilities[MAX_OUTCOMES];
    int num_outcomes;
    double expected_value = 0.0;

    printf("Introduza o número de resultados (máx. %d): ", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // Introduzir valores
    printf("Introduza os valores:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Introduzir probabilidades
    printf("Introduza as probabilidades:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilidade %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // Calcular o valor esperado
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Imprimir resultados
    printf("\nDetalhes do Cálculo:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: %.2f * Probabilidade %d: %.2f = %.2f\n",
               i + 1, values[i], i + 1, probabilities[i],
               values[i] * probabilities[i]);
    }
    printf("\nValor Esperado: %.2f\n", expected_value);

    return 0;
}

Compile e execute o programa atualizado:

gcc expected_value.c -o expected_value
./expected_value

Exemplo de saída:

Introduza o número de resultados (máx. 10): 3
Introduza os valores:
Valor 1: 10
Valor 2: 20
Valor 3: 30
Introduza as probabilidades:
Probabilidade 1: 0.2
Probabilidade 2: 0.5
Probabilidade 3: 0.3

Detalhes do Cálculo:
Valor 1: 10.00 * Probabilidade 1: 0.20 = 2.00
Valor 2: 20.00 * Probabilidade 2: 0.50 = 10.00
Valor 3: 30.00 * Probabilidade 3: 0.30 = 9.00

Valor Esperado: 21.00

Pontos chave a entender:

  • Introduzimos expected_value para armazenar a soma de valor * probabilidade
  • O loop for calcula cada termo e acumula o total
  • Imprimimos os passos detalhados do cálculo para mostrar como o valor esperado é calculado
  • A contribuição de cada resultado é mostrada como (valor * probabilidade)

Imprimir o Valor Esperado

Neste passo final, irá aprimorar o programa para fornecer uma saída mais detalhada e melhorar a experiência do utilizador ao exibir o valor esperado.

Abra o ficheiro existente e faça as modificações finais:

cd ~/project
nano expected_value.c

Atualize o código com formatação melhorada e verificação de erros:

#include <stdio.h>

#define MAX_OUTCOMES 10

int main() {
    double values[MAX_OUTCOMES];
    double probabilities[MAX_OUTCOMES];
    int num_outcomes;
    double expected_value = 0.0;
    double total_probability = 0.0;

    printf("Calculadora de Valor Esperado\n");
    printf("==============================\n");

    // Introdução do número de resultados
    do {
        printf("Introduza o número de resultados (1-%d): ", MAX_OUTCOMES);
        scanf("%d", &num_outcomes);

        if (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES) {
            printf("Número de resultados inválido. Tente novamente.\n");
        }
    } while (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES);

    // Introdução dos valores
    printf("\nIntroduzir Valores:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Valor %d: ", i + 1);
        scanf("%lf", &values[i]);
    }

    // Introdução das probabilidades com validação
    printf("\nIntroduzir Probabilidades:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Probabilidade %d: ", i + 1);
        scanf("%lf", &probabilities[i]);
        total_probability += probabilities[i];
    }

    // Validar a soma total das probabilidades
    if (total_probability < 0.99 || total_probability > 1.01) {
        printf("\nAVISO: As probabilidades não somam 1.0 (soma atual: %.2f)\n",
               total_probability);
    }

    // Calcular o valor esperado
    for (int i = 0; i < num_outcomes; i++) {
        expected_value += values[i] * probabilities[i];
    }

    // Imprimir resultados detalhados
    printf("\n--- Detalhes do Cálculo ---\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("Resultado %d: Valor = %.2f, Probabilidade = %.2f\n",
               i + 1, values[i], probabilities[i]);
        printf("  Contribuição: %.2f * %.2f = %.2f\n",
               values[i], probabilities[i], values[i] * probabilities[i]);
    }

    // Saída final do valor esperado
    printf("\n=== Valor Esperado ===\n");
    printf("E(X) = %.2f\n", expected_value);

    return 0;
}

Compile e execute o programa final:

gcc expected_value.c -o expected_value
./expected_value

Exemplo de saída:

Calculadora de Valor Esperado
==============================
Introduza o número de resultados (1-10): 3

Introduzir Valores:
Valor 1: 10
Valor 2: 20
Valor 3: 30

Introduzir Probabilidades:
Probabilidade 1: 0.2
Probabilidade 2: 0.5
Probabilidade 3: 0.3

--- Detalhes do Cálculo ---
Resultado 1: Valor = 10.00, Probabilidade = 0.20
  Contribuição: 10.00 * 0.20 = 2.00
Resultado 2: Valor = 20.00, Probabilidade = 0.50
  Contribuição: 20.00 * 0.50 = 10.00
Resultado 3: Valor = 30.00, Probabilidade = 0.30
  Contribuição: 30.00 * 0.30 = 9.00

=== Valor Esperado ===
E(X) = 21.00

Melhorias chave:

  • Adição de validação de entrada para o número de resultados
  • Verificação da soma total das probabilidades
  • Formatação de saída aprimorada
  • Exibição das contribuições individuais de cada resultado
  • Exibição clara do valor esperado final

Resumo

Neste laboratório, aprenderá a ler valores e probabilidades, e a calcular o valor esperado de uma distribuição discreta em C. Primeiro, criará um programa que permite aos utilizadores introduzir múltiplos valores e as suas probabilidades correspondentes. Em seguida, aprenderá a somar o produto de cada valor e a sua probabilidade para calcular o valor esperado. Finalmente, imprimirá o valor esperado calculado.

Os pontos chave abordados neste laboratório incluem o uso de arrays para armazenar valores e probabilidades, a definição de um número máximo de resultados possíveis e a utilização da função scanf() para ler a entrada do utilizador. O programa garante que os valores e probabilidades introduzidos são impressos para verificação antes de prosseguir para o próximo passo.