Baixe o app para aproveitar ainda mais
Prévia do material em texto
Cristiano de Macêdo Neto Algoritmos e Lógica de Programação Cristiano de Macêdo Neto ALGORITMOS E LÓGICA DE PROGRAMAÇÃO Belo Horizonte Janeiro de 2016 COPYRIGHT © 2015 GRUPO ĂNIMA EDUCAÇÃO Todos os direitos reservados ao: Grupo Ănima Educação Todos os direitos reservados e protegidos pela Lei 9.610/98. Nenhuma parte deste livro, sem prévia autorização por escrito da detentora dos direitos, poderá ser reproduzida ou transmitida, sejam quais forem os meios empregados: eletrônicos, mecânicos, fotográficos, gravações ou quaisquer outros. Edição Grupo Ănima Educação Vice Presidência Arthur Sperandeo de Macedo Coordenação de Produção Gislene Garcia Nora de Oliveira Ilustração e Capa Alexandre de Souza Paz Monsserrate Equipe EaD Conheça o Autor Cristiano de Macêdo Neto é mestre em Engenharia Elétrica e bacharel em Ciência da Computação. Atua na área acadêmica como professor universitário, ministrando aulas para cursos de graduação e pós-graduação na área de TI desde 2003. Atua no mercado de produção de software desde 1995, já tendo trabalhado com desenvolvimento de software, análise de sistemas, suporte a usuários e análise de negócios e requisitos em sistemas de médio e grande porte para empresas como: Governo de Minas Gerais, Drogaria Araújo, Usiminas, Magnesita, entre outras. Os conhecimentos e técnicas relacionados à lógica de programação e programação de computadores vêm sendo inseridos nos currículos escolares cada vez mais nas séries iniciais em várias regiões do mundo. No contexto do profissional da tecnologia da informação, tal conhecimento se mostra como algo essencial para o futuro na profissão do estudante, uma vez que grande parte dos aprendizados e habilidades necessários para o profissional de tecnologia da informação requerem tal conhecimento. Para os estudantes e profissionais da engenharia, a apresentação de tal disciplina se mostra extremamente útil pelo fato de incentivar o raciocínio lógico, a capacidade de abstração e desenvolver nas pessoas uma forma sistêmica de resolução de problemas. Na área de engenharia, temos visto todo dia um número cada vez maior de cursos criando uma maior vinculação com a programação de computadores, que já é o caso da Engenharia de Controle de Automação, Engenharia Elétrica, Engenharia de Computação e Engenharia Mecânica. Tal evolução pode não estar distante de impactar diretamente as outras engenharias, uma vez que a programação de computadores se mostra como uma atividade de apoio para todas as áreas. O foco será centrado no desenvolvimento do raciocínio lógico e da aplicação do conhecimento gerado para a resolução de pequenos problemas matemáticos na forma de algoritmos. Para um melhor aproveitamento, esta disciplina conta com unidades em que se trabalha o conteúdo de forma teórica, com o objetivo de construir uma sólida base da teoria dos assuntos apresentados, e Apresentação da disciplina também conta com unidades práticas, em que é possível ao aluno aplicar todo o conteúdo exibido na resolução de problemas de forma algorítmica, através de uma plataforma de programação criada especialmente para a construção e execução dos algoritmos desenvolvidos por eles. UNIDADE 4 073 Estruturas de controle 074 Estruturas de controle 076 Estrutura de seleção ou condicional 077 Estrutura de repetição 085 Revisão 096 UNIDADE 3 057 Construção de algoritmos sequenciais e modulares 058 Apresentação do ambiente de aprendizado prático 059 Principais erros 065 Revisão 072 UNIDADE 2 029 Estruturas sequenciais e modularização 030 Algoritmo mínimo 031 Variáveis e constantes 033 Comandos de entrada e saída 041 Operadores aritméticos 046 Operadores relacionais e operadores lógicos 048 Construção e análise de expressões 051 Modularização e construção de sub-rotinas 051 Revisão 055 UNIDADE 1 003 Introdução a algoritmos e lógica de programação 004 Contextualização da lógica de programação na sociedade atual 006 Conceitos básicos de lógica de programação 007 Algoritmos não computacionais e computacionais 011 Fases de um algoritmo computacional 020 Regras de construção de algoritmos computacionais 021 Estrutura básica de algoritmo computacional 022 Revisão 027 UNIDADE 8 148 Construção de Algoritmos computacionais em pseudocódigo 149 Construção de algoritmos computacionais utilizando todo o conteúdo ministrado 150 Revisão 159 REFERÊNCIAS 160 UNIDADE 7 130 Construção de algoritmos com utilização de tipos de dados homogêneos 131 Tipos de dados homogêneos suportados pelo Ambiente de Aprendizado Prático 132 Tipos de dados homogêneos multidimensionais ou matrizes 142 Revisão 147 UNIDADE 6 116 Tipo de dados homogêneos: vetores e matrizes 117 Tipos de dados homogêneos unidimensionais ou vetores 119 Tipos de dados homogêneos multidimensionais ou matrizes 124 Revisão 128 UNIDADE 5 100 Construção de algoritmos com estruturas de controle 101 Estruturas de controle suportadas pelo ambiente de aprendizado prático 102 Estruturas de seleção ou condição simples 103 Estrutura de seleção ou condição composta 106 Estrutura de repetição ou iteração 109 Estruturas de repetição ou iteração controladas por contador 109 Estruturas de repetição ou iteração controladas por condição 110 Revisão 114 Introdução a algoritmos e lógica de programação • Contextualização da lógica de programação na sociedade atual • Conceitos básicos de lógica de programação • Algoritmos não computacionais e computacionais • Fases de um algoritmo computacional • Regras de construção de algoritmos computacionais • Estrutura básica de algoritmo computacional • Revisão Introdução Um questionamento muito comum entre alunos de graduação ao iniciarem os estudos de lógica de programação é como a disciplina poderá impactar no seu futuro profissional e qual a sua relação com o conteúdo do seu curso. E até pouco tempo atrás, a resposta vinha apenas dos professores da área de programação, tentando mostrar para o aluno qual é a importância de tal conteúdo na sua vida acadêmica e profissional. Porém, esse cenário vem mudando e a cada dia que passa temos um grupo maior de pessoas defendendo o ensino de programação, não apenas para alunos dos cursos associados à tecnologia da informação e engenharias, mas sim que tal disciplina deve fazer parte do currículo do ensino básico, ser apresentada nos primeiros anos da vida escolar às disciplinas associadas à lógica de programação. No evento Transformar 2014, Mitchl Resnick, pesquisador do MIT, diz que acredita que saber programar é tão importante quanto saber ler e que “escrever no mundo de hoje significa saber nos expressar com as tecnologias atuais: saber programar”. Para ele, a necessidade de aprender a escrever algoritmos e programas vai além da utilidade profissional. Mesmo que não sejam cientistas da computação, Resnick defende que todas as crianças devem ter a oportunidade de serem “fluentes” em programação. “Todas as crianças aprendem a escrever porque é uma habilidade útil para todos e em todos os aspectos da vida. A programação funciona da mesma forma.” E segundo ele a maior vantagem em aprender a programar não é se dar melhor no mercado de trabalho, mas a mudança mental que a programação produz. Além de organizar as ideias, a programação ajuda a ver o mundo de maneira mais criativa e crítica. Para Gustavo Furtado, apesar de parecer intimidante no começo, programar não é tão complicado como muitos pensam. Na verdade, da mesma forma como ler, escrever e fazer cálculos básicos, programação é a nova disciplina básica paraalfabetização. “Tenho uma convicção de que daqui a uns 10 ou 20 anos, programação será ensinada nas escolas como uma coisa tão básica quanto ler, escrever e fazer cálculos básicos como soma, subtração, multiplicação e divisão”, disse Gustavo Furtado. Podemos definir a atividade de programar como sendo a arte de ensinar uma máquina a resolver problemas. E uma das principais atividades dos profissionais de engenharia e tecnologia da informação está exatamente em criar soluções para a resolução de problemas, ou seja, estudar uma forma de automatizar decisões e atividades através de comandos é uma ótima maneira de desenvolver a técnica de resolução de problemas em futuros profissionais. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 006 Cada vez mais é um consenso entre os profissionais que sabem programar que a imaginação é realmente o limite, com relação às facilidades que um computador pode trazer para sua vida pessoal e profissional. Contextualização da lógica de programação na sociedade atual Para Daniel Caetano, a programação é uma atividade que auxilia o estudante de engenharia a aprimorar sua habilidade para desenvolver métodos de solução para problemas complexos, em um processo que se chama sistematização de soluções, e aponta que existem diversas situações no dia a dia de um engenheiro em que a habilidade de programar pode simplificar muito a sua vida, desde o desenvolvimento de planilhas e macros para controles financeiros até cálculos complexos como movimento de terra, cálculos de circuitos e alterações nas vazões de rios - dentre muitos outros - que podem ser programados por esse profissional com relativa simplicidade. A habilidade necessária para a programação é o desenvolvimento da lógica de programação, que deve ser utilizada no curso com o propósito de desenvolver a capacidade de sistematizar a solução de problemas abrindo inúmeras facilidades para engenheiros e alunos da área de tecnologia da informação, que vão desde o desenvolvimento de simples planilhas de Excel que realizem automaticamente cálculos repetíveis, até o desenvolvimento de sistemas que permitam cálculos refinados que não são possíveis de serem realizados à mão, proporcionando economia e eficiência aos projetos. Cada vez mais é um consenso entre os profissionais que sabem programar que a imaginação é realmente o limite, com relação às facilidades que um computador pode trazer para sua vida pessoal e profissional. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 007 A lógica de programação é a técnica que nos permite desenvolver a habilidade de descrever soluções de problemas que serão automatizados através de computadores. Conceitos básicos de lógica de programação A lógica de programação é a técnica que nos permite desenvolver a habilidade de descrever soluções de problemas que serão automatizados através de computadores. Para Marcio Leitão, do blog <marcioleitaoexpress.wordpress.com>, “o homem por si só é um ser lógico, e essa lógica é um dom que não se aprende de uma hora para outra. Resulta, em geral, de experiências do dia a dia. Usamos lógica quando executamos ordenadamente uma série de rotinas predeterminadas, tais como: levantar da cama, pegar os chinelos, ir ao banheiro, tomar banho, etc. Estas ações são justificadas pela experiência prévia nestes procedimentos que nos fazem reconhecê-los como mais eficazes e agradáveis para começar o dia de atividade”. Se procurarmos uma definição de lógica, encontraremos uma infinidade de respostas que, entre elas, podemos citar: • “O conjunto de leis, princípios ou métodos que determinam um raciocínio coerente, induzindo a uma solução prática e eficaz do problema.” (LEITÃO, Marcio. O conceito de lógica. In: Site “Marcio Leitão Express”) • “Organização e planejamento das instruções, assertivas, etc. em um algoritmo, a fim de viabilizar a implantação de um programa.” (MEDEIROS, 2009, p. 3) • “E se procurarmos uma definição no Google para lógica de programação, iremos encontrar entre outras definições a seguinte descrição: “lógica de programação é a técnica de desenvolver algoritmos (sequências lógicas) para atingir determinados objetivos dentro de certas regras ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 008 Se decompormos o ato de descrever uma solução de forma que seja passível a sua execução por um computador, chegaremos essencialmente a duas partes: cálculos aritméticos e decisões lógicas. baseadas na lógica matemática e em outras teorias básicas da ciência da computação e que depois são adaptados para a linguagem de programação utilizada pelo programador para construir seu software.” (O QUE É Lógica de Programação. In: Site “Intellectuale - Tecnologia & Treinamento”) Se decompormos o ato de descrever uma solução de forma que seja passível a sua execução por um computador, chegaremos essencialmente a duas partes: cálculos aritméticos e decisões lógicas. Baseado nessa decomposição, podemos dizer que programar um computador é basicamente conseguir identificar e descrever quais os cálculos necessários e quais decisões lógicas devem ser tomadas para a solução do problema em questão. É relativamente comum utilizarmos o termo lógica ou lógico, porém defini-lo não é assim tão simples. Se eu solicitasse para me explicar o que significa o termo lógico, você seria capaz de descrever sem nenhuma dificuldade? Caso a sua resposta seja não, não se assuste, pois toda vez que faço essa pergunta em sala de aula, é comum logo em seguida um silêncio absoluto reinar, até que eu fale alguma outra coisa. Então, vamos tentar lembrar em quais momentos utilizamos o termo lógico ou é lógico. Toda vez que tento lembrar, vêm automaticamente à minha memória aqueles momentos em que alguém acabou de realizar uma tarefa cujo resultado não foi o esperado e instintivamente alguém mais do que depressa solta a frase “É lógico que iria dar errado!”. Se analisarmos os momentos em que dizemos “É lógico que iria dar errado!”, vamos começar a perceber que normalmente dizemos essa frase quando sabemos o que deveria ter sido feito e como deveria ter sido feito, e verificamos que a pessoa ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 009 Podemos definir algoritmo como uma série de instruções que mostram como determinado problema pode ser resolvido. que executou a tarefa não a realizou da maneira como sabemos que iria dar certo. Podemos então dizer que a sentença “é lógico” é utilizada todas as vezes que sabemos qual é a sequência de passos para realizar uma tarefa com sucesso, isto é, o termo lógico pode ser associado à forma de fazer algo com sucesso ou à forma de resolver um problema com sucesso. Repare que o termo sequência apareceu no parágrafo acima. Se buscarmos conceituar o que é sequência, vamos chegar a uma definição que remete à ordem em que as coisas ocorrem, ou seja, se juntarmos as palavras sequência e lógica, teremos o termo sequência lógica, que na nossa disciplina poderemos definir como a sequência ou ordem de execução de passos (instruções) a serem seguidos ou executados para podermos resolver um problema com sucesso. Para complicar um pouquinho mais as coisas, apareceu agora a palavra instrução, que é um termo que utilizamos com uma certa frequência, mas para explicar a sua definição nem sempre é assim tão simples. Tentando simplificar, no contexto da nossa disciplina, para nós, instrução será definida como uma ação ou operação elementar a ser executada por um computador. Agora vamosao conceito mais importante da nossa disciplina e a nossa principal ferramenta de trabalho. Um termo que utilizaremos constantemente é algoritmo e será nosso principal alvo na disciplina. Porém, ao contrário do que muitos imaginam, a definição de algoritmo não foi criada para atender a área de computação ou programação de computadores e nem é uma exclusividade dessa área. Na verdade, já tivemos contato com um monte de algoritmos em nossas vidas, algumas vezes utilizamos algoritmos mais formais e outras vezes utilizamos algoritmos informais. Mas afinal das contas, o que seria um algoritmo? ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 010 Podemos concluir então que a principal característica na construção de um algoritmo de qualidade é conseguir descrever de forma precisa, simples e clara a ordem de instruções seguindo uma sequência lógica. Podemos definir algoritmo como uma série de instruções que mostram como determinado problema pode ser resolvido. Isto é, podemos considerar que uma receita culinária é um algoritmo, um manual de instruções de como realizar algo também é. E o que define a qualidade de um algoritmo é o quão preciso e simples ele é. Costumo utilizar como exemplo de um bom repositório de algoritmos o site <www.tudogostoso.com. br>, uma vez que receitas culinárias também são algoritmos. Lá no site, podemos verificar que as receitas que alcançam uma maior pontuação dos usuários são aquelas escritas de forma clara ou simples, em que qualquer pessoa, independente da sua habilidade culinária, poderá seguir aquela receita e ter um resultado de sucesso. Na programação de computadores não é diferente, os algoritmos que alcançarão êxito na sua execução serão aqueles que forem escritos de forma precisa, simples e clara. Uma vez que o computador terá que repetir todos os passos descritos por nós, assim como em uma receita culinária, com a não realização de um passo ou a realização no momento errado, poderemos não alcançar o sucesso esperado. Podemos concluir então que a principal característica na construção de um algoritmo de qualidade é conseguir descrever de forma precisa, simples e clara a ordem de instruções seguindo uma sequência lógica. Referências: LEITÃO, Marcio. O conceito de lógica. In: Site “Marcio Leitão Express”. Disponível em: <https://marcioleitaoexpress.wordpress.com/logica-de- programacao/>. Acesso em: 12 jan. 2016. MEDEIROS, Carlos Augusto G.; GONÇALVES NETO, Estanislau. Cap. 1 – Conceitos Básicos. In: ______. Lógica de Programação e Algoritmos: com exemplos na linguagem JAVA. 2009. P. 03. Disponível em: <https://ccunip. files.wordpress.com/2009/11/apostila-cap1_conceitosbasicos_exemp_em_ java.pdf>. Acesso em: 25 jan. 2016. O QUE É Lógica de Programação. In: Site “Intellectuale - Tecnologia & Treinamento”. Disponível em: <http://cursosdeprogramacao.com.br/blog/o- que-e-logica-de-programacao/>. Acesso em: 29 jan. 2016. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 011 Os algoritmos podem ser classificados como computacionais e não computacionais, dependendo de quem é o responsável por executá-los. Algoritmos não computacionais e computacionais Os algoritmos podem ser classificados como computacionais e não computacionais, dependendo de quem é o responsável por executá-los. Algoritmos não computacionais Os algoritmos não computacionais são os tipos de algoritmos que mais frequentemente nós executamos de forma inconsciente, e são tão comuns que na maioria das vezes nem percebemos que estamos seguindo uma sequência lógica de passos para a realização de tal tarefa. Normalmente, quando realizamos tarefas simples do dia a dia, como por exemplo escovar os dentes, trocar pneu de um carro, tomar banho ou trocar uma lâmpada, seguimos sempre a mesma sequência de passos que sabemos que nos levará ao sucesso. Porém, se analisarmos outras pessoas executando uma mesma tarefa, perceberemos que existe mais de uma forma correta de fazer a mesma coisa, e que alguns passos podem ter a sua sequência alterada que não prejudica o sucesso da atividade que estamos realizando. Já outros passos, caso troquemos a ordem em que fazemos a tarefa, prejudicarão o resultado final, nos impedindo de alcançar o sucesso da atividade. Imagine que nosso objetivo é criar um site que ensina a realizar pequenos reparos domésticos, e para isso podemos listar uma série de tarefas que possam ser interessantes. Dentre as quais, podemos descrever como trocar uma torneira, como trocar uma lâmpada, como trocar a resistência de um chuveiro, como colocar um quadro ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 012 Quanto à sequência dos passos, podemos verificar que se trocarmos a ordem dos passos 5 e 6, continuaremos tendo o mesmo resultado para a tarefa. na parede, e por aí vai. Se analisarmos o que já discutimos até agora, repararemos que cada uma dessas tarefas pode se tornar um algoritmo. Para exemplificar, vamos mostrar a tarefa de descrever o algoritmo não computacional de trocar uma torneira. Início 1. Comprar a nova torneira 2. Comprar fita veda rosca 3. Localizar o registro referente à torneira a ser trocada 4. Fechar o registro referente à torneira a ser trocada 5. Retirar a torneira instalada 6. Passar oito voltas de veda rosca na rosca da torneira nova 7. Rosquear a torneira nova 8. Abrir o registro referente à torneira 9. Verificar se existe vazamento na torneira instalada 10. Se existir vazamento 11. Retirar a torneira instalada 12. Retirar o veda rosca 13. Voltar ao passo 6 14. Testar o funcionamento da torneira instalada 15. Se não estiver funcionando corretamente 16. Acionar um bombeiro profissional Fim Repare que no algoritmo não computacional apresentado acima alguns cuidados foram tomados, como por exemplo, em cada passo, foi colocado apenas um verbo ou ação. Isso foi feito para que o leitor, ao tentar seguir os passos, não possa se confundir ou ter um entendimento ambíguo da operação, e esse é um dos cuidados que devem ser tomados para a criação de algoritmos que sejam simples, consistentes e claros. Quanto à sequência dos passos, podemos verificar que se trocarmos a ordem dos passos 5 e 6, continuaremos tendo o mesmo resultado para a tarefa. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 013 Os algoritmos computacionais são aqueles que serão executados pelo computador e, por esse motivo, teremos que criar um algoritmo ainda mais rígido do que os algoritmos não computacionais. .... 6. Passar oito voltas de veda rosca na rosca da torneira nova 5. Retirar a torneira instalada .... Porém, se trocarmos a ordem dos passos 4 e 5, já comprometeremos o sucesso da ação. .... 5. Retirar a torneira instalada 4. Fechar o registro referente à torneira a ser trocada .... Ou seja, a ordem em que os passos ocorrem é importante e pode impactar diretamente no resultado final, e isso é o que consideramos sequência lógica. Algoritmos computacionais Os algoritmos computacionais são aqueles que serão executados pelo computador e, por esse motivo, teremos que criar um algoritmo ainda mais rígido do que os algoritmos não computacionais, pois ao contrário do que muitos imaginam, o computador é uma máquina que não é dotada de raciocínio ou inteligência, e que não analisa se os passos que lhe são instruídos para executar seguem ou não uma sequência lógica. Antes de construirmos algoritmos computacionais, é interessante entendermos o que é um computador, mesmo que essa definição seja dada de forma simplificada.E ao solicitar ao “Dr. Google” que ele definisse computador, ele me trouxe a seguinte resposta: “máquina destinada ao processamento de dados, capaz de obedecer a instruções que visam produzir certas transformações nesses dados para alcançar um fim determinado” (COMPUTADOR. In: Dicionário Houaiss Online). ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 014 Para entendermos melhor o que é e como construir algoritmos computacionais, vamos tentar entender a definição de computador do Google, desmembrando cada um dos conceitos apresentados e fazendo uma analogia com outras áreas. Processamento A primeira parte da definição apresentada pelo site Google. com e apresentada acima fala que “é uma máquina destinada ao processamento de dados...”. Acredito que o que é uma máquina está muito claro para todos, porém o que é processar ou processamento? Você conseguiria me explicar com as suas palavras? Caso sua resposta seja não, vamos tentar entender o que significa primeiro a ação de processar. Se olharmos em nossa casa, mais especificamente na cozinha, vamos perceber que temos uma série de processadores de comida. Alguns têm a audácia de ter o nome de multiprocessadores, outros possuem nomes específicos e, apesar de não remeterem ao termo processador no nome, também podem ser considerados processadores. Um bom exemplo disso é o liquidificador, que é considerado um processador de alimentos. Quando analisamos o funcionamento de um liquidificador, podemos entender melhor o que significa o verbo processar. Em um liquidificador, se colocamos dentro dele um limão, 500 ml de água, duas colheres de açúcar e 50 ml de leite, após ligá- lo e deixá-lo em funcionamento por cinco minutos, o que temos de resultado? A primeira parte da definição apresentada pelo site Google.com e apresentada acima fala que “é uma máquina destinada ao processamento de dados...”. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 015 FIGURA 1 - Ingredientes Fonte: Núcleo de Educação a Distância (NEaD), Una, 2015. Continuamos tendo os mesmos ingredientes que colocamos? Ou passamos a ter um novo alimento? Após a utilização do liquidificador, isto é, após o processamento, passaremos a ter uma limonada suíça não coada, e não teremos mais os ingredientes iniciais. Pois os ingredientes não foram apenas misturados, eles sofreram um processamento, ou seja, sofreram uma transformação e, em grande parte dos casos, não teremos mais condições de voltar à matéria-prima inicial. Isto é, processar é transformar, e assim podemos adaptar a definição inicial do Google em “é uma máquina destinada ao processamento à transformação de dados...”. Mas ao utilizar o liquidificador, temos que analisar algumas outras situações que ainda não foram apresentadas e que são interessantes de serem discutidas. Vamos imaginar agora que, ao invés de utilizá-lo para fazer uma limonada suíça, vamos utilizá-lo ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 016 para bater leite. Ou seja, colocaremos leite no liquidificador, deixá-lo ligado por três minutos e, ao desligar, o que teremos? Ocorreu alguma transformação? Ocorreu algum processamento? Ou apenas desperdiçamos energia? FIGURA 2 - Ingredientes 2 Fonte: Núcleo de Educação a Distância (NEaD), Una, 2015. Repare que, para que ocorra a transformação, é necessário que exista mais de um ingrediente, pois raramente apenas uma matéria- prima conseguirá se transformar em algo novo a partir de um processamento; ela poderá no máximo mudar o seu estado. Dados Agora falta entender o que são dados, pois a primeira parte da definição fala que “é uma máquina destinada ao processamento à transformação de dados...”. Podemos definir como dados os valores específicos que possuam algum significado em um contexto. Isto é, quando falamos da ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 017 cotação do dólar, estamos falando de um valor específico que indica alguma coisa em determinado contexto. Outro exemplo de dados é a velocidade média de um veículo ou o valor de um produto. O que vamos perceber em todos os dados que possamos identificar é que eles são em sua essência valores numéricos, e que são passíveis de se relacionarem com outros valores para se gerar um novo valor. Ou seja, quando falamos de dados, estamos falando de números, e quando falamos de processamento de dados, estamos falando de transformação de números. Transformação esta que já vimos na matemática, em que aprendemos um conjunto de quatro operações básicas que transformam seus operandos em resultados. Agora, podemos rever a definição inicial do Google e dizer que computador “é uma máquina destinada ao processamento à transformação de dados números...”. Algoritmo Voltando à definição completa do Google: “é uma máquina destinada ao processamento de dados à transformação de números, capaz de obedecer a instruções que visam produzir certas transformações nesses dados para alcançar um fim determinado”, vemos que na segunda parte ela trata da construção de algoritmos, uma vez que podemos defini-los como “sequência de instruções que visam produzir certas transformações nesses dados para alcançar um fim determinado”. E como podemos fazer essas transformações? Se eu pegar o número 8 e número 2, como posso gerar o número 6? 8 ? 2 = 6, onde podemos substituir o ? por – (subtração) e teremos 8 – 2 = 6 As formas de transformar números ou processar dados nada mais são do que utilizar as operações e funções matemáticas. Quando falamos de operações, vamos na maioria das vezes As formas de transformar números ou processar dados nada mais são do que utilizar as operações e funções matemáticas. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 018 nos remeter às operações básicas, que são soma, subtração, multiplicação e divisão. Quando falamos de algoritmos, falamos em combinar as operações aritméticas ou cálculos e falamos também em decisões lógicas, que são responsáveis por coordenar quais cálculos devem ser realizados e que, devido à sua relevância no contexto matemático, foram formalizados pelos filósofos e representados através de sentenças declarativas, também conhecidas como proposições, que podem ser falsas ou verdadeiras. Proposições As proposições consideradas na lógica matemática possuem duas características: • Uma proposição é verdadeira ou falsa. • Uma proposição não pode ser verdadeira e falsa, simultaneamente. As proposições da lógica podem ser agrupadas em uma proposição composta, com o uso de operadores lógicos E, OU, NÃO. Por exemplo: consideremos que, para que um aluno possa ser aprovado em uma disciplina de EAD, ele precise de uma nota final >= 70. Usando o símbolo NF para indicar a média, podemos escrever a condição de aprovação na forma da proposição lógica simples: p: NF >= 70 Já se quisermos representar também a aprovação de um aluno em uma disciplina presencial, além de considerarmos a nota final, temos que levar em conta o percentual de frequência na disciplina, devendo ser maior ou igual a 75% (setenta e cinco por cento), que será representado pelo símbolo F, como mostra a proposição: As proposições da lógica podem ser agrupadas em uma proposição composta, com o uso de operadores lógicos E, OU, NÃO. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 019 q: F >= 0,75 (75%) r: p E q s: A > 10% t: E > 5% Isto é, para representar a condição de aprovação das disciplinas presenciais, não basta apenas verificar as proposições simples, teremos que combinar a proposição p com a proposição q de formaque essas duas condições sejam verdadeiras para que o aluno seja aprovado. Assim, podemos escrever: Em que a proposição r indica se o aluno está aprovado (verdadeira) ou reprovado (falsa). Repare que a proposição r será verdadeira se e somente se NF e F forem simultaneamente verdadeiras. Se qualquer uma delas (ou ambas) for falsa, r será falsa, indicando que o aluno está reprovado. Em um outro exemplo, podemos construir a proposição u, que indica se uma equipe de projetos é ruim. Consideremos A como a taxa de atraso nas entregas da equipe e E como a taxa de erros graves encontrados nos projetos construídos, então podemos fazer as afirmações s e t: Consideramos uma má equipe de projetos aquela que atrasa as entregas frequentemente ou que gera projetos com altas taxas de erros (qualquer um dos dois), descrevendo a proposição u como: u: s OU t Assim, u será verdadeira sempre que A ou E forem verdadeiras, independente da equipe ter as proposições verdadeiras isolada ou simultaneamente. Repare que a proposição r será verdadeira se e somente se NF e F forem simultaneamente verdadeiras. Se qualquer uma delas (ou ambas) for falsa, r será falsa, indicando que o aluno está reprovado. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 020 A função do operador NÃO é utilizada para inverter o resultado de proposição. Por exemplo, se uma má equipe é dada pela proposição u representada acima, uma boa equipe pode ser representada por uma proposição NÃO u. Algoritmos computacionais Os algoritmos computacionais geralmente são resoluções que demandam cálculos matemáticos que podem ser desde simples problemas, como calcular o índice de massa corpórea (IMC) de uma pessoa e verificar em qual categoria de obesidade essa pessoa se enquadra, até a resolução de cálculos complexos, como calcular qual a rota mais rápida para se chegar a determinado local, realizado por aplicativos como o Waze, ou o cálculo da quantidade de aço necessário na construção de uma ponte. Como vimos anteriormente, qualquer tarefa que siga um padrão pode ser escrita por um algoritmo. E toda tarefa que se baseia na realização de um processamento pode ter o problema apresentado em três fases fundamentais. Fases de um algoritmo computacional Fases de um processamento ENTRADA SAÍDAPROCESSAMENTO Entrada: São os dados de entrada necessários para a resolução do problema solucionado pelo algoritmo. Os algoritmos computacionais geralmente são resoluções que demandam cálculos matemáticos que podem ser desde simples problemas. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 021 Processamento: São as tarefas a serem executadas para se chegar ao resultado final, geralmente compostas por cálculos aritméticos e por condições lógicas. Saída: São os dados resultantes do(s) processamento(s) realizado(s) que geralmente representam os objetivos dos algoritmos. Para a construção de qualquer tipo de algoritmo computacional, é necessário seguir estes passos: • Compreender completamente o problema a ser resolvido, destacando os pontos mais importantes e os objetos que o compõem. • Definir os dados de entrada, ou seja, quais dados serão fornecidos e quais objetos fazem parte desse cenário-problema. • Definir o processamento, isto é, quais cálculos e condições serão efetuados e quais as restrições para esses cálculos. O processamento é responsável pela transformação dos dados de entrada em dados de saída. Além disso, deve-se verificar quais objetos são responsáveis pelas atividades. • Definir os dados de saída, ou seja, quais dados serão gerados depois do processamento. • Construir o algoritmo utilizando uma linguagem formal (pseudocódigo, fluxograma) ou uma linguagem de programação. • Testar o algoritmo realizando simulações. Regras de construção de algoritmos computacionais Processamento: São as tarefas a serem executadas para se chegar ao resultado final, geralmente compostas por cálculos aritméticos e por condições lógicas ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 022 Os algoritmos computacionais podem ser descritos de várias formas, porém as formas mais comuns e que permitem uma solução já projetada para respeitar as restrições necessárias para a execução da solução pelo computador são: pseudocódigo, fluxograma e linguagem de programação. Independente da forma escolhida, a estrutura sempre deverá respeitar as fases de execução de um algoritmo, que consistem nas etapas de entrada, processamento e saída, podendo esse ciclo se repetir várias vezes na resolução de um problema. Pseudocódigo Consiste em escrever os passos a serem realizados pelo computador na resolução de um problema computacional através da adoção de uma pseudolinguagem conhecida como português estruturado, que é uma alusão à posterior implementação em uma linguagem de programação. A grande vantagem em descrever a solução nessa pseudolinguagem é que os nossos algoritmos serão independentes de linguagem de programação e utilizarão como base o vocabulário em nossa língua nativa, o português. Já a quase totalidade das linguagens de programação se baseia na língua inglesa. Outra vantagem é que, por ser escrito baseado na língua portuguesa, o algoritmo será mais fácil de se interpretar e mais fácil de codificar. Mas nunca devemos nos esquecer de que a sua escrita deverá ser intermediária entre a linguagem falada e a linguagem de programação (a forma em que o computador consegue executar a solução). Estrutura básica de algoritmo computacional Os algoritmos computacionais podem ser descritos de várias formas, porém as formas mais comuns e que permitem uma solução já projetada para respeitar as restrições necessárias para a execução da solução pelo computador são: pseudocódigo, fluxograma e linguagem de programação. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 023 O fluxograma é uma forma padronizada e eficaz para representar os passos lógicos de um determinado processamento. Fluxograma ou diagrama de blocos O fluxograma é uma forma padronizada e eficaz para representar os passos lógicos de um determinado processamento. Com o fluxograma, podemos definir uma sequência de símbolos, com significado bem determinado. Portanto, sua principal função é a de facilitar a visualização dos passos de um processamento. Exemplo da construção de um algoritmo computacional Como exemplo, podemos imaginar que desejamos criar um algoritmo que seja responsável por calcular a idade que uma pessoa completará em um determinado ano. Esse algoritmo poderá no futuro ser utilizado para diferentes finalidades, como por exemplo fazer um cartão de aniversário personalizado com a idade da pessoa, ou criar um bolo de aniversário que já vem com a idade a ser comemorada impressa, ou quem sabe para indicar qual a quantidade correta de velas a serem compradas e uma série de outros problemas que possam demandar conhecer a idade a ser comemorada. Se voltarmos ao item que descreve os passos para a construção de um algoritmo, vamos ver que temos x passos a serem seguidos, que estão descritos de forma simplificada abaixo: • Compreender o Esta é com certeza a etapa mais importante para podermos criar o nosso algoritmo e a etapa para a qual devemos dedicar mais tempo, por mais simples que possa parecer o problema. o No nosso caso, precisamos ser capazes de: • Identificar qual idade uma pessoa completará em determinado ano e, para isso, precisamos identificar quais são os dados de entrada que nos permitem calcular o dado desejado(idade a comemorar). ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 024 Identificar em quais situações o dado desejado não é válido, ou em quais situações os dados necessários para o cálculo não são válidos, e assim poderemos criar as nossas proposições ou condições lógicas. • Identificar em quais situações o dado desejado não é válido, ou em quais situações os dados necessários para o cálculo não são válidos, e assim poderemos criar as nossas proposições ou condições lógicas. • Definir os dados de entrada o Após a compreensão do problema, identificamos que os dados de entrada necessários para o cálculo da idade a comemorar são: o ano de nascimento e o ano desejado. • Definir o processamento o Nesta etapa, devemos definir quais cálculos devem ser realizados e também quais são as condições lógicas que devem ser testadas. o O cálculo necessário para se obter a idade a comemorar é a subtração do ano desejado e o ano de nascimento, que para atender ao formalismo necessário para a execução dos passos pelo computador será representado por: idade_comemora ano_nascimentoano_desejado • Quando se trata da condição lógica relativa ao processamento de uma idade válida, podemos criar uma proposição r em que o ano desejado será representado por “desejado” e o ano de nascimento será representado por “nascimento”. E como não é possível calcular a idade de quem ainda não nasceu, teremos a seguinte proposição para uma idade válida: r: desejado > nascimento • Definir os dados de saída • Os dados de saída são os objetivos que se deseja alcançar, nesse caso é a idade a comemorar. • Construir o algoritmo • A construção do algoritmo consiste em seguir uma linguagem formal pré-definida e organizar os passos seguindo uma ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 025 sequência lógica. Como ainda não detalhamos as instruções existentes em portugol, faremos um algoritmo mais simples, que não adotará toda a formalidade necessária para que seja possível a sua execução por um computador. Início Leia ano_desejado Leia ano_nascimento Se ano_desejado > ano_nascimento Então Início idade_comemora ← ano_desejado – ano_nascimento Mostre idade_comemora Senão Mostre “Idade inválida!” Fim Fim Testar o algoritmo • O teste consiste em colocar valores de que se conhece o resultado e verificar se, realizando os passos do algoritmo, obtém-se o mesmo resultado. ano_desejado 2016 2016 2016 ano_nascimento 2020 2000 1996 ano_desejado – ano_nascimento 2016 – 2020 = -4 2016 – 2000 = 16 2016 – 1996 = 20 idade_comemora Idade inválida 16 20 ENTRADAS PROCESSAMENTO SAÍDA Como podemos ver no quadro de testes acima, cujos valores foram preenchidos a partir da simulação de execução do algoritmo proposto, podemos inferir que o algoritmo está correto, uma vez que os resultados que são gerados na coluna de saída atendem as expectativas geradas de valores, porque todas as situações testes Quadro 1 - Teste de algoritmo ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 026 utilizadas são de valores esperados como resposta, que o autor já conhecia de antemão. Essa etapa de validação é extremamente importante, pois muitas vezes um pequeno erro na organização de nosso algoritmo poderá gerar a descrição de um algoritmo errado, como será demonstrado na aula referente a esta unidade. A criação de aplicativos para celulares tem como ponto de partida os conhecimentos de lógica de programação apresentados nesta unidade. Como exemplo prático, podemos imaginar a criação de uma ferramenta para controle de gastos pessoais, que poderá ser realizado tanto de forma manual, através de anotações em um bloco de papel, ou de forma automatizada, a partir de uma planilha Excel ou de um aplicativo para celular. O primeiro passo em qualquer um dos casos é definir de forma clara quais são as informações necessárias de serem anotadas (entrada), quais são as informações que desejamos que sejam criadas (saída) e também a forma como conseguiremos chegar a esse valor criado (processamento). A partir do momento em que compreendemos o problema, é perfeitamente possível criarmos agora a nossa solução. Caso a nossa opção seja por uma planilha de Excel, já conseguimos definir que é necessário que sejam anotados todos os valores a receber dentro do mês e todos os gastos, assim será possível calcular qual o saldo ao final do mês. A criação de um aplicativo consiste em seguir praticamente os mesmos passos que foram seguidos na criação da planilha Excel, a única diferença está na forma de descrever a solução: ao invés de criar uma planilha, teremos que criar um algoritmo responsável pela realização da tarefa. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 027 Nesta unidade, vimos os conceitos básicos de lógica de programação e os passos necessários para a escrita de um algoritmo de qualidade. Aprendemos aqui que a ordem em que os passos são descritos pode influenciar diretamente no resultado final do nosso objetivo, e que para criar algoritmos de qualidade é necessário cumprirmos uma sequência de requisitos. Vimos também que o passo principal é a compreensão do problema em questão e que, para criar algoritmos que possam ser executados pelo computador, temos que ser claros e objetivos. Aprendemos também que a criação de algoritmos computacionais consiste basicamente na identificação dos cálculos necessários e das condições logicas, que podem ser descritas no formato de proposições. Uma boa fonte para buscar conhecimentos adicionais são os sites e iniciativas de aprendizagem de programação, ferramentas estas que são construídas para atender a demanda de pessoas de todas as idades e níveis de conhecimento. Entre elas, podemos citar o site code. org, que é a principal iniciativa mundial para o ensino de programação e conta com módulos de aprendizagem baseados em soluções gráficas e jogos, que podem ser utilizados por pessoas de todas as idades. Outra extremamente interessante é o site KhanAcademy.org, que possui um módulo de aprendizagem de ciência da computação e cursos para todos os níveis de conhecimento, partindo do nível básico até os níveis avançados. Para quem desejar um jogo cujo objetivo é treinar o raciocínio lógico, podemos buscar o Light Bot, que está disponível no site lightbot.com e possui versões para web, Android e iOS. Revisão ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 1 028 Os livros de fundamentos de programação são sempre uma ótima opção para reforçar nossa base teórica. Entre eles, podemos citar o livro adotado como bibliografia básica da nossa disciplina, “Fundamentos de Programação de Computadores”, de Ana Fernanda Ascênsio. Outra excelente opção de aprendizagem, para quem quer ir além do nosso conteúdo e aplicar os conhecimentos aqui apresentados na utilização de uma linguagem de programação, são as videoaulas e tutorias presentes no <www.youtube.com>. Entre eles, podemos citar o canal canalfessorbruno, disponível em <https://www.youtube.com/user/canalfessorbruno>, que contém um excelente material. Estruturas sequenciais e modularização • Algoritmo mínimo • Variáveis e constantes • Comandos de entrada e saída • Operadores aritméticos • Operadores relacionais e operadores lógicos • Construção e análise de expressões • Modularização e construção de sub-rotinas • Revisão Introdução Nesta unidade, apresentaremos as instruções que nos permitirá solucionar problemas computacionais sequenciais. Levando em consideração as fases de umalgoritmo que foram abordadas na unidade anterior, falaremos das instruções que serão responsáveis pela entrada de dados; dos operadores e das expressões que possibilitarão a execução de processamento e avaliações lógicas; das instruções que serão responsáveis pela saída dos dados. Além das instruções de entrada e saída, das expressões responsáveis pelo processamento e das avalições lógicas, trabalharemos coma alguns conceitos essenciais para a construção de algoritmos. Entre eles estão o conceito de variáveis e os tipos de dados. Para a construção organizada de soluções algorítmicas, abordaremos também a técnica de modularização, que nos permitirá a construção de algoritmos menores, mais precisos e objetivos e que, no futuro, poderão ser reutilizados em outras situações. A partir desta unidade, o foco estará apenas em algoritmos computacionais, que serão descritos em duas formas distintas: o pseudocódigo ou portugol e o fluxograma ou diagrama de fluxos. Alguns exemplos serão apresentados utilizando essas duas formas de descrição de algoritmo; em outros, selecionaremos apenas uma delas, permitindo que o aluno desenvolva a capacidade de transcrever uma solução algorítmica descrita em pseudocódigo para fluxograma, e vice-versa. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 031 Algoritmo mínimo é o menor algoritmo que se pode escrever. Leva esse nome pelo fato de não executar absolutamente nada. Possui a estrutura mínima de qualquer algoritmo que deve possuir um início e um fim. Fluxograma mínimo Para a construção do fluxograma mínimo, adotaremos os símbolos que denotam as instruções de início e fim. Tais símbolos são chamados, em fluxograma, de terminados e são representados pelo símbolo abaixo: Como podemos perceber, temos um símbolo único responsável por representar duas fases muito distintas do fluxograma. Se não tivermos nenhum recurso para diferenciá-los, poderemos causar dúvidas e confusão quanto ao que se pretende informar. Para resolver esse problema, no fluxograma, todos os símbolos devem vir com uma anotação dentro deles. No caso do terminado, as anotações possíveis são início ou fim, possibilitando a identificação de qual das fases do algoritmo está sendo representada pelo símbolo. Símbolo terminador responsável por início e fim. Algoritmo mínimo Algoritmo mínimo é o menor algoritmo que se pode escrever. Como um algoritmo mínimo é composto por início e fim, o fluxograma mínimo também é representado apenas por esses dois símbolos, conforme podemos visualizar na figura abaixo. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 032 Início Fim algoritmo fim_algoritmo. Fluxograma mínimo Se analisarmos o fluxograma mínimo apresentado na figura acima, perceberemos que, entre os dois símbolos, existe uma seta que se inicia no símbolo de início e finaliza no símbolo de fim. Essa seta também faz parte do modelo de representação do fluxograma e o seu objetivo é demonstrar o sentido no qual os passos estão sendo executados. Pseudocódigo mínimo Assim como no fluxograma, o pseudocódigo também tem uma estrutura mínima a ser seguida e que será comum a qualquer pseudocódigo criado. A sua sintaxe (forma de escrever) vai variar entre diferentes autores, mas, em todos eles, a estrutura será a mesma. Abaixo apresentamos o algoritmo mínimo, adotando a sintaxe proposta por Ana Fernanda Ascencio. Algoritmo mínimo adotando a sintaxe proposta por Ana Fernanda Ascencio. Assim como no fluxograma, o pseudocódigo também tem uma estrutura mínima a ser seguida e que será comum a qualquer pseudocódigo criado. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 033 O conceito de variáveis e constantes não será novidade em nossa vida acadêmica, uma vez que, provavelmente, já utilizamos tal recurso para resolver problemas matemáticos e físicos com uma certa constância. Sempre questiono meus alunos sobre qual teria sido a primeira vez, na vida acadêmica deles, em que tiveram contato com o conceito de variáveis. Geralmente respondem ter sido na disciplina de Matemática, quando o professor apresentou as equações matemáticas, que utilizam as variáveis x, y ou z, conforme o exemplo abaixo. Variáveis e constantes x + 2 = 5 Expressão 1: Expressão matemática com utilização de variável Porém, costumo dizer que o primeiro contato se deu bem antes disso. Ocorreu provavelmente quando nos deparamos com as nossas primeiras soluções de problemas matemáticos, nos quais o professor solicitava que preenchêssemos o quadro abaixo com a valor correto. + 2 = 5 Expressão 2: Primeiros problemas matemáticos da nossa vida acadêmica Se repararmos bem as duas expressões apresentadas, perceberemos que representam exatamente a resolução do mesmo problema, porém de modos distintos. Na solução de cada uma das questões, o que importa é o valor dado, de forma que o resultado da expressão esteja correto. Ou seja, o mais importante de uma variável, não é a sua forma (x ou quadrado a preencher), mas sim o conteúdo que ela armazena, uma vez que a solução do problema só estará correta se existir um conteúdo correto. O mais importante de uma variável, não é a sua forma (x ou quadrado a preencher), mas sim o conteúdo que ela armazena, uma vez que a solução do problema só estará correta se existir um conteúdo correto. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 034 Na computação, uma variável não é muito diferente daquela aprendida na matemática. Ambas representam uma estrutura que armazena determinado valor. Segundo Sandra Puga, uma variável é utilizada para representar valores desconhecidos, porém necessários para a resolução de um problema, podendo ser alterados de acordo com a situação. Por isso, pode-se dizer que as variáveis armazenam valores (dados) temporariamente. Se analisarmos conforme o seu objetivo, podemos classificar as variáveis em: variável de entrada, variável de saída e variável auxiliar Variável de entrada As variáveis de entrada são as responsáveis por armazenarem os valores que são geralmente fornecidas pelo usuário e que consistem nos valores necessários para a solução do problema. Como exemplo podemos utilizar a necessidade de se encontrar as raízes de uma equação de 2º grau. Neste caso, as variáveis de entrada seriam: a, b e c. Variável de saída As variáveis de saída são as responsáveis por armazenar os valores calculados pelo algoritmo e são geralmente os resultados esperados para a resolução dos problemas. Nas equações de segundo grau, por exemplo, as variáveis de saída seriam x’ e x’’, ou seja, as raízes da equação. Variável auxiliares As variáveis auxiliares são as responsáveis por armazenar os valores intermediários da solução de determinados problemas. As variáveis de saída são as responsáveis por armazenar os valores calculados pelo algoritmo e são geralmente os resultados esperados para a resolução dos problemas. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 035 Tomando novamente o exemplo das raízes de uma equação de segundo grau, a variável auxiliar seria o delta, que tem seu cálculo necessário para se obter o valor de cada raiz. Identificação das variáveis para os algoritmos Para que os algoritmos possam identificar as variáveis e as utilizarem no decorrer da sua execução, é necessário que se realize uma etapa que chamamos de declaração de variáveis. A declaração de variáveis consiste em definir um nome e o tipo de informação que ela poderá armazenar ao longo da execução do algoritmo. Para que seja possível que o computadoridentifique uma variável, há algumas restrições a serem seguidas, conforme apresentadas abaixo. • Seu nome deve ser único e não pode ter outra função já predeterminada na linguagem que estamos adotando, ou seja, não poderemos ter uma variável chamada início, pois vimos que a palavra início já tem uma função predeterminada em pseudocódigo. • Não devemos utilizar espaço entre as letras. • Essa restrição se dá pelo fato de o computador não conseguir interpretar que palavras separadas podem significar uma mesma coisa. Então, se queremos criar uma variável para armazenar a data de nascimento de uma pessoa, seu nome deverá ser data_nascimento ou dataNascimento, pois assim o computador saberá interpretá-la. O caractere ‘sublinha’ ou ‘underline’ (_) pode ser utilizado para representar o espaço entre as letras, apesar de que, no padrão atual de programação, não se adota mais o sublinhado, mas sim a letra maiúscula, para simbolizar a primeira letra de uma palavra composta, conforme pode ser visto no exemplo dataNascimento. A declaração de variáveis consiste em definir um nome e o tipo de informação que ela poderá armazenar ao longo da execução do algoritmo. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 036 • Não iniciar o nome da variável com números. • É o caso do exemplo ‘2valor’. Nesse caso, o computador, ao entrar em contato com o um número no início de uma palavra, ele “entende” que o número deverá ser utilizado para fazer cálculo. Então, o correto fica sendo ‘valor2’. • Não utilizar acentos e caracteres especiais no nome das variáveis. • Essa restrição se deve a dois motivos: nem todos os idiomas possuem acento/caracteres especiais e os que o possuem não necessariamente apresentam as mesmas características. Logo, os códigos não serão interpretados por qualquer computador, em qualquer idioma. • Não utilizar símbolos (@, !, &, %, dentre outros) no nome das variáveis. • Essa restrição se dá pelo fato de grande parte desses símbolos já possuir outra função dentro do contexto de programação e já ser utilizado para simbolizar alguma outra operação. • Ser sucinto e utilizar nomes coerentes • Isso simplifica o entendimento do seu algoritmo pelo programa de computador. Se o nome das suas variáveis remeter ao seu significado, ficará bem mais simples compreender a sua utilização. Evite sempre utilizar nomes como a, b, c, ci, pois à medida que o seu algoritmo se tornar mais complexo, será extremamente difícil identificar o objetivo de cada uma das variáveis. Identificação das variáveis em pseudocódigo Em pseudocódigo, assim como na maioria das linguagens de programação, a definição do nome da variável deve respeitar as Não utilizar símbolos (@, !, &, %, dentre outros) no nome das variáveis. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 037 restrições apresentadas no item acima. Além disso, é necessário também definir o tipo de informação que cada variável poderá armazenar – o que chamamos de ‘tipos de dados’. Tipos de dados Os tipos de dados são responsáveis por definir quais valores podem ser guardados em uma variável, bem como quais tipos de operação poderão ser executados com a variável. Os tipos de dados que adotaremos na nossa disciplina são: numérico, lógico e literal (ou caractere). Numéricos As variáveis pertencentes ao tipo numérico, como o próprio nome diz, são responsáveis por guardarem valores numéricos, podendo ser valores positivos ou negativos. Os tipos numéricos suportam tanto o número com casas decimais (ou fracionários) quanto apenas valores inteiros. Outra informação importante refere-se à língua inglesa: a parte decimal é separada da parte inteira por um ponto, e não por uma vírgula, como ocorre na nossa língua. Essa informação é importante, porque quase a totalidade das linguagens de programação são definidas tendo como base a língua inglesa. Na hora de resolver determinados problemas, é importante que tenhamos a consciência de que o tipo numérico pode ser subdividido em números inteiros e números reais. E essa divisão pode ser de grande importância, uma vez que determinadas soluções só existem no domínio dos números inteiros, como é o caso dos números pares e ímpares. Os tipos de dados são responsáveis por definir quais valores podem ser guardados em uma variável, bem como quais tipos de operação poderão ser executados com a variável. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 038 Lógicos As variáveis pertencentes ao tipo lógico são variáveis que podem assumir apenas dois valores (verdadeiro ou falso) e, por serem advindos da álgebra de Boole, são também chamados de booleanos. Literais ou caracteres É possível que as variáveis pertencentes ao tipo literal assumam valores que podem ser formados por um único caractere ou por uma cadeia de caracteres. Para que o computador identifique esse valor, ele deverá sempre vir dentro de aspas – em algumas linguagens de programação, usam-se aspas duplas, em outras, aspas simples. Declaração de variáveis em pseudocódigo O portugol tem uma área reservada para a declaração de todas as variáveis necessárias para o algoritmo e, independentemente do objetivo (entrada, saída ou auxiliar), todas elas devem ser definidas nessa área. Para indicar ao algoritmo que um conjunto de variáveis será declarado, foi definido como palavra reservada (palavra que tem um objetivo bem definido na linguagem) a palavra declare. algoritmo Declare nome_variável tipo_variável //bloco de comandos do algoritmo fim_algoritmo. Como exemplo, utilizaremos o algoritmo computacional apresentado na unidade 1, que tem como objetivo indicar a quantidade de velas correta a ser comprada para o aniversário de Exemplo de declaração de variáveis Para indicar ao algoritmo que um conjunto de variáveis será declarado, foi definido como palavra reservada (palavra que tem um objetivo bem definido na linguagem) a palavra declare. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 039 uma pessoa. Após a análise e compreensão do problema, vimos que, para calcular a quantidade de velas, precisamos saber qual idade o aniversariante irá comemorar. E a forma correta de obter essa informação é perguntar a ela o seu ano de nascimento e considerar o ano de comemoração. Assim teremos duas variáveis de entrada: anoNascimento e anoComemoracao. E, como resultado ou objetivo, temos a quantidade de velas necessárias, que será considerada, em nosso problema, como a variável de saída qtdeVelas. Ao analisarmos a solução, percebemos que nenhum cálculo intermediário é necessário, ou seja, não teremos variáveis auxiliares. Então, no algoritmo de cálculo de velas para uma comemoração, teremos a declaração de três variáveis. É preciso verificar qual tipo de informação melhor se adequa aos valores que serão armazenados e, a partir disso, concluir que o melhor tipo de dados a ser adotado é o tipo numérico, ficando o algoritmo conforme representado abaixo. Algoritmo Declare anoNascimento, anoComemoracao, qtdeVelas numerico //bloco de comandos do algoritmo fim_algoritmo Analisando o algoritmo representado acima, podemos perceber que, em uma mesma linha, é possível realizar a declaração de mais de uma variável. A única restrição é que todas elas pertencerão a um mesmo tipo – o que, no caso do exemplo, é o tipo numérico. Outra informação importante é que, para ser possível a declaração de mais de uma variável, o nome de cada uma deverá ser separado por vírgula, conforme já exemplificado aqui. Declaração de variáveis doalgoritmo de cálculo de quantidade de velas para uma comemoração de aniversário É preciso verificar qual tipo de informação melhor se adequa aos valores que serão armazenados e, a partir disso, concluir que o melhor tipo de dados a ser adotado é o tipo numérico. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 040 Operador de atribuição de valor a uma variável A operação de valor atribuída diretamente a uma variável é feita por um operador denominado ‘operador de atribuição’, sendo representada pelo símbolo ←. Em várias linguagens de programação, o símbolo adotado pelo operador de atribuição é o =. E para não confundirmos com seu uso na matemática, normalmente lemos a utilização desse operador como ‘recebe’, conforme será representado nos exemplos abaixo. Exemplos de atribuição de valores a variáveis 1. Algoritmo 2. Declare anoNascimento, anoComemoracao, qtdeVelas numerico 3. anoNascimento ←1996 4. anoComemoracao ← 2016 5. qtdeVelas ← anoComemoracao - anoNascimento 6. fim_algoritmo Se analisarmos o algoritmo acima, perceberemos que: • na linha 3, estamos atribuindo à variável anoNacimento o valor 1996; • na linha 4, estamos atribuindo à variável anoComemoracao o valor 2016; • na linha 5, estamos atribuindo à variável qtdeVelas o resultado da expressão anoComemoracao - anoNascimento, que, no exemplo acima, será o mesmo que atribuir 2016 - 1996, cujo resultado será 20, ou ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 041 seja, dentro da variável qtdeVelas teremos o valor 20 armazenado; • este algoritmo possui um problema: ele sempre calcula os mesmo valores, e isso quer dizer que ele não se propõe a resolver um grupo de problemas, mas apenas uma situação, que é a quantidade de velas a comprar no ano de 2016 para uma pessoa que nasceu em 1996. Identificação das variáveis em fluxograma No fluxograma, diferentemente do pseudocódigo, não é necessário realizar a declaração de variáveis, porém, a representação da atribuição de valores a variáveis é possível, e deverá ser feita no símbolo que equivale ao processamento, conforme representado abaixo. Início Fim anoNascimento ← 1996 anoComemoracao ← 2016 qtdeVelas ← anoComemoracao - anoNascimento Fluxograma com atribuição de valores a variáveis Analisando a imagem abaixo, que representa as fases de um algoritmo, vemos que o usuário é o responsável pela entrada de dados no programa, a partir do qual se realiza o processamento e a exibição do resultado no computador, cumprindo assim o ciclo de um algoritmo. Comandos de entrada e saída O usuário é o responsável pela entrada de dados no programa, a partir do qual se realiza o processamento e a exibição do resultado no computador, cumprindo assim o ciclo de um algoritmo. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 042 FIGURA 3 - Fases de um algoritmo Fonte: Núcleo de Educação a Distância (NEaD), Una, 2016. Se relacionarmos o algoritmo apresentado anteriormente, que calculava a quantidade de velas a ser utilizada em uma comemoração de aniversário, com a figura acima, perceberemos que, para corrigir o problema de calcular a quantidade de velas para qualquer situação, basta ter uma instrução que permita ao usuário informar os valores das variáveis de entrada e outra instrução que nos permite exibir o resultado no computador. Tais instruções são chamadas de comandos de entrada e saída. Comando de entrada O comando de entrada é utilizado para que o usuário possa digitar um valor que será diretamente armazenado em uma variável de entrada. Essa instrução é representada em portugol pela instrução LEIA. A sintaxe de utilização da instrução LEIA é: LEIA anoNascimento ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 043 Essa instrução permitirá ao usuário digitar um valor, que será armazenado na variável anoNascimento. Comando de saída O comando de saída é utilizado para que o algoritmo possa exibir o conteúdo de uma variável ou um texto na tela do computador. Essa instrução é representada em portugol pela instrução ESCREVA. A sintaxe de utilização da instrução ESCREVA é: ESCREVA anoNascimento Essa instrução permitirá ao algoritmo exibir na tela do computador o valor que está armazenado na variável anoNascimento. ESCREVA “Ano de nascimento é: ” = anoNascimento Essa instrução permitirá ao algoritmo exibir na tela do computador o texto “Ano de nascimento é:” acompanhado do valor que está armazenado na variável anoNascimento. Exemplo de algoritmo utilizando comandos de entrada e saída 1. Algoritmo 2. Declare anoNascimento, anoComemoracao, qtdeVelas numerico 3. LEIA anoNascimento 4. LEIA anoComemoracao 5. qtdeVelas ← anoComemoracao - anoNascimento 6. ESCREVA “Velas necessárias: ”, qtdeVelas 7. fim_algoritmo Exemplo de algoritmo utilizando comandos de entrada e saída. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 044 Se analisarmos o algoritmo acima, perceberemos que na: • linha 3, estamos atribuindo à variável anoNascimento o valor que será informado pelo usuário; • linha 4, estamos atribuindo à variável anoComemoracao o valor que será informado pelo usuário, ou seja, a cada utilização, o usuário poderá informar diferentes valores, fazendo assim com que o programa possa atender a uma infinidade de comemorações diferentes; • linha 5, estamos atribuindo à variável qtdeVelas o resultado da expressão anoComemoracao - anoNascimento, que será calculado de acordo com os valores informados pelo usuário; • linha 6, estamos exibindo os resultados na tela do computador para que o usuário possa conhecer o resultado e assim atingir o seu objetivo ao utilizar o programa. Exemplo de fluxograma utilizando comandos de entrada e saída No fluxograma, existem símbolos específicos para a entrada e a saída de dados e que podem variar conforme o padrão adotado. Os símbolos mais comumente utilizados para a entrada de dados é o símbolo de dados ou o símbolo de entrada manual: ou Símbolos adotados para entrada de dados no fluxograma Os símbolos mais comumente utilizados para a saída de dados é o símbolo de dados ou o símbolo de documento ou o símbolo de exibir: No fluxograma, existem símbolos específicos para a entrada e a saída de dados e que podem variar conforme o padrão adotado. ou ou Símbolos adotados para s saída de dados no fluxograma ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 045 Fluxograma de cálculo de velas para uma comemoração Fluxograma de cálculo de velas para uma comemoração E o exemplo do algoritmo para cálculo de quantidade de velas para uma comemoração é representado no fluxograma abaixo. Início Fim qtdeVelas ← anoComemoracao - anoNascimento anoNascimento anoComemoracao qtdeVelas Início Fim qtdeVelas anoComemoracao anoNascimento qtdeVelas ← anoComemoracao - anoNascimento Outro exemplo de fluxograma, utilizando outro grupo de símbolos de representação, é apresentado abaixo: ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 046 Os operadores aritméticos representam as operações aritméticas básicas de soma, subtração, multiplicação e divisão. Os operadores podem ser utilizados apenas com operandos numéricos. Tais operandos podem ser tanto constantes numéricas quanto variáveis do tipo numérico. Operadores aritméticos Os símbolos adotados para representar os operadores são: Operadores aritméticos + * - / Soma Multiplicação Subtração Quociente da divisão SÍMBOLO OPERAÇÃO Expressões aritméticas As expressões formadas por operadores aritméticossão chamadas ‘expressões aritméticas’, devendo possuir seus operandos numéricos e produzir um resultado também numérico. São comumente utilizadas ao serem combinadas com uma operação de atribuição de valor a uma variável, pois, se solicitamos ao computador que realize a resolução de uma expressão aritmética apenas, ele realiza o cálculo, porém não armazena o resultado produzido. As expressões formadas por operadores aritméticos são chamadas ‘expressões aritméticas’, devendo possuir seus operandos numéricos e produzir um resultado também numérico. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 047 Linearização de expressões Para a correta execução da expressão pelo computador, todas as expressões aritméticas devem ser linearizadas, ou seja, colocadas em linha. Além disso, os operadores aritméticos tradicionais devem ser substituídos pelos seus correspondentes para os símbolos computacionais, conforme o exemplo abaixo. Tradicional 2 + (5-3) + 1 = 3 Computacional (2/3 + (5-3)) + 1 = Linearização de expressões, Costa 1998 Expressões aritméticas em fluxogramas As expressões aritméticas são representadas no fluxograma pelo símbolo de processo ou pelo símbolo de processo predefinido, conforme apresentado abaixo – já tendo sido utilizado no exemplo dado de cálculo de quantidade de velas. ou Símbolo adotado para representar expressões aritméticas Dentro do símbolo representado, devemos sempre colocar a expressão aritmética que ele representa, pois o símbolo, por si só, possui um significado completo. As expressões aritméticas são representadas no fluxograma pelo símbolo de processo ou pelo símbolo de processo predefinido. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 048 Os operadores relacionais e os operadores lógicos são responsáveis por realizarem as condições lógicas necessárias para a construção de uma solução algorítmica. Operadores relacionais Os operadores relacionais são responsáveis por realizar comparação entre valores numéricos e também já são familiares no estudo da matemática. Em pseudocódigo, os operadores relacionais são representados pelos símbolos apresentados abaixo. Operadores relacionais e operadores lógicos > >= = < <= <> Maior que Maior ou igual a Igual a Menor que Menor ou igual a Diferente de SÍMBOLO OPERAÇÃO O erro mais comum que cometemos é confundir o oposto dos operadores maior que ( > ) ou do operador menor que ( < ). Normalmente pensamos que o oposto do sinal maior que ( > ) é o sinal menor que ( < ), porém o correto é ter outro tipo de raciocínio: quando dizemos que queremos tudo que não é maior do que 5, estamos falando que queremos todos os item que possuem valores Os operadores relacionais e os operadores lógicos são responsáveis por realizarem as condições lógicas necessárias para a construção de uma solução algorítmica. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 049 que são menores do que 5 e todos os itens que possuem valores iguais a 5. Ou seja, o contrário do operador maior que ( > ) em portugol é menor ou igual a ( <= ), e o contrário do operador menor que ( < ) em portugol é maior ou igual a ( >= ). Expressões relacionais As expressões relacionais possuem operandos numéricos e operadores relacionais e produzem resultados lógicos (verdadeiro ou falso). Operadores lógicos ou booleanos Os operadores lógicos ou booleanos são responsáveis por realizar a comparação entre valores lógicos e já nos foram apresentados na unidade 1 desta disciplina. Em pseudocódigo, os operadores lógicos são representados pelos símbolos apresentados abaixo. E NÃO OU Retorna verdadeiro, se ambos os operandos forem verdadeiros. Retorna verdadeiro se, pelo menos, um dos operandos forem verdadeiros. Retorna verdadeiro, se o operando for falso e retorna falso, se o operando for verdadeiro. SÍMBOLO OPERAÇÃO Expressões lógicas ou booleanas As expressões lógicas possuem operandos lógicos, operadores lógicos e produzem resultados lógicos (verdadeiro ou falso), sendo frequentemente utilizadas para combinarem duas ou mais expressões relacionais. As expressões lógicas possuem operandos lógicos, operadores lógicos e produzem resultados lógicos (verdadeiro ou falso), sendo frequentemente utilizadas para combinarem duas ou mais expressões relacionais. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 050 Tabela-verdade V F V F V V F F V F F F V V V F F V F V F F V V var1 var2 var2 E var2 NÃO (var1)var1 OU var2 NÃO(var2) Expressões relacionais e expressões lógicas em fluxogramas As expressões relacionais e as expressões lógicas são representadas no fluxograma pelo símbolo de condicional ou decisão, conforme apresentado abaixo. Símbolo adotado para representar expressões relacionais e expressões lógicas Dentro do símbolo representado, devemos sempre colocar a expressão relacional ou lógica que ele representa, pois o símbolo, por si só, possui um significado completo. Uma característica peculiar desse símbolo é o fato de ele ser o único, em fluxograma, que nos permite dividir o caminho de execução do fluxo em duas possibilidades: um para as situações nas quais o resultado da análise de expressão dê o resultado verdadeiro e outro para situações nas quais o resultado da análise da expressão dê o resultado falso. As expressões relacionais e as expressões lógicas são representadas no fluxograma pelo símbolo de condicional ou decisão. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 051 Independentemente de a expressão ser aritmética ou lógica, o computador sempre irá analisá-la da esquerda para a direita, assim como fazemos com a solução de problemas matemáticos. Porém, em alguns casos, é necessário que mudemos a ordem de solução dessa expressão, para que tenhamos o resultado esperado. Essa mudança na ordem de solução é chamada de prioridade e, assim como na matemática, aqui também temos o operador que nos permitirá fazer essa alteração. Na matemática, os operadores de modificação de prioridade são as chaves “{ }”, os colchetes “[ ]” e os parênteses “( )”. No portugol, só adotamos os parênteses como operador de prioridade, porém, diferente da matemática, no portugol é permitido utilizar um par de abre e fecha parênteses dentro de outro par de abre e fecha parênteses, na quantidade que for necessária para resolver a expressão. A programação de problemas complexos consiste na divisão do problema em partes menores e específicas, tornando a escrita e o entendimento do algoritmo mais simples e fáceis de serem realizados e facilitando a possibilidade de reutilizar soluções já construídas anteriormente. A cada uma dessas partes que dividimos e construímos, chamamos de sub-rotinas em portugol e procedimento, função ou método em outras linguagens de programação. Construção e análise de expressões Modularização e construção de sub-rotinas No portugol, só adotamos os parênteses como operador de prioridade, porém, diferente da matemática, no portugol é permitido utilizar um par de abre e fecha parênteses dentro de outro par de abre e fecha parênteses, na quantidade que for necessária para resolver a expressão. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO unidade 2 052 Quanto menor for a tarefa que conseguirmos transformar em sub- rotinas, mais eficiente será o seu reuso em programas futuros, e maior será a independência desse módulo na solução do problema. Criação
Compartilhar