Durante uma análise ambiental, um engenheiro precisa calcular um índice de qualidade da água com base em três parâmetros coletados em campo (oxigênio dissolvido, pH e turbidez), cada um com um peso diferente de importância.
Desenvolva um programa que receba os valores dos parâmetros e seus respectivos pesos e calcule o índice final utilizando média ponderada.
Passo 1
O que o enunciado pede:
- Desenvolver um programa que receba os valores de três parâmetros de qualidade da água (oxigênio dissolvido, pH e turbidez) e os respectivos pesos, e calcule o índice final usando média ponderada.
Informações que temos (entradas esperadas):
- Três valores medidos:
- valor do oxigênio dissolvido (vou chamar de
); - valor do pH (vou chamar de
); - valor da turbidez (vou chamar de
).
- valor do oxigênio dissolvido (vou chamar de
- Três pesos associados a esses parâmetros:
- peso do oxigênio dissolvido (vou chamar de
); - peso do pH (vou chamar de
); - peso da turbidez (vou chamar de
).
- peso do oxigênio dissolvido (vou chamar de
O que o programa deve entregar (saída):
- O índice final da qualidade da água calculado pela média ponderada dos três parâmetros.
Restrições/validações que o programa deve cuidar:
- Os pesos não podem somar zero (pois haveria divisão por zero).
- Idealmente os pesos são números não-negativos (pesos negativos não fazem sentido prático aqui).
- As entradas devem ser números (floats).
Passo 2
Conceito matemático que vamos usar (aula rápida e prática):
- A média ponderada de um conjunto de valores
com pesos é dada por
- No nosso caso, com três parâmetros, a fórmula fica
- Aqui:
-
é o valor do oxigênio dissolvido, -
é o valor do pH, -
é o valor da turbidez, -
são os pesos correspondentes que medem a importância relativa de cada parâmetro.
-
Por que dividir pela soma dos pesos?
- A soma
normaliza o resultado: se todos os pesos fossem multiplicados por um mesmo fator, o índice não mudaria. É isso que garante que o índice fique na escala apropriada.
Exemplo numérico manual (para fixar):
- Suponha
, , e , , . - Calcula-se o numerador:
. - Soma dos pesos:
. - Índice:
.
Passo 3
Escolha de implementação (motivo e estratégia):
- Vou implementar em Python porque é simples, claro e muito usado em Engenharia para scripts rápidos.
- Estratégia do programa:
- Ler os três valores
do usuário. - Ler os três pesos
do usuário. - Validar que todos são números e que
e que os pesos não são negativos (avisar o usuário se houver problema). - Calcular o numerador
. - Calcular o denominador
. - Calcular
e exibir formatado (por exemplo com duas casas decimais).
- Ler os três valores
- Observação: se preferir, pode normalizar os pesos para que somem 1 (dividindo cada peso por
) e depois fazer ; isso é matematicamente equivalente.
Passo 4
Programa em Python — código comentado e explicado passo a passo.
Código (copiar/colar e executar em um interpretador Python 3):
def ler_float(mensagem):
while True:
try:
s = input(mensagem)
# substitui vírgula por ponto para aceitar entradas como 0,5
s = s.replace(',', '.')
return float(s)
except ValueError:
print("Entrada inválida. Digite um número (ex: 6, 7.5).")
def calcular_indice_ponderado(x1, x2, x3, w1, w2, w3):
numerador = w1 * x1 + w2 * x2 + w3 * x3
denominador = w1 + w2 + w3
if denominador == 0:
raise ZeroDivisionError("A soma dos pesos é zero. Não é possível calcular a média ponderada.")
return numerador / denominador
def main():
print("Cálculo de índice de qualidade da água por média ponderada")
# Ler valores dos parâmetros
x1 = ler_float("Valor do oxigênio dissolvido (x1): ")
x2 = ler_float("Valor do pH (x2): ")
x3 = ler_float("Valor da turbidez (x3): ")
# Ler pesos
w1 = ler_float("Peso do oxigênio dissolvido (w1): ")
w2 = ler_float("Peso do pH (w2): ")
w3 = ler_float("Peso da turbidez (w3): ")
# Validações simples
if w1 < 0 or w2 < 0 or w3 < 0:
print("Aviso: um ou mais pesos são negativos. Normalmente espera-se pesos não-negativos.")
soma_pesos = w1 + w2 + w3
if soma_pesos == 0:
print("Erro: a soma dos pesos é zero. O cálculo não pode ser realizado.")
return
indice = calcular_indice_ponderado(x1, x2, x3, w1, w2, w3)
# Exibir resultado com duas casas decimais
print(f"Índice ponderado da qualidade da água: {indice:.2f}")
if __name__ == "__main__":
main()
Explicação das partes do código (passo a passo):
ler_float(mensagem): função auxiliar que lê uma linha do usuário e tenta converter parafloat. Substitui vírgula por ponto para facilitar entradas no formato brasileiro (ex:0,5). Em loop até o usuário digitar um número válido.calcular_indice_ponderado(...): função que aplica a fórmulaVerifica se o denominador é zero e lança erro apropriado caso seja. main(): função principal que:- lê os três valores e os três pesos,
- faz validações básicas (pesos negativos, soma dos pesos igual a zero),
- chama
calcular_indice_ponderadoe exibe o resultado com duas casas decimais.
- O bloco
if __name__ == "__main__":permite executar o script diretamente.
Passo 5
Exemplos de uso (para treinar e validar que entendeu):
Exemplo 1 (o mesmo que usamos na aula):
- Entradas:
-
, , -
, ,
-
- Cálculo:
- numerador
- denominador
- índice
- numerador
- O programa imprime:
Índice ponderado da qualidade da água: 6.10
Exemplo 2:
- Entradas:
-
, , -
, ,
-
- Cálculo:
- numerador
- denominador
- índice
- numerador
- O programa imprime:
Índice ponderado da qualidade da água: 6.70
Passo 6
Dicas práticas para prova/uso rápido:
- Se lhe derem pesos percentuais, transforme-os para frações (por exemplo
vira ) ou simplesmente use os números percentuais: a fórmula funciona com qualquer escala de pesos (contanto que a soma não seja zero). - Se os pesos já somarem 1, a fórmula simplifica para
. - Em prova, calcule numerador e denominador separadamente, simplifique se possível (por exemplo, se os pesos tiverem fator comum, divida tudo por esse fator antes da conta).
- Sempre verifique se a soma dos pesos é zero antes de dividir.
Resposta
def ler_float(mensagem):
while True:
try:
s = input(mensagem)
s = s.replace(',', '.')
return float(s)
except ValueError:
print("Entrada inválida. Digite um número (ex: 6, 7.5).")
def calcular_indice_ponderado(x1, x2, x3, w1, w2, w3):
numerador = w1 * x1 + w2 * x2 + w3 * x3
denominador = w1 + w2 + w3
if denominador == 0:
raise ZeroDivisionError("A soma dos pesos é zero. Não é possível calcular a média ponderada.")
return numerador / denominador
def main():
print("Cálculo de índice de qualidade da água por média ponderada")
x1 = ler_float("Valor do oxigênio dissolvido (x1): ")
x2 = ler_float("Valor do pH (x2): ")
x3 = ler_float("Valor da turbidez (x3): ")
w1 = ler_float("Peso do oxigênio dissolvido (w1): ")
w2 = ler_float("Peso do pH (w2): ")
w3 = ler_float("Peso da turbidez (w3): ")
if w1 < 0 or w2 < 0 or w3 < 0:
print("Aviso: um ou mais pesos são negativos. Normalmente espera-se pesos não-negativos.")
soma_pesos = w1 + w2 + w3
if soma_pesos == 0:
print("Erro: a soma dos pesos é zero. O cálculo não pode ser realizado.")
return
indice = calcular_indice_ponderado(x1, x2, x3, w1, w2, w3)
print(f"Índice ponderado da qualidade da água: {indice:.2f}")
if __name__ == "__main__":
main()