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
não são aceitos cheques de valores maiores que
, 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:
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
Para
d
dígitos, a gente coloca 5 – d
asteriscos antes.Para
d
dígitos de um número n > 0
, vale:(no caso
Depois fazemos algo como:
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”:
- 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"
- Tratamos os especiais de 10 a 19 primeiro.
- 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)
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”
}
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
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[dz10 + u])
else:
if dz > 0:
partes.append(dezenas_por_extenso[dz])
if u > 0:
partes.append(unidades_por_extenso[u])
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[dz10 + 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 “”)
extenso += " real” + (“es” if n != 1 else “”)
Saída final
print(texto_num)
print(extenso)
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()