Ir ao conteúdo
  • Cadastre-se

Python Desenvolvimento programa em python


Ir à solução Resolvido por Midori,

Posts recomendados

É porque o programa precisa ser flexível e possa ser utilizado como módulo (foi isso que entendi).

Seria algo como: 

if __name__ == '__main__':
  print(ordena([['Brasil','Colombia','Argentina'],['Chile','Peru','Venezuela']])
  print(ordena([['Italia','França','Alemanha'],['Portugal','Holanda','Espanha']])
   ...
  

Por isso q tava precisando de mais funções que retornam valores, mas de fato não precisam ser todas (ainda bem)

 

Pode me ajudar na parte das estatísticas ? sei que tá chato, mas nesse trab to igual uma ameba e não consigo fazer quase nada

A parte do dicionário eu entendi, mas não tô conseguindo fazer p pegar a lista com as estatísticas.

Link para o comentário
Compartilhar em outros sites

@Felipe2719 Para a estatística se quiser pegar p.ex a quantidade de vitórias, empates e derrotas, pode aproveitar a função resultado e passar um dicionário como parâmetro assim,

 

import numpy

def resultado(listas, iA, iB, estatistica):
    times = listas[0]
    pontos = listas[1]
    A = times[iA]
    B = times[iB]
    if not A in estatistica:
        estatistica[A] = [0, 0, 0]
    if not B in estatistica:
        estatistica[B] = [0, 0, 0]

    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

    estatistica[A] = numpy.add(
        estatistica[A],[pA > pB,pA == pB,pA < pB]
    )
    estatistica[B] = numpy.add(
        estatistica[B],[pB > pA,pB == pA,pB < pA]
    )

 

E para mostrar uma das informações é só usar o índice, p.ex para pegar as vitórias do Brasil,

print('Vitórias do Brasil =', estatistica['Brasil'][0])

 

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

esse  print vai direto na função resultado ?

se for fazer desse jeito então, eu ignoro a opção '2',e a opção 1 passa a executar essa parte tb né ?

eu tava pensando em pedir pro usuário digitar o nome do time, pra depois ele executar essa parte(na opção 2)

e por último, pode me explicar o porque da utilização do módulo numpy ?

Link para o comentário
Compartilhar em outros sites

O print é só para mostrar a estatística depois passar como argumento para a função. A opção 1 deve ser usada e serve para informar os confrontos. A opção 2 é que mostra as estatísticas como no exemplo que postei. Se quiser pode pedir para o usuário informar o nome do time, mas acho melhor só listar os times da lista e já mostrar tudo. Veja que no meu exemplo é a função resultado que cria as chaves com os times no dicionário, mas seu programa também poderia criar as chaves no início do programa principal e depois a função só faria a adição.

 

O módulo numpy é para usar a função add que efetua a soma entre duas listas, só faltou converter para lista com tolist(),

 

estatistica[A] = numpy.add(
    estatistica[A],[pA > pB,pA == pB,pA < pB]
).tolist()
    
estatistica[B] = numpy.add(
    estatistica[B],[pB > pA,pB == pA,pB < pA]
).tolist()

 

Mas se não for permitido ou não quiser usar essa função pode somar assim,

    if pA > pB:
        pontos[times.index(A)] += 3
        estatistica[A][0] += 1
        estatistica[B][2] += 1
    elif pA < pB:
        pontos[times.index(B)] += 3
        estatistica[B][0] += 1
        estatistica[A][2] += 1
    else:
        pontos[times.index(A)] += 1
        pontos[times.index(B)] += 1
        estatistica[A][1] += 1
        estatistica[B][1] += 1

 

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

@Midori não tem diferença, só queria entender mesmo pra poder explicar no trabalho, assim como todas as outras funções.

a ideia de imprimir todos as informações é melhor mesmo obrigado

1 hora atrás, Midori disse:

A opção 2 é que mostra as estatísticas como no exemplo que postei

é isso que não to entendendo, porque se eu boto as estatísticas como parâmetro  da função resultado como você fez, fica pedindo p eu colocar um argumento adicional na opção 1 

como vai ficar a opção 2 na função main ? se for muito óbvio me desculpa 😭

 

Na parte de arquivos

 

 1,0

Brasil,0

Colombia ,0

Equador,0

Peru,0

1,1

França,0

Alemanha,0

Italia,0

Espanha,0

 

e assim por diante ?

e pra abrir, seria com o open(arquivo,'r') no começo do programa ? Creio que só falta essa parte pra eu fechar. Vou descartar a opção 4, que só botei pra encaixar algum módulo.

Link para o comentário
Compartilhar em outros sites

A opção 1 só vai pedir o resultado das partidas, use a função dessa forma,

 

resultado(times, 0, 1, estatistica)
resultado(times, 2, 3, estatistica)

 

E na opção 2 é só mostrar os valores,

print("TIME".ljust(10) + 'V E D')
for E in estatistica.items():
    print(E[0].ljust(10) +\
        str(E[1][0]) +' '+\
        str(E[1][1]) +' '+\
        str(E[1][2])
    )

Usei ljust para deixar tudo alinhado para 10 caracteres nos nomes dos times.

 

Uma coisa que pode ser feita também é criar as chaves do dicionário no início do programa. Assim no caso de escolher a opção 2 antes de registrar as rodadas não fica sem nada.

estatistica = {}
for T in times:
    estatistica[T] = [0, 0, 0]

 

Sobre o arquivo ele sempre vai ter 5 linhas onde a primeira tem a rodada e o campeonato e as outras os 4 times com as respectivas informações.

Link para o comentário
Compartilhar em outros sites

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

import numpy

def resultado(listas,iA,iB,estatistica):
    times = listas[0]
    pontos = listas[1]
    A = times[iA]
    B = times[iB]
    if not A in estatistica:
        estatistica[A] = [0, 0 ,0]
    if not B in estatistica:
        estatistica[B] = [0 ,0 ,0]
    try:
        while True:
            j = input(A + ' x ' + B + ': ').split()
            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 válido, maior que 0 e menor/igual a 20.')
    except KeyboardInterrupt:
        print('Encerrando...')
    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

        estatistica[A] = numpy.add(
                estatistica[A], [pA>pB,pA==pB,pA<pB]
                ).tolist()
        estatistica[B] = numpy.add(
                estatistica[B],[pB>pA,pB==pA,pB<pA]
                ).tolist()
        
def ordena(listas):
    times = lista[0].copy()
    pontos = lista[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]

def main():
    open(arquivo,'r') ???
   
    listas = [['Brasil','Colombia','Equador','Peru'],['Alemanha','Italia','França','Holanda']]

    campeonato = int(input('Campeonato: '))

    times = listas[campeonato - 1]

    times = [times, [0]*len(times)]

    estatistica = {}
    for T in times:
        estatistica[T] = [0, 0, 0]
    while True:
        r = imprimirMenu()
        if r == 1:
            if rodada == 1:
                resultado(times,0,1,estatistica)
                resultado(times,2,3,estatistica)
                rodada += 1
            elif rodada== 2:
                resultado(times,0,2,estatistica)
                resultado(times,1,3,estatistica)
        elif r == 2:
            print('TIME'.ljust(10) + 'V E D')
            for E in estatistica.items():
                print(E[0].ljust(10)+\
                        str(E[1][0]) +' '+\
                        str(E[1][1]) +' '+\
                        str(E[1][2]))
        elif r == 3:
            time, ponto = ordena(times)
            i = 0
            while i <len(time):
                print(time[i],ponto[i])
                i+=1
        elif r == 4:
            pass
        elif r == 5:
            break
        else:

Tá dando o erro typeError: unhashable type: 'list'

na parte do estatistica[T] = [0, 0, 0]

 

já que o arquivo são 5 linhas, eu tenho que criar mais de um pra adicionar mais campeonatos ? não entendii

e ainda sobre ele, pra implementar ele é só fazer isso ?? e depois fechar ele no final ?

 

Além disso, pode conferir o código pra mim pra ver se eu não esqueci de algo ?

prometo que vou parar de pertubar jaja kkkkk

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@Felipe2719 Só é necessário um arquivo com as 5 linhas. Entendi que a finalidade do arquivo é salvar o estado do programa para continuar de onde parou. Então se tiver informado a rodada 1 e sair, da próxima que vez que rodar o programa tem que abrir o arquivo para pegar o que já foi preenchido e continuar. Fiz algumas alterações e coloquei a parte que salva e lê o arquivo,

 

import numpy

def menu():
    opções = 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 - Salvar\n'
        '5 - Sair do programa\n: '
    ))
    return opções

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]
    
def resultado(listas, iA, iB, estatistica):
    times = listas[0]
    pontos = listas[1]
    A, B = times[iA], 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

    estatistica[A] = numpy.add(
        estatistica[A],[pA > pB,pA == pB,pA < pB]
    ).tolist()
    estatistica[B] = numpy.add(
        estatistica[B],[pB > pA,pB == pA,pB < pA]
    ).tolist()

def main():
    listas_times = [
        ['Brasil','Colombia','Equador','Peru'],
        ['Alemanha', 'Italia', 'França', 'Holanda']
    ]
    
    opcao = int(input(
        '1 - Sul-americano\n'
        '2 - Europeu\n'
        '3 - Abrir Arquivo\n: '
    ))
    rodada = 1
    estatistica = {}
    tabela = []
    if opcao < 3:
        times = listas_times[opcao - 1]
        pontos = [0] * len(times)
        tabela = [times, pontos]
        for time in times:
            estatistica[time] = [0, 0, 0]
    else:
        arquivo = open('arquivo.txt', 'r')
        rodada = int(arquivo.readline())
        times = []
        pontos = []
        for linha in arquivo:
            vitorias = int(linha.split(',')[2])
            empates = int(linha.split(',')[3])
            derrotas = int(linha.split(',')[4])
            time = linha.split(',')[0]
            times.append(time)
            pontos.append(int(linha.split(',')[1]))
            estatistica[time] = [vitorias,empates,derrotas]
        tabela = [times, pontos]
        arquivo.close()
        
    while True:
        opcao = menu()
        if opcao == 1 and rodada <= 3:
            print('RODADA ', rodada)
            if rodada == 1:
                resultado(tabela, 0, 1, estatistica)
                resultado(tabela, 2, 3, estatistica)
                rodada += 1
            elif rodada == 2:
                resultado(tabela, 0, 2, estatistica)
                resultado(tabela, 1, 2, estatistica)
                rodada += 1
            elif rodada == 3:
                resultado(tabela, 0, 3, estatistica)
                resultado(tabela, 2, 1, estatistica)
                rodada += 1
            else:
                print('Fim do campeonato')
        elif opcao == 2:
            print("TIME".ljust(10) + 'V E D')
            for E in estatistica.items():
                print(E[0].ljust(10) +\
                    str(E[1][0]) +' '+\
                    str(E[1][1]) +' '+\
                    str(E[1][2])
                )
        elif opcao == 3:
            times, pontos = ordena(tabela)
            i = 0
            while i < len(times):
                print(times[i], pontos[i])
                i += 1
        elif opcao == 4:
            arquivo = open('arquivo.txt','w')
            arquivo.write(str(rodada)+'\n')
            i = 0
            while i < len(tabela[0]):
                time = tabela[0][i]
                ponto = str(tabela[1][i])
                vitorias = str(estatistica[time][0])
                empates = str(estatistica[time][1])
                derrotas = str(estatistica[time][2])
                arquivo.write(
                    time+','+
                    ponto+','+
                    vitorias+','+
                    empates+','+
                    derrotas+'\n'
                )
                i += 1
            arquivo.close()
        elif opcao == 5:
            break

main()

 

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

minha sinceras desculpas por ser um tanto inconveniente e insistir na burrice muitas vezes;

eu admiro demais a sua paciência kkk

muito obrigado de coração, tenho nem palavras pra te agradecer. você é uma pessoa maravilhosa, saiba disso 🥰

carregou meu semestre nas costas praticamente haha

 

te amoooooooo

tudo de bom pra voce, que seja recompensado em dobro !!!

obrigado.

 

 

 

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...