Utilizando os conceitos de procedimentos e funções, crie um algoritmo que forneça informações sobre o desempenho de cada equipe que participou de um campeonato de futebol (nome da equipe, no de jogos, no de vitórias, no de empates, no de derrotas, pontos ganhos, gols a favor, gols contra e saldo de gols). Considere que no campeonato participaram 22 times e que, para cada jogo, existe o registro do nome e número de gols de cada uma das duas equipes.
Obs: a saída deverá ser fornecida de forma ordenada, ou seja, da equipe com maior pontuação para a equipe com menor pontuação. Caso haja equipes com a mesma pontuação, os critérios de desempate são: maior no de vitórias, maior saldo de gols, mais gols a favor, menos gols contra e menos derrotas.
Passo 1
Resumimos o problema: temos um campeonato com 22 equipes, e a cada jogo recebemos o nome das duas equipes e os gols de cada uma. Precisamos computar para cada time: número de jogos, vitórias, empates, derrotas, pontos (3 por vitória, 1 por empate), gols a favor, gols contra e saldo de gols, e depois exibir tudo ordenado pelos critérios dados.
Passo 2
Definimos um registro (tipo struct) Equipe com campos: nome (string), jogos, vitorias, empates, derrotas, pontos, golsFavor, golsContra e saldoGols. Declaramos um vetor Equipes[1…22] desse tipo.
Passo 3
Criamos um procedimento InicializarEquipes que lê os nomes das 22 equipes e zera todos os outros campos de cada registro.
Passo 4
Criamos um procedimento AtualizarResultado(e1, e2: índice no vetor; g1, g2: inteiros) que atualiza os campos das equipes no jogo: incrementa jogos, golsFavor, golsContra, calcula vitoria/empate/derrota, ajusta pontos e saldoGols.
Passo 5
Implementamos uma função Comparar(eA, eB: Equipe): booleano que retorna verdadeiro se eA deve vir antes de eB segundo os critérios: maior pontos, maior vitórias, maior saldoGols, maior golsFavor, menor golsContra, menor derrotas.
Passo 6
No programa principal (ou procedimento Main) chamamos InicializarEquipes, depois lemos 231 jogos (pois com 22 equipes em turno único há 231 partidas), para cada entrada lemos nomes e gols, localizamos índices das equipes no vetor e chamamos AtualizarResultado.
Passo 7
Após processar todos os jogos, usamos um algoritmo de ordenação (por exemplo, sort por inserção ou quicksort) fornecido pela linguagem, passando a função Comparar como critério.
Passo 8
Por fim, imprimimos cabecalho e, em seguida, para i de 1 até 22 exibimos os campos de Equipes[i] na ordem desejada.
Passo 9
Esse pseudocódigo atende à modularidade com funções/procedimentos e obedece todos os critérios de desempate e ordenação.
Resposta
// Pseudocódigo em estilo Pascal
type
Equipe = record
nome: string;
jogos, vitorias, empates, derrotas: integer;
pontos, golsFavor, golsContra, saldoGols: integer;
end;
Equipe = record
nome: string;
jogos, vitorias, empates, derrotas: integer;
pontos, golsFavor, golsContra, saldoGols: integer;
end;
var
Equipes: array[1…22] of Equipe;
i, j, totalJogos: integer;
nome1, nome2: string;
g1, g2: integer;
Equipes: array[1…22] of Equipe;
i, j, totalJogos: integer;
nome1, nome2: string;
g1, g2: integer;
procedure InicializarEquipes;
begin
for i := 1 to 22 do
begin
readln(Equipes[i].nome);
Equipes[i].jogos := 0;
Equipes[i].vitorias := 0;
Equipes[i].empates := 0;
Equipes[i].derrotas := 0;
Equipes[i].pontos := 0;
Equipes[i].golsFavor := 0;
Equipes[i].golsContra := 0;
Equipes[i].saldoGols := 0;
end;
end;
begin
for i := 1 to 22 do
begin
readln(Equipes[i].nome);
Equipes[i].jogos := 0;
Equipes[i].vitorias := 0;
Equipes[i].empates := 0;
Equipes[i].derrotas := 0;
Equipes[i].pontos := 0;
Equipes[i].golsFavor := 0;
Equipes[i].golsContra := 0;
Equipes[i].saldoGols := 0;
end;
end;
procedure AtualizarResultado(idx1, idx2, gols1, gols2: integer);
begin
// Incrementa jogos e gols
with Equipes[idx1] do
begin
jogos := jogos + 1;
golsFavor := golsFavor + gols1;
golsContra := golsContra + gols2;
end;
with Equipes[idx2] do
begin
jogos := jogos + 1;
golsFavor := golsFavor + gols2;
golsContra := golsContra + gols1;
end;
// Resultados e pontos
if gols1 > gols2 then
begin
Equipes[idx1].vitorias := Equipes[idx1].vitorias + 1;
Equipes[idx1].pontos := Equipes[idx1].pontos + 3;
Equipes[idx2].derrotas := Equipes[idx2].derrotas + 1;
end
else if gols1 < gols2 then
begin
Equipes[idx2].vitorias := Equipes[idx2].vitorias + 1;
Equipes[idx2].pontos := Equipes[idx2].pontos + 3;
Equipes[idx1].derrotas := Equipes[idx1].derrotas + 1;
end
else // empate
begin
Equipes[idx1].empates := Equipes[idx1].empates + 1;
Equipes[idx2].empates := Equipes[idx2].empates + 1;
Equipes[idx1].pontos := Equipes[idx1].pontos + 1;
Equipes[idx2].pontos := Equipes[idx2].pontos + 1;
end;
// Atualiza saldo de gols
Equipes[idx1].saldoGols := Equipes[idx1].golsFavor - Equipes[idx1].golsContra;
Equipes[idx2].saldoGols := Equipes[idx2].golsFavor - Equipes[idx2].golsContra;
end;
begin
// Incrementa jogos e gols
with Equipes[idx1] do
begin
jogos := jogos + 1;
golsFavor := golsFavor + gols1;
golsContra := golsContra + gols2;
end;
with Equipes[idx2] do
begin
jogos := jogos + 1;
golsFavor := golsFavor + gols2;
golsContra := golsContra + gols1;
end;
// Resultados e pontos
if gols1 > gols2 then
begin
Equipes[idx1].vitorias := Equipes[idx1].vitorias + 1;
Equipes[idx1].pontos := Equipes[idx1].pontos + 3;
Equipes[idx2].derrotas := Equipes[idx2].derrotas + 1;
end
else if gols1 < gols2 then
begin
Equipes[idx2].vitorias := Equipes[idx2].vitorias + 1;
Equipes[idx2].pontos := Equipes[idx2].pontos + 3;
Equipes[idx1].derrotas := Equipes[idx1].derrotas + 1;
end
else // empate
begin
Equipes[idx1].empates := Equipes[idx1].empates + 1;
Equipes[idx2].empates := Equipes[idx2].empates + 1;
Equipes[idx1].pontos := Equipes[idx1].pontos + 1;
Equipes[idx2].pontos := Equipes[idx2].pontos + 1;
end;
// Atualiza saldo de gols
Equipes[idx1].saldoGols := Equipes[idx1].golsFavor - Equipes[idx1].golsContra;
Equipes[idx2].saldoGols := Equipes[idx2].golsFavor - Equipes[idx2].golsContra;
end;
function Comparar(a, b: Equipe): boolean;
begin
if a.pontos <> b.pontos then
Comparar := (a.pontos > b.pontos)
else if a.vitorias <> b.vitorias then
Comparar := (a.vitorias > b.vitorias)
else if a.saldoGols <> b.saldoGols then
Comparar := (a.saldoGols > b.saldoGols)
else if a.golsFavor <> b.golsFavor then
Comparar := (a.golsFavor > b.golsFavor)
else if a.golsContra <> b.golsContra then
Comparar := (a.golsContra < b.golsContra)
else
Comparar := (a.derrotas < b.derrotas);
end;
begin
if a.pontos <> b.pontos then
Comparar := (a.pontos > b.pontos)
else if a.vitorias <> b.vitorias then
Comparar := (a.vitorias > b.vitorias)
else if a.saldoGols <> b.saldoGols then
Comparar := (a.saldoGols > b.saldoGols)
else if a.golsFavor <> b.golsFavor then
Comparar := (a.golsFavor > b.golsFavor)
else if a.golsContra <> b.golsContra then
Comparar := (a.golsContra < b.golsContra)
else
Comparar := (a.derrotas < b.derrotas);
end;
procedure Main;
begin
InicializarEquipes;
totalJogos := 22 * 21 div 2; // 231 jogos
for i := 1 to totalJogos do
begin
readln(nome1, g1, nome2, g2);
// encontra índices
idx1 := 0; idx2 := 0;
for j := 1 to 22 do
begin
if Equipes[j].nome = nome1 then idx1 := j;
if Equipes[j].nome = nome2 then idx2 := j;
end;
AtualizarResultado(idx1, idx2, g1, g2);
end;
// Ordena pelo critério
Sort(Equipes, 1, 22, Comparar);
// Imprime resultados
writeln(‘Nome J V E D Pts GF GC SG’);
for i := 1 to 22 do
with Equipes[i] do
writeln(nome, ’ ', jogos, ’ ', vitorias, ’ ', empates, ’ ',
derrotas, ’ ', pontos, ’ ', golsFavor, ’ ',
golsContra, ’ ', saldoGols);
end;
begin
InicializarEquipes;
totalJogos := 22 * 21 div 2; // 231 jogos
for i := 1 to totalJogos do
begin
readln(nome1, g1, nome2, g2);
// encontra índices
idx1 := 0; idx2 := 0;
for j := 1 to 22 do
begin
if Equipes[j].nome = nome1 then idx1 := j;
if Equipes[j].nome = nome2 then idx2 := j;
end;
AtualizarResultado(idx1, idx2, g1, g2);
end;
// Ordena pelo critério
Sort(Equipes, 1, 22, Comparar);
// Imprime resultados
writeln(‘Nome J V E D Pts GF GC SG’);
for i := 1 to 22 do
with Equipes[i] do
writeln(nome, ’ ', jogos, ’ ', vitorias, ’ ', empates, ’ ',
derrotas, ’ ', pontos, ’ ', golsFavor, ’ ',
golsContra, ’ ', saldoGols);
end;
begin
Main;
end.
Main;
end.