Ir ao conteúdo
  • Cadastre-se

Python Desenvolvimento programa em python


Ir à solução Resolvido por Midori,

Posts recomendados

Sou iniciante em Python e preciso de ajuda pra desenvolver um programa de futebol, e precisa ter um menu com algumas opções q vou colocar no código abaixo.

Até agr só fiz isso e tô com algumas dúvidas:

def imprimirMenu():
    print('Digite uma das opções abaixo:')
    print('1 - Preencher resultados da rodada')
    print('2 - Estatisticas do seu time')
    print('3 - Tabela do campeonato')
    print('4 - Proximos jogos')
    print('5 - Sair do programa.')


def tabela(listatimes):
    for t in listatimes:
        print(t)
    print()

def resultados():
    while True:
        try:
            print('Atletico-GO X Sao Paulo: ')
            g1=int(input('Atletico-GO: '))
            if g1<0 or g1>50:
                raise ValueError
            g2=int(input('Sao Paulo: '))
            if g2<0 or g2>50:
                raise ValueError

        except ValueError:
          print('Digite um inteiro maior que 0 e maior que 50')
print()

def main():
    times = ['Bragantino','Bahia','Ceara','Fotaleza',\
            'Atletico-PR','Flamengo','Atletico-GO','Sport',\
            'Juventude','Cuiaba','Internacional','Sao Paulo',\
            'Fluminense','Gremio','Atletico Mg','America MG',
            'Palmeiras','Corinthians','Chapecoense','Santos']
    while True:
        imprimirMenu()
        r = input('Opcao: ')
        if r == '1':
            resultados()
            pass
        elif r == '2':
            pass
        elif r == '3':
            tabela(times)
        elif r == '4':
            pass
        elif r == '5':
            break
        else:
            print('Opcao invaida.')
main()

          
          
                                    

 

Na parte dos resultados, eu preciso que o usuário digite os resultados de todas as partidas daquela rodada (eu coloquei só uma partida por enquanto) Minha dúvida é se eu preciso inserir todas as partidas  ou existe uma forma automatizada de fazer isso ? A forma q eu fiz tá correta ?

 

E Dependendo dos resultados que o usuário digitar, eu preciso que a tabela(opção 3) atualize, contendo a pontuação e colocação de cada time, Vitória=3 pontos, Empate = 1 ponto e Derrota = 0

Toda vez q o usuário terminar de colocar os resultados da rodada, na proxima vez q ele selecionar a opção 1, o programa tem que ir pra próxima rodada, com as próximas partidas e indo atualizando a tabela pra cada interação.

e Na opção 2 só mostrar as estatisticas (gols, vitórias, derrotas, empates) do time que o usuário digitar.

 

Se alguém puder me ajudar a desenvolver esses tópicos eu ficaria mt agradecido, pois estou com bastantes dificuldades.

Desde já, Obrigado.

 

 

 

Link para o comentário
Compartilhar em outros sites

@Felipe2719 Para o menu acho que ficaria melhor se a função já retornar a opção escolhida, p.ex,

 

def imprimirMenu():
    r = int(input(
        'Digite uma das opções abaixo:\n'
        '1 - Preencher resultados da rodada\n'
        '2 - Estatisticas do seu time\n'
        '3 - Tabela do campeonato\n'
        '4 - Proximos jogos\n'
        '5 - Sair do programa.\n: '
    ))
    return r

 

Aí é só atribuir a função a variável.

 

Nos resultados você pode usar um dicionário para registrar os pontos enquanto faz o loop na lista de times, assim não terá que criar um if para cada partida,

 

pontos = {}
for i in range(len(times)):
    j = i + 1
    while j < len(times):
        A, B = times[i], times[j]
        if not A in pontos:
            pontos[A] = 0
        if not B in pontos:
            pontos[B] = 0

        p = input(A + ' X ' + B + ': ').split()
        pA, pB = int(p[0]), int(p[1])
                
        if pA > pB:
            pontos[A] += 3
        elif pA < pB:
            pontos[B] += 3
        else:
            pontos[A] += 1
            pontos[B] += 1
        j += 1

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Midori Fazendo isso ele vai pedindo todos os jogos de todos os times até acabar, né ?  eu precisava no caso só repetir a rodada, que são em média 10 jogos por rodada sem repetir o time. Depois de preencher os jogos como faço pra aparecer a a pontuação do lado dos times (na tabela da opção 3) e caso o time tiver mais pontuação que o outro, subir uma linha na frente igual a tabela do brasileirão mesmo. To martelando aqui mas n to conseguindo fazer

