Baixe o app para aproveitar ainda mais
Prévia do material em texto
ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA Prof. Roque Maitino Neto ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I Marília/SP 2023 “A Faculdade Católica Paulista tem por missão exercer uma ação integrada de suas atividades educacionais, visando à geração, sistematização e disseminação do conhecimento, para formar profissionais empreendedores que promovam a transformação e o desenvolvimento social, econômico e cultural da comunidade em que está inserida. Missão da Faculdade Católica Paulista Av. Cristo Rei, 305 - Banzato, CEP 17515-200 Marília - São Paulo. www.uca.edu.br Nenhuma parte desta publicação poderá ser reproduzida por qualquer meio ou forma sem autorização. Todos os gráficos, tabelas e elementos são creditados à autoria, salvo quando indicada a referência, sendo de inteira responsabilidade da autoria a emissão de conceitos. Diretor Geral | Valdir Carrenho Junior ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 5 SUMÁRIO CAPÍTULO 01 CAPÍTULO 02 CAPÍTULO 03 CAPÍTULO 04 CAPÍTULO 05 CAPÍTULO 06 CAPÍTULO 07 CAPÍTULO 08 CAPÍTULO 09 CAPÍTULO 10 CAPÍTULO 11 CAPÍTULO 12 09 19 29 38 48 58 70 76 84 93 101 110 INTRODUÇÃO A ALGORITMOS E LÓGICA DE PROGRAMAÇÃO VARIÁVEIS, CONSTANTES E TIPOS DE DADOS EXPRESSÕES ARITMÉTICAS, LÓGICAS E RELACIONAIS INTRODUÇÃO À ALGORITMOS ESTRUTURADOS FORMAS DE REPRESENTAÇÕES DOS ALGORITMOS ESTRUTURAS CONDICIONAIS ESTRUTURA DE REPETIÇÃO COM TESTE NO INÍCIO ESTRUTURA DE REPETIÇÃO COM TESTE NO FIM ESTRUTURA DE REPETIÇÃO COM NÚMERO DEFINIDO DE REPETIÇÕES ESTRUTURA DE DADOS HOMOGÊNEA UNIDIMENSIONAL: VETORES ESTRUTURA DE DADOS HOMOGÊNEA BIDIMENSIONAL: MATRIZES ESTRUTURA DE DADOS HETEROGÊNEA: REGISTROS ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 6 SUMÁRIO CAPÍTULO 13 CAPÍTULO 14 CAPÍTULO 15 119 125 134 CONCEITO E UTILIZAÇÃO DE STRINGS MODULARIZAÇÃO PARÂMETROS E ARGUMENTOS EM SUBPROGRAMAS ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 7 INTRODUÇÃO No vasto universo da ciência da computação, os algoritmos servem como a espinha dorsal que sustenta o desenvolvimento de soluções para os mais diversos tipos de problemas. Eles são a chave para as mudanças que temos presenciado em nosso cotidiano e o domínio de conceitos e práticas relacionados a eles certamente abrem as portas para o sucesso profissional nesta área. Este material foi planejado e criado para ser um guia que oferecerá a você uma sólida compreensão dos fundamentos essenciais da criação de algoritmos através das ferramentas oferecidas pela programação estruturada. Neste sentido, cada capítulo proporcionará uma imersão progressiva em aspectos distintos destas ferramentas, proporcionando uma base sólida para quem dá os passos iniciais nos algoritmos. Nos dois primeiros capítulos mergulharemos na essência dos algoritmos, explorando seu conceito fundamental e suas diversas aplicações. Um breve histórico dos algoritmos nos permitirá compreender a evolução dessa disciplina, enquanto uma introdução às variáveis estabelecerá a base para a manipulação de dados ao longo do material. Ainda nesta parte inicial, expandiremos nosso entendimento sobre as variáveis, ao abordarmos tipos de dados, assim como as operações de entrada e saída que constituem a interação vital entre o programa e o usuário. Este será um passo crucial para a criação de algoritmos dinâmicos e interativos. No terceiro capítulo, aprofundaremos nosso conhecimento em expressões aritméticas, lógicas e relacionais, essenciais para a manipulação e avaliação de dados que atuarão em nossos códigos. Esses conceitos formarão a base para a construção de algoritmos mais complexos e eficientes. Os capítulos subsequentes abordarão tópicos cruciais da programação estruturada, desde estruturas sequenciais e condicionais até formas distintas de representação de algoritmos. Estruturas condicionais e de repetição são discutidas detalhadamente, o que fornecerá a você as ferramentas necessárias para criar programas robustos e flexíveis. Nos capítulos 10, 11 e 12 adentramos nas estruturas de dados homogêneas e heterogêneas, e teremos oportunidade de explorar conceitos e aplicações de vetores, matrizes e registros, enquanto o capítulo treze introduz o fascinante mundo das strings. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 8 A modularização, discutida no capítulo quatorze, é um conceito fundamental para a criação de programas mais legíveis, reutilizáveis e fáceis de manter. Finalmente, o capítulo quinze aborda a importância dos parâmetros e argumentos em subprogramas, revelando técnicas fundamentais para criar código modular e eficiente. Este material, enfim, é endereçado a estudantes que, como você, estão dando seus primeiros passos na criação de algoritmos. Cada capítulo é estruturado para oferecer uma experiência de aprendizado progressiva, construindo uma sólida base para o entendimento prático da criação de algoritmos. Sua jornada está prestes a começar e, para bem cumpri-la, seu esforço e perseverança serão decisivos. Bons estudos! ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 9 CAPÍTULO 1 INTRODUÇÃO A ALGORITMOS E LÓGICA DE PROGRAMAÇÃO Aqui começa nossa jornada rumo aos saberes e habilidades do que seguramente podemos entender como um dos pilares da Computação moderna. O conhecimento das estruturas e da lógica próprias de um algoritmo certamente abrirá caminhos para seu progresso na Tecnologia da Informação e garantirá bom alicerce para a construção do seu sucesso profissional. Para que você se sinta estimulado a prosseguir, cuidamos para que o início do nosso estudo seja repleto de descobertas e de fatos interessantes a respeito dos algoritmos. Por isso, neste primeiro encontro você terá a oportunidade de fazer contato com conceitos e utilizações do nosso objeto de estudo, com alguns de seus elementos históricos e, por fim, com os componentes mais básicos de sua estrutura. Sigamos adiante! 1.1 Conceito de Algoritmo Não dá para negar que os algoritmos desempenham papel fundamental em nosso mundo e nosso estilo de vida cada vez mais dependente do meio digital. Eles constituem a própria essência da resolução de problemas, da tomada de decisões e de muitos aspectos do nosso cotidiano que que seriam dificultados – para dizer o mínimo – sem a atuação deles. Apenas como exercício, tente imaginar como seria uma simples operação bancária sem o controle exercido por um algoritmo. Com tamanha utilidade, não é de se estranhar que os algoritmos sejam quase onipresentes em nossa vida. Antes de termos contato com a complexidade das suas aplicações, vale a pena investirmos tempo na correta conceituação de algoritmos. De forma simples e prática, um algoritmo é uma sequência de passos finitos e ordenados, executados com a finalidade de resolver um problema. Como você certamente já imaginou, há uma categoria específica de problemas que podem ser resolvidos pelos algoritmos. Não se pode atribuir a eles, portanto, a missão de resolver um problema existencial ou comportamental, por exemplo. Embora o tratamento deste assunto venha na sequência, é necessário registrar que as tarefas que um algoritmo ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 10 pode resolver são aquelas que podem ser formuladas por meio de uma sequência lógica e precisa de comandos. Para que possa estar apto a desempenhar sua função, um algoritmo deve obedecer a algumas regras e a primeira delas está relacionada a sua finitude. Embora esta premissa possa parecer bem óbvia, a sequência de passos deve ter início e fim definidos. Neste sentido, um bom exemplo vem de problemas cujoresultado compreende uma sequência numérica potencialmente infinita. Uma condição de parada deve ser adotada de tal modo que, ao ser satisfeita, o processamento do algoritmo seja interrompido. A segunda regra estabelece que um algoritmo não deve ser ambíguo, ou seja, que as instruções não devem ser passíveis de interpretação e/ou de geração de dúvidas. Duas situações da vida cotidiana esclarecerão esta ideia: 1. Imagine que você está diante de um problema cuja resolução inclua o abastecimento de um veículo, de modo que, após o procedimento, o indicador aponte que exatamente metade do tanque está preenchido com combustível. Neste caso, você não deve se dirigir ao atendente do posto pedindo a ele que “coloque meio tanque de combustível”, simplesmente porque ele não sabe quanto combustível há no tanque. Ao invés disso, um comando preciso e livre de interpretação deve ser dado. Neste comando, a quantidade exata de combustível (em litros) seja apontada. 2. Imagine agora uma receita de bolo que contenha a instrução “adicione farinha a gosto”. Neste caso, a quantidade de farinha a ser adicionada não está especificada, deixando espaço para interpretações variadas. O ponto ideal de farinha pode ser (e certamente será!) diferente para pessoas diferentes, o que levará a resultados inconsistentes e imprevisíveis relacionados ao bolo. Neste caso, a instrução “incluir 200g de farinha” constituirá uma instrução objetiva e sem margem para dúvida. Nos algoritmos que você aprenderá a construir, a clareza e a precisão dos comandos serão cruciais. Neste sentido, cada passo da resolução deve ser estabelecido de forma inequívoca, a fim de garantir que o algoritmo funcione corretamente e produza resultados previsíveis. A ambiguidade em algoritmos pode levar a erros de interpretação e, potencialmente, a consequências indesejadas. Por isso, a não ambiguidade é uma característica fundamental dos algoritmos eficazes. Por fim, a terceira regra está relacionada a entrada de dados. Um algoritmo deverá dar ao seu usuário a possibilidade de inserção de dados para que sejam processados. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 11 Além disso, para quaisquer entradas de um certo conjunto de dados, o algoritmo deverá ser capaz de fornecer o resultado esperado. Um pouco abstrato, não é mesmo? Um exemplo servirá para esclarecer o caso: imagine um algoritmo que realiza a soma de dois valores inteiros e fornece outro inteiro como resultado. Usando o conceito de variáveis – que logo você aprenderá a usar – podemos expressar assim o processamento envolvido: a + b = c Para quaisquer valores de a e para quaisquer valores de b, o algoritmo deverá ser capaz de realizar a soma e fornecer o resultado esperado. Não se pode admitir que o algoritmo seja capaz, por exemplo, de calcular o resultado para os valores 3 e 4, mas não seja capaz de fazer o mesmo para 5 e 6. Conforme já mencionado, um algoritmo serve para resolver um problema que possa ser estruturado em uma sequência de passos, o que possibilita a qualquer pessoa (ou equipamento computacional) seguir as instruções e obter o resultado desejado. Os algoritmos, portanto, podem ser encontrados em todas as áreas da ciência da computação, matemática, engenharia e em vários aspectos da nossa vida cotidiana. A próxima seção trata das principais aplicações modernas dos algoritmos. 1.2 Principais aplicações dos Algoritmos Optamos por apresentar essa seção em itens, a fim de que você possa compreender por completo a caracterização das aplicações mais interessantes e úteis dos algoritmos, desde as mais técnicas até as mais corriqueiras. Temos certeza de que você encontrará nesta lista uma ou mais aplicações que fazem parte do seu cotidiano. 1. Ordenação e Pesquisa: algoritmos de ordenação são usados para organizar dados em ordem crescente ou decrescente. Já os algoritmos de pesquisa são utilizados para encontrar itens em listas ordenadas de maneira eficiente. Como exemplo prático de utilização destes algoritmos podemos idealizar a seguinte situação: um gerente de agência bancária poderá querer ordenar a lista de seus clientes em ordem de saldo para fins de concessão de taxas especiais de juros e, em ação posterior, pesquisar todos os clientes que residem em uma determinada rua da cidade. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 12 2. Aprendizado de máquina: algoritmos de aprendizado de máquina são usados para treinar modelos que podem fazer previsões, classificações e tomadas de decisão com base em dados. 3. Processamento de imagem e de vídeo: sistemas modernos de monitoramento vão muito além da mera geração de um vídeo de uma certa localidade. Algoritmos de reconhecimento facial, de detecção de presença humana e de classificação de objetos conferem a estes sistemas capacidades de observação até então exclusivas dos seres humanos. 4. Segurança da Informação: algoritmos criptográficos garantem a segurança de dados sensíveis, como nossas senhas de cartão de crédito, quando eles são transmitidos e armazenados. Um conjunto de regras matemáticas – expressas em um algoritmo – realiza a transformação de um texto que um humano pode compreender para um texto cifrado. Há, no entanto, uma ampla gama de aplicações de algoritmos que transcendem o contexto mais técnico da Computação e se acomodam em nossa utilização diária. Vejamos. 5. Redes Sociais: o vídeo ou a foto sobre aquele assunto que tanto provoca seu interesse não aparece por acaso em seu feed de notícias nas redes sociais. Algoritmos especializados determinam o que você vê com base no seu interesse em determinado tema, apurado pelo seu engajamento com o tema. 6. Navegação por GPS: são algoritmos capazes de calcular a melhor rota entre o ponto de origem e o de destino, considerando as condições de tráfego em tempo real. Convém registrar que GPS vem de Global Positioning System, ou Sistema de Posicionamento Global, e que se tornou recurso indispensável em nossos deslocamentos, sobretudo em lugares desconhecidos. Aplicativos como o Waze e Google Maps utilizam este tipo de algoritmo para funcionarem. 7. Assistência Médica: algoritmos são usados na análise de dados médicos para auxiliar em diagnósticos, identificação de padrões e desenvolvimento de tratamentos personalizados. Além destas aplicações, há muitas outras que poderiam ser exploradas neste contexto, incluindo algoritmos usados para indicar conteúdos personalizados em ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 13 plataformas de streaming, comércio eletrônico e serviços de música. Agora que já compreendeu o conceito e as principais aplicações dos algoritmos, você é nosso convidado para conhecer um pouco da história e evolução deste tema tão interessante. 1.3 Breve histórico dos algoritmos Engana-se quem acha que a ideia de um algoritmo surgiu em nossos dias. A começar pela escolha do nome, sua história remonta a séculos atrás. O termo “algoritmo” tem sua origem no nome de Muhammad ibn Musa al-Khwarizmi, um matemático persa do século IX. Com algum esforço (e muita licença poética), conseguimos associar a última parte do nome ao som da palavra algoritmo. Em uma obra chamada “O Livro Compendioso sobre Cálculo por Conclusão e Equação”, nosso personagem sistematizou os métodos de resolução de equações lineares e quadráticas, fato que impulsionou o desenvolvimento da álgebra e da matemática (CITAÇÃO). A utilização de um algoritmo para a resolução de problemas lógicos e matemáticos, contudo, foi verificada em civilizações anteriores ao século IX. Os egípcios, por exemplo, desenvolveram métodos para resolver equações lineares e calcular áreas usando fórmulas que, essencialmente, constituíam uma sequência de passos que levava à resolução de um problema. Em outras palavras, um algoritmo. Como nãopoderia deixar de ser, os gregos antigos - muito bem representados por Euclides e Arquimedes - também contribuíram para o desenvolvimento dos algoritmos, ao formularem procedimentos para a resolução de problemas geométricos. Tempos depois, com a invenção da imprensa, o compartilhamento dos algoritmos – e de todo conhecimento relacionado a eles – foi bastante facilitado. Os trabalhos de matemáticos como Fibonacci e John Napier acrescentaram muito na evolução dos algoritmos. A revolução digital que presenciamos no século XX viabilizou grandes avanços na utilização dos algoritmos. A criação de uma máquina que atende a comandos escritos em linguagem específica constituiu abriu caminho para a criação de algoritmos de diferentes complexidades e aptos a resolverem uma miríade de problemas, desde cálculos científicos voltados a certos nichos de pesquisa até processamento de dados em larga escala. Desta forma, algoritmos de classificação, pesquisa, otimização e aprendizado de máquina ajudaram a construir a Computação como a conhecemos. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 14 ANOTE ISSO O matemático italiano Leonardo Fibonacci foi o criador de uma das sequências matemáticas mais intrigantes que conhecemos. Por padrão, ela se inicia com os números 0 e 1 e, a partir do terceiro termo, cada número é a soma dos dois anteriores. Assim, os primeiros números da sequência são: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, e assim por diante, infinitamente. Mais do que uma simples cadeia de números, esta criação tem aplicações na ciência e na natureza. Ela está relacionada à proporção áurea, uma constante irracional denotada pela letra grega φ (phi), que é aproximadamente igual a 1,618033988749895. A proporção áurea é famosa por sua presença na arquitetura, arte e natureza, e é obtida ao dividir um número da sequência de Fibonacci pelo número anterior na mesma sequência. Além disso, a sequência de Fibonacci aparece em fenômenos naturais, como o arranjo de sementes em flores, a forma espiralada de conchas de moluscos, a disposição de folhas em algumas plantas e até mesmo na reprodução de coelhos, inspirando assim o nome “sequência de Fibonacci”. Em plena era da inteligência artificial e do aprendizado de máquina, os algoritmos desempenham papel crucial em tarefas como reconhecimento de fala, visão computacional e até mesmo na condução autônoma de veículos. A constante evolução deste tema tem ajudado a moldar nosso mundo e a tornar nosso estudo ainda mais interessante. Na próxima seção serão abordados os elementos mais básicos dos algoritmos, incluindo as ideias de entrada, processamento e saída de dados. 1.4 Elementos fundamentais dos algoritmos Um dos elementos mais interessantes sobre os algoritmos é a simplicidade conceitual que os caracteriza, especialmente quando comparada à sua complexidade de aplicações. Na seção 1.1 tivemos oportunidade de fornecer um conceito para algoritmo, comparando-o a uma sequência de passos finitos e ordenados, executados com a finalidade de resolver um problema. Basta refletir um pouco sobre este conceito para que se verifique seu enorme alcance, já que executamos “sequências de passos” em muitas das ações que empreendemos diariamente. Pensemos juntos: ao nos levantarmos da cama, normalmente seguimos uma rotina definida para estarmos aptos ao trabalho ou ao estudo; a criação de um prato segue uma receita igualmente definida de ações e o planejamento de uma festa requer o cumprimento de certas etapas em ordem definida. Os exemplos, enfim, são muitos. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 15 1.4.1 Esquema geral de um algoritmo Uma diferença fundamental entre os “algoritmos” que executamos em nossas ações corriqueiras e os algoritmos que compõem o objeto de nosso estudo é a capacidade do segundo de receber entradas, realizar processamento e fornecer saídas, em formato de expressões, números e/ou textos. Para que esta ideia comece a parecer mais familiar a você, observe a figura 1. Figura 1: Esquema geral dos algoritmos. Fonte: o autor. Do algoritmo complexo até o mais simples, o esquema “entrada > processamento > saída” comporá sua estrutura, mesmo considerando as inevitáveis variações das quais trataremos em encontros futuros. Tomemos uma situação bem simples como exemplo: você deseja criar um algoritmo que some dois números e mostre o resultado da operação. Neste caso, os dados de entrada serão dois números quaisquer, representados por duas variáveis. Neste ponto cabe uma observação e uma lembrança: (i) o conceito de varável será introduzido adiante e, (ii) para quaisquer entradas de um certo conjunto de dados, o algoritmo deverá ser capaz de fornecer o resultado esperado, conforme tratamos na seção 1.1. Decidimos então que a e b representarão os dois números quaisquer que serão processados. Como você pode imaginar, o processamento se dará pela aplicação da operação de soma, em a e b. Ao colocarmos a entrada, o processamento e a saída em uma sequência de passos, teremos: 1. obter a 2. obter b 3. somar a com b 4. exibir o resultado Embora a menção seja quase sempre feita no singular, uma entrada pode ser efetivada por diversas variáveis, conforme podemos constatar nas linhas 1 e 2 do ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 16 nosso exemplo. A linha 3 corresponde ao processamento do algoritmo e, na linha 4, a saída está representada. Parece simples, não é mesmo? Na maioria dos casos, uma boa prática para se começar a criar um algoritmo é identificar a(s) entrada(s), o processamento e a(s) saídas. Como último ato deste primeiro encontro será apresentado o conceito de variáveis, seguido de exemplos e aplicações. 1.4.2 Conceito e aplicações de variáveis A utilização de entidades literais (ou seja, representadas por letras) para simbolizar um valor numérico não é uma “invenção” do mundo dos algoritmos. O uso de letras que representam números (e compõem expressões) é prática comum na matemática, desde sempre. Embora a ideia que permeia a prática em ambas as áreas seja praticamente a mesma, será necessário fazer certas distinções, a fim de que o conceito e aplicação das variáveis nos algoritmos sejam livres de dúvidas. Em nosso contexto de estudo, as variáveis são como “pequenas caixas” situadas na memória, capazes de guardar um ou mais dados, a depender do tipo da variável. Esse dado será usado e modificado (daí a denominação de “variável”) durante a execução do algoritmo. Pense nas variáveis como contêineres em que será possível armazenar dados de diferentes tipos, incluindo número e texto, entre outros. As variáveis são constituídas por três elementos principais: Nome: meio pelo qual uma variável é identificada. Trata-se de uma palavra escolhida pelo criador do algoritmo para representar o valor armazenado. As condições para criação do nome serão abordadas em encontros futuros, mas é importante ressaltar, desde já, que o nome dado à variável em sua criação deverá ser reproduzido fielmente em qualquer atualização da variável feita posteriormente. ISTO ACONTECE NA PRÁTICA Se você criar uma variável chamada nota1 e, ao fazer alguma atualização, referenciá-la como nota_1, por exemplo, seu algoritmo conterá um defeito. Embora os ambientes integrados de desenvolvimento que nos ajudam na criação dos algoritmos contenham recursos para que esses defeitos sejam rapidamente descobertos, esse tipo de distração já tirou o sono de muita gente, principalmente quando os recursos de edição de um algoritmo não eram tão sofisticados. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 17 Tipo do dado que será armazenado: um algoritmo é capaz de armazenar e processar vários tipos de dados, incluindo números inteiros (ou seja, sem casas decimais), caracteres (dea – z, por exemplo) e textos, entre outros. Por isso, antes de estar apta a armazenar e processar valores, a variável deve receber o tipo de dado com que lidará. Valor: por fim, este elemento é aquele que representa o valor real que a variável, em dado momento, possui. A utilização da expressão “em dado momento” neste contexto sinaliza que uma variável simples poderá conter um – e apenas um – valor em um certo momento. Se, durante a execução do algoritmo, uma variável recebe, por exemplo, o valor 5, ele substituirá o valor anteriormente guardado. Por fim, o valor presente na variável seguirá o critério determinado pelo seu tipo. Uma variável definida como inteira não poderá, por exemplo, conter o valor “casa”. A figura 2 exibe uma possível representação de variável. Figura 2: Representação de uma variável. Fonte: o autor. Observe que a letra “a”, situada acima do quadrado, representa o nome da variável. O número 5, posicionado dentro do quadrado, representa o valor momentâneo da variável e, por fim, “inteiro” indica o tipo da variável. Esta representação serve para transmitir a ideia de que a função de uma variável se assemelha a de uma caixa que contém um nome, e é capaz de guardar um valor de determinado tipo. Uma aplicação possível para variáveis pode ser resgatada de um contexto bastante familiar: o cálculo da média obtida nas provas bimestrais. Imagine que o criador do algoritmo tenha declarado cinco variáveis para esta demanda. A declaração é o ato de dar nome e tipo a uma variável. Para que coincidam com suas funções, os nomes ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 18 escolhidos para as variáveis foram nota1, nota2, nota3, nota4 e media, todos grafados em letras minúsculas e sem acentos. Já a definição dos tipos requer, por assim dizer, um certo “conhecimento de mundo” do criador do algoritmo. Em outras palavras, será necessário saber que uma nota é muito comumente expressa em valores com casas decimais, o que acontece também com a média. Por isso, neste caso, você deverá declarar as cinco variáveis com o tipo decimal. Finalizamos aqui este primeiro encontro. Procure resolver os exercícios e realizar suas leituras a fim de se preparar bem para o que vem por aí. Até breve! ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 19 CAPÍTULO 2 VARIÁVEIS, CONSTANTES E TIPOS DE DADOS Seja bem-vinda e seja bem-vindo ao segundo encontro de Algoritmos e Lógica de Programação. No capítulo inicial deste material tratamos dos elementos mais básicos do nosso tema, incluindo conceituação, principais aplicações, breve histórico e, por fim, uma breve introdução a variáveis. Por causa da importância e da larga extensão de aplicações deste último item, retomaremos o estudo justamente por ele. Conforme introduzido no capítulo 1, variáveis se assemelham a caixas (ou contêineres) capazes de armazenar um dado, cujo valor será alterado durante a execução do algoritmo. Mas será que as definições sobre variáveis param por aí? Além disso, teremos a oportunidade de entendermos os conceitos relacionados a constantes e a tipos de dados, além de desenvolvermos o primeiro exemplo completo de algoritmo. Fique conosco! 2.1 Definições sobre variáveis e constantes nos algoritmos Em nosso contexto, criar um algoritmo é o equivalente a criar uma sequência de declarações e de comandos que transformarão dados de entrada em resultados disponibilizados ao utilizador do algoritmo, a fim de solucionar um problema. Em outras palavras, dados de entrada passarão por transformações (ou processamento) e os dados resultantes serão entregues como saída ao usuário. Este processo, que constitui o esquema geral dos algoritmos, pede a existência de um elemento que permita o armazenamento e recuperação dos dados que mencionamos, seja durante a entrada, durante o processamento ou durante a saída. A este elemento damos no nome de variável. As variáveis, portanto, são os pilares dos algoritmos e, sem elas, a resolução de um problema através de uma sequência de passos seria inviável. Iniciaremos as nossas definições sobre variáveis pelas regras de constituição do nome que as identificam. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 20 2.1.1 Definição do nome de uma variável O objetivo final da criação de um algoritmo é a transformação dele em um programa de computador, criado em determinada linguagem de programação, de modo que possa ser executado pelo computador. Embora devamos retomar este tema em encontros futuros, a menção a este fato já faz sentido neste item, posto que os critérios de criação de um nome de variável (e de demais identificadores do algoritmo) deverão seguir as regras da linguagem de programação adotada para a implementação do algoritmo. Sobre esta questão, fixe o seguinte: as regras de composição do nome de uma variável aqui apresentadas têm uma origem definida e estão em sintonia com nossos objetivos futuros. Os nomes das nossas variáveis deverão ser iniciados com uma letra, nos intervalos de a – z ou de A – Z. Há ainda a possibilidade de se iniciar um nome de variável com um sublinhado ( _ ). Depois deste primeiro caractere, você poderá usar combinações de letras, números e sublinhados. Além disso, as letras maiúsculas e minúsculas são diferenciadas na composição do nome da variável, de modo que nota1 e Nota1 sejam consideradas duas variáveis distintas. Por último, o espaço não é admitido no nome da variável. Nomes separados por espaço são consideradas duas variáveis, e não apenas uma. Embora estes apontamentos sejam regras das quais não podemos nos esquivar, adotaremos algumas convenções não obrigatórias que nos ajudarão na padronização dos nomes. Escreveremos os nomes todos em letras minúsculas e, no caso de haver uma composição de termos, eles serão separados por sublinhados. Vejamos alguns exemplos de nomes de variáveis, com a indicação de validade ou não. nota_1: válido 1_nota: inválido Nota: válido, mas fora do padrão primeiro_nome: válido primeiro nome: inválido Antes de avançarmos, cabe uma última recomendação: é fundamental que você escolha o nome da variável de acordo com a função que ela irá exercer em seu algoritmo. Por óbvio que pareça, uma variável criada com o nome de “media” não deverá conter outro valor que não a média calculada entre números. Além disso, chamar uma variável de “arvore_frondosa” em uma operação aritmética, por exemplo, em nada ajudará no entendimento do algoritmo, embora ele possa executar exatamente o que se pretendia. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 21 2.1.2 Definições sobre o tipo de uma variável Tente imaginar a variedade de dados com os quais lidamos em nosso cotidiano e nos formatos que eles assumem: uma data de nascimento tem composição, formato e utilização diferentes de um nome próprio, por exemplo. Um número com o qual se pretende expressar elementos da física quântica tem forma e função diferentes do número que indica uma idade. Os exemplos podem ser variados e numerosos, mas um fato já parece claro: para construir um algoritmo, será necessário contar com a possibilidade de se criar variáveis de diferentes tipos, a fim de poder contemplar a miríade de problemas a serem resolvidos. Por isso, o tipo da variável será mais um elemento a ser considerado em sua criação. Na sequência serão descritos alguns tipos de dados disponíveis para armazenar diferentes tipos de dados, a começar pelo mais comum. 1. Inteiro: este tipo de variável é usado para armazenar números inteiros, positivos ou negativos. Vale sempre lembrar que um número inteiro não contém a parte decimal, ou seja, não contém vírgula em sua composição. Grandezas como idade, quantidade de passos e número de repetições de um determinado evento podem ser exemplos que demandema criação de variáveis inteiras. 2. Ponto Flutuante: variáveis do tipo ponto flutuante são usadas para armazenar números com parte decimal. A altura de uma pessoa, uma nota escolar em formato numérico e o peso de um produto são exemplos típicos de grandezas que devem ser mantidas em variáveis deste tipo. 3. String: também conhecido como cadeia de caracteres, este tipo é usado para armazenar texto, normalmente formado por uma sequência de caracteres alfanuméricos. 4. Booleano: também conhecido como tipo lógico, um booleano poderá conter apenas dois valores possíveis: verdadeiro ou falso. ISTO ESTÁ NA REDE A compreensão do nome “booleano” como tipo de dado passa pela descoberta da vida e da obra do homem que o inspirou. George Boole foi um matemático inglês, criador da Álgebra Booleana, que serve da lógica computacional. Para saber mais, consulte https://www.ebiografia.com/george_boole/. Acesso em 26 set. 23. https://www.ebiografia.com/george_boole/ ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 22 5. Lista: as variáveis do tipo “lista” são usadas para armazenar uma coleção ordenada de valores, que podem ser de diferentes tipos. Uma lista, portanto, é um tipo de variável conhecida como composta, por ser capaz de armazenar mais do que um valor em sua estrutura. Um bom exemplo do uso de uma lista pode se efetivar quando o criador do algoritmo deseja armazenar todas as idades apuradas a partir de uma amostra de eleitores de uma certa região. De modo geral, sempre que você precisar armazenar um conjunto de valores – ao invés de apenas um – a utilização de uma lista poderá ser uma boa ideia. Por enquanto, esses são os tipos de variáveis mais comuns que usaremos nos algoritmos. A exemplo das regras para composição do nome da variável, os tipos aqui descritos seguem padrões provenientes de ferramentas que serão usadas por você num futuro próximo. 2.1.3 Definições sobre constantes Com base no que estudamos até o momento, pudemos entender que a função de manter valores – sejam numéricos ou não – tornam as variáveis indispensáveis na criação de um algoritmo. O nome de “variável” dado a este elemento reflete seu caráter não permanente e justificar a necessidade de sua existência é bem simples: os valores por ela mantidos variam de acordo com inúmeros fatores, incluindo a entrada feita pelo usuário ou o tipo de transformação aplicada sobre ela. Todos esses fatos, contudo, se contrapõem ao nosso próximo objeto de estudo: a constante. Constantes são elementos que não se modificam durante a execução do algoritmo. Embora ocorram com menos frequência na maioria dos algoritmos, uma constante tem sua importância resguardada por vários motivos. Imagine que seu algoritmo demande a utilização da constante PI em várias ocasiões. A depender da precisão numérica necessária, o número que o representa poderá ser extenso e reproduzi-lo com frequência certamente aumentará a propensão ao erro. Em casos como este, não hesite: declare uma constante e dê a ela o valor desejado, conforme se vê na sequência: PI = 3.141592 ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 23 Embora a ideia seja a de manter o valor da constante PI inalterado durante todo o algoritmo, seu criador poderá concluir pela necessidade de se acrescentar mais 4 casas de precisão no número. Ao optar por usar uma constante, ele não precisará buscar todas as ocorrências do valor de PI para acrescentar as casas necessárias. Ao invés disso, bastará proceder a alteração na constante. Uma outra vantagem desta prática é a de aumentar a legibilidade e a clareza do seu algoritmo, já que o nome da constante idealmente descreve sua função. As constantes desempenham um papel importante na clareza e na manutenção de um algoritmo, pois ajudam a tornar o código mais compreensível e fácil de gerenciar. Lembre-se, então, de usar constantes sempre que for aplicável ao escrever seu algoritmo. Como última recomendação, use letras maiúsculas ao declará-las. 2.2 Declaração de variável e operação de atribuição Existem diversas formas de uma variável ser utilizada durante a execução do algoritmo e cada uma destas formas merecerá oportunamente nossa atenção. O que precisa ser pontuado desde já é a necessidade de se fazer uma espécie de anúncio da variável ao algoritmo que está sendo escrito. A esta operação damos o nome de declaração da variável. Declarar uma variável é, portanto, informar ao algoritmo nome e tipo do recurso que será usado logo na sequência. Declara-se a variável uma única vez e, depois, usa-se a variável quantas vezes forem necessárias. Vamos ao primeiro exemplo: inteiro idade Esta simples linha informa que o algoritmo utilizará uma variável chamada idade e que seu tipo é inteiro, ou seja, só aceitará números sem a parte decimal. Eventualmente você poderá querer declarar uma variável e, na mesma linha, indicar seu valor inicial. Vejamos: inteiro contador = 0 ANOTE ISSO Linguagens de Programação modernas geralmente dispensam a prévia declaração de uma variável e a definição do tipo correspondente. O tipo de uma variável é determinado automaticamente com base no valor atribuído a ela. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 24 Embora a atribuição de valor a uma variável possa ser feita no ato da sua declaração, é mais comum que ela seja efetivada durante o algoritmo. Realizar uma atribuição significa inserir nela um valor, que deve ser coerente com seu tipo. Para nossos propósitos, esta operação se faz com o sinal de igual ( = ). Observe que a atribuição contador = 0 diferencia-se do exemplo anterior justamente pelo momento em que aparece no algoritmo: no primeiro exemplo, temos uma declaração seguida de atribuição e, no segundo, temos uma simples atribuição, feita depois de o tipo ter sido associado à variável. A operação de atribuição, no entanto, não é a única forma de se associar um valor a uma variável. Sigamos adiante para descobrirmos mais a esse respeito. 2.3 Introdução a comandos de entrada e saída Como você bem se lembra, o esquema geral de um algoritmo prevê a aquisição de dados, o processamento destes dados e, por fim, o fornecimento do resultado obtido por meio do processamento. Esquematicamente, temos “entrada > processamento > saída” e, nesta seção, trataremos especificamente das formas de entrada e de saída de dados em nossos algoritmos. Antes, porém, de nos aventurarmos neste assunto, vale a pena tratarmos de um elemento que será praticamente onipresente em nossas atividades: o comando. ANOTE ISSO Será muito comum você se deparar com o termo “pseudocomando” quando estiver buscando referências a respeito de comandos em algoritmos. Os autores usam essa denominação para diferenciar uma instrução escrita segundo as regras formais de uma linguagem de programação e outra escrita numa linguagem meramente algorítmica e que não poderá ser executada por um computador, a não ser em ferramentas específicas para criação de algoritmos. Por ora, estaremos usando apenas pseudocomandos em nossos estudos. Outro apontamento importante neste contexto está relacionado aos meios físicos de entrada e saída de dados. Conforme já mencionado, entendemos que nossos algoritmos poderão, em estágio mais avançado, ser convertidos em comandos de linguagem de programação para que possam ser executados por um computador. Assumimos, portanto, desde já, que o teclado será nosso meio universal de entrada e o monitor de vídeo (também referenciado como tela) será nosso meio de saída. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 25 Um comando representa uma ordem – ou uma instrução - dada ao algoritmo para que uma ação seja tomada. Um comando, portanto, remete a uma ação e inclui uma entrada de dado, uma atribuição, uma operação lógica, umaoperação de repetição e tantas outras que teremos oportunidade de estudar. Entrada de dados: em nossos algoritmos, usaremos o comando leia() para realizar as entradas de dados e uma variável deverá ser inserida entre os parênteses do comando. Objetivamente, o comando leia()permite que o usuário do algoritmo insira um dado pelo teclado, que deve ser do mesmo tipo da variável que ocupa o espaço entre parênteses. Após a execução do comando, esta variável conterá o valor digitado. Depois de tratarmos da saída de dados, um exemplo completo será desenvolvido. Saída de dados: usaremos o comando escreva() para indicar ao algoritmo que desejamos que um valor ou um conteúdo textual seja enviado a tela, como forma de realizar uma saída de dado. As regras para utilização deste comando incluem: a) Para que um texto seja enviado à tela, ele deve estar entre aspas. Exemplo: ao se deparar com a instrução escreva (“Este comando serve para enviar texto à tela. “), o algoritmo enviará à tela o exatamente o texto situado entre aspas. b) Para que o conteúdo de uma variável seja enviado a tela, ela deverá ser colocada entre os parênteses do comando. Exemplo: o comando escreva (idade) irá enviar à tela o conteúdo da variável idade, que será aquele informado pelo usuário durante a entrada de dados ou será resultado de algum processamento previamente realizado. c) É possível também que o resultado de uma expressão, resolvida pelo próprio comando de saída, seja enviada para a tela. Exemplo: o comando escreva (principal + acrescimo) enviará a tela o resultado da soma entre o conteúdo da variável chamada principal e o conteúdo da variável chamada acrescimo. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 26 Postos estes elementos, poderemos então desenvolver nosso primeiro exemplo completo de algoritmo. Para que a explicação de cada uma das linhas seja facilitada, elas serão numeradas. 1 algoritmo exemplo1_soma_duas_idades 2 //Este algoritmo soma duas idades e mostra o resultado em tela 3 var 4 idade1, idade2, soma_das_idades: inteiro 5 inicio 6 escreva (“Informe a sua idade: “) 7 leia (idade1) 8 escreva (“Informe a idade do seu irmão ou irmã: “) 9 leia (idade2) 10 soma_das_idades = idade1 + idade2 11 escreva (“A soma das idades é “, soma_das_idades) 12 fimAlgoritmo Linha a linha, este algoritmo realiza o que segue: Linha 1: aqui o algoritmo simplesmente recebe um nome. A partir desta linha, a forma correta de fazer referência a ele será exemplo1_soma_duas_idades. Repare que a composição do nome segue uma das regras de composição de nomes de variáveis: não pode haver espaço entre as palavras. Linha 2: esta linha contém um texto inserido como comentário. Ao longo do seu algoritmo, você poderá inserir comentários em linhas inteiras (como é o caso deste exemplo) ou logo após a inclusão de um comando. Os comentários não compõem os elementos de execução de um algoritmo, mas servem para documentá-lo. Neste ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 27 nosso caso, o comentário informa a funcionalidade do algoritmo, em poucas palavras. Para distinguir um comentário de uma linha de comando, você deve inserir duas barras (//). Durante nossos encontros, trataremos de outra forma de apontar ao algoritmo que o texto que segue compõe um comentário. Linha 3: aqui é indicado o início da área de declarações de variáveis. Linha 4: nesta linha, três variáveis são declaradas. Como elas são do mesmo tipo, foi possível utilizar a mesma linha para declaração das três. Note que o tipo designado foi inteiro, pois os números que indicam idades pertencem ao domínio dos inteiros. Linha 5: aqui é apontado o início da área em que os comandos serão escritos, ou seja, nesta linha é que o algoritmo efetivamente tem início. Linha 6: o primeiro comando do algoritmo foi colocado na linha 6. Trata-se de uma instrução para que o texto situado entre aspas seja colocado em tela. Tenha em mente que textos enviados à tela fazem parte da comunicação do algoritmo com a pessoa que o utilizará. Por isso, a recomendação é que você seja o mais claro e assertivo possível nestas ocasiões. Linha 7: o comando leia (idade1) provoca uma interrupção na execução do algoritmo, a fim de que o usuário digitar a idade dele. Uma vez digitada, a idade informada pelo teclado será atribuída à variável idade1. No momento, não dispomos de recursos técnicos para instruir o algoritmo a validar o valor informado pelo usuário. Se a digitação tiver sido, por exemplo, 320, o algoritmo assumirá que este é um valor coerente com uma idade humana, o que não é verdade. No entanto, em sendo digitado um número inteiro, a falta de coerência que apontamos não será impeditivo para a correção do algoritmo. Linha 8: esta linha tem finalidade semelhante a apontada na linha 6, que é a de obter uma idade. Neste caso específico, no entanto, o usuário é orientado a informar a idade de outra pessoa, qual seja de um irmão ou irmã. Linha 9: aqui valem os mesmos apontamentos feitos para a linha 7. A variável envolvida, no entanto, é outra. Se, por desatenção do criador do algoritmo, a variável idade1 for novamente usada, seu valor anteriormente lido será apagado. Linha 10: esta linha contém uma expressão aritmética e um comando de atribuição. A expressão aritmética é efetivada pela operação de adição entre duas variáveis e a atribuição é realizada pelo sinal de igual. É necessário observar que as ações ocorrem da direita para esquerda: o conteúdo da variável idade1 é somado ao conteúdo da variável idade2 e o resultado é atribuído à variável soma_das_idades. Será comum ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 28 você se deparar com o comando de atribuição representado por uma seta orientada para a esquerda, justamente para reforçar a direção em que ocorrem as ações. Linha 11: esta linha realiza a apresentação do resultado em tela, precedido por um texto que o apresenta. É necessário novamente pontuar a importância da clareza que deve caracterizar este texto, já que dele dependerá boa parte do entendimento do usuário sobre a saída exibida. Note que nesta linha o comando de saída contém elemento fixo (texto colocado entre aspas) e parte variável, representada por soma_ das_idades. Linha 12: esta linha simplesmente indica o final do algoritmo. Bastante informação para um primeiro algoritmo, não é mesmo? Há ainda uma última observação a ser feita: da linha 6 até a linha 11 o recuo do comando está diferente em relação às demais linhas. Isso se deve ao recurso da indentação, que consiste em inserir espaçamento horizontal para que as estruturas dos blocos de comandos fiquem aparentes. Embora essa providência não altere a execução do seu algoritmo, ela servirá para conferir organização e boa legibilidade ao seu código. Até o próximo encontro! ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 29 CAPÍTULO 3 EXPRESSÕES ARITMÉTICAS, LÓGICAS E RELACIONAIS Como você teve a oportunidade de constatar em nosso encontro anterior, a criação de um algoritmo está vinculada, principalmente, à escrita de comandos e à realização de operações com variáveis. Conforme avançarmos em nossos estudos, trataremos de comandos que realizam ações muito além das atribuições, das leituras e das escritas em tela. Por ora, no entanto, teremos como objeto de estudo as operações com variáveis e as transformações que poderemos aplicar nessas variáveis, por meio da utilização de expressões aritméticas e lógicas. 3.1 Operações aritméticas Como o próprio nome sugere, estas operações envolvem transformações aritméticas aplicadas a variáveis e constantes, por meio de expressões. É necessário salientar, desde já, que todas as expressões que abordaremos exigem que uma variável receba, emforma de atribuição, o valor calculado na expressão. Isso quer dizer que não é permitida a escrita, por exemplo, da expressão x + y, sem uma variável à qual seja atribuída o resultado da soma. Em outras palavras, nesta expressão faltou a variável que deverá receber o resultado da soma entre x e y. Na sequência você terá a oportunidade de constatar como essa regra funciona. As operações aritméticas mais comuns incluem: 3.1.1 Adição Operação efetivada pelo sinal de adição ( + ) e apta a somar dois ou mais números, sejam eles representados por variáveis ou por constantes. Em nosso contexto, essa operação é útil para calcular totais, médias, acumular valores e realizar contagens. Na sequência, alguns exemplos de suas aplicações e as respectivas explicações. a) distancia_total = distancia1 + distancia2 ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 30 Supondo que todas as variáveis sejam do tipo inteiro, a expressão começa a ser resolvida pela soma entre distancia1 e distancia2. Na sequência, o valor resultante é atribuído à variável distancia_total. Caso esta última variável já contenha algum valor atribuído, ele será simplesmente sobreposto pelo novo valor. b) contador = contador + 1 Esta expressão aritmética é certamente um dos componentes mais importantes dos algoritmos. De tão utilizada, ela recebeu um nome próprio: contador. Esta denominação expressa justamente função que a caracteriza. Um breve olhar sobre essa expressão pode levantar uma questão bastante oportuna: numa equação matemática comum não é possível que uma variável assuma um valor igual a ele próprio mais um. No entanto, a expressão que implementa um contador não é uma equação e seria errado tratá-la como tal. A leitura que devemos fazer da expressão contador = contador + 1 é a seguinte: ao valor contido na variável contador deve ser somado 1, e o resultado deve ser atribuído à própria variável contador. Desta forma, a execução desta linha provoca o incremento da variável que ocupa o lado esquerdo da expressão. Não levará muito tempo até desenvolvermos um exemplo completo utilizando este recurso, mas é prudente pontuar que o nome da variável que usaremos em nossos futuros desenvolvimentos nem sempre será contador. O que caracteriza o funcionamento desta expressão não é o nome da variável que a compõe, mas a sua estrutura. c) acumulador = acumulador + numero Ainda no escopo das operações aritméticas efetivadas por meio de adição, é necessário que você conheça a expressão conhecida por acumulador ou somador. A cada execução desta linha, o valor contido na variável numero é somado ao valor já existente na variável acumulador, o que faz a expressão operar somas sucessivas. Novamente, os nomes das variáveis poderão variar entre exemplos, o que não invalida a funcionalidade da expressão. 3.1.2 Subtração A subtração é usada para o algoritmo possa encontrar a diferença entre dois números e efetiva-se por meio da aplicação do sinal - . Ela é útil para calcular variações, saldos, e outras quantidades relacionadas à diferença entre valores. A expressão diferenca ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 31 = numero1 - numero2 subtrai o valor contido em numero2 do valor contido em numero1, e atribui a diferença à variável diferenca. Assim como as demais expressões, a resolução se dá no sentido da direita para a esquerda. 3.1.3 Multiplicação Esta operação é usada para calcular o produto de dois ou mais números. Ela é essencial para calcular áreas, volumes, e para criar repetições controladas por multiplicação. Em encontros futuros trataremos de repetições de trechos de algoritmos. A expressão produto = numero1 * numero2 multiplica o valor de numero1 por numero2 e atribui o produto à variável produto. Observe que operador da multiplicação é um asterisco (*) e não a letra x, como na Matemática. 3.1.4 Divisão Colocado da forma mais simples possível, a divisão é usada para dividir um número pelo outro, o que pode ser útil para calcular taxas, médias ponderadas e distribuir quantidades. Na expressão quociente = dividendo / divisor, a variável divisor jamais deve assumir o valor 0. Por meio da aplicação da correta validação, você deve assegurar-se de que este fato não acontecerá durante a execução do seu algoritmo. Note que o operador da divisão é a barra (/). 3.1.5 Divisão inteira Esta operação retorna apenas a parte inteira do resultado da divisão, o que pode será quando você deseja calcular quantas vezes um número cabe em outro sem considerar os decimais. Este operador é representado pela barra dupla (//) e a expressão resultado_inteiro = numero1 // numero2 é um exemplo de sua utilização. 3.1.6 Módulo O operador de módulo, representado pelo símbolo de porcentagem (%), retorna o resto da divisão entre dois números. Isso pode ser útil para verificar se um número é divisível por outro ou para determinar se o valor contido em certa variável é par ou não. Como exemplo, considere a expressão resto = numero1 % 2. Caso o valor resultante em resto seja 0, teremos que o valor contido em numero1 é par. Qualquer número que retorne resto 0 quando dividido por 2 é par. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 32 3.1.7 Potenciação A operação de potenciação, efetivada pelo operador duplo asterisco (**), eleva um número a uma potência específica, e pode ser usada em cálculos exponenciais próprios de juros compostos, por exemplo. Um exemplo de expressão para esta operação é resultado_potencia = numero_base ** expoente. No decorrer de nosso estudo poderá ser introduzido um ou outro novo operador, conforme necessidade. É importante lembrar que, ao usar operações aritméticas em algoritmos, é necessário levar em consideração a precedência dos operadores, do mesmo jeito que fazemos na Matemática. Por exemplo, multiplicação e a divisão são resolvidas antes da adição e da subtração e os parênteses servem para controlar a ordem das operações quando necessário. Em resumo, as operações aritméticas serão ferramentas essenciais em nossos algoritmos e permitirão que você resolva uma ampla variedade de problemas matemáticos e quantitativos de forma eficaz. Elas desempenham um papel fundamental em muitos campos, desde cálculos financeiros até simulações científicas. 3.2 Operações lógicas Assim como as transformações aritméticas, as operações lógicas desempenharão papel fundamental na construção dos nossos algoritmos. Em composição com variáveis, eles integram ferramental essencial para que comandos específicos sejam capazes de tomar decisões com base em certas condições. Para contemplar nossos objetivos imediatos, trataremos dos três operadores lógicos principais: e, ou e não. Com eles, você será capaz de compor expressões que basearão a lógica necessária para a resolução de problemas específicos. 3.2.1 Operador “e” O operador lógico “e” é parte fundamental dos algoritmos, pois desempenha um papel crucial na tomada de decisões com base em múltiplas condições. Ele é usado para combinar duas ou mais condições e determinar se todas elas são verdadeiras. A utilização deste operador implica que uma expressão resultará em verdadeira somente se todas as condições individuais que a compõem também forem verdadeiras. A boa notícia em favor do entendimento destas condições (e de outras que integrarão outros operadores lógicos) é que as utilizamos constantemente em nosso dia a dia. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 33 Tomemos como exemplo a seguinte situação: ao abrir o jornal, você se depara com uma vaga de emprego cujo preenchimento será feito por (a) pessoas regularmente matriculadas em curso relacionado à Tecnologia da Informação e (b) pessoas com 18 anos ou mais. Observe que o atendimento a apenas uma das condições nãotorna alguém apto para a vaga. É necessário que a condição (a) e a condição (b), ambas sejam verdadeiras para que tenhamos um candidato apto à vaga. Outros exemplos serão desenvolvidos quando estudarmos os comandos condicionais, em encontro futuro. Por ora, devemos entender que, dadas duas condições, ambas devem ser satisfeitas (ou seja, devem ser verdadeiras) para que a expressão toda que compõe uma expressão lógica criada com o operador “e” seja verdadeira. Você terá a oportunidade de constatar a grande utilidade deste operador em algoritmos que contenham tomadas de decisões com base em múltiplas variáveis ou condições. Ele permite que você crie algoritmos dotados de lógica complexa para resolver problemas do mundo real de maneira eficaz. 3.2.2 Operador “ou” O operador que abordaremos nesta seção é igualmente importante na construção de algoritmos, pois também desempenha papel fundamental na tomada de decisões baseadas em condições múltiplas. Nos algoritmos que construiremos, o operador “ou” será usado para combinar duas ou mais condições e determinar se pelo menos uma delas é verdadeira. Em outras palavras, a expressão resultará em verdadeira se pelo menos uma das condições individuais for verdadeira. Para ilustrar este conceito, devemos resgatar o exemplo usado no operador “e”: imagine que a descrição da vaga, desta vez, indique que quem (a) está matriculado em um curso de TI OU quem (b) tem 18 anos ou mais, estará apto a concorrer. Observe que bastará que uma das condições seja satisfeita para que o candidato possa concorrer à vaga. Neste ponto valem duas observações: a primeira é que o operador “ou”, de fato, é menos restritivo que o operador “e”, pois toda a expressão será verdadeira se apenas uma condição componente o for. A segunda observação será colocada em forma de pergunta: e se o candidato tiver 18 anos ou mais e estiver cursando TI? Neste caso, a aplicação do operador “ou” também retornará verdadeiro para a expressão. Em resumo, o operador “ou” é bastante útil para criar algoritmos flexíveis que podem lidar com diferentes cenários. Ele é frequentemente usado em situações em que você ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 34 deseja que pelo menos uma das condições seja satisfeita para prosseguir. Antes de avançarmos, vale o registro de que você poderá encontrar uma variação deste operador, conhecido com “ou exclusivo”. Neste caso, sua aplicação retornará verdadeiro quando uma das condições for verdadeira, mas retornará falso se ambas forem verdadeiras. 3.2.3 Operador “não” O operador lógico “não” serve para realizar a negação de uma condição lógica. Vamos explorar como esse operador funciona e sua importância nos algoritmos. Em outras palavras, ele é usado para inverter o valor de uma condição: se uma condição for verdadeira, o operador “não” a tornará falsa; se a condição for falsa, o operador “não” a tornará verdadeira. Este recurso será fundamental para criar parte da lógica em nossos algoritmos, permitindo a alteração do comportamento de variáveis e expressões com base em condições negativas. Ele é frequentemente usado em conjunto com os operadores “e” e “ou” para criar expressões lógicas mais elaboradas. 3.3 Tabela Verdade É comum que, ao tomarmos contato com um conhecimento novo, sintamos falta de algum artifício ou recurso que possa resumir toda a informação que acabamos de receber. Por sorte, o comportamento dos operadores lógicos que abordamos até aqui podem ser sintetizados e analisados, em um recurso chamado tabela verdade. Ela exerce papel bastante importante na lógica que permeia estes operadores e certamente irá nos ajudar a com as condições compostas que deveremos escrever em breve. Em uma tabela verdade teremos listadas todas as possíveis combinações de condições lógicas aplicadas aos operadores lógicos que conhecemos. Além de exibir as mencionadas condições, a tabela verdade exibirá o resultado das combinações formadas por essas condições. Utilizando os operadores “e”, “ou” e “não” para condições “a” e “b”, a tabela verdade assim será composta conforme exibido na tabela 3.1: a b a e b a ou b não a não b V V V V F F V F F V F V F V F V V F F F F F V V Tabela 3.1 – Tabela Verdade Fonte: o autor (2023). ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 35 Nesta tabela, “V” representa verdadeiro e “F” representa falso. Ela lista todas as combinações possíveis de valores para a e b e mostra o resultado das expressões “a e b”, “a ou b”, “não a” e “não b”, considerando todas as combinações possível. Observe que, com a utilização do operador “e”, a expressão é verdadeira apenas quando ambas as condições a e b são verdadeiras. No caso do operador “ou”, a expressão é verdadeira em todos os casos, exceto quando a e b são ambos falsos. Por fim, a aplicação do operador “não”, o valor lógico de a e de b são simplesmente invertidos. Em resumo, as tabelas verdade desempenham um papel importante na análise e no desenvolvimento de algoritmos, ajudando a garantir que as expressões lógicas funcionem conforme o esperado. No entanto, não só de operações lógicas serão construídos nossos algoritmos. Em muitas ocasiões precisaremos comparar valores entre variáveis ou entre uma variável e uma constante. Para isso, utilizaremos outro recurso muito importante: os operadores relacionais. Sigamos adiante! 3.4 Operações relacionais Durante a parte introdutória das operações lógicas, em seção anterior a esta, foi mencionado que elas compõem parte do conjunto de recursos que permitem tomadas de decisões durante a execução dos algoritmos. Com o estudo das operações relacionais introduziremos mais um recurso para tornar nossos algoritmos poderosas ferramentas de decisão. As operações relacionais são viabilizadas por seis operadores relacionais, conhecidos também como operadores de comparação. Não por acaso, estes recursos permitem comparar variáveis e expressões, com a obtenção de um resultado que varia entre verdadeiro e falso. Na sequência, estas ideias ganharão vida pela descrição dos operadores relacionais e pelos respectivos exemplos. 3.4.1 Operador “igual” Este operador, representado por um duplo igual ( == ) verifica se dois valores são iguais e retorna “verdadeiro” se for constatada a igualdade entre eles e “falso” se os valores forem diferentes. Vale a menção de que o termo “valores” remete ao conteúdo de uma variável ou a uma constante. Faz sentido, portanto, comparar uma variável com outra e uma variável com uma constante. Você jamais deve comparar uma constante com outra, seja qual for o operador usado. Imagine x e y como duas variáveis, cujos valores foram informados pelo usuário ou atribuídos por operação anterior. Em dado momento, elas contêm os valores de 4 e 5, ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 36 respectivamente. Assim, x contém o valor 4 e y contém o valor 5 e, ao aplicarmos o operador de igualdade, teremos que x == y retornará falso, pois os valores contidos nas variáveis sob comparação não são iguais. ANOTE ISSO No contexto dos algoritmos e da programação de computadores, o termo “retorna” indica a obtenção de um resultado por meio da aplicação de uma função ou de um operador específico. Já que consideramos a sequência “entrada > processamento > saída” como esquema geral dos algoritmos, podemos aproveitar essa ideia para representarmos também a atuação de um operador. A comparação de igualdade entre duas variáveis, por exemplo, toma as variáveis (entradas), realiza a comparação (processamento) e “retorna” verdadeiro ou falso (saída). 3.4.2 Operador “diferente” Este operador, representado pelo símbolo ( != ) verifica se dois valores são diferentes. O resultado, porém, segue comportamento contrário ao operador de igualdade. Aqui, a operação retornará “verdadeiro” seos valores forem diferentes e retornará “falso” se os valores forem iguais. Ainda considerando os valores de x e y do exemplo anterior, teremos que a aplicação de x != y retornará verdadeiro, pois os valores contidos nas variáveis sob comparação não são iguais. 3.4.3 Operador “maior que” Este operador, representado pelo sinal matemático de maior (>), retorna verdadeiro quando o valor da esquerda for maior que o valor da direita. Em operações que envolvam comparação, o valor da esquerda sempre será uma variável e o valor da direita poderá ser uma variável ou uma constante. Em uma situação em que o algoritmo deva apurar se uma idade lida é maior do que um certo valor, a expressão idade > 29 retornará verdadeiro se o conteúdo de idade for, de fato, maior que 29. 3.4.4 Operador “menor que” Este operador, representado pelo sinal matemático de menor (<), retorna verdadeiro quando o valor da esquerda for menor que o valor da direita. Em uma situação em que o algoritmo deva apurar se uma distância lida (ou calculada) é menor do que um ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 37 certo valor, a expressão distancia < 100 retornará verdadeiro se o conteúdo de distancia for, de fato, menor que 100. 3.4.5 Operador “maior ou igual” Este operador, representado pelo sinal de maior ou igual (>=), retorna verdadeiro quando o valor da esquerda for maior ou for igual ao valor da direita. É sempre necessário frisar que, em operações que envolvam comparação, o valor da esquerda sempre será uma variável e o valor da direita poderá ser uma variável ou uma constante. Em uma situação em que o algoritmo deva apurar se uma idade lida é maior ou igual a um certo valor, a expressão idade >= 29 retornará verdadeiro se o conteúdo de idade for maior que 29 ou for igual a 29. 3.4.6 Operador “menor ou igual” Este operador, representado pelo sinal de menor ou igual (<=), retorna verdadeiro quando o valor da esquerda for menor ou for igual ao valor da direita. Em uma situação em que o algoritmo deva apurar se uma distância lida (ou calculada) é menor ou igual a um certo valor, a expressão distancia <= 100 retornará verdadeiro se o conteúdo de distancia for menor ou for igual a 100. Os operadores relacionais serão amplamente utilizados em estruturas de controle condicionais, cujo conhecimento você logo adquirirá. Estes recursos também desempenharão papel importante na validação de entrada do usuário em nossos algoritmos. Entenda o que abordamos neste encontro como peças de um quebra- cabeça que logo se unirão a comandos e outras expressões para tornar seus algoritmos interessantes e úteis. Até a próxima! ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 38 CAPÍTULO 4 INTRODUÇÃO À ALGORITMOS ESTRUTURADOS Até o momento, o caminho que trilhamos nos mostrou recursos fundamentais relacionados aos algoritmos, o que incluiu meios de inserirmos dados para serem processados e operadores que serão úteis para a construção do encadeamento lógico que resolverá o problema proposto. É bem verdade que nosso percurso ainda está no início, mas os elementos que estudaremos neste encontro comporão as bases de todos os algoritmos que você escreverá. Um algoritmo estruturado é aquele escrito de maneira clara e organizada, de modo a tornar-se facilmente compreensível e cuja manutenção é bastante simplificada. Esta abordagem é parte fundamental da nossa área e desempenha papel crítico na resolução de problemas por meio da criação de algoritmos e posterior uso de linguagem de programação. A clareza e organização associadas a algoritmos estruturados nascem da utilização apenas de estruturas sequenciais, de seleção e de repetição, justamente os temas que serão tratados de maneira introdutória neste nosso encontro. Esta abordagem é amplamente utilizada durante os passos iniciais do ensino de algoritmos, pois ela simplifica o rastreamento do fluxo de execução do algoritmo e a identificação de erros cometidos durante a escrita do código. Conforme você terá oportunidade de conferir a partir desta aula, os algoritmos estruturados podem ser considerados a pedra angular da programação de computadores através da escrita de algoritmos, pois promovem clareza, a eficiência e a facilidade de manutenção nos projetos de software, itens amplamente valorizados em ambiente acadêmico e profissional. Sigamos adiante, pois, com o estudo das estruturas sequenciais, de seleção e repetição. 4.1 Estruturas sequenciais Começamos nossa abordagem dos algoritmos estruturados pela mais elementar das três estruturas: a sequencial. Como a própria denominação sugere, ela se baseia na execução linear de um bloco de comandos, uma após o outro, seguindo uma sequência sem interrupção. De algum modo, todos os algoritmos que você criar usarão ao menos uma estrutura sequencial, o que significa que cada instrução (ou comando) será processada após a conclusão da anterior, criando um fluxo de execução claro ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 39 e previsível. Conforme já mencionado, essa abordagem é essencial para resolver problemas de forma organizada e eficaz. A estrutura sequencial é frequentemente usada para executar operações simples, incluindo entradas de dados feitas pelo usuário, execução de expressões aritméticas, processamentos triviais de dados e apresentação de resultados, nada diferente do que já aprendemos até o momento. Um exemplo possível para ilustrar essas ideias seria um algoritmo que calcula a média entre dois valores inteiros informados pelo usuário. Este algoritmo resolve o problema da seguinte maneira: 1. Receber o primeiro número. 2. Receber o segundo número. 3. Calcular a média entre os dois números. 4. Exibir a média. Embora seja bem simples, este algoritmo tem ao menos duas coisas a nos dizer: a) A forma como ele foi escrito difere ligeiramente da forma demonstrada em encontro anterior. Na verdade, não há uma maneira apenas de expressar nossos algoritmos e este será o tema central da nossa aula número 5. De qualquer forma, a sequência de passos, da forma como foi colocada, serve para que o problema do cálculo da média seja resolvido. Uma forma mais bem elaborada e mais próxima da execução por uma linguagem de programação é a que segue: 1 algoritmo calculo_de_media_aritmetica 2 //Este algoritmo recebe dois valores inteiros, calcula a média entre eles e retorna o resultado. 3 var 4 n1, n2: inteiro 5 media: flutuante 5 inicio 6 escreva (“Informe o primeiro valor: “) 7 leia (n1) 8 escreva (“Informe o segundo valor: “) 9 leia (n2) 10 media = n1 + n2 11 escreva (“A média é “, media) 12 fimAlgoritmo ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 40 Note que não há alteração na funcionalidade do algoritmo, apenas na forma de escrevê- lo. Conforme mencionado, em nosso próximo encontro trataremos detalhadamente das formas de se expressar um algoritmo. b) Este algoritmo é composto por uma única estrutura sequencial. Repare que esta estrutura se caracteriza por conter comandos que serão executados linearmente, do primeiro ao último, sem desvios condicionais ou repetições, recursos que serão tratados ainda nesta aula. A estrutura sequencial é a base sobre a qual outras estruturas de controle, como seleção e repetição, serão construídas. Portanto, dominar essa estrutura é fundamental neste contexto e atingiremos ótimo nível de entendimento com o desenvolvimento de exemplos. 4.2 Estruturas de repetição Uma estrutura de repetição é composta por comando (ou comandos) com capacidade para repetir um determinado trecho de algoritmo. Embora colocada em termos bem simples e objetivos, essa afirmação contém implicações importantes, que serão analisadas na sequência. a) Bloco de comandos: trata-se do conjunto de comandos que serão submetidosà repetição e que estarão subordinados ao comando de repetição escolhido para o processamento dos dados. Quando escrevermos nossos algoritmos, trataremos de delimitar nossos blocos de comandos com indicações de início e fim, nomeadas de acordo com o seguinte padrão: inicioNomeDoComando //neste espaço serão escritos os comandos a serem re- petidos fimNomeDoComando Observe a inclusão de um recuo na área em que os comandos do bloco serão escritos. Esta prática é largamente utilizada para fins de organização do código e leva o nome de indentação. Por fim, um apontamento necessário: em certas ocasiões poderemos dispensar a inclusão da indicação de início do bloco. ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 41 b) Condição de parada: a existência de um trecho de algoritmo que contém repetição - da mais simples à mais complexa – implica na existência de um recurso algorítmico que interrompe essa repetição. A este recurso damos o nome de condição de parada, que geralmente é escrita como uma expressão de comparação colocada no comando de repetição. Caso esta expressão contenha um determinado defeito lógico, a repetição poderá nunca ser interrompida, fato que certamente causará problemas ao usuário do algoritmo. Além disso, a não interrupção da execução da repetição causará a negação da parte do conceito de algoritmos em que sua finitude é afirmada. c) Laço de repetição: também conhecido como loop ou iteração o laço de repetição refere-se à execução contínua do bloco definido para ser repetido enquanto a condição de parada assim o permitir. Um loop, portanto, é o modo como é conhecida uma repetição feita no bloco subordinado ao comando de repetição. Para que o criador do algoritmo possa escolher segundo a conveniência da ocasião, os comandos de repetição estão divididos em três modalidades, todas elas essenciais para implementação de tarefas repetitivas nos algoritmos. 4.2.1 Teste da condição de parada no início do bloco Esta modalidade de repetição apresenta a condição de parada no início do bloco que será repetido, o que significa que o bloco será executado somente se a condição de parada não tiver sido ainda satisfeita. Em outras palavras, a condição de parada é verificada no início do bloco e, somente se ainda não tiver sido satisfeita, o código dentro do bloco de comandos será executado. Vale o registro de que, durante suas pesquisas, você poderá encontrar a expressão “loop pré-testado” como denominação alternativa para esta modalidade. O comando que utilizaremos nesta modalidade terá o seguinte formato geral: Enquanto <aqui vai a condição de parada> faça <aqui são escritos os comandos que serão executados enquanto a condição de parada não for verdadeira> fimEnquanto ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 42 Além de implementar a condição de parada antes da entrada do fluxo de execução no bloco de comandos, esta modalidade de comando de repetição apresenta outra característica interessante: normalmente o criador do algoritmo não sabe de antemão quantas repetições serão dadas, dada a construção da condição de parada. Para ilustrar esta ideia, imagine a seguinte situação: o algoritmo deve permitir a entrada das notas dos alunos para fins de cálculo da média, enquanto não for digitado o valor -1. Em notação algorítmica, temos: leia (nota) Enquanto nota != -1 faça <aqui será feita a soma das notas lidas, a fim de que se possa calcular a média fora do loop.> fimEnquanto A satisfação da condição de parada está, portanto, atrelada à digitação do valor -1 por parte do usuário, o que pode ser feito logo na primeira digitação ou em qualquer outra oportunidade. Neste caso específico, a utilização do comando “Enquanto... faça,” implica que o algoritmo verificará no início de cada iteração se a comparação nota != -1 é verdadeira, ou seja, se o usuário não digitou -1. Enquanto essa condição estiver sendo atendida, as repetições continuarão. A definição correta da condição de parada é mandatória para garantir que o programa não entre em um loop infinito e que as ações repetidas sejam controladas. Este exemplo será desenvolvido por completo quando estudarmos em detalhes os comandos de repetição. Por ora, devemos avançar rumo à segunda modalidade de comando de repetição. 4.2.2 Teste da condição de parada no final do bloco Ao contrário da modalidade anterior, a estrutura de repetição com teste no final do bloco obrigatoriamente executará ao menos uma vez os comandos do bloco antes de realizar o teste expresso na condição de parada. Isso se dá por causa da colocação deste teste no fechamento do bloco. Esta modalidade de estrutura de repetição é implementada pelo comando “faça... enquanto” que, conforme já mencionado, é especialmente útil quando você precisa garantir que um bloco de código seja executado pelo menos uma vez, independentemente da condição. Posteriormente, a condição é ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 43 verificada, e se for verdadeira, o bloco é repetido. Caso contrário, a execução continua após o bloco. O comando que utilizaremos nesta modalidade terá o seguinte formato geral: Faça <aqui são escritos os comandos que serão executados enquanto a condição de parada não for satisfeita.> Enquanto <teste que expressa a condição de parada> Além de implementar a condição de parada após a execução no bloco de comandos, esta modalidade de comando de repetição é também utilizada em ocasiões em que o criador do algoritmo não tem como saber antecipadamente quantas repetições serão dadas. Recorreremos ao exemplo anterior para ilustrar esta ideia. Novamente, o algoritmo deve permitir a entrada das notas dos alunos para fins de cálculo da média, enquanto não for digitado o valor -1. Em notação algorítmica e usando o teste no final do bloco, temos: Faça leia (nota) <aqui será feita a soma das notas lidas, a fim de que se possa calcular a média fora do loop.> Enquanto nota != -1 Note que a leitura da nota no exemplo do item 4.2.1 é feita fora do bloco de repetição, ao passo que a leitura neste último exemplo é feita no interior do bloco. Para que a condição de parada no primeiro exemplo possa ser testada, um valor para a variável nota deveria estar carregado. Já para testes no final do bloco, a leitura pode ser feita no corpo de comandos que compõem o bloco de repetição. Embora extremamente úteis, estas duas modalidades de repetição não permitem que o criador do algoritmo conheça a quantidade de repetições que serão feitas, exceto pela implementação de uma variável de controle. Há, no entanto, uma terceira modalidade, cuja característica principal é a de realizar, nativamente, o controle da quantidade de repetições a serem feitas. Vamos conhecê-la? ALGORÍTIMO E LÓGICA DE PROGRAMAÇÃO I PROF. ROQUE MAITINO NETO FACULDADE CATÓLICA PAULISTA | 44 4.2.3 Quantidade definida de repetições É comum que parte do problema a ser resolvido pelo algoritmo inclua uma quantidade fixa de repetições de um certo trecho de código. Nestes casos, portanto, o criador do algoritmo saberá antecipadamente a quantidade de repetições a serem feitas. O cálculo da média entre 10 notas, a busca pelo maior entre 5 números e a soma de 4 distâncias compõem algumas situações para este caso, cuja implementação se dá por meio da estrutura “Para...Faça”. Este comando será usado, então, para criarmos loops com um número fixo de iterações e, para que isto seja possível, o próprio comando permitirá que especifiquemos um valor inicial, a condição de parada e o valor final da variável de controle. O comando que utilizaremos nesta modalidade terá o seguinte formato geral: Para i de 1 até 8 faça <aqui são escritos os comandos que serão executados enquanto a variável de controle i não tiver atingido o valor 8> fimPara ISTO ACONTECE NA PRÁTICA
Compartilhar