Baixe o app para aproveitar ainda mais
Prévia do material em texto
PENSAMENTO COMPUTACIONAL Fabricio Machado da Silva Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python) Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Descrever a utilização dos comandos iterativos for e while em estruturas aninhadas em problemas de nível inicial. � Desenvolver testes de mesa em programas que utilizem comandos iterativos aninhados. � Resolver problemas computacionais utilizando comandos iterativos aninhados. Introdução Muitas vezes, durante a construção de um programa, nos deparamos com uma situação em que precisamos repetir um bloco de código mais de uma vez. Ainda, as estruturas precisam ser executadas em um formato hierárquico, em que um laço de repetição é executado como parte do bloco de código de outra repetição. O conceito que define que uma estrutura está contida no escopo de outra é denominado aninhamento. No desenvolvimento de programas, o aninhamento pode ser utilizado em casos em que se faz necessário repetir condições de teste sucessiva- mente; para isso, é necessário fazer uso dos comandos iterativos for e while. A utilização de blocos aninhados utilizando comandos iterativos é muito usual no desenvolvimento de programas, como na manipulação de matrizes, nos mecanismos de busca, nos algoritmos de ordenação e nos cálculos matemáticos complexos. Neste capítulo, você vai verificar os comandos iterativos for e while aninhados, aplicados à resolução de problemas computacionais, e vai conferir diferentes formas de uso desses comandos na linguagem de programação Python. Por meio do teste de mesa, você vai poder testar a lógica da construção dos comandos iterativos aninhados, para determinar se o seu funcionamento está adequado. Por fim, você vai aprender na prática a resolver problemas computacionais por meio desses comandos. Comandos iterativos for e while Existem situações em que queremos que a própria estrutura de repetição (loop) seja repetida um número específico de vezes, conforme expõe Wazlawick (2017). Moreira de Matos (2018, documento on-line) faz uma analogia do uso de loops aninhados com o nosso calendário, conforme descrito abaixo. � O ano tem 12 meses, sendo que todo ano começa em janeiro, depois vêm os meses fevereiro, março, e assim por diante, até chegar dezembro. Depois de cada ano completado, tudo recomeça. Isso é um looping. � Cada mês do ano contém os dias do mês, iniciando no dia 1, que é seguido pelos dias 2, 3, etc., até o último dia do mês (que é variável). Mas, quando acaba o mês, inicia-se tudo de novo. Dessa forma, ocorre um novo looping. � Também podemos considerar que dentro do dia temos as horas, que também se repetem a cada dia. E, dentro de cada hora, há o loop dos minutos. E, dentro de cada minuto, há o loop dos segundos. Assim, podemos considerar que vivemos em loops aninhados. Vamos colocar esse conceito em prática utilizando a linguagem Python. Ao empregarmos uma instrução while, podemos fazer um bloco de código ser repetido diversas vezes, gerando um loop controlado, até que uma determinada condição seja verdadeira. A instrução while é composta por: � uma palavra-chave while; � uma expressão (condição de teste); � dois-pontos. Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)2 while <expressão>: <bloco de código> Em Python, podemos criar estruturas while combinadas, gerando es- truturas aninhadas, em que o resultado de um bloco while vai influenciar no resultado de outro, possibilitando obter resultados interessantes, como a repetição de um incremento de duas variáveis, conforme leciona Menezes (2014). A sintaxe de uma condição de loop while aninhado é: while <expressão>: while <expressão>: <bloco de código> <bloco de código> Para ilustrarmos isso, vamos analisar o código mostrado na Figura 1, que usa comandos while aninhados para percorrer uma estrutura de dados que pode ter sido obtida de um serviço da internet. Figura 1. Exemplo de comandos while aninhados em Python. 3Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python) No código da Figura 1, há uma estrutura de dados de dicionário contendo a informação das refeições de dois animais (linha 1). Podemos utilizar comandos while aninhados para percorrer os dois níveis dessa estrutura: o primeiro nível é a chave que indica o nome do cachorro (linha 4), e o segundo nível é o dos elementos que compõem a refeição do animal (linha 8). O comando while, por si só, é muito útil em diversos casos, como quando existe a necessidade de implementação de algoritmos de pesquisa binária, devido à possibilidade de criar comportamento iterativo no código. No entanto, devido à natureza das estruturas de dados utilizadas em Python, torna-se mais compreensível a utilização da instrução for. Na estrutura de código, uma instrução for é composta por: � uma palavra-chave for; � uma variável; � uma palavra-chave in; � um objeto iterável de tamanho finito, contendo vários elementos; � dois-pontos. for <variável> in <objeto iterável>: <bloco de código> Um objeto iterável pode ser uma lista ou um dicionário. Para simular o comportamento similar ao while utilizando uma variável contadora, podemos utilizar a função range, que gera uma lista com os números de zero até o valor informado como parâmetro. for i in range ([valor inicial], valor final, [passo]): <bloco de código> Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)4 Observe que o bloco do comando for se inicia na próxima linha, em um bloco de código indentado. Como a estrutura for é um comando que pode ter outros comandos subordinados a ele, então, podemos implementar perfeitamente outro comando for dentro de seu bloco de execução, conforme leciona Wazlawick (2017). A sintaxe de dois comandos for aninhados é: for <variável> in <objeto iterável>: <bloco de código> for <variável> in <objeto iterável>: <bloco de código> <bloco de código> A Figura 2 ilustra a implementação do mesmo programa anterior (Fi- gura 1), mas utilizando o comando iterativo for. Perceba que, por percorrer diretamente os objetos iteráveis, esse programa utiliza menos variáveis e é construído com menos linhas. Figura 2. Exemplo de comandos for aninhados em Python. Ambos os comandos iterativos, for e while, podem ser construídos em estruturas iterativas aninhadas em conjunto, ou seja, um for pode estar contido em um while e vice-versa. Veja na Figura 3 um programa que, uti- lizando loops while e for, imprime a cada linha uma nova letra da palavra informada (linha 1), até apresentá-la por completo. 5Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python) Figura 3. Exemplo de comandos while e for aninhados em Python. Em Python, os comandos iterativos for são tradicionalmente usados quando você tem um bloco de código que deseja repetir um número fixo de vezes. A instrução Python for faz a iteração sobre os componentes de uma sequência em ordem, executando o bloco a cada vez. Em contraste, a instrução com o loop while é usada quando uma condição precisa ser verificada em cada iteração, ou para repetir um bloco de código, inclusive eternamente. Teste de mesa em algoritmos com estruturas iterativas Ao projetarmos um algoritmo para solucionar um determinado problema, geralmente realizamos um exercício mental, com um passo a passo do que será executado pelo programa. Entretanto, muitas vezes nos deparamos com um programa que apresenta comportamentos diferentes do que foi projetado e que é dado como a solução correta. Por isso, é importante sempre testarmos o algoritmo antes de implementar e submeter ao compilador, simulando a sua Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)6 execução para verificar antecipadamentepossíveis erros lógicos. Para tanto, existe uma prática utilizada com sucesso na área de programação, chamada de teste de mesa, que consiste na execução do algoritmo em um passo a passo, com o apoio de papel e caneta. Existem alguns softwares disponíveis no mercado que efetuam a interpretação de algoritmos representados em pseudocódigos ou em fluxogramas. Seu objetivo é realizar um teste similar ao teste de mesa. Para simularmos a aplicação do teste de mesa em estruturas com comandos iterativos aninhados, vamos supor um algoritmo que cria um array bidimen- sional, que é um array com duas dimensões acessadas por linhas e colunas, caracterizando-se por uma matriz, conforme mostra a Figura 4. Figura 4. Array bidimensional. Fonte: Adaptada de Pereira et al. ([201-?], documento on-line). 7Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python) A Figura 4 apresenta uma matriz com três colunas e três linhas. É im- portante entender que cada célula dessa matriz corresponde a um elemento, que é referenciado por dois índices diferentes: um que corresponde à linha, e outro, à coluna. Assim, [1,1] refere-se ao elemento da linha 1 com a coluna 1, por exemplo. Cabe lembrar que, em Python, a primeira posição de um vetor ou lista é enumerada com o índice 0. Então, diferentemente da tabela acima, ao executarmos nosso algoritmo em Python para o preenchimento de uma matriz que é uma lista bidimensional, o programa vai iniciar no índice M [0,0], indicando a primeira linha e a primeira coluna. Para nosso teste de mesa, vamos considerar que o preenchimento de uma matriz pode ser executado da esquerda para a direita e de cima para baixo, ou seja, começando na posição [0,0] e seguindo para a posição [0,1], e assim por adiante. Vamos supor que tenhamos construído um algoritmo em Python para preencher uma matriz 3 × 3, conforme mostra a Figura 5. Figura 5. Algoritmo de implementação de uma matriz 3 × 3. Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)8 Para simularmos o teste de mesa, temos uma variável com valor inicial igual a 10 e uma variável para guardar o incremento igual a 5. O algoritmo inicia o for mais externo e, para cada execução desse for, executa o for mais interno, em que o valor é armazenado na posição da matriz e é incrementado em 5, com a variável de incremento. Realizando o teste de mesa (Quadro 1), obtemos: Posição 0,0 = 10 Posição 0,1 = 15 Posição 0,2 = 20 Posição 1,0 = 25 Posição 1,1 = 30 Posição 1,2 = 35 Posição 2,0 = 40 Posição 2,1 = 45 Posição 2,2 = 50 Iteração Linha de 1 até 3 Coluna de 1 até 3 Valor_ inicial M [linha, coluna] = Valor_inicial Valor_inicial = valor inicial + incremento 1 0 0 10 M [0,0] =10 10 + 5 = 15 2 0 1 15 M [0,1] = 15 15 + 5 = 20 3 0 2 20 M [0,2] = 20 20 + 5 = 25 4 1 0 25 M [1,0] = 25 25 + 5 = 30 5 1 1 30 M [1,1] = 30 30 + 5 = 35 6 1 2 35 M [1,2] = 35 35 + 5 = 40 7 2 0 40 M [2,0] = 40 40 + 5 = 45 8 2 1 45 M [2,1] = 45 45 + 5 = 50 9 2 2 50 M [2,2] = 50 50 + 5 = 55 Quadro 1. Exemplo de teste de mesa 9Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python) Dessa forma, para preencher a matriz, executamos ao todo nove iterações, como pode ser visto na execução do programa, mostrada na Figura 6. Figura 6. Algoritmo de implementação de matriz 3 × 3 e a saída do programa. Como é possível perceber, a utilização do teste de mesa possibilitou enten- der, passo a passo, exatamente como o compilador vai processar cada linha de comando do código. Assim, foi possível verificar que o código não deverá apresentar comportamento diferente do esperado. Iterar, na computação, significa repetir uma instrução ou um conjunto de instruções até que uma condição não seja mais aceita. Ou seja, trata-se de executar a série de instruções por uma determinada quantidade de vezes, ou até mesmo infinitamente, se a cláusula assim permitir. Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)10 Problemas computacionais solucionados por comandos iterativos aninhados A condição de estruturar blocos aninhados, conforme citado anteriormente, é muito usual em cálculos matemáticos. Observe a Figura 7, que ilustra um código que implementa comandos while e for aninhados para o cálculo de fatorial. O fatorial de um número (n) natural é calculado pela multiplicação desse n por todos os seus antecessores, até chegar ao número 1, sendo definido por: n! = n.(n – 1).(n – 2).(n – 3)! Por exemplo: Fatorial de 0: 0! = 1 Fatorial de 1: 1! = 1 Fatorial de 2: 2! = 2.1 = 2 Fatorial de 3: 3! = 3.2.1 = 6 E assim por diante. Figura 7. Cálculo de fatorial de 10 números. 11Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python) O primeiro while itera sobre os números que queremos calcular, ou seja, os números de 0 a 10, enquanto o for interno faz a decomposição e a multiplicação dos valores, gerando o resultado do fatorial do número. Vamos acompanhar outro exemplo (Figura 8) com vários for aninhados, criando uma espécie de simulador de relógio digital, em que, a cada instante, será impressa na tela a informação de hora (variando de 0 a 23) e minuto (variando de 0 a 59). Nesse caso, serão usadas duas estruturas for aninhadas, em que o for mais externo, o primeiro, realiza a contagem das horas, e o segundo, que é o mais interno, conta os minutos, o que é repetido várias vezes. Figura 8. Exemplo de comandos for aninhados para o cálculo das horas. Observe que esse é o princípio do funcionamento de um relógio, que im- prime todas as horas e todos os minutos em poucos instantes. Você pode ainda adicionar um for e incluir os segundos no seu relógio. Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)12 Por último, a Figura 9 ilustra a implementação de um comando for ani- nhado dentro de outro, para o cálculo da média de notas de uma turma de alunos em variadas disciplinas. Figura 9. Exemplo de dois comandos iterativos for aninhados, para o cálculo da média dos alunos. 13Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python) O programa da Figura 9 é um programa típico de entrada de dados. Ele usa um for para percorrer a lista de alunos e, depois, utiliza o for interno para perguntar o valor de todas as notas do aluno, para calcular a média. Dessa forma, tem-se, ao final, um conjunto de médias por aluno, que pode ser usado para calcular a média da turma. A página Como Pensar Como um Cientista da Computação, que traz a tradução do livro How to Think Like a Computer Scientist: Interactive Version, de Brad Miller e David Ranum, aborda alguns aspectos sobre os tipos de iteração que existem, especialmente em relação à sua duração. Segundo a página, o comando for realiza a iteração em determinadas sequências de valores, como uma lista de nomes ou de números que utiliza o comando range. Ao utilizar o for, sabe-se quantas vezes será possível iterar sobre o conjunto de valores, já que é criado um laço do tipo iteração definida (definite iteration), com um término programado. Já no caso do comando while, o término do laço depende de uma condição falsa, que não se sabe exatamente quando vai ocorrer; trata-se, portanto, de uma iteração indefinida (indefinite iteration). Nesse caso, eventualmente, a condição de controle da iteração vai falhar, e a iteração vai parar — a não ser que se trate de um laço infinito, o que representa um problema, conforme descrito na página. Veja no link a seguir o conteúdo abordado de forma mais completa. https://qrgo.page.link/vVtcF Estruturas aninhadas são ótimas para reaproveitamento de código, pois, em vez de se criar uma única estrutura com muitos membros, que nem sempre serão acessados, várias estruturas podem ser criadas e reutilizadas em diver- sas partes do seu projeto. Portanto, as estruturas aninhadas são um recurso muitoútil para que você consiga resolver o seu problema de forma ainda mais eficiente e modularizada. Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)14 MENEZES, N. N. C. Introdução à programação com Python: algoritmos e lógica de pro- gramação para iniciantes. 2. ed. São Paulo: Novatec, 2014. 328 p. MOREIRA DE MATOS, F. J. Loops Aninhados (Laço dentro de laço). Python Progressivo, Fortaleza, maio 2018. Disponível em: https://www.pythonprogressivo.net/2018/05/ Loopings-Aninhados-Laco-dentro-Lado.html. Acesso em: 28 ago. 2019. PEREIRA, F. V. Y. R. et al. Comandos de Repetição (Laços ou Loops). ITAbits, São José dos Campos, [201-?]. Disponível em: https://sites.google.com/site/itabits/treinamento/ introducao-a-programacao-em-c/comandos-de-repeticao. Acesso em: 28 ago. 2019. WAZLAWICK, R. S. Introdução a algoritmos e programação com Python: uma abordagem dirigida por testes. Rio de Janeiro: Elsevier, 2017. 232 p. Leituras recomendadas BANIN, S. L. Python 3: conceitos e aplicações: uma abordagem didática. São Paulo: Érica, 2018, 264 p. BARRY, P. Use a cabeça! Python. 2. ed. Rio de Janeiro: Alta Books, 2018. 616 p. (Série Use a Cabeça/Head First). BORGES, L. E. Python para desenvolvedores. 2. ed. Rio de Janeiro: Edição do Autor, 2010. 360 p. Disponível em: https://ark4n.wordpress.com/python/. Acesso em: 24 jul. 2019. DOWNEY, A. B. Pense em Python: pense como um cientista da computação. São Paulo: Novatec, 2016. 312 p. Disponível em: https://penseallen.github.io/PensePython2e/. Acesso em: 23 jun. 2019. MATTHES, E. Curso intensivo de Python: uma introdução prática e baseada em projetos à programação. São Paulo: Novatec, 2016. 656 p. PERKOVIC, L. Introdução à computação usando Python: um foco no desenvolvimento de aplicações. Rio de Janeiro: LTC, 2016. 516 p. RAMALHO, L. Python fluente: programação clara, concisa e eficaz. São Paulo: Novatec, 2015. 800 p. SLATKIN, B. Python eficaz: 59 maneiras de programar melhor em Python. São Paulo: Novatec, 2016. 296 p. 15Aplicações utilizando comandos iterativos aninhados (nível fácil de aninhamento — Python)
Compartilhar