Link para o comentário
Compartilhar em outros sites

4 horas atrás, Felipe2719 disse:

@Midori Fazendo isso ele vai pedindo todos os jogos de todos os times até acabar, né ?  eu precisava no caso só repetir a rodada, que são em média 10 jogos por rodada sem repetir o time. Depois de preencher os jogos como faço pra aparecer a a pontuação do lado dos times (na tabela da opção 3) e caso o time tiver mais pontuação que o outro, subir uma linha na frente igual a tabela do brasileirão mesmo. To martelando aqui mas n to conseguindo fazer

Se não deu p entender o que eu disse, é mais ou menos assim:

['São Paulo'],['Corinthians'],['Santos'],['Palmeiras']

na primeira rodada se enfrentam São paulo X corinthians e Santos X Palmeiras

na segunda Corinthians X Santos, Palmeiras X São Paulo. E assim por diante até todos os times se enfrentarem. Como eu escolhi 20 times, desse jeito eu ficaria uma eternidade digitando os resultados até o final, já que todos enfrentam 19 times. Por isso tava pensando em colocar só 10 partidas pra cada vez q o usuário digitar a opção 1, guardando as partidas e os resultados anteriores. Não sei se dá pra fazer isso, e só uma ideia. Se achar que vai ficar mt complicado me avisa p eu escolher um campeonato com menos times, daí eu faço desse jeito mesmo kkkk

 

Link para o comentário
Compartilhar em outros sites

@Felipe2719 Como já tem uma lista dos times pode criar outra dos pontos onde cada posição dessa lista será relativa a posição dos times na outra.

 

Crie a lista dos pontos com todos os elementos zerados,

pontos = [0] * len(times)

 

Para atribuir a pontuação pode usar uma função que recebe os nomes dos times como parâmetro,

def resultado(A, B):
    j = input(A + ' x ' + B + ': ').split()
    pA, pB = int(j[0]), int(j[1])
    if pA > pB:
        pontos[times.index(A)] += 3
    elif pA < pB:
        pontos[times.index(B)] += 3
    else:
        pontos[times.index(A)] += 1
        pontos[times.index(B)] += 1

 

Para ordenar acho mais fácil usar um algoritmo de ordenação como o bubble sort em uma função que recebe as duas listas como parâmetro, p.ex,

def ordena(times, pontos):
    t = len(times)
    for i in range(t - 1):
        for j in range(t - i - 1):
            if pontos[j] < pontos[j + 1]:
                pontos[j], pontos[j + 1] = \
                    pontos[j + 1], pontos[j]
                times[j], times[j + 1] = \
                    times[j + 1], times[j]

 

Aí para ordenar é só passar as listas e depois imprimir,

ordena(times, pontos)
i = 0
while i < len(times):
    print(times[i],'=',pontos[i])
    i += 1

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

def imprimirMenu():
    print('Digite uma das opções abaixo:')
    print('1 - Preencher resultados da rodada')
    print('2 - Estatisticas do seu time')
    print('3 - Tabela do campeonato')
    print('4 - Proximos jogos')
    print('5 - Sair do programa.')

def resultados(listatimes):
    pontos = {}
    for i in range(len(listatimes)):
        j = i + 1
        while j<len(listatimes):
            A,B = listatimes[i],listatimes[j]
            if not A in pontos:
                pontos[A] = 0
            if not B in pontos:
                pontos[B] = 0
            p = input(A + 'X' + B +': ').split()
            pA, pB = int(p[0]),int(p[1])

            if pA>pB:
                pontos[A]+=3
            elif pA<pB:
                pontos[B]+=3
            else:
                pontos[A]+=1
                pontos[B]+=1
            j+=1
                             
def resultado(A,B):

    j = input(A + ' x ' + B + ': ').split()
    pA,pB = int(j[0]),int(j[1])
    if pA>pB:
        pontos[times.index(A)]+=3
    elif pA<pB:
        pontos[times.index(B)]+=3
    else:
        pontos[times.index(A)]+=1
        pontos[times.index(B)]+=1

