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_OUTCOMESdefine o número máximo de resultados possíveisscanf()é 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_valuepara armazenar a soma de valor * probabilidade - O loop
forcalcula 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.



