Introdução a Programação com Python: Strings, Formatação e Contratos I/O
16 exercícios com foco em leitura de enunciado, precisão de formato e validação de saída
Este roteiro não é só “rodar código”: é treino de método. Cada exercício precisa ser resolvido com contrato I/O claro, processamento justificável e saída no formato exato.
Se você consegue explicar por que usou cada operação de string ou cálculo numérico, então você saiu do modo tentativa e erro e entrou no modo raciocínio técnico.
O que a questão pede
você precisa armazenar 3 linhas “exatamente” em uma única variável string (com quebras de linha preservadas).
Conceito cobrado
texto multilinha pode ser escrito com aspas triplas (mais simples) ou com '\n' entre linhas.
Estrutura dos dados
Entrada: nenhuma.
Saída: 3 linhas (o cabeçalho impresso).
Como pensar
O enunciado quer uma única string contendo 3 linhas. Armazene o texto inteiro primeiro; só depois imprima. Se você usar 3 print() separados, resolve a saída, mas não a exigência de manter tudo em uma variável.
Como validar
Ao imprimir, o console deve mostrar exatamente 3 linhas: Nome do módulo..., Data de criação... e Descrição.... Se tudo sair em uma linha só ou se você depender de 3 strings independentes, o contrato falhou.
Tabela de Evidência
- Leitura: nenhuma.
- Decisão no código: texto multilinha pode ser escrito com aspas triplas (mais simples) ou com '\n' entre linhas.
- Evidência: saída final no formato exato (3 linhas (o cabeçalho impresso).).
Variáveis-chave
cabecalho
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Fazer 3 prints separados (vira 3 strings soltas, não “uma única string armazenada”). / Perder a quebra de linha (colocar tudo em uma linha só).
cabecalho = """Nome do módulo: Módulo de Vendas Diretas
Data de criação: 15/03/2024
Descrição: Responsável pelo registro e acompanhamento das vendas da equipe externa."""
print(cabecalho)O que a questão pede
combinar duas strings para formar um identificador.
Conceito cobrado
concatenação de strings usa o operador +.
Estrutura dos dados
Entrada: nenhuma (dados definidos em variáveis).
Saída: 1 linha (SKU completo).
Como pensar
Há duas partes fixas e nenhuma regra extra de separador. O caminho é juntar prefixo e número exatamente nessa ordem e guardar o resultado em sku.
Como validar
Com ELT e 12345, o programa deve imprimir ELT12345. Qualquer espaço, hífen ou barra extra quebra o formato.
Tabela de Evidência
- Leitura: nenhuma (dados definidos em variáveis).
- Decisão no código: concatenação de strings usa o operador +.
- Evidência: saída final no formato exato (1 linha (SKU completo).).
Variáveis-chave
prefixonumero_seriesku
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
prefixo = "ELT"
numero_serie = "12345"
sku = prefixo + numero_serie
print(sku)O que a questão pede
repetir um caractere N vezes para gerar uma linha.
Conceito cobrado
em Python, string * inteiro repete a string.
Estrutura dos dados
Entrada: 2 linhas: (1) um caractere, (2) um inteiro positivo (comprimento).
Saída: 1 linha: o caractere repetido exatamente “comprimento” vezes.
Como pensar
Converta o comprimento para inteiro antes da repetição. Depois use o caractere como unidade e repita exatamente N vezes com *.
Como validar
Entrada - e 5 gera -----. Teste também * e 1; a saída deve ser *.
Tabela de Evidência
- Leitura: 2 linhas: (1) um caractere, (2) um inteiro positivo (comprimento).
- Decisão no código: em Python, string * inteiro repete a string.
- Evidência: saída final no formato exato (1 linha: o caractere repetido exatamente “comprimento” vezes.).
Variáveis-chave
caracterecomprimentolinha
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Não converter para int: sem int(), não dá para repetir corretamente. / Digitar mais de um caractere (o programa repete “o texto todo”).
caractere = input()
comprimento = int(input())
linha = caractere * comprimento
print(linha)O que a questão pede
imprimir a mensagem original com confirmação e depois imprimir a versão com maiúsculas/minúsculas invertidas.
Conceito cobrado
swapcase() troca maiúscula ↔ minúscula em cada letra.
Estrutura dos dados
Entrada: 1 linha (mensagem do usuário).
Saída: 2 linhas:
Como pensar
Há duas saídas relacionadas ao mesmo texto. Leia a mensagem uma vez, reaproveite-a na confirmação literal e só depois aplique swapcase() para gerar a segunda linha.
Como validar
Se a entrada for PyThOn, a 1ª linha deve ser Mensagem recebida com sucesso: PyThOn e a 2ª pYtHoN.
Tabela de Evidência
- Leitura: 1 linha (mensagem do usuário).
- Decisão no código: swapcase() troca maiúscula ↔ minúscula em cada letra.
- Evidência: saída final no formato exato (2 linhas:).
Variáveis-chave
mensagem
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Usar upper() ou lower() achando que “inverte” (na verdade força tudo para um lado só).
mensagem = input()
print("Mensagem recebida com sucesso: " + mensagem)
print(mensagem.swapcase())O que a questão pede
aplicar transformações em strings e depois concatenar no formato exigido.
Conceito cobrado
- upper(): tudo maiúsculo
Estrutura dos dados
Entrada: nenhuma obrigatória (pode usar variáveis como no exemplo do enunciado).
Saída: 3 linhas:
Como pensar
Faça cada transformação separadamente: upper() no nome completo, capitalize() no crachá e só então monte o ID com ---. Separar as etapas ajuda a enxergar se o erro está na transformação ou na concatenação.
Como validar
Com joão silva pereira e joão, as 3 saídas esperadas são JOÃO SILVA PEREIRA, João e João---JOÃO SILVA PEREIRA.
Tabela de Evidência
- Leitura: nenhuma obrigatória (pode usar variáveis como no exemplo do enunciado).
- Decisão no código: - upper(): tudo maiúsculo
- Evidência: saída final no formato exato (3 linhas:).
Variáveis-chave
nome_completonome_crachanome_completo_formatadonome_cracha_formatadoid_seguranca
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
nome_completo = "joão silva pereira"
nome_cracha = "joão"
nome_completo_formatado = nome_completo.upper()
nome_cracha_formatado = nome_cracha.capitalize()
id_seguranca = nome_cracha_formatado + "---" + nome_completo_formatado
print(nome_completo_formatado)
print(nome_cracha_formatado)
print(id_seguranca)O que a questão pede
criar variáveis booleanas para cada critério e exibir claramente.
Conceito cobrado
- "x" in senha verifica presença do caractere
Estrutura dos dados
Entrada: 1 linha (senha do usuário).
Saída: várias linhas (cada uma indicando True/False para um critério).
Como pensar
Quebre a verificação em perguntas pequenas: tem @? tem !? tem #? é só letra minúscula? é só letra maiúscula? Cada pergunta vira uma variável booleana.
Como validar
Teste abc@123: a linha de @ deve sair True e as verificações de "apenas letras" devem sair False. Teste também senha; sem símbolos e com Apenas letras minúsculas? True.
Tabela de Evidência
- Leitura: 1 linha (senha do usuário).
- Decisão no código: - "x" in senha verifica presença do caractere
- Evidência: saída final no formato exato (várias linhas (cada uma indicando True/False para um critério).).
Variáveis-chave
senhatem_arrobatem_exclamacaotem_cerquilhaapenas_minusculasapenas_maiusculas
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
senha = input()
tem_arroba = "@" in senha
tem_exclamacao = "!" in senha
tem_cerquilha = "#" in senha
apenas_minusculas = senha.isalpha() and senha.islower()
apenas_maiusculas = senha.isalpha() and senha.isupper()
print("Tem '@'?", tem_arroba)
print("Tem '!'?", tem_exclamacao)
print("Tem '#'?", tem_cerquilha)
print("Apenas letras minúsculas?", apenas_minusculas)
print("Apenas letras maiúsculas?", apenas_maiusculas)O que a questão pede
medir o tamanho total (prefixo + mensagem + sufixo) e comparar com 160.
Conceito cobrado
- len(texto) conta caracteres
Estrutura dos dados
Entrada: nenhuma (mensagens em variáveis).
Saída: 2 linhas (tamanho total e diferença para 160).
Como pensar
Some os comprimentos do prefixo, da mensagem e do sufixo antes de comparar com 160. Depois interprete o sinal da diferença: positivo ainda cabe, negativo já excedeu.
Como validar
Se a diferença final for 12, ainda cabem 12 caracteres. Se sair -12, a mensagem passou do limite em 12.
Tabela de Evidência
- Leitura: nenhuma (mensagens em variáveis).
- Decisão no código: - len(texto) conta caracteres
- Evidência: saída final no formato exato (2 linhas (tamanho total e diferença para 160).).
Variáveis-chave
mensagem_candidataprefixo_padraosufixo_padraotamanho_totaldiferenca_limite
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
mensagem_candidata = "Desconto exclusivo para você! Válido por tempo limitado."
prefixo_padrao = "Voz Digital: "
sufixo_padrao = " Acesse nosso site para detalhes."
tamanho_total = len(prefixo_padrao) + len(mensagem_candidata) + len(sufixo_padrao)
diferenca_limite = 160 - tamanho_total
print("Tamanho total:", tamanho_total)
print("Diferença para o limite (160):", diferenca_limite)O que a questão pede
montar um “desenho” com bordas usando repetição e quebras de linha.
Conceito cobrado
- topo/fundo: "=" repetido
Estrutura dos dados
Entrada: nenhuma.
Saída: múltiplas linhas (o cartão desenhado).
Como pensar
Monte o cartão por partes: topo, linha interna e, por fim, o bloco completo com \n. Pensar em peças evita errar a quantidade de espaços do miolo.
Como validar
O resultado precisa formar um bloco visual como este:==================================
= =
= =
==================================
Tabela de Evidência
- Leitura: nenhuma.
- Decisão no código: - topo/fundo: "=" repetido
- Evidência: saída final no formato exato (múltiplas linhas (o cartão desenhado).).
Variáveis-chave
carlarguratopomeiocartao
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
car = "="
largura = 34
topo = car * largura
meio = car + (" " * (largura - 2)) + car
cartao = topo + "\n" + meio + "\n" + meio + "\n" + topo
print(cartao)O que a questão pede
concatenar partes com barras exatamente como o enunciado descreve.
Conceito cobrado
construir em etapas reduz erro (e casa com o texto do enunciado).
Estrutura dos dados
Entrada: nenhuma (dados em variáveis).
Saída: 1 linha (URL completa).
Como pensar
A regra do enunciado é montar em etapas. Acrescente cada segmento e a barra na ordem pedida para não gerar barra dupla nem esquecer o último trecho.
Como validar
Ao final deve sair api.linkmanager.com/clientes/123/detalhes, sem barra dupla e sem barra sobrando no fim.
Tabela de Evidência
- Leitura: nenhuma (dados em variáveis).
- Decisão no código: construir em etapas reduz erro (e casa com o texto do enunciado).
- Evidência: saída final no formato exato (1 linha (URL completa).).
Variáveis-chave
dominio_basecaminhoidentificadoracaourl
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
dominio_base = "api.linkmanager.com"
caminho = "clientes"
identificador = "123"
acao = "detalhes"
url = dominio_base + "/"
url = url + caminho + "/"
url = url + identificador + "/"
url = url + acao
print(url)O que a questão pede
contar ocorrências exatas, respeitando maiúsculas/minúsculas.
Conceito cobrado
count() é sensível a capitalização.
Estrutura dos dados
Entrada: nenhuma (texto em variável).
Saída: 2 linhas (contagem exata e contagem da versão minúscula).
Como pensar
São duas buscas diferentes no mesmo texto: uma para #PythonChallenge e outra para #pythonchallenge. Como count() respeita maiúsculas e minúsculas, cada contagem mede uma forma exata.
Como validar
No texto do exemplo, a saída esperada é 1 na primeira linha e 1 na segunda. Isso mostra que cada hashtag foi contada separadamente.
Tabela de Evidência
- Leitura: nenhuma (texto em variável).
- Decisão no código: count() é sensível a capitalização.
- Evidência: saída final no formato exato (2 linhas (contagem exata e contagem da versão minúscula).).
Variáveis-chave
textoqtd_exataqtd_minuscula
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
texto = "Participe do nosso #PythonChallenge e conquiste prêmios! #pythonchallenge agora mesmo!"
qtd_exata = texto.count("#PythonChallenge")
qtd_minuscula = texto.count("#pythonchallenge")
print(qtd_exata)
print(qtd_minuscula)O que a questão pede
ler dois inteiros, subtrair e imprimir no formato pedido.
Conceito cobrado
Aplicar as operações de string e/ou aritmética adequadas ao tipo de dado.
Estrutura dos dados
Entrada: 2 linhas (inteiros): quantidade_inicial, quantidade_retirada.
Saída: 1 linha (frase exatamente como a especificação).
Como pensar
Leia os dois inteiros, calcule a diferença e só então monte a frase completa. O ponto crítico é converter os números de volta para texto na concatenação.
Como validar
Entrada 50 e 7 deve produzir exatamente Após a retirada de 7 itens, o saldo atual é de 43 unidades.
Tabela de Evidência
- Leitura: 2 linhas (inteiros): quantidade_inicial, quantidade_retirada.
- Decisão no código: Aplicar as operações de string e/ou aritmética adequadas ao tipo de dado.
- Evidência: saída final no formato exato (1 linha (frase exatamente como a especificação).).
Variáveis-chave
quantidade_inicialquantidade_retiradaquantidade_restante
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Esquecer int() e tentar subtrair strings.
quantidade_inicial = int(input())
quantidade_retirada = int(input())
quantidade_restante = quantidade_inicial - quantidade_retirada
print("Após a retirada de " + str(quantidade_retirada) + " itens, o saldo atual é de " + str(quantidade_restante) + " unidades.")O que a questão pede
aplicar juros simples primeiro e só depois a taxa administrativa; dividir pelo número de meses.
Conceito cobrado
- juros simples: valor_com_juros = preco * (1 + taxa_juros * meses)
Estrutura dos dados
Entrada: Conforme enunciado.
Saída: 2 linhas:
Como pensar
A ordem importa: primeiro calcule os juros simples sobre o preço, depois aplique a taxa administrativa sobre o montante com juros e, só no fim, divida pelo número de meses.
Como validar
Caso de sanidade: entradas 1000, 0.02, 10 e 0.05 geram 1260.00 na 1ª linha e 126.00 na 2ª. Se inverter a ordem das taxas, os valores mudam.
Tabela de Evidência
- Leitura: Conforme enunciado.
- Decisão no código: - juros simples: valor_com_juros = preco * (1 + taxa_juros * meses)
- Evidência: saída final no formato exato (2 linhas:).
Variáveis-chave
precotaxa_jurosmesestaxa_adminvalor_com_jurosvalor_total
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
preco = float(input())
taxa_juros = float(input())
meses = int(input())
taxa_admin = float(input())
valor_com_juros = preco * (1 + taxa_juros * meses)
valor_total = valor_com_juros * (1 + taxa_admin)
parcela = valor_total / meses
print(f"{valor_total:.2f}")
print(f"{parcela:.2f}")O que a questão pede
traduzir a fórmula do enunciado em variáveis intermediárias.
Conceito cobrado
- // = divisão inteira (corta decimais)
Estrutura dos dados
Entrada: 3 linhas (inteiros): exploracao, combate, estrategia.
Saída: 1 linha: "Pontuação Final em Arcana Quest: X pontos."
Como pensar
Separe a fórmula em blocos: base, bônus, dedução e fator. Isso reduz erro de precedência e deixa claro onde entram // e %.
Como validar
Teste 20, 19 e 8: como 19 % 10 vale 9, a dedução não pode ser zero. Esse caso confirma que o módulo entrou de fato na conta.
Tabela de Evidência
- Leitura: 3 linhas (inteiros): exploracao, combate, estrategia.
- Decisão no código: - // = divisão inteira (corta decimais)
- Evidência: saída final no formato exato (1 linha: "Pontuação Final em Arcana Quest: X pontos.").
Variáveis-chave
exploracaocombateestrategiabasebonusdeducao
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
exploracao = int(input())
combate = int(input())
estrategia = int(input())
base = exploracao + combate + estrategia
bonus = 2 * estrategia + (exploracao // 2)
deducao = 3 * (combate % 10)
fator = (exploracao // 5) + 1
pontuacao_final = (base + bonus - deducao) * fator
print(f"Pontuação Final em Arcana Quest: {pontuacao_final} pontos.")O que a questão pede
calcular duas métricas e concatenar como string com '; ' entre elas.
Conceito cobrado
- F = (C * 9/5) + 32
Estrutura dos dados
Entrada: 1 linha (float): temperatura em Celsius.
Saída: 1 linha: "<Fahrenheit>; <IET>" (ambos convertidos para string).
Como pensar
Calcule Fahrenheit e IET separadamente. Depois converta ambos para string e una com ; , porque aqui o formato final vale tanto quanto as fórmulas.
Como validar
Com entrada 10, a saída deve ficar no formato 50.0; 3.2. Se faltar o ; ou surgir vírgula no lugar do ponto, o formato saiu errado.
Tabela de Evidência
- Leitura: 1 linha (float): temperatura em Celsius.
- Decisão no código: - F = (C * 9/5) + 32
- Evidência: saída final no formato exato (1 linha: "<Fahrenheit>; <IET>" (ambos convertidos para string).).
Variáveis-chave
cfietsaida
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Detalhes de tipo, pontuação e espaços na saída.
c = float(input())
f = (c * 9 / 5) + 32
iet = (c / 4.0) - (c * 0.08) + 1.5
saida = str(f) + "; " + str(iet)
print(saida)O que a questão pede
contar vogais (A/E/I/O/U em qualquer caso) e dividir pelo total de caracteres.
Conceito cobrado
usar contador + loop (forma mais “intro” e transparente).
Estrutura dos dados
Entrada: 1 linha (string): mensagem.
Saída: 1 linha: porcentagem de vogais em relação ao total de caracteres.
Como pensar
Conte vogais em um laço, use len() para obter o total e trate o caso total == 0 antes da divisão. A lógica só fecha quando o denominador está seguro.
Como validar
Entrada vazia deve resultar em 0.0. Com AEIOU, o percentual esperado é 100.0, porque todos os 5 caracteres são vogais.
Tabela de Evidência
- Leitura: 1 linha (string): mensagem.
- Decisão no código: usar contador + loop (forma mais “intro” e transparente).
- Evidência: saída final no formato exato (1 linha: porcentagem de vogais em relação ao total de caracteres.).
Variáveis-chave
mensagemtotalvogaisqtd_vogaispercentual
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Contar só letras e ignorar o “total de caracteres” (o enunciado pede total da string). / Esquecer de tratar string vazia (total = 0).
mensagem = input()
# Total de caracteres (inclui espaços e pontuação)
total = len(mensagem)
# Conjunto de vogais em ambos os casos
vogais = "aeiouAEIOU"
# Conta quantos caracteres da mensagem são vogais
qtd_vogais = 0
for ch in mensagem:
if ch in vogais:
qtd_vogais += 1
# Evita divisão por zero se a mensagem vier vazia
if total > 0:
percentual = (qtd_vogais / total) * 100
else:
percentual = 0.0
print(percentual)O que a questão pede
montar uma única linha com tokens fixos, espaços e pontuação exatamente como especificado.
Conceito cobrado
aqui a habilidade é “montar texto com contrato rígido”. Construa com + e str, sem inventar espaços.
Estrutura dos dados
Entrada: 7 linhas (strings): id, data, hora, tipo, origem, destino, valor.
Saída: 1 linha: log completo com o formato exigido (termina com ';').
Como pensar
Leia as 7 entradas na ordem do enunciado e monte a linha com os blocos fixos exatamente nas mesmas posições. O trabalho aqui é precisão de espaços, setas, chaves e ponto e vírgula final.
Como validar
Com entradas 123, 2024-03-15, 10:30, PIX, 001, 002 e 150.00, a saída final deve ser [LOG:123] - DATA: 2024-03-15 10:30 | TIPO: PIX {ORIGEM:001 -> DESTINO:002} VALOR: R$150.00;
Tabela de Evidência
- Leitura: 7 linhas (strings): id, data, hora, tipo, origem, destino, valor.
- Decisão no código: aqui a habilidade é “montar texto com contrato rígido”. Construa com + e str, sem inventar espaços.
- Evidência: saída final no formato exato (1 linha: log completo com o formato exigido (termina com ';').).
Variáveis-chave
id_transacaodatahoratipoconta_origemconta_destino
Como explicar
Descreva em voz alta: entrada -> processamento -> saída. Se você consegue justificar cada etapa sem ler o código, o exercício está dominado.
Erro comum
Errar um espaço (especialmente antes/depois do |). / Esquecer o ';' final.
id_transacao = input()
data = input()
hora = input()
tipo = input()
conta_origem = input()
conta_destino = input()
valor = input()
log = "[LOG:" + id_transacao + "] - DATA: " + data + " " + hora + " | TIPO: " + tipo + " {ORIGEM:" + conta_origem + " -> DESTINO:" + conta_destino + "} VALOR: R$" + valor + ";"
print(log)Perguntas para validação final
- Você sabe justificar quando usar
int(),float()e string pura na entrada? - Você consegue explicar a diferença entre formatar saída e “só imprimir um valor”?
- Você valida bordas (string vazia, caixa, separadores e limites numéricos) sem depender de tentativa aleatória?
- Você consegue reescrever um exercício usando o mesmo contrato I/O com nomes de variáveis melhores?