def ordena(times,pontos):
    t = len(times)
    i = 0
    while i<len(times):
        print(times[i],'=',pontos[i])
        i+=1
    for i in range(t - 1):
        for j in range(t - i - 1):
            if pontos[j] < pontos[j+1]:
                pontos[j], pontos[j+1]= \
                        pontos[j+1],pontos[j]
                times[j],times[j+1] = \
                        times[j+1],times[j]
print()

def main():
    times = ['Brasil','Colombia','Equador','Peru','Venezuela']
    pontos = [0]*len(times)

    while True:
        imprimirMenu()
        r = input('Opcao: ')
        if r == '1':
            resultados(times)
            pass
        elif r == '2':
            pass
        elif r == '3':
            ordena(times,pontos)
        elif r == '4':
            pass
        elif r == '5':
            break
        else:
            print('Opcao invaida.')
main()

ficaria assim ?

com certeza fiz algo errado porque  os valores só ficam = 0 na tabela.

na função main eu tô chamando as funções corretas ? fiquei meio confuso nessa parte.

Link para o comentário
Compartilhar em outros sites

@Felipe2719 Os valores ficam zerados porque porque não está usando a função dos pontos,

 

def imprimirMenu():
    opcao = int(input(
        'Digite uma das opções abaixo:\n'
        '1 - Preencher resultados da rodada\n'
        '2 - Estatisticas do seu time\n'
        '3 - Tabela do campeonato\n'
        '4 - Proximos jogos\n'
        '5 - Sair do programa.\n: '
    ))
    return opcao
 
def resultado(A, B):
    j = input(A + ' x ' + B + ': ').split()
    pA, pB = int(j[0]), int(j[1])
    if pA > pB:
        pontos[times.index(A)] += 3
    elif pA < pB:
        pontos[times.index(B)] += 3
    else:
        pontos[times.index(A)] += 1
        pontos[times.index(B)] += 1
        
def ordena(times, pontos):
    t = len(times)
    for i in range(t - 1):
        for j in range(t - i - 1):
            if pontos[j] < pontos[j + 1]:
                pontos[j], pontos[j + 1] = \
                    pontos[j + 1], pontos[j]
                times[j], times[j + 1] = \
                    times[j + 1], times[j]
                    

times = ['Brasil','Colombia','Equador','Peru','Venezuela']
pontos = [0] * len(times)

while True:
    r = imprimirMenu()
    if r == 1:
        resultado('Brasil', 'Colombia')
        resultado('Equador', 'Peru')
        ordena(times, pontos)
    elif r == 2:
        pass
    elif r == 3:
        i = 0
        while i < len(times):
            print(times[i],'=',pontos[i])
            i += 1
    elif r == 4:
        pass
    elif r == 5:
        break
    else:
        print('Opcao invaida.')

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Felipe2719 Na função ordena uso um algoritmo de ordenação, existem outros, mas esse é um dos mais simples e se chama Bubble Sort. Se procurar por esse assunto vai encontrar bastante material. Basicamente no loop é feita a comparação de cada valor da lista com o próximo e se esse for menor é feita a troca entre eles.

 

Na função resultado uso input com split para permitir a entrada de dois valores de uma vez e como o retorno é uma lista faço atribuição com base no índice.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Fui fazer agora a parte de tratamento de exceção e tô tendo um problema. Caso caia no index error ou no value error ele fica dando print em loop infinito. Pode me ajudar ?

def resultado(A, B):
  try:
    j = input(A + ' x ' + B + ': ').split()
    while True:
      try:
        pA, pB = int(j[0]), int(j[1])
        if pA<0 or pA>20 or pB<0 or pB>20:
          raise ValueError
        else:
          break
      except IndexError:
        print('Separe os valores por um espaço, EX: 1 1')
      except ValueError:
        print('Digite um número inteiro válido maior que 0 e menor que 20.')
  except KeyboardInterrupt:
    print('Encerrando o programa...')
  else:
    print('O jogo foi {} a {}.'.format(pA,pB))
  
    if pA > pB:
      pontos[times.index(A)] += 3
    elif pA < pB:
      pontos[times.index(B)] += 3
    else:
      pontos[times.index(A)] += 1
      pontos[times.index(B)] += 1
    
        
    

 

Link para o comentário
Compartilhar em outros sites

@Felipe2719 Além de editar a lista teria que mudar os confrontos passados como argumento para a função resultado. Uma forma de deixar o código mais simples quando quiser mudar os times, é passar a posição da lista como argumento para a função em vez do nome do time, assim só a lista terá que ser editada quando quiser trocar os times.

 

if r == 1:
    resultado(times[0], times[1])
    resultado(times[2], times[3])

 

Link para o comentário
Compartilhar em outros sites

@Midori Mas esse novo campeonato ia aproveitar as funções anteriores pra criar uma nova tabela a parte, por exemplo ? ou eu teria que alterar as funções ? 

queria que o usuário digitasse qual campeonato ele quer, pra daí ele começar a por os resultados. 

usar listas de listas seria uma boa ? [ ['Brasil,'Chile'],['Venezuela','Argentina'] ]

Minha professora sugeriu p que eu cadastrasse 2.

 

Mais uma vez obrigado pela paciência.

 

 

Link para o comentário
Compartilhar em outros sites

como faço pra pegar os gols e as derrotas nas estatísticas ? eu pensei em algo assim pra pegar as vitórias e os empates, mas não sei se funciona direito.

Mais uma coisa importante, sabe como posso encaixar ou alterar o programa pra que tenha lista de lista(ou equivalente) e a utilização de arquivo ? o trabalho tá exigindo :(

def estatisticas(times, pontos):
  vitoria = 0
  empate = 0
  
  for t in times:
    input('Digite o nome do seu time:')
    if t in times:
      for p in pontos:
        if p == 3:
          vitoria += 1
          if p == 1:
            empate += 1
  print('{} Vitórias, {} Empates'.format(vitoria,empate) 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Felipe2719 disse:

como faço pra pegar os gols e as derrotas nas estatísticas ? eu pensei em algo assim pra pegar as vitórias e os empates, mas não sei se funciona direito.

Mais uma coisa importante, sabe como posso encaixar ou alterar o programa pra que tenha lista de lista(ou equivalente) e a utilização de arquivo ? o trabalho tá exigindo :(


def estatisticas(times, pontos):
  vitoria = 0
  empate = 0
  
  for t in times:
    input('Digite o nome do seu time:')
    if t in times:
      for p in pontos:
        if p == 3:
          vitoria += 1
          if p == 1:
            empate += 1
  print('{} Vitórias, {} Empates'.format(vitoria,empate) 

 

Se você quiser, eu posso postar o enunciado do meu trabalho aqui pra facilitar. Mas não sei se seria muito abuso da minha parte.

Link para o comentário
Compartilhar em outros sites

@Felipe2719 Acabei me esquecendo de comentar sobre a ordenação no caso de passar a lista com índice como parâmetro. Dessa forma se ordenar as listas antes de terminar as rodadas, os confrontos podem ficar errados. Para evitar isso pode ser feita uma alteração na parte que ordena para só manipular uma cópia das listas, p.ex,

 

def tabela(times, pontos):
    t = len(times)
    T = times.copy()
    P = pontos.copy()
    for i in range(t - 1):
        for j in range(t - i - 1):
            if P[j] < P[j + 1]:
                P[j], P[j + 1] = P[j + 1], P[j]
                T[j], T[j + 1] = T[j + 1], T[j]
    i = 0           
    while i < t:
        print(T[i],P[i])
        i += 1

 

Assim é só chamar essa função na opção 3.

 

1 hora atrás, Felipe2719 disse:

Mais uma coisa importante, sabe como posso encaixar ou alterar o programa pra que tenha lista de lista

A lista de lista você poderia usar para armazenar os times de dois campeonatos, p.ex,

 

listas = [
    ['Brasil','Colombia','Equador','Peru'],
    ['Alemanha', 'Itália', 'França', 'Holanda']
]

 

E na parte que pede o campeonato pode ser assim,

campeonato = int(input('Campeonato: '))
times = listas[campeonato - 1]
pontos = [0] * len(times)

 

1 hora atrás, Felipe2719 disse:

como faço pra pegar os gols e as derrotas nas estatísticas

Para armazenar as estatísticas talvez seja melhor usar um dicionário onde a chave seria o nome do time e o valor uma lista com as estatísticas. Pode postar o enunciado.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

1364325956_Semaaaasdasdasdsad.png.7a60114ba054186136109ee89d212a27.png

1344828655_meudeus.png.5e6a10feed602a9fd75088a641938177.png

 

Peço desculpas pelo desespero, é que preciso entregar o trabalho até amanha as 23:59 e sou completamente incompetente nessa disciplina(já não basta física)

muito obrigado de coração. Se for preciso alterar algo pra se ajustar no enunciado ou nas exigências me avisa por favor.

 

*em relação ao módulo, foi sugerido que eu usasse o datetime pra opção 4, pra mostrar a data dos jogos de acordo com a data atual.

Link para o comentário
Compartilhar em outros sites

@Felipe2719 As funções terão que ser modificadas para se adequar ao que o enunciado pede, já que tem variáveis globais nelas. Acho que fica mais simples usar uma lista de listas que será definida em main com os times e os respectivos pontos, assim,

 

    listas = [
        ['Brasil','Colombia','Equador','Peru'],
        ['Alemanha', 'Italia', 'França', 'Holanda']
    ]
    campeonato = int(input('Campeonato: '))
    times = listas[campeonato - 1]
    times = [times, [0] * len(times)]

 

E as funções vão receber essa lista de listas como parâmetro,

def resultado(listas, iA, iB):
    times = listas[0]
    pontos = listas[1]
    A = times[iA]
    B = times[iB]
    j = input(A + ' x ' + B + ': ').split()
    pA, pB = int(j[0]), int(j[1])
    if pA > pB:
        pontos[times.index(A)] += 3
    elif pA < pB:
        pontos[times.index(B)] += 3
    else:
        pontos[times.index(A)] += 1
        pontos[times.index(B)] += 1
        
def tabela(listas):
    times = listas[0].copy()
    pontos = listas[1].copy()
    t = len(times)
    for i in range(t - 1):
        for j in range(t - i - 1):
            if pontos[j] < pontos[j + 1]:
                pontos[j], pontos[j + 1] = \
                    pontos[j + 1], pontos[j]
                times[j], times[j + 1] = \
                    times[j + 1], times[j]
    i = 0           
    while i < t:
        print(times[i], pontos[i])
        i += 1

 

Nas opções do menu é só passar os confrontos e exibir a tabela, p.ex,

 

if rodada == 1:
    resultado(times, 0, 1)
    resultado(times, 2, 3)
    rodada += 1
elif rodada == 2:
    resultado(times, 0, 3)
...

 

Veja que criei uma variável chamada rodada, isso é dentro do if da opção 1 e o valor dela também pode ser salvo no arquivo. Você só tem que definir o formato do arquivo e se o seu programa terá uma opção para abrir no início, já que por enquanto só dá a opção de escolher entre dois campeonatos.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, Midori disse:

Você só tem que definir o formato do arquivo e se o seu programa terá uma opção para abrir no início, já que por enquanto só dá a opção de escolher entre dois campeonatos.

geralmente eu só utilizo txt. Mas que tipos de variáveis seria interessante salvar no arquivo, além da rodada ?

no enunciado diz pra salvar o estado do programa e permitir que ele seja carregado após salvar, mas não entendi :(

 

 

 

 

Link para o comentário
Compartilhar em outros sites

@Felipe2719 O enunciado pede alguma função com retorno e parâmetro, mas não tem que ser todas. A função menu já tem retorno e a resultado não é necessário, mas dá para deixar a função da ordenação com retorno para não ficar só a do menu que é bem simples. Se estiver usando a função tabela, substitua por esta,

 

def ordena(listas):
    times = listas[0].copy()
    pontos = listas[1].copy()
    t = len(times)
    for i in range(t - 1):
        for j in range(t - i - 1):
            if pontos[j] < pontos[j + 1]:
                pontos[j], pontos[j + 1] = \
                    pontos[j + 1], pontos[j]
                times[j], times[j + 1] = \
                    times[j + 1], times[j]
    return [times, pontos]

 

Aí na opção 3 pode usar o retorno dela para mostrar a tabela,

time, ponto = ordena(times)
i = 0
while i < len(time):
    print(time[i], ponto[i])
    i += 1

 

Sobre a variável __name__ o enunciado menciona um vídeo, então não sei exatamente o que deve ser feito nesse caso. Para o arquivo você pode salvar a variável da rodada, do campeonato escolhido e as listas dos times e pontos. Uma estrutura simples para o arquivo poderia ser com os dados separados por vírgula, p.ex,

 

1,0

Brasil,0

Colombia,0

Equador,0

Peru,0

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...