Foi feita uma pesquisa de audiência de canal de TV em várias casas de uma certa cidade num determinado dia. Para cada casa visitada, é fornecido o número do canal
e o número de pessoas que estavam assistindo naquela casa. Se a televisão estivesse desligada, nada era anotado, ou seja, esta casa não entrava na pesquisa. Fazer um programa que:
- Leia um número indeterminado de dados, sendo que o “flag” corresponde ao número do canal igual a zero;
- Calcule a porcentagem de audiência para cada emissora e escreva o número de cada canal e sua respectiva porcentagem;
Passo 1
O que o enunciado pede e quais informações são dadas:
- O enunciado pede que se faça um programa que leia um número indeterminado de registros e, ao final, calcule a porcentagem de audiência de cada emissora e imprima o número do canal com sua respectiva porcentagem.
- Cada registro da pesquisa contém dois dados: o número do canal e o número de pessoas assistindo naquela casa.
- Os canais possíveis são
. - O valor de flag que sinaliza o fim da leitura é o número do canal igual a
. - Casas com a TV desligada não aparecem na pesquisa (logo não entram como registros).
- Saída esperada: para cada um dos canais
mostrar a porcentagem da audiência relativa ao total de pessoas contabilizadas na pesquisa.
Resumindo, as perguntas explícitas do enunciado:
- Como ler os dados até o flag
? - Como calcular a porcentagem de audiência de cada canal?
- Como exibir o número do canal e sua porcentagem?
Passo 2
Estratégia geral (passo-a-passo do algoritmo, sem código ainda):
- Inicializar um contador de espectadores por canal; ou seja, armazenar para cada canal
o total de pessoas que marcaram esse canal. Vou chamar esses acumuladores de . - Inicializar o total de espectadores
como zero. - Repetir a leitura de registros (cada registro tem: número do canal e número de pessoas):
- Se o número do canal lido for
, parar a leitura (esse é o flag). - Caso contrário, somar o número de pessoas ao acumulador do respectivo canal e somar também em
. - Se aparecer um número de canal diferente de
(erro de entrada), ignorar o canal ou tratar como inválido (a implementação que segue vai ignorar canais não esperados).
- Se o número do canal lido for
- Depois que a leitura terminar, calcular para cada canal a porcentagem de audiência
usando a fórmula de porcentagem abaixo. - Tratar o caso especial
(nenhum telespectador contabilizado): evitar divisão por zero e, nesse caso, definir as porcentagens como .
Passo 3
Fórmula da porcentagem e explicação didática (a “aula” sobre o que estamos calculando):
- Porcentagem significa “parte por cem”. Se um canal tem, por exemplo,
espectadores e o total de espectadores é , a porcentagem de audiência do canal 4 é:
- Aqui:
-
é o número total de pessoas que estavam assistindo ao canal . -
é o número total de pessoas contabilizadas na pesquisa (soma de todas as ).
-
- A multiplicação por
transforma a fração em porcentagem. - Se
, a fração não é definida; nesse caso, interpretamos que não houve espectadores na pesquisa e todas as porcentagens valem .
Exemplo simples para fixar: se
e
,
Ou seja, canal 4 tem
da audiência.
Passo 4
Como implementar a leitura até o flag (conceito do sentinel) — aula curta:
- Um “flag” ou “sentinela” é um valor especial que indica término de dados. Aqui o sentinel é o número do canal igual a
. - Leitura típica: em loop, lê-se um par
. Logo após ler , testa-se se . Se for, sai do loop sem processar esse registro. Caso contrário, processa-se o registro. - Em problemas de programação que leem de entrada padrão, costuma-se ler linhas até o final ou até encontrar o sentinel. Se a entrada vier em linhas, cada linha pode ter dois inteiros separados por espaço; se vier em fluxo contínuo, lê-se dois inteiros por iteração.
Passo 5
Exemplo numérico completo (simulado) para ver as contas na prática:
Suponha que a sequência de registros lidos (cada par é
) seja:
.
- Acumular:
-
- Total:
- Porcentagens:
Observe que as porcentagens somam
(verificação útil para detectar erros).
Passo 6
Formato de saída e arredondamento recomendados:
- É comum apresentar as porcentagens com duas casas decimais, por exemplo:
. - Decida se haverá separador decimal com vírgula ou ponto conforme a exigência do exercício; aqui vou usar ponto decimal (formato comum em programação).
- Imprimir cada linha com o número do canal e a porcentagem formatada com duas casas decimais.
Resposta
# Programa em Python que lê pares (canal, pessoas) até canal == 0
# e imprime a porcentagem de audiência para os canais 4, 5, 10 e 13.
import sys
def main():
counts = {4: 0, 5: 0, 10: 0, 13: 0}
total = 0
# Leitura robusta: cada linha pode conter um ou mais pares; assumimos pares canal pessoas por linha
for line in sys.stdin:
parts = line.strip().split()
if not parts:
continue
# Processar tokens em pares
i = 0
while i + 1 < len(parts):
try:
canal = int(parts[i])
pessoas = int(parts[i + 1])
except ValueError:
# tokens inválidos: pular estes dois e seguir
i += 2
continue
if canal == 0:
# flag de parada: termina a leitura e sai completamente
i = len(parts) # força saída do while interno
# esvazia o iterador do for lendo até o fim sem fazer nada
# para terminar imediatamente a função:
print_percentages(counts, total)
return
if canal in counts:
counts[canal] += pessoas
else:
# canal não esperado: ignorar (ou poderia acumular separadamente)
pass
total += pessoas
i += 2
# Se chegou ao EOF sem encontrar canal == 0, imprime resultados também
print_percentages(counts, total)
def print_percentages(counts, total):
canais = [4, 5, 10, 13]
if total == 0:
for ch in canais:
print(f"Canal {ch}: 0.00%")
else:
for ch in canais:
pct = counts[ch] * 100.0 / total
print(f"Canal {ch}: {pct:.2f}%")
if __name__ == "__main__":
main()