From d8fac9474ecb63edf48edba605c311a390f10b77 Mon Sep 17 00:00:00 2001 From: tiagorg Date: Thu, 10 Nov 2022 19:54:11 +0000 Subject: [PATCH] Aula07/Ex04 adicionado --- 1ano/fp/aula05/allMatches.py | 1 + 1ano/fp/aula07/README.md | 4 +- 1ano/fp/aula07/campeonato.py | 134 ++++++++++++++++++++++++++++ 1ano/fp/aula07/extras/allMatches.py | 9 ++ 4 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 1ano/fp/aula07/campeonato.py create mode 100755 1ano/fp/aula07/extras/allMatches.py diff --git a/1ano/fp/aula05/allMatches.py b/1ano/fp/aula05/allMatches.py index 4a030e6..efc3dbf 100755 --- a/1ano/fp/aula05/allMatches.py +++ b/1ano/fp/aula05/allMatches.py @@ -14,5 +14,6 @@ def allMatches(teamList): return matchList + if __name__ == "__main__": main() \ No newline at end of file diff --git a/1ano/fp/aula07/README.md b/1ano/fp/aula07/README.md index b711b9a..6ac46b2 100644 --- a/1ano/fp/aula07/README.md +++ b/1ano/fp/aula07/README.md @@ -1,7 +1,7 @@ # Fundamentos de Programação ## Aula 07 - [Slides](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/fp/slides/tp07-dictionaries.pdf) ### Tópico principal da aula: Dictionaries -#### Exercícios terminados: ex01, ex02, ex03 +#### Exercícios terminados: ex01, ex02, ex03, ex04 --- -*Pode conter erros, caso encontre algum, crie um* [*ticket*](https://github.com/TiagoRG/uaveiro-leci/issues/new) \ No newline at end of file +*Pode conter erros, caso encontre algum, crie um* [*ticket*](https://github.com/TiagoRG/uaveiro-leci/issues/new) diff --git a/1ano/fp/aula07/campeonato.py b/1ano/fp/aula07/campeonato.py new file mode 100644 index 0000000..93dd187 --- /dev/null +++ b/1ano/fp/aula07/campeonato.py @@ -0,0 +1,134 @@ +from extras.allMatches import * # importa a função allMatches criada na aula05 + + +def main(): + equipas = getTeams() # pede as equipas ao utilizador + partidas = allMatches(equipas) # cria a lista de partidas + resultados = getResults(partidas) # pede os resultados ao utilizador + tabela = getTable(equipas, resultados) # cria a tabela de classificação + printTable(tabela) # imprime a tabela de classificação + + +def getTeams(): + teams = [] # cria uma lista vazia para as equipas + + while True: # Ciclo para obter as equipas + team = input("Nome da equipa: ") + if team == "" and len(teams) < 2: + continue + elif team == "": + break + teams.append(team) + + return teams + + +def getResults(matches): + results = dict() # cria um dicionário vazio para os resultados + for match in matches: + team1, team2 = match # desempacota a partida + print("Resultado do jogo entre", team1, "e", team2) + goals1 = int(input("Golos da equipa 1: ")) + goals2 = int(input("Golos da equipa 2: ")) + results[match] = (goals1, goals2) # adiciona o resultado ao dicionário + return results + + +def getTable(teams, results): + table = dict() # cria um dicionário vazio para a tabela + for team in teams: + table[team] = [0, 0, 0, 0, 0, 0] # inicializa a tabela com zeros + for match in results: + team1, team2 = match # desempacota a partida + goals1, goals2 = results[match] # desempacota os resultados + if goals1 > goals2: # se a equipa 1 ganhou + # atualiza os resultados da equipa 1 + table[team1][0] += 1 + table[team1][3] += goals1 + table[team1][4] += goals2 + table[team1][5] += 3 + + # atualiza os resultados da equipa 2 + table[team2][2] += 1 + table[team2][3] += goals2 + table[team2][4] += goals1 + elif goals2 > goals1: # se a equipa 2 ganhou + # atualiza os resultados da equipa 2 + table[team2][0] += 1 + table[team2][3] += goals2 + table[team2][4] += goals1 + table[team2][5] += 3 + + # atualiza os resultados da equipa 1 + table[team1][2] += 1 + table[team1][3] += goals1 + table[team1][4] += goals2 + else: # se houve empate + # atualiza os resultados da equipa 1 + table[team1][1] += 1 + table[team1][3] += goals1 + table[team1][4] += goals2 + table[team1][5] += 1 + + # atualiza os resultados da equipa 2 + table[team2][1] += 1 + table[team2][3] += goals2 + table[team2][4] += goals1 + table[team2][5] += 1 + + sortedTable = sortTable(table) # ordena a tabela por pontos e diferença de golos + return sortedTable + + +def printTable(table): + + print(f"\n{'Equipa':<15}\tV\tE\tD\tGM\tGS\tPts") + + for results in table: + print(f"{results:<15}", end="\t") + + for result in table[results]: + print(result, end="\t") + + print('') + + print(f"\nA equipa campeã é {max(table, key=lambda x: (table[x][3]- table[x][4]))}.") + + +def sortTable(table): + pointsOrder = [] # cria uma lista vazia para a ordenação por pontos + for team in table: + pointsOrder.append(table[team][5]) # adiciona os pontos à lista + pointsOrder.sort() # ordena a lista de pontos (ordem crescente) + + resultsByPoints = {} # cria um dicionário vazio para os resultados ordenados por pontos + for points in pointsOrder: # percorre a lista de pontos + for team in table: # percorre as equipas + if table[team][5] == points: # se a equipa tiver os pontos + resultsByPoints[team] = table[team] # adiciona a equipa ao dicionário + + goalDiffByTeam = {} # cria um dicionário vazio para a diferença de golos por equipa + for team in table: # percorre as equipas + goalDiffByTeam[team] = table[team][3] - table[team][4] # calcula a diferença de golos da equipa e adiciona ao dicionário + + teamOrder = [] # cria uma lista vazia para a ordenação dos nomes das equipas por diferença de golos + for team1 in resultsByPoints: + for team2 in resultsByPoints: + if resultsByPoints[team1][5] == resultsByPoints[team2][5]: # se as equipas tiverem os mesmos pontos + + if goalDiffByTeam[team1] >= goalDiffByTeam[team2]: # se a diferença de golos da equipa 1 for maior ou igual à da equipa 2 + teamOrder.append(team1) # adiciona a equipa 1 à lista + + else: # se a diferença de golos da equipa 2 for maior + teamOrder.append(team2) # adiciona a equipa 2 à lista + + teamOrder = teamOrder[::-1] # inverte a lista de equipas (ordem decrescente em diferença de golos) + resultsByGoalDiff = {} # cria um dicionário vazio para os resultados ordenados por diferença de golos + for team in teamOrder: + resultsByGoalDiff[team] = resultsByPoints[team] # adiciona os resultados da equipa ao dicionário ordenado por diferença de golos + + return resultsByGoalDiff + + +if __name__ == '__main__': + main() diff --git a/1ano/fp/aula07/extras/allMatches.py b/1ano/fp/aula07/extras/allMatches.py new file mode 100755 index 0000000..1531caa --- /dev/null +++ b/1ano/fp/aula07/extras/allMatches.py @@ -0,0 +1,9 @@ +def allMatches(teamList): + matchList = [] + + for team1 in teamList: + for team2 in teamList: + if team1 != team2: + matchList.append((team1, team2)) + + return matchList