Programação textual com Python
Até agora você arrastava blocos coloridos no Scratch ou no App Inventor. Agora vai escrever as mesmas ideias com texto: cada linha é uma ordem exata e o computador a executa do jeito que está escrita, sem adivinhar o que você queria dizer. Será que um programa de texto consegue calcular o frete de uma loja virtual sem errar? No fim da página você vai saber.
Do bloco ao texto
Um algoritmo é uma sequência de passos para resolver um problema. Nos blocos, cada passo era uma peça encaixada. No Python, cada passo é uma linha de texto. As ideias são as mesmas: guardar valores (variáveis), decidir (se… senão), repetir (laços) e agrupar passos com nome (funções). Se você já programou no Scratch ou no App Inventor, vai reconhecer cada uma delas, como nas aulas do 6º ano.
| Nos blocos | No Python |
|---|---|
| bloco «defina variável» | pontos = 0 |
| bloco «diga» / «mostre» | print("Olá") |
| bloco «pergunte» | input("Nome: ") |
| bloco «se… senão» | if / else |
| bloco «repita 10 vezes» | for |
| bloco «repita até que» | while |
Variáveis, tipos de dado e entrada/saída
O sinal = no Python não é uma igualdade da matemática: é uma ordem de guardar. Por isso pontos = pontos + 1 não é erro: o computador primeiro calcula o lado direito (lê o valor antigo e soma 1) e só depois guarda na caixa.
Numa loja virtual, por exemplo: 13 pode ser a quantidade de itens no carrinho (int), 3.75 o preço de um item em reais (float), "Ana" o nome da cliente (str) e True a informação «pagamento aprovado» (bool).
Rastreio: acompanhar variáveis linha a linha
Para prever o que um programa faz, construa uma tabela com o valor de cada variável depois de cada linha. É o chamado teste de mesa.
Explique o que é uma variável recorrendo à comparação com uma caixa com etiqueta e descreva o que faz cada linha: puntos = 0, puntos = puntos + 1, print(puntos). Que…
Explique o que é uma variável recorrendo à comparação com uma caixa com etiqueta e descreva o que faz cada linha: puntos = 0, puntos = puntos + 1, print(puntos). Que valor aparece na tela e por que razão não é um erro somar algo a uma variável que «já tinha» um valor?
Classifique estes valores de acordo com o tipo de dados (inteiro, decimal, texto ou booleano) e dê um exemplo de uso para cada tipo em um programa de uma loja: 13, 3,75,…
Classifique estes valores de acordo com o tipo de dados (inteiro, decimal, texto ou booleano) e dê um exemplo de uso para cada tipo em um programa de uma loja: 13, 3,75, "Ana", True.
Explique o que fazem as instruções input() e print() em Python, qual é a diferença entre elas e escreva um programa de duas linhas que peça o seu nome e o cumprimente…
Explique o que fazem as instruções input() e print() em Python, qual é a diferença entre elas e escreva um programa de duas linhas que peça o seu nome e o cumprimente usando-o.
Preveja a saída deste programa sem executá-lo, acompanhando o valor das variáveis linha a linha: a = 4, b = 3, a = a + b, b = a - b, print(a), print(b). Escreva o…
Preveja a saída deste programa sem executá-lo, acompanhando o valor das variáveis linha a linha: a = 4, b = 3, a = a + b, b = a - b, print(a), print(b). Escreva o rastreio completo (quanto vale cada variável após cada linha) e não apenas o resultado.
Escreva um programa de três linhas que peça o nome e a idade de uma pessoa e escreva uma frase completa usando-os (por exemplo, «A Mei tem 14 anos»). Explique que tipo…
Escreva um programa de três linhas que peça o nome e a idade de uma pessoa e escreva uma frase completa usando-os (por exemplo, «A Mei tem 14 anos»). Explique que tipo de dado o input() sempre devolve e para que serve o int() ao pedir a idade.
Condicionais: `if`, `elif`, `else`
Pense numa regra do dia a dia: «se chover, levo o guarda-chuva; se não, levo os óculos de sol». Em pseudocódigo:
se chover:
levar guarda-chuva
senão:
levar óculos de sol
As comparações do Python são: == (igual), != (diferente), <, >, <= e >=. O resultado de uma comparação é sempre True ou False.
A figura mostra um fluxograma e, ao lado, o programa que faz o mesmo, mas com a condição escondida. Escreva a condição que falta na linha do if (deve comparar a variável…
A figura mostra um fluxograma e, ao lado, o programa que faz o mesmo, mas com a condição escondida.
Escreva a condição que falta na linha do if (deve comparar a variável edad com $12$), explique o que faz int(input("Edad: ")) e por que as linhas dentro do if e do else têm recuo (indentação) para a direita.
Explique o que é uma estrutura condicional com um exemplo do seu dia a dia (se chover, levo o guarda-chuva; se não, os óculos de sol) e escreva-a em três linhas de…
Explique o que é uma estrutura condicional com um exemplo do seu dia a dia (se chover, levo o guarda-chuva; se não, os óculos de sol) e escreva-a em três linhas de pseudocódigo: condição, o que acontece se for verdadeira e o que acontece se for falsa.
Este programa tem três erros típicos: nome = input("O teu nome: ), if nome = "Fátima", print("Olá"). Encontre cada erro (umas aspas por fechar, um = que deveria ser == e…
Este programa tem três erros típicos: nome = input("O teu nome: ), if nome = "Fátima", print("Olá"). Encontre cada erro (umas aspas por fechar, um = que deveria ser == e explique a diferença), reescreva o programa corrigido e indique qual mensagem de erro o computador daria em cada caso.
Escreva um programa que peça um número e diga se ele é positivo, negativo ou zero. Indique qual estrutura você usa (uma condicional com dois ramos ou três), quais…
Escreva um programa que peça um número e diga se ele é positivo, negativo ou zero. Indique qual estrutura você usa (uma condicional com dois ramos ou três), quais comparações você faz e teste-o mentalmente com os valores $7$, $-3$ e $0$.
Um programa converte a nota numérica em classificação: menos de $5$ é «insuficiente», de $5$ a $6{,}9$ é «suficiente» e de $7$ em diante é «bom». Escreva o programa com…
Um programa converte a nota numérica em classificação: menos de $5$ é «insuficiente», de $5$ a $6{,}9$ é «suficiente» e de $7$ em diante é «bom». Escreva o programa com if, elif e else, explique por que a ordem das condições importa e o que aconteceria se a primeira condição fosse nota > 5.
Laços: `for` e `while`
Exemplos do cotidiano: dar dez voltas no pátio da escola é um for (você sabe quantas). Continuar remando até chegar à margem é um while (você repete até uma condição mudar).
Explique a diferença entre um laço for (repetir um número conhecido de vezes) e um laço while (repetir enquanto uma condição for verdadeira), e dê um exemplo cotidiano…
Explique a diferença entre um laço for (repetir um número conhecido de vezes) e um laço while (repetir enquanto uma condição for verdadeira), e dê um exemplo cotidiano de cada um: dar dez voltas no pátio da escola versus continuar remando até chegar à margem.
Escreva um laço for que mostre a tabuada do $3$ (do $3 \cdot 1$ ao $3 \cdot 10$), indique quantas vezes se repete o corpo do laço e explique o que você mudaria para…
Escreva um laço for que mostre a tabuada do $3$ (do $3 \cdot 1$ ao $3 \cdot 10$), indique quantas vezes se repete o corpo do laço e explique o que você mudaria para mostrar a tabuada do $7$ sem reescrever todo o programa.
Leia este programa e explique o que ele faz: n = 5, while n > 0:, print(n), n = n - 1, e no final print("Já está!"). Escreva a saída completa na tela e justifique o que…
Leia este programa e explique o que ele faz: n = 5, while n > 0:, print(n), n = n - 1, e no final print("Já está!"). Escreva a saída completa na tela e justifique o que aconteceria se esquecêssemos a linha n = n - 1.
Um colega escreve um programa que pede senhas até acertar: chave = "", while chave != "sol":, e dentro dele apenas print("incorreta"). Explique por que o programa nunca…
Um colega escreve um programa que pede senhas até acertar: chave = "", while chave != "sol":, e dentro dele apenas print("incorreta"). Explique por que o programa nunca termina, que linha falta dentro do laço (pedir a chave novamente) e a regra geral sobre os laços while: algo precisa poder alterar a condição.
Para selecionar os classificados de um torneio de robótica, são lidas cinco pontuações (de $0$ a $10$). Um colega propôs este código para contar quantas são iguais ou…
Para selecionar os classificados de um torneio de robótica, são lidas cinco pontuações (de $0$ a $10$). Um colega propôs este código para contar quantas são iguais ou superiores a $5{,}0$:
aprobados = 0
for i in range(5):
nota = float(input("Introduce nota: "))
if nota >= 5:
aprobados = aprobados + 1
else:
aprobados = 0
print("Total de aprobados:", aprobados)
- a) Preveja o que será mostrado na tela se o usuário digitar sucessivamente as notas: $6{,}0$, $8{,}0$, $4{,}0$, $9{,}0$ e $7{,}0$. Justifique por que o resultado final não é o esperado, localizando o erro de lógica na estrutura condicional.
- b) Corrija o código e modifique-o para que descarte da contagem as notas inválidas (menores que $0$ ou maiores que $10$), mostrando uma mensagem de aviso específica sem somar nem reiniciar o contador.
Funções
Escrever def saudar(): uma única vez e depois chamar saudar() onde precisar evita copiar as mesmas linhas várias vezes. Se houver um erro, você corrige em um só lugar.
O parâmetro (lado) é o nome que a função dá ao dado de entrada. O valor devolvido é o que o return entrega a quem chamou a função. Sem return, a função devolve None (nada útil).
Explique o que é uma função em um programa e que vantagem há em escrever uma vez def saudar(): e poder chamá-la várias vezes, em vez de copiar as mesmas linhas…
Explique o que é uma função em um programa e que vantagem há em escrever uma vez def saudar(): e poder chamá-la várias vezes, em vez de copiar as mesmas linhas repetidamente.
Analise esta função: def area_quadrado(lado): e, no interior, return lado * lado. Explique o que é o parâmetro, o que é o valor devolvido e o que seria escrito na tela…
Analise esta função: def area_quadrado(lado): e, no interior, return lado * lado. Explique o que é o parâmetro, o que é o valor devolvido e o que seria escrito na tela em cada chamada: print(area_quadrado(5)), print(area_quadrado(2{,}5)).
Uma equipe desenvolve o software de um caixa registradora usando funções: a) Ao executar este código, o Python produz o erro: TypeError: unsupported operand type(s) for…
Uma equipe desenvolve o software de um caixa registradora usando funções:
def calcular_iva(precio):
total = precio * 1.21
pass # O programador esqueceu-se de adicionar a última linha desta função
def aplicar_descuento(total, rebaja):
resultado = total - rebaja
return resultado
precio_base = 100.0
precio_con_iva = calcular_iva(precio_base)
precio_final = aplicar_descuento(precio_con_iva, 10.0)
print("Preço final:", precio_final)
- a) Ao executar este código, o Python produz o erro:
TypeError: unsupported operand type(s) for -: 'NoneType' and 'float'. Interprete a mensagem e explique exatamente como o valorNoneviaja pelas variáveis do programa. - b) Um colega afirma: «Para resolver basta mudar a linha da primeira função para
print(precio * 1.21)». Refute a afirmação dele explicando a diferença funcional entre mostrar um valor na tela e retornar um valor para a chamada principal. - c) Corrija o código e adicione uma função
es_valido(precio)que retorne um valor booleano (TrueouFalse) para verificar que o valor base não seja negativo antes de processá-lo.
Erros de sintaxe e erros de lógica
Uma loja aplica a seguinte política: compras inferiores a $\text{R\$}\ 30$ pagam $4{,}\text{R\$}\ 50$ de frete; compras entre $\text{R\$}\ 30$ e $\text{R\$}\ 50$ têm…
Uma loja aplica a seguinte política: compras inferiores a $\text{R\$}\ 30$ pagam $4{,}\text{R\$}\ 50$ de frete; compras entre $\text{R\$}\ 30$ e $\text{R\$}\ 50$ têm frete grátis; compras superiores a $\text{R\$}\ 50$ têm frete grátis e um desconto de $10\ \%$ sobre o preço da compra.
Um aluno programou este código:
precio = float(input("Total compra: "))
if precio > 50:
total = precio * 0.90
if precio >= 30:
total = precio
else:
total = precio + 4.50
print("Total a pagar:", total)
- a) Faça o teste de mesa com uma compra de $60{,}\text{R\$}\ 00$. Que preço final o programa imprime? Justifique por que ocorre esse erro de lógica ao encadear as condicionais.
- b) Reescreva o programa de forma correta utilizando uma estrutura condicional aninhada ou com
elif, e inclua uma validação que avise se for digitado um preço negativo ou zero.
Observe o seguinte programa, cujo objetivo é pedir a idade ao usuário e determinar se tem idade legal para votar (a partir dos $18$ anos completos): a) Se você tentar…
Observe o seguinte programa, cujo objetivo é pedir a idade ao usuário e determinar se tem idade legal para votar (a partir dos $18$ anos completos):
if edad >= "18":
print("Puedes votar")
edad = input("Dime tu edad: ")
else:
print("No puedes votar")
- a) Se você tentar executar o programa como está, em que linha o interpretador de Python vai parar e por que motivo não chegará a executar a linha do
input? - b) Identifique e classifique todos os erros presentes, distinguindo entre erros de sintaxe (que impedem a compilação/interpretação) e erros de tipo ou de lógica durante a execução.
- c) Reescreva o código corrigido e introduza uma verificação para evitar que o programa falhe se o usuário digitar a idade com texto (por exemplo, escrevendo «dezoito»).
Desenhe o algoritmo para um terminal de recarga e cobrança do refeitório escolar cumprindo os seguintes requisitos técnicos: O cartão parte de um saldo inicial de…
Desenhe o algoritmo para um terminal de recarga e cobrança do refeitório escolar cumprindo os seguintes requisitos técnicos:
-
O cartão parte de um saldo inicial de $20{,}\text{R\$}\ 00$ e cada refeição custa $4{,}\text{R\$}\ 50$.
-
Em um laço de repetição, o programa pergunta quantas refeições se pretende consumir no dia.
-
Se o saldo disponível não for suficiente para pagar a quantidade solicitada, a operação é cancelada, informa-se o valor que falta e o saldo não é modificado.
-
Se houver saldo suficiente, desconta-se o valor e verifica-se se o saldo restante é inferior a $5{,}\text{R\$}\ 00$, mostrando nesse caso o aviso «Saldo baixo: recarregue em breve».
-
O programa deve terminar automaticamente quando o saldo restante for menor que o preço de uma refeição individual ($4{,}\text{R\$}\ 50$).
-
Justifique que tipo de laço de repetição você utilizou e explique como evitar que um usuário digite um número negativo de refeições para aumentar artificialmente o seu saldo.
Um sistema de classificação calcula a nota final aplicando os seguintes pesos: Trabalho de aula ($20\ \%$), Prática de laboratório ($30\ \%$) e Prova teórica ($50\ \%$).…
Um sistema de classificação calcula a nota final aplicando os seguintes pesos: Trabalho de aula ($20\ \%$), Prática de laboratório ($30\ \%$) e Prova teórica ($50\ \%$). O professor programou a fórmula assim:
trabajo = float(input("Nota trabalho: "))
taller = float(input("Nota laboratório: "))
examen = float(input("Nota prova: "))
nota_final = trabajo * 0.20 + taller * 0.30 + examen * 0.50 / 3
if nota_final > 5:
print("Aprovado")
else:
print("Reprovado")
- a) Preveja o resultado que o programa vai mostrar se o aluno obtiver $10{,}0$ nas três componentes. Interprete a prioridade de operadores para justificar o valor numérico errado que
nota_finalarmazena. - b) Justifique por que este erro é de lógica e não de sintaxe, e argumente por que os erros lógicos representam um risco muito maior em programas de engenharia ou controle do que os de sintaxe.
- c) Detecte um segundo erro lógico na condição do
ifem relação ao critério habitual de aprovação (aprovar com $5{,}0$) e escreva a versão definitiva do programa corrigido.
Voltando à pergunta do início: sim, um programa de texto calcula o frete sem errar, desde que as condições estejam encadeadas na ordem certa (if/elif/else) e você confira o resultado com um teste de mesa.