Para evitar fraudes, uma máquina de preenchimento de cheques deve preencher as dezenas não utilizadas no valor numérico com asteriscos. Considerando que na loja X não são aceitos cheques de valores maiores que R , faça um programa que imprimia na tela o valor numérico do cheque e seu valor por extenso.

Passo 1

Beleza, aqui a ideia é fazer um programinha que leia um valor inteiro de um cheque (até R$ 10 000), pinte com asteriscos as “casinhas” à esquerda do número (pra galera não fraudar) e, em seguida, escreva esse valor por extenso em português.
Conteúdo usado:
  • Manipulação de string (para preencher com *).
  • Condicionais (pra garantir que o valor seja ≤ 10000).
  • Conversão de número em extenso (quebra do número em milhares, centenas, dezenas, unidades).

Passo 2

Primeiro, a gente pede ao usuário um número inteiro n. Aí logo em seguida checamos:
se n < 0 ou n > 10000:
    imprimir "Valor não aceito"
    encerrar
Isso é só um if pra garantir que ele não tente passar “20000” ou um valor negativo, beleza?

Passo 3

Agora vamos formatar o número com asteriscos. Supondo que a máquina tenha 5 “casinhas” pros dígitos (de unidades até dezenas de milhar), se o número tiver d dígitos, a gente coloca 5 – d asteriscos antes.
Para d dígitos de um número n > 0, vale:
d = lfloor log10(n)rfloor + 1
(no caso n = 0, consideramos d = 1).
Depois fazemos algo como:
texto_num = "*" * (5 - d) + str(n)
Ex.: se n = 256 então d = 3 e texto_num = "**256".

Passo 4

Bora converter n em extenso. A gente vai quebrar n em:
  • milhares: m = n // 1000
  • resto1 = n % 1000
  • centenas: c = resto1 // 100
  • resto2 = resto1 % 100
  • dezenas: dz = resto2 // 10
  • unidades: u = resto2 % 10
Explico rapidinho a teoria da “conversão em extenso”:
  1. Temos dicionários/preenchimentos para:
    • 1→"um", 2→"dois", …, 9→"nove"
    • 10→"dez", 11→"onze", …, 19→"dezenove"
    • dezenas “redondas”: 2→"vinte", 3→"trinta", …, 9→"noventa"
    • centenas “redondas”: 1→"cem"/“cento”, 2→"duzentos", …, 9→"novecentos"
  2. Tratamos os especiais de 10 a 19 primeiro.
  3. Sempre que juntamos partes (milhar + centena + dezena + unidade) usamos “ e ” conforme a gramática:
    • “dois mil e trezentos e cinco”
    • “mil e dezessete”

Passo 5

Montagem final do extenso (pseudo-fluxo):
lista_partes = []
se m > 0:
    se m == 1: lista_partes.append("mil")
    senão: lista_partes.append(unidades_por_extenso[m] + " mil")
se c > 0:
    se c == 1 e dz == 0 e u == 0:
        lista_partes.append("cem")
    senão:
        lista_partes.append(centenas_por_extenso[c])
se dz*10 + u entre 10 e 19:
    lista_partes.append(teens_por_extenso[dz*10 + u])
senão:
    se dz > 0:
        lista_partes.append(dezenas_por_extenso[dz])
    se u > 0:
        lista_partes.append(unidades_por_extenso[u])
extenso = " e ".join(lista_partes) + " real" + ("es" se n > 1 else "")

Passo 6

d = 1 if n == 0 else int(math.log10(n)) + 1
texto_num = “*” * (5 - d) + str(n)

Dicionários básicos

unidades_por_extenso = {
1:“um”,2:“dois”,3:“três”,4:“quatro”,5:“cinco”,
6:“seis”,7:“sete”,8:“oito”,9:“nove”
}
teens_por_extenso = {
10:“dez”,11:“onze”,12:“doze”,13:“treze”,14:“catorze”,
15:“quinze”,16:“dezesseis”,17:“dezessete”,18:“dezoito”,19:“dezenove”
}
dezenas_por_extenso = {
2:“vinte”,3:“trinta”,4:“quarenta”,5:“cinquenta”,
6:“sessenta”,7:“setenta”,8:“oitenta”,9:“noventa”
}
centenas_por_extenso = {
1:“cento”,2:“duzentos”,3:“trezentos”,4:“quatrocentos”,
5:“quinhentos”,6:“seiscentos”,7:“setecentos”,8:“oitocentos”,9:“novecentos”
}

Quebra em partes

m = n // 1000
resto1 = n % 1000
c = resto1 // 100
resto2 = resto1 % 100
dz = resto2 // 10
u = resto2 % 10

Montagem do extenso

partes = []
if m > 0:
partes.append(“mil” if m == 1 else unidades_por_extenso[m] + " mil")
if c > 0:
if c == 1 and dz == 0 and u == 0:
partes.append(“cem”)
else:
partes.append(centenas_por_extenso[c])
if 10 <= dz10 + u <= 19:
partes.append(teens_por_extenso[dz
10 + u])
else:
if dz > 0:
partes.append(dezenas_por_extenso[dz])
if u > 0:
partes.append(unidades_por_extenso[u])
extenso = " e “.join(partes)
extenso += " real” + (“es” if n != 1 else “”)

Saída final

print(texto_num)
print(extenso)

Resposta

Segue o pseudocódigo completo:
n = int(input("Digite valor do cheque (0–10000): "))
if n < 0 or n > 10000:
    print("Valor não aceito")
    exit()

Exercícios relacionados