(1 ponto) Faça um programa que recebe números inteiros digitados pelo usuário até que
, sem aspas, seja digitado e imprima o menor deles.
Proibido o uso das funções min, sorted, sort e de estruturas iteráveis (por enquanto aprendemos apenas lista e string).
EXEMPLO
Entrada
Saída
1
-10
-1
-10
10
s
Proibido o uso das funções min, sorted, sort e de estruturas iteráveis (por enquanto aprendemos apenas lista e string).
EXEMPLO
| Entrada | Saída |
| 1 | -10 |
| -1 | |
| -10 | |
| 10 | |
| s |
Passo 1
O que o problema pede e o que é fornecido:
- O programa deve receber entradas do usuário uma por vez.
- Cada entrada é ou um número inteiro (por exemplo
, , ) ou a letra (literal, sem aspas). - A leitura termina quando o usuário digita
. - Depois de terminar, o programa deve imprimir o menor dos números inteiros que foram digitados.
- Proibições: não usar as funções
, , e não usar estruturas iteráveis além de lista e string (neste problema não precisamos de listas). - Considerar que o enunciado está bem-formulado (ou seja, haverá pelo menos uma linha com inteiro antes de
, mas o programa que eu vou propor lida também com o caso em que nenhum inteiro foi fornecido).
Passo 2
Ideia geral (explicada passo a passo, sem código ainda):
- Não vamos armazenar todos os números; vamos guardar apenas o menor visto até agora. Isso economiza memória e é simples.
- Precisamos de uma variável que represente “o menor até agora”. Antes de ler qualquer número essa variável não tem valor definido — podemos representá-la como “vazia” (usar
em Python) e, ao ler o primeiro inteiro, inicializá-la com esse inteiro. - Para cada número inteiro
lido, fazemos a comparação: se está vazia (primeiro número) ou se , então atualizamos . - Quando o usuário digitar
, interrompemos a leitura e imprimimos o valor guardado em . - Este método evita funções proibidas e não usa estruturas iteráveis extras.
Passo 3
Detalhando as operações que o programa precisa fazer (controle de fluxo e conversão):
- Repetição: usar um laço que repete até encontrar o sentinela
. Em Python usamos um laço infinito com while True:ebreakquando receber. - Leitura: usar
input()para obter a linha como string estrip()para remover espaços em branco. - Checagem do sentinela: comparar a string lida com
's'. - Conversão: se não for
, converter a string lida para inteiro com int(s). Assumimos entradas válidas (inteiros) conforme o enunciado. - Atualização do mínimo: comparar o inteiro lido com o valor atual de
e atualizar quando necessário. - Impressão: depois do laço, imprimir
(se existir).
Passo 4
Por que inicializar com
é uma boa escolha:
- Alternativa 1 seria inicializar com um número muito grande (por exemplo
), mas isso é frágil e dependente de limites. - Alternativa 2 (usar uma flag booleana
primeiro = True) funciona também, mas usaré mais idiomático e claro: significa “ainda não temos nenhum valor”. - Assim, a atualização fica simples: se
é ou se , então .
Passo 5
Passo a passo do algoritmo aplicado ao exemplo dado (para fixar a ideia):
Entradas (cada linha): ,
,
,
,
.
Entradas (cada linha):
- Antes de começar:
. - Lê
: como , faz . Agora . - Lê
: verifica se . Verdadeiro, então . Agora . - Lê
: verifica se . Verdadeiro, então . Agora . - Lê
: verifica se . Falso, não atualiza. Continua . - Lê
: para o laço e imprime , que é . Isso coincide com o exemplo.
Passo 6
Observações finais e boas práticas:
- O programa proposto lida com espaços em branco porque usamos
strip()na entrada. - Caso nenhuma linha com inteiro seja fornecida (usuário digita
no começo), o programa não imprime nada — isso evita imprimir algum valor inválido. Como o enunciado foi considerado bem-formulado, normalmente haverá pelo menos um inteiro antes de , mas esse comportamento é seguro. - Não usamos
, nem , nem coleções extras: apenas variáveis simples e comparações.
Resposta
menor = None
while True:
s = input().strip()
if s == 's':
break
n = int(s)
if menor is None or n < menor:
menor = n
if menor is not None:
print(menor)