Fórum PiR2
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

(OBI2018) - Python

2 participantes

Ir para baixo

Resolvido (OBI2018) - Python

Mensagem por Mat209880980823 Dom 04 Abr 2021, 13:53

Todo mundo está jogando um novo game de realidade aumentada no celular, com batalhas entre monstrinhos! Nas primeiras fases do jogo as batalhas são bem simples, mas ainda assim bastante divertidas. Dois jogadores vão escolher um monstrinho cada, na sua coleção de monstrinhos. Cada monstrinho tem um tipo de ataque e um tipo de defesa, que são identificados por números naturais. A regra da batalha, que consiste em cada monstrinho usar seu respectivo ataque ao mesmo tempo, é que se o número da defesa de um monstrinho é igual ao número do ataque do seu oponente, então ele não sofre nenhum dano; caso contrário, se o número da defesa dele é diferente do ataque do oponente, então ele sofre dano total e desmaia! Por exemplo, o monstrinho do primeiro jogador tem o ataque 21 e a defesa 7; enquanto que o monstrinho do segundo jogador tem o ataque 7 e a defesa 12. Nesse caso, o primeiro jogador vence, pois não desmaiou, enquanto que o segundo jogador desmaiou. Assim, o resultado da batalha, que seu programa deve determinar, pode ser:

• Jogador 1 vence: se o jogador 1 não desmaia e o jogador 2 desmaia;
• Jogador 2 vence: se o jogador 2 não desmaia e o jogador 1 desmaia;
• Empate: em qualquer caso contrário; quer dizer, os dois desmaiam, ou nenhum desmaia.

Entrada Simplificada do Exemplo 

A primeira linha da entrada contém um inteiro A1 indicando o ataque do primeiro jogador. A segunda linha contém um inteiro D1 indicando a defesa do primeiro jogador. A terceira linha contém um inteiro A2 representando o ataque do segundo jogador. A quarta, e última linha, contém um inteiro D2 representando a defesa do segundo jogador.

Saída Simplificada do Exemplo

A Saída simplificada imprime uma linha contendo um inteiro, 1 ou 2, indicando qual jogador ganhou a batalha. Se a batalha resultou em empate é impresso -1.

Restrições
• 1 ≤ A1 ≤ 100
• 1 ≤ D1 ≤ 100
• 1 ≤ A2 ≤ 100
• 1 ≤ D2 ≤ 100

a) Defina as entradas e as saídas de testes diferentes das apresentadas no exemplo. Lembre dos casos críticos e delimitações.


b) Implemente o programa, em Pyhton, que realiza essa tarefa e que após a primeira execução pergunte se o usuário deseja fornecer uma nova entrada ou não. No caso da resposta ser ‘sim’ deverá ser solicitado outra entrada.


c) Faça uma interface que explicando para que serve o programa, bem como pedidos de entradas de dados e exibição da saída de forma compreensível por qualquer usuário, você deverá melhorar a entrada e a saída simplificada. Lembre dos casos críticos e delimitações; por exemplo, no caso de fornecerem entradas não válidas deve enviar uma mensagem de Erro, solicitando a entrada correta.


d) O programa deve estar comentado com a explicação do que cada conjunto de instruções executam a ação descrita no algoritmo relacionado a implementação.

Mat209880980823
iniciante

Mensagens : 23
Data de inscrição : 26/08/2020

Ir para o topo Ir para baixo

Resolvido Re: (OBI2018) - Python

Mensagem por PoH Qui 15 Abr 2021, 10:34

Vou resolver até a parte que seria necessário na OBI, os outros itens darei dicas de como prosseguir.

a) Nesse item deve-se dar um exemplo de caso de teste para esse problema, destacando as entradas e as saídas. Lembrando que em geral na computação todo algoritmo é composto por três partes: Entrada de Dados, processamento e saída:

Possível caso de teste:

Entrada: 
40
20
10
3
-----------
Saída:
-1

Como você pode observar temos um empate já que o jogador 1 foi capaz de desmaiar o jogador 2 (ataque 1 foi diferente de defesa 2) e o jogador 2 também.

b) Vamos implementar o programa passo a passo para que você entenda:

#ENTRADA

a1 = int(input())
d1 = int(input())
a2 = int(input())
d2 = int(input())

No Python, a esquerda da igualdade temos os nomes das variáveis: a1 (ataque do jogador 1), d1 (defesa do jogador 1), a2 (ataque do jogador 2), d2( defesa do jogador 2). Logo em seguida temos o sinal de atribuição = que é usado para se atribuir um valor de uma variável. A função input() é usada para ler dados na entrada padrão (o teclado) e a função int() para converter esses dados para o tipo inteiro já que a função input() retorna um string.

#PROCESSAMENTO

#JOGADOR 1 VENCE

if a1 != d2 and d1 == a2:
       #SAIDA
       print(1)

#JOGADOR 2 VENCE

elif a2 != d1 and d2 == a1:
      #SAIDA
      print(2)

#EMPATE

else:
      #SAIDA
      print(-1)

Agora vamos ao processamento, inicialmente temos o caso em que o jogador 1 vence: A instrução if significa "se", é uma estrutura condicional que executa determinado conjunto de instruções apenas se uma condição for verdadeira. Neste caso a condição é: se o ataque do jogador 1 é diferente da defesa do jogado 2 E se a defesa do jogador 1 é igual ao ataque do jogador 2. O operador lógico "and" torna a condição verdadeira somente se ambas as proposições forem verdadeiras também. Perceba que para o jogador 1 vencer não basta que ele seja capaz de desmaiar o jogador 2, é necessário, também, que ele não seja desmaiado pelo mesmo.

O mesmo vale para o caso em que o jogador 2 vence. A instrução elif (else + if (se não, se)) tem o mesmo funcionamento da instrução if.

Se nada disso acontecer, então temos o caso do empate. Por isso o else (se não) foi usado.

A saída são justamente os trechos de código que são executados caso as condições de algumas dessas estruturas se cumpram. Utilizei a função print() que imprime dados na saída padrão (linha de comando).

Código final:

# OBI 2018 PYTHON

#ENTRADA

a1 = int(input())
d1 = int(input())
a2 = int(input())
d2 = int(input())

#PROCESSAMENTO

#JOGADOR 1 VENCE

if a1 != d2 and d1 == a2:
       #SAIDA 
       print(1)

#JOGADOR 2 VENCE

elif a2 != d1 and d2 == a1:
        #SAIDA
        print(2)

#EMPATE

else:
       #SAIDA
       print(-1)

Esse o core do programa, mas podemos fazer alguma melhorias como o próprio enunciado indica. Para realizar essa segunda tarefa estude a estrutura de repetição "while" e o tipo primitivo "str" (string). Você deve ser capaz de colocar todas essas instruções acima em um loop "infinito" que cessa quando a palavra "sim" não é digitada.

c) Caso se trata de uma interface gráfica (imagino que não seja o caso kk) pesquise sobre a biblioteca tkinter. No caso de uma interface em linha de comando basta usar a função print com algumas formatações como o sistema de cores (\033) e as tabulações (\t) para realizar o que se pede: Mostrar uma explicação do programa na tela. Para melhorar a saída e a entrada basta especificar o que se pede, e adicionar uma mensagem a saída.

Para fazer o tratamento de erros de entrada de dados, pode-se usar nesse caso estruturas condicionais ou mesmo, se quiser algo mais trabalhado, use a estrutura try com algumas funções como a ".isnumeric()" ou algo assim, não me lembro bem o Google pode ajudar nessa parte. Aconselho também a criação de funções para isso, para que esse tratamento posso ser aproveitado ao longo de outros possíveis momentos do programa, isto é uma boa prática.

d) Aqui são os comentários, o comentário no Python é com o símbolo "#" tudo que é escrito numa linha que se inicia com tal símbolo é ignorado pelo interpretador.


É isso, qualquer erro no código ou na explicação, por favor não deixe de me avisar. Bons estudos!  Cool

PoH
iniciante

Mensagens : 5
Data de inscrição : 06/04/2021

Henrique de Cristo gosta desta mensagem

Ir para o topo Ir para baixo

Ir para o topo


 
Permissão neste fórum:
Você não pode responder aos tópicos