“Cada jogador escolhe um valor entre dois ou um; ao som de um comando (geralmente um dos competidores anuncia em voz alta “Dois ou... Um! ”), todos os participantes mostram o valor escolhido, utilizando uma das mãos: se o valor escolhido foi um, o competidor mostra o dedo indicador estendido; se o valor escolhido foi dois, mostra a mão com exatos dois dedos estendidos. O ganhador é aquele que tiver escolhido um valor diferente de todos os outros; se não há um jogador com valor diferente de todos os outros (por exemplo todos os jogadores escolhem dois, ou um grupo de jogadores escolhe dois e outro grupo escolhe um), não há ganhador. ”
André, Carlos e Pietro são grandes amigos e jogam Dois ou Um a toda hora: para determinar quem será o motorista da rodada, quem vai pagar a conta, etc. Jogam tanto que resolveram fazer um aplicativo de celular para jogar. Como não sabem programar, dividiram as tarefas entre amigos que sabem, inclusive você. Dados os três valores escolhidos por André, Carlos e Pietro, cada valor dois ou um, escreva um algoritmo que determina se há um ganhador, e nesse caso determina quem é o ganhador.
O algoritmo deve receber como entrada, três valores inteiros que serão armazenados nas variáveis A, C e P indicando os valores escolhidos por André, Carlos e Pietro, respectivamente.
O algoritmo deverá produzir uma única saída, imprimindo apenas um caractere. Se o vencedor for André, deve-se imprimir a letra “A”, na tela; se o vencedor for Carlos, é preciso mostrar o caractere “C”, na tela; se Pietro for o ganhador, então deve-se imprimir “P”; por fim, se não houver vencedor, deve-se imprimir um asterisco, “X”, na tela.
Deve-se considerar que o usuário é leigo, e nem sempre irá digitar ou o número dois (2) ou o número um (1). É preciso que o algoritmo trate as entradas que não estiverem dentro do padrão de dois ou um, solicitando ao usuário que insira um novo valor, caso ele não insira um dado válido (número 2 ou número 1). Considere que o usuário tem acesso apenas ao teclado numérico, sendo impossível inserir caracteres alfabéticos, acentos ou qualquer outro dado diferente de números.
Somente após validados os dados informados pelo usuário, o algoritmo deve apresentar o resultado e, consequentemente, quem foi vitorioso, de acordo com a seguinte tabela de exemplos de entradas e saídas:
Caso de Teste Entradas Saída Correspondente
A
(André) C
(Carlos) P
(Pietro) Ganhador:
1º 1 1 1 “X”
2º 1 1 2 “P”
3º 1 2 1 “C”
4º 1 2 2 “A”
5º 2 1 1 “A”
6º 2 1 2 “C”
7º 2 2 1 “P”
8º 2 2 2 “X”
Soluções para a tarefa
Resposta:
A resposta abaixo é bastante elegante e complexa, garantia de uma nota 10. Algumas especificações técnicas:
- Resposta realizada com o compilador Portugol Studio
- Foi utilizada leitura em formato alfanumérico (e não numérico), para gerenciar tratatamento de erros, caso o usuário insira uma entrada não numérica, superando portanto a restrição colocada pelo enunciado de que só serão incluídos números. Veja que mesmo utilizando-se um teclado apenas com números, havia outras questões que necessitavam tratamento, como por exemplo a utilização de separador decimal incorreta (vírgula no lugar de ponto) iria gerar mensagens de erro se não fosse feito o tratamento adequado.
- Utilizei uma função (método) para captar a jogada, evitando repetição de código para cada jogador
- Utilizada variável booleana (lógica) para armazenar as entradas (2 ou 1), economizando memória de execução
- As condições se/senão utilizam o mínimo possível de testes, sempre excluindo alternativas já apresentadas, ao invés de ficar repetindo vários "se" e fazendo um novo teste para cada resultado possível, economizando assim tempo de execução.
Explicação:
programa
{
funcao inicio()
{
logico andre=levalor("André"); // Declara as variáveis e lê os valores usando a função levalor
logico carlos=levalor("Carlos"); // usei variavel booleanda para economia de memória
logico pietro=levalor("Pietro"); // Foi usada seguinte convenção: 1 = falso, 2 = verdadeiro
se ((andre == carlos) e (carlos == pietro)) escreva("X") // todos jogaram mesmo número
senao se (andre == carlos) escreva("P") // pietro foi o unico diferente por exclusão
senao se (pietro == carlos) escreva("A") // andré foi o único diferente por exclusão
senao escreva("C") // desnecessário testar a única opção possível
}
funcao logico levalor(cadeia nome) // Este método lê o input de teclado, fazendo o tratamento de erros
{ // esta função recebe o nome do usuário, e retorna o valor jogado para main
cadeia entrada; // utilizei variável tipo string para evitar tratar entradas inválidas não-numéricas
enquanto (verdadeiro) // loop infinito até ser inserido um valor válido
{
escreva("Digite a jogada do usuário ",nome,": "); // solicita entrada de teclado ao usuário
leia(entrada); // armazena variável temprária para leitura do input do teclado
se (entrada == "1") retorne falso // digitou 1; retorna conforme convenção da linha 7.
senao se (entrada == "2") retorne verdadeiro; // digitou 2; retorna conforme convenção da linha 7
escreva("\nEntrada inválida. As únicas opções válidas são 1 ou 2.\n"); // digitou entrada inválida
}
retorne falso; // Código inatingível. Colocado para atender a necessidade do compilador de ter sempre um retorno.
}
}