Python para engenharia

Arquivo de roteiros e aulas do curso Python para Engenharia com Aplicações

Capítulo 5: Laço de repetição while

Atividade 1: while

O while é uma estrutura de repetição comum em quase todas as linguagens de programação, assim como o if (já visto anteriormente). Estas duas estruturas possuem semelhanças: ambas possuem uma condição e o passo que deve ser executado deve estar devidamente identado.

Para facilitar a compreensão, imagine o while como uma estrutura if que executa um bloco de código enquanto a condição for verdadeira ou o laço seja explicitamente encerrado com break. Caso ela seja falsa, executa outro bloco de instrução.

Contudo, existe uma observação a ser feita em laços como o while e o for (será visto posteriormente). Acima foi dito que um determinado bloco de código será executado enquanto uma condição for verdadeira. Você consegue identificar o problema que pode ser causado para a máquina?

Veja o fluxograma abaixo:

graph TD
	id((Início)) -- Enquanto -->  id1{Condição} 
	id1 -- True --> id2[Executa este bloco] --> id1  
	id1  -- False -->id4((Fim))

Exemplo 1: Contador de 1 a 10.

Imprima os valores de 1 a 10 utilizando while:

%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '18px'}}}%%
flowchart LR
	id1((count=1))
    subgraph " "
        id2{count<br>menor/igual a<br>10} 
        id2 -- True --> id3((count=count+1)) --> id2
    end
    id2 -- False --> id4((count é maior<br>que 10))
    id1 -- Enquanto --> id2
    id4 --> id5((Fim))
count = 1
while count <= 10:
 	print(count)
 	count += 1

1
2
3
4
5
6
7
8
9
10

Exemplo 2: Investimento

Paulo quer começar a investir, mas apenas quando tiver R$ 20.000,00. Todos os anos, ele recebe um bônus líquido de R$ 2.000,00 e guarda em seu cofre. No momento, ele tem apenas R$ 4.000,00. Utilizando while, informe ao Paulo quando ele poderá, finalmente, começar a aplicar o seu patrimônio.

saldo_atual = 4000
bonus_anual = 2000
count = 0  # contador

while saldo_atual < 20000:
 	print("Lamento, Paulo. Ainda não possui {saldo_desejado}. Você possui apenas R$ 	{saldo_atual}.".format(saldo_desejado=20000, saldo_atual=saldo_atual))
 	saldo_atual += bonus_anual  # saldo_atual = saldo_atual + bonus_atual
 	count += 1  # count = count + 1
 
if saldo_atual >= 20000:
 	print("{} conseguiu em {} anos!".format("Paulo", count))

Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 4000.
Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 6000.
Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 8000.
Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 10000.
Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 12000.
Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 14000.
Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 16000.
Lamento, Paulo. Ainda não possui 20000. Você possui apenas R$ 18000.
Paulo conseguiu em 8 anos!

Exemplo 3: def e Fibonacci.

A palavra reservada def é para a criação de funções em python. Não é objetivo deste capítulo aprofundar-se sobre as funções, porém é necessário, à primeira vista, entender a sua importância.

Imagine que você queira fazer um pequeno programa em python que simule uma calculadora. Pense a nível de projeto:

Por cima descrevemos o que seria o projeto de uma calculadora. Agora imagine tudo isso em um arquivo em código “contínuo”. Ficaria imenso!

Você decide compartilhar o seu código com o seu amigo e quando ele vê aquele código imenso, já até sente preguiça de continuar a leitura.

Isso é bastante desagradável, porém utilizar funções para “enxutar” o seu código ajuda muito. Veja que, em termos de tamanho, não deve mudar muita coisa. Contudo, em termos de legibilidade (acredite, isso importa muito!) influencia.

Sem mais delongas, vamos ver a sintaxe para criar uma função através do exemplo abaixo, em que queremos retornar ao usuário a série de Fibonacci.

Escrevendo uma série de Fibonacci até um valor delimitador.

# def e fibonacci
def fibonacci(n):  # funcao fibonacci limitado ao parametro n
    a, b = 0, 1  # a = 0, b = 1
    while a < n:
        print(a, end = ' ')
        a, b = b, a+b  # a = b, b = a + b
    	print()

# chamando a funcao criada acima
fibonacci(10)

0 1 1 2 3 5 8

Links úteis:

Tarefa 1: Faça uma calculadora de soma e subtração. Utilize def e while.

Exemplo 4: break

O break é um comando que encerra o loop imediatamente, sem se importar com as instruções seguintes. É muito útil para o que podemos chamar de “erros críticos”. Vamos abstrair em um exemplo: pense que você está dirigindo um carro e o semáforo sinaliza amarelo e, em poucos segundos, altera para o vermelho. Não importa se vem carros ou não, você deve parar. O que chamamos de “erro crítico”, nesse caso, seria avançar o sinal.

Para exercitar tente fazer a tarefa abaixo:

Tarefa 1: Veja o código abaixo e faça o que se pede:

qtd_operacoes = 1

while qtd_operacoes <= 3:
    x = float(input("x = "))
    y = float(input("y = "))
    
    if y == 0:
        break # Este comando para o loop
    else:
        print("{} / {} = {:.2f}".format(x, y, x/y))

Atividade 2: while-else

Você viu anteriormente que o while trata de executar um bloco de código enquanto uma condição é verdadeira. Se você incluir um else será possível executar uma “contra ação”, isto é, executar outro bloco de código caso a condição seja falsa.

Exemplo 5: Números pares

Imprimir os números pares de 0 a 10.

numerospares = 0

while numerospares <= 10:
   	print(numerospares)
   	numerospares += 2 # numerospares=numerospares + 2
else:
   	print('O intervalo foi ultrapassado.')

0
2
4
6
8
10
O intervalo foi ultrapassado.

Exemplo 6: Digitando uma senha

Peça ao usuário para que ele digite uma senha. Esta senha não pode iniciar com um número decimal. Utilizando While, faça uma verificação para que todas as vezes que o usuário entre com uma senha inválida, mostre uma mensagem e peça para ele repetir até que seja uma senha aceitável.

senha_usuario = input('Senha: ')
while senha_usuario[0].isdecimal():
   	print('Senha inválida. Tente novamente!')
   	print('-'*50)
   	senha_usuario = input('Outra senha: ')
else:
   	print("Senha válida!")
print('FIM')

Senha: 1MinhaSenha
Senha inválida. Tente novamente!
--------------------------------------------------
Outra senha: MinhaSenha
Senha válida!
FIM

Atividade 3: while-continue

Além do break, temos também o continue, que é o seu oposto. Enquanto o primeiro para o código totalmente, sem se importar com o que vem depois; o continue ignora as próximas instruções e passa para a próxima iteração.

Exemplo 7: Classificando números

Neste exemplo vamos imprimir todos os números e dizendo se é par ou ímpar, em um intervalo de 0 a 10.

num = 0											# inicializa a variavel num
while num <= 10:								# itera sobre num
   	num += 1									# adiciona sempre 1 passo
   	if num % 2 == 0:							# para verificar se é par ou nao
           print('{} é par.'.format(num))			# imprime se for par
        	continue								# aqui ele continua a iteracao
    	print('{} é ímpar.'.format(num))			# imprime se for ímpar
print('FIM.')									# fim do codigo

1 é ímpar.
2 é par.
3 é ímpar.
4 é par.
5 é ímpar.
6 é par.
7 é ímpar.
8 é par.
9 é ímpar.
10 é par.
11 é ímpar.
FIM.

Tarefa 3: Faça um programa que leia e valide as seguintes informações:

Tarefa 4: Faça um programa que calcule as raízes de uma equação do 2º grau enquanto o usuário desejar. Utilize def e while.

Tarefa 5: Um número complexo é composto pela parte real e parte imaginária. Considere z um número complexo da forma: \(z = a + jb\) em que: \(j = \sqrt{-1} \rightarrow j^{2} = -1\) Veja o fluxograma abaixo para saber o valor de j elevado a qualquer expoente.

%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '16px'}}}%%
graph TD
id1((j elevado <br> a n)) --> id2{n é par} -- True --> id3((j elevado<br> a 2k)) --> id5{k é par} -- True --> id6((j elevado<br> a n é igual a 1))
id5 -- False --> id7((j elevado<br> a n é igual a -1))
id2 -- False --> id4((j elevado<br>a 2k+1)) --> id8{k é par} -- True --> id9((j elevado<br>a n é igual a j))
id8 -- False --> id10((j elevado<br> a n é igual a -j))

Pratique com j elevado 1000 e com j elevado a 1001.

Agora que você já sabe como descobrir o valor de j elevado a qualquer expoente, faça um programa que peça ao usuário o valor do expoente três vezes e, utilizando while, retorne para ele o resultado. Faça apenas para expoentes pares.


Atividades 4: Para casa

Exercício 1: Expoente ímpares

Aprimore a Tarefa 5 para expoentes ímpares.

Dica: reutilize o código.

Exercício 2: Calculando fatorial

Faça um programa que calcule o fatorial de um número mostrando as suas multiplicações para o usuário. Também imprima o valor final.

Dica: por definição, o fatorial de um número n é: n! = 1 x 2 x 3 x … x (n - 1) x n. Exemplo: 3! = 3 x 2 x 1; 5! = 5 x 4 x 3 x 2 x 1.

Exercício 3: Lista de compras

Paulo tem apenas R$ 200,00 e decide ir ao supermercado. Ele pede para que você faça um programa simples que adiciona produtos em sua cesta enquanto o valor total não ultrapassar o que tem em mãos.

Produto Valor Quantidade desejada
Sabão em pó R$ 5,00 2
Arroz R$ 40,00/kg 2
Energético R$ 8,00 5
Produtos de limpeza R$ 55,00 1
Picanha R$ 70,00/kg 2,5

Imprima para o Paulo o que você conseguiu colocar e diga o valor total.

Observação: Embora ele tenha R$ 200,00, talvez ele não queira gastar tudo. Crie a cesta dele de acordo com as suas preferências, mas lembre-se que não pode ultrapassar o saldo.

Exercício 4: Imprimindo números

Imprima todos os números sejam menores que 100 quando elevados ao quadrado.

Sugestão: Utilize def

Exercício 5: Fluxogramas

Crie fluxogramas que representem esses dois códigos.

Dica: Você pode utilizar o mermaid em uma célula Markdown que é habilitado através da extensão @agoose77/jupyterlab-markup (Ver capítulo 4). A documentação do mermaid está disponível aqui, e existe um editor online disponível aqui.

Código 1:

i = 0
j = 10
n = 0
while i < j :
	i = i + 1
	j = j  1
	n = n + 1

Código 2:

i = 0
j = 10
n = 0
while i != j :
	i = i + 2
	j = j  2
	n = n + 1