Baixe o app para aproveitar ainda mais
Prévia do material em texto
DESENVOLVIMENTO DE SISTEMAS Allen Oberleitner Luís Carlos S. Silva Editora Senac São Paulo – São Paulo – 2020 Sumário Capítulo 1 Apresentação inicial sobre desenvolvimento de sistemas 1 Evolução do desenvolvimento de sistemas 2 Utilização dos conceitos na prática Considerações finais Referências Capítulo 2 Introdução a algoritmos 1 Introdução a algoritmos 2 Conceitos de algoritmos 3 Descrição narrativa de um algoritmo 4 Representação de algoritmos por fluxograma Considerações finais Referências Capítulo 3 Algoritmos variáveis 1 Programação imperativa 2 Utilização de pseudocódigo 3 Declaração de variáveis e constantes 4 Expressões aritméticas, literais, relacionais e de lógica booleana Considerações finais Referências Capítulo 4 Algoritmos: condicional 1 A arte de tomar decisões 2 Estrutura de controle condicional simples 3 Estrutura de controle condicional composta Considerações finais Referências Capítulo 5 Algoritmos: repetição 1 Repetir para aprender 2 Enquanto-faça (while) Considerações finais Referências Capítulo 6 Algoritmos: vetores 1 Teoria dos conjuntos 2 Conceito de vetores 3 Manipulando vetores Considerações finais Referências Capítulo 7 Algoritmos: matrizes 1 Matriz é tabela? 2 Conceito de matriz 3 Manipulando matriz Considerações finais Referências Capítulo 8 Programação estruturada 1 Linguagem de programação 2 Linearidade 3 Programação estruturada Considerações finais Referências Capítulo 9 Programação: funções e procedimentos 1 Conceitos de função 2 Procedimento 3 Aplicando funções Considerações finais Referências Capítulo 10 Programação: arquivo 1 Processo arquivado! 2 Conceitos de arquivo 3 Manipulando arquivo Considerações finais Referências Capítulo 11 Programação orientada a objetos 1 Conceito de POO 2 Classes e objetos 3 Aplicação de POO Considerações finais Referências Capítulo 12 Programação orientada a objetos: classes 1 Composição da classe 2 Instâncias Considerações finais Referências Capítulo 13 Programação orientada a objetos: Python 1 Linguagem orientada a objetos 2 Conceitos de Python 3 Aplicação de POO: Python Considerações finais Referências Capítulo 14 Banco de dados 1 Armazenamento de dados 2 Modelos de banco de dados 3 Conceito de banco de dados 4 Instâncias ou ocorrências de uma entidade Considerações finais Referências Capítulo 15 Linguagem SQL 1 Utilização de SQL nas aplicações Considerações finais Referências Capítulo 16 Atualização de tabelas em aplicações 1 Conceitos de CRUD (Create, Read, Update, Delete) para SQL Considerações finais Referências Sobre os autores Capítulo 1 Apresentação inicial sobre desenvolvimento de sistemas Estamos na era dos nativos digitais, pessoas que já nasceram em um mundo automatizado, virtualizado e conectado à internet. Mas como essa tecnologia chegou ao que conhecemos hoje? Na segunda metade do século XX, após o fim da guerra mundial, os primeiros softwares começaram a surgir. Até aquela época, os computadores eram programados por meio de chaves manuais e sua utilização era muito trabalhosa e restrita, se comparado aos dias atuais. Essa primeira era de softwares foi marcada pelo uso básico, pois naquela época não havia muito interesse no desenvolvimento. Como os computadores eram muito limitados, era possível executar apenas um programa de cada vez. Com a visão de novas possibilidades e as necessidades do mercado, os computadores começaram a ficar maiores, deixaram de utilizar válvulas – que eram lentas e de alta manutenção, pois queimavam muito –, migrando para a utilização de componentes microeletrônicos, que, mesmo nas primeiras versões, já apresentavam um poder computacional muito maior. Conforme as décadas foram passando, assim como a tecnologia dos computadores cresceu exponencialmente, os softwares buscaram acompanhar essa evolução, otimizando os recursos e trazendo novas funcionalidades para este poder computacional. 1 Evolução do desenvolvimento de sistemas No mundo digital em que vivemos, a utilização de programas e sistemas está presente em praticamente tudo que nos cerca, mas para chegarmos onde estamos hoje a programação de softwares passou por um longo caminho. A evolução da programação está diretamente ligada à história dos computadores, e, para entendermos melhor esse conceito, falaremos um pouco sobre isso. “A necessidade de desenvolver ferramentas que facilitassem o uso e o manuseio de operações de cálculos fez com que o ser humano chegasse ao estágio atual de desenvolvimento da área da computação” (MANZANO, 1996, p. 17). A palavra computador significa o que computa ou aquele que calcula. Na verdade, os computadores não só calculam, mas também executam outras tarefas associadas, como receber, transmitir e armazenar dados. Todo o computador é composto essencialmente por duas partes, conforme a figura 1: Figura 1 – Hardware versus software Fonte: adaptado de Capron; Johnson (2004). 1.1 Como tudo começou O Eniac foi o primeiro computador digital de larga escala, construído para quebrar códigos de comunicação do exército inimigo e realizar vários tipos de cálculos, principalmente de artilharia, afim de ajudar as tropas aliadas durante a Segunda Guerra Mundial; contudo, foi mais utilizado nos últimos anos da Guerra Fria. Segundo Platzman (1979), ele foi construído na escola Moore por ordem do exército dos EUA. A equipe contava com o engenheiro- chefe J. Presper Eckert, atuando inicialmente nos conceitos básicos desenvolvidos por John W. Mauchly, que atuou como principal engenheiro construtor e como consultor do departamento da artilharia americana Herman H. Goldstine. O matemático húngaro John Von Neumann também participou do projeto, desenvolvendo uma lógica de números pseudoaleatórios, que trouxe um grande ganho de desempenho. Este computador foi construído na década de 1940, sendo composto por quase 18 mil válvulas, utilização que marca a primeira geração de computadores e originava repetidos problemas de manutenção, pois estas queimavam com frequência. De acordo com Matsuura (2016), mulheres como Ada Lovelace e Grace Hopper foram fundamentais para o avanço dos softwares. As seis programadoras do projeto Eniac criaram o sistema do primeiro computador eletrônico digital, mas nenhuma recebeu o devido crédito. Embora o sistema operacional do Eniac fosse feito por cartões perfurados, a programação não era através de linguagem, e sim por chaves manuais. Larry Gonick (1983) explica que as válvulas, entre outras funções, mostravam o resultado dos cálculos, da mesma maneira que hoje usamos os monitores. Mesmo que a sua arquitetura seja enorme, a quantidade de processamento não se comparava à dos computadores atuais. 1.2 O início de uma revolução No fim da Segunda Guerra Mundial, na década de 1940, a maioria das pesquisas em todo o mundo, principalmente nos EUA e na Inglaterra, sobre programas era financiada pelos governos e desenvolvida como projetos de ciência por universidades, e outras, mais específicas, pelo exército. Os computadores eram muito grandes e caros, por isso só eram usados por especialistas. Era um mundo ainda muito restrito, e as comunidades de especialistas trabalhavam juntas para chegar a programas que fizessem os computadores executarem tarefas específicas. Nesta fase, não existiam grandes investimentos, pois ainda não interessava às empresas e ao público. O sistema operacional utilizado era o Unix, desenvolvido pela AT&T nos laboratórios Bell, em 1969; já os hardwares não eram específicos, montados conforme a necessidade, utilizando uma mistura de componentes definidos e configurados por eles. Esses computadores ficavam muito grandes e eram utilizados em salas bem espaçosas. Na metade do século XX, o mundo iniciou uma grande evolução da tecnologia, unindo os conhecimentos científicos e a produção industrial. As indústrias concentraram seus trabalhos na pesquisa e conhecimento, dando início à chamada 3ª Revolução Industrial. Como início do interesse das empresas pelos computadores, eles começaram a receber configurações padronizadas e uma considerável redução de tamanho. 1.3 O nascimento da Apple Pouco depois, em meados dos anos 1970, dois jovens muito talentosos decidiram criar algo para o público. Steve Wozniak – detentor de grandes conhecimentos em programação – e Steve Jobs – um gênio em vendas – uniram suas habilidades e criaram a primeira empresa a vender computadores de boa performance para usuários sem grande conhecimento. Assim nascia a Apple. A intenção era desenvolver um computador confiável, relativamente pequeno e que pudesse ser usado em qualquer residência; para isso, utilizaram o sistema Unix, o mesmo sistema empregado pelos especialistas, mas com comandos mais simples e um ambiente mais amigável. Queriam que fosse tão popular quanto um eletrodoméstico. PARA SABER MAIS Até hoje, o fator de maior sucesso da Apple é o cuidado com os clientes: mais potência nas configurações, utilizando os componentes mais seguros do mercado e menos botões por fora, ou seja, o mais simples e intuitivo possível para os usuários. Quinafelex (2014) destaca o lançamento do Apple I no Homebrew Computer Club – clube criado por entusiastas de tecnologia, que se reuniam no Vale do Silício. Esse modelo era formado por um kit com placa principal, que poderia ser comprada em pequenas lojas. Esse kit tinha de se “adaptar”, pois não possuía seu próprio gabinete. O aparelho tinha um processador de 1 MHz e uma memória RAM de 8 KB. Inicialmente, o preço era por volta de US$ 667. 1.4 Microsoft, uma nova visão entra no mercado Segundo Bill Gates (1995), com o interesse do público crescendo pela aquisição de computadores pessoais, empresas como a IBM tinham o controle da produção de hardwares e decidiram fabricar seus próprios computadores. O grande problema era que a Apple não concordou em fornecer seu sistema operacional, uma vez que sua intenção também era vender um produto completo, com hardware e software juntos. Neste cenário, surgiram Bill Gates, Paul Allen e Steve Ballmer. Eles aceitaram o desafio de, em um curto espaço de tempo, fornecer um sistema operacional. Sabendo que tinham um grande desafio e pouco tempo para entregar, em 1980 compraram o “QDOS” – um sistema operacional com várias falhas e bugs. Corrigindo os erros e realizando diversas melhorias, o transformaram no DOS – Sistema Operacional de Disco (da sigla em inglês, disk operating system). Assim, conseguiram cumprir o prazo e entregar o sistema para o grupo de empresas. Figura 2 – Tela da DOS – sistema operacional da Microsoft Atelsek (1983) compara o sistema operacional do PC a uma caixa de ferramentas que temos em casa. Primeiro, colecionamos as mais básicas ou essenciais, que realizam as tarefas mais simples, como uma chave de fenda, um alicate, um martelo, etc. Conforme vão surgindo outras necessidades, vamos adquirindo ferramentas mais específicas, como furadeira, serra elétrica e outras. A Microsoft, diferente da Apple, utilizou a tática de fornecer o seu sistema para o máximo de fabricantes de hardware possível. Esta tática acabou trazendo vários problemas, como incompatibilidade com o hardware de alguns fabricantes e até problemas de segurança com vírus. Tanenbaum (2009) diz que as primeiras versões do Windows apresentavam uma tela colorida com recursos gráficos, mas ainda utilizam muitos arquivos de configuração do DOS. 1.5 Uma grande mudança no mercado A possibilidade da utilização dos computadores nas casas e escritórios impulsionou grandes mudanças na economia e no mercado de trabalho. Segundo Rifkin (2014), com a aplicação da tecnologia nas indústrias, inicialmente, os valores dos produtos não eram baixos, mesmo utilizando pouca matéria-prima, pois os gastos com estudos e pesquisas eram altos. Neste contexto, as atividades que mais se destacaram no mercado eram as vinculadas à produção de softwares, computadores e os circuitos microeletrônicos. Estes produtos estavam em alta, pois eram necessários para a produção de equipamentos na área da robótica, telefonia, televisão e internet. Figura 3 – Linha de montagem da indústria automobilística utilizando robôs autômatos Fica claro um ciclo de dependência entre eles, sendo que a inovação de um item afeta diretamente a evolução dos demais. Na década de 1990, com o surgimento dos computadores com ambiente gráfico e a popularização da internet, as empresas começaram uma corrida para acompanhar esse crescimento. A rotina dos escritórios, naquela época, era muito diferente do que vivemos nos dias de hoje. Como os computadores ainda não eram utilizados para estas atividades, tudo era feito em folhas de papel e armazenado em grandes fichários e arquivos. Como a internet ainda não era usada, todos os documentos eram enviados e recebidos por meio de cartas e malotes. Era necessário transformar todos aqueles documentos, fichas e planilhas em documentos digitais e registros organizados em banco de dados. No mercado de trabalho também tivemos grandes mudanças, como por exemplo uma corrida para formar e preparar os funcionários para essa nova tecnologia. Também cresceu muito o trabalho temporário, contratando digitadores para realizarem essa transação digital, uma vez que ainda não havia programas de digitalização confiáveis como temos nos dias de hoje. O mercado de softwares começou a criar programas para atender às empresas – eram programas que realizavam tarefas específicas, sem nenhuma integração. Era muito comum andarmos por uma loja de materiais de escritório e nos depararmos com prateleiras repletas de caixas parecidas com caixas de cereais, contendo os mais diversos títulos de aplicação, como por exemplo controle de estoque, cadastro de clientes, folha de pagamento, controle de vendas, etc. O grande problema desses programas era a falta de integração entre eles; por exemplo, como o programa de vendas não estava interligado com o controle de estoque, a atualização no estoque referente às vendas feitas no dia tinha de ser feita manualmente, no fim do expediente ou no início do dia seguinte. Outro aspecto negativo era o fato de nem sempre esses programas terem o formato necessário para aquele determinado serviço, uma vez que eram genéricos e produzidos em massa. Atualmente, os softwares são desenvolvidos exclusivamente, conforme a necessidade de cada empresa. São sistemas integrados que não atendem a todas as áreas da empresa, automatizando todas as informações, mas também se conectam com as filiais, empresas parceiras e fornecedores. 2 Utilização dos conceitos na prática Nos dias atuais, temos vivenciado um crescimento exponencial da tecnologia – os sistemas desenvolvidos hoje executam atividades complexas, impensáveis há poucos anos. Acabamos não percebendo, mas ela está a nossa volta, em todos os lugares – chamamos isso de computação ubíqua. Weiser (1999) firmou esse termo com a ideia que as tecnologias mais profundas são aquelas que desaparecem, referindo-se à conexão de dispositivos que nem se fazem notar, mas estão por toda a parte. Utensílios de uso diário, como smartphones, tablets, televisores, computadores de bordo de carros, eletrodomésticos, sistemas de segurança, etc., todos estão conectados à internet e incorporados a nossos hábitos, facilitando o nosso dia a dia. Essas são algumas das fontes do oceano de dados que é o Big Data – tecnologia que hoje traz avanços a todas as áreas, cruzando dados e formando soluções. Hoje, podemos ver na prática os grandes avanços e poderíamos citar centenas de inovações, mas vamos falar das mais impactantes. 2.1 A Internet das Coisas Segundo a SAP (2018), a Internet das Coisas é uma rede composta de objetos físicos, que podem ser veículos, máquinas, eletrodomésticos, etc. Esses objetos utilizam sensores e APIs para se conectar e trocarem dados pela internet. Utilizando várias tecnologias, como aplicativos, dispositivos eletrônicos e internet, ela integra, monitora e realiza uma série de eventos. Podemos encontrar essatecnologia em diversas áreas de nossas vidas, no computador de bordo de um carro, em equipamentos de segurança em nossa residência, em eletrodomésticos, e muitos outros. 2.2 Inteligência artificial e cognitiva A inteligência artificial é a área da tecnologia que se propõe a elaborar sistemas baseados em algoritmos complexos, que simulem a capacidade humana de analisar e resolver os problemas e tomar decisões. Já a inteligência cognitiva, segundo D’Egmont (2016), difere da inteligência artificial, porque o sistema cognitivo é capaz de aprender. O exemplo mais famoso desse sistema é o Watson da IBM, uma plataforma de serviços cognitivos, ou seja, você pode ensiná-lo a resolver problemas. Hoje, ele é utilizado para as mais diversas aplicações, desde atendimentos telefônicos e chats, até auxílio na leitura de exames médicos complexos. Além de aprender com as informações que recebe, ele também conta com uma aplicação que reconhece o que compõe a imagem. Esse recurso pode ser utilizado em diversas atividades, tendo um espaço especial na segurança. Considerações finais O desenvolvimento de sistemas está em ciclo de evoluções contí nuas. Em relação a outras ciências que os homens estudam, a tecnologia é a que mais cresce e contribui para o progresso das demais. Ela é muito nova, tem décadas, mas já se tornou vital para todos. Os ciclos têm sido cada vez mais curtos, pois a disseminação de conhecimento é maior a cada dia e vemos profissionais do mundo inteiro trazendo mais e mais inovações. A necessidade de adaptação a este novo mundo é cada vez maior. Referências ATELSEK, Jean. Tudo sobre computadores. São Paulo: Editora Quark, 1983. CAPRON, H. L.; JOHNSON, J. A. Introdução à informática. 8. ed. São Paulo: Editora Pearson Prentice Hall, 2004. D’EGMONT, Tahiana. O que é Watson? Plataforma cognitiva? Inteligência artificial? Um robô?, 16 dez. 2016. Disponível em: <https://www.ibm.com/blogs/digital-transformation/br-pt/o-que-e- watson-plataforma-cognitiva-inteligencia-artificial-robo/>. Acesso em: 27 ago. 2018. GATES, Bill. A estrada do futuro. São Paulo: Companhia das Letras, 1995. GONICK, Larry. Introdução ilustrada à computação. São Paulo: Harper & Row do Brasil, 1983. MANZANO, J. A. N. G.; Oliveira, J. F. Algoritmos: lógica para desenvolvimento de programação. São Paulo: Editora Érica, 1996. MATSUURA, S. Hoje minoria da indústria de tecnologia, mulheres foram fundamentais na gênese da computação, 14 fev. 2015. Disponível em: <https://oglobo.globo.com/sociedade/historia/hoje- minoria-na-industria-de-tecnologia-mulheres-foram-fundamentais-na- genese-da-computacao-15336779#ixzz5PJ1tCp6j>. Acesso em: 27 ago. 2018. PLATZMAN, G. W. The ENIAC computations of 1950 — gateway to numerical weather prediction. Bulletin of the American Meteorological Society, v. 60, n. 4, p. 302-312, 1979. https://www.ibm.com/blogs/digital-transformation/br-pt/o-que-e-watson-plataforma-cognitiva-inteligencia-artificial-robo/ https://oglobo.globo.com/sociedade/historia/hoje-minoria-na-industria-de-tecnologia-mulheres-foram-fundamentais-na-genese-da-computacao-15336779#ixzz5PJ1tCp6j QUINAFELEX, R. Confira a evolução dos computadores de mesa da Apple, desde a origem. 27 out. 2014. Disponível em: <https://www.techtudo.com.br/noticias/noticia/2014/10/confira- evolucao-dos-computadores-de-mesa-da-apple-desde-origem.html>. Acesso em: 27 ago. 2018. RIFKIN, J. A Terceira Revolução Industrial. São Paulo: Bertrand Editora, 2014. SAP. O que é Internet das Coisas (IoT)? [s. d.]. Disponível em: <https://www.sap.com/brazil/trends/internet-of-things.html>. Acesso em: 27 ago. 2018. TANENBAUM, A. S. Sistemas operacionais modernos. 3. ed. São Paulo: Editora Pearson Prentice Hall, 2009. WEISER, Mark. The computer for the 21st century. obile Computing and Communications Review, v. 3, n. 3, p. 3-11, 1999. https://www.techtudo.com.br/noticias/noticia/2014/10/confira-evolucao-dos-computadores-de-mesa-da-apple-desde-origem.html https://www.sap.com/brazil/trends/internet-of-things.html Capítulo 2 Introdução a algoritmos Quando perguntamos o que é algoritmos, muitas pessoas associariam a algo difícil ou os relaciona a conceitos complexos de cálculos ou algo assim. Mas será que a primeira impressão está correta? Algoritmos na verdade são conceitos simples que usamos em nosso dia-a-dia. Hoje em dia temos os algoritmos digitais em várias tarefas do nosso cotidiano. Quando você acessa um site, faz uma busca, lê os seus e-mails, se relaciona com seus amigos através de redes sociais e até mesmo faz aquelas compras on-line, isso tudo só é possível por causa dos algoritmos. Mesmo quando estamos jogando um jogo, pode ser aquele joguinho mais simples que você tem no seu smartphone até aquele mais pesado que só funciona no seu console favorito, os algoritmos estão trabalhando para te dar diversão. Seria quase impossível imaginarmos a possibilidade de realizar tantas tarefas como as que hoje nos sãos impostas sem as facilidades proporcionadas pelos algoritmos digitais. Utilizamos algoritmos todo tempo, no computador de bordo dos carros, nos programas de celular, até mesmo em outros aparelhos mais simples como um micro-ondas ou um refrigerador, tudo isso é possível através dos algoritmos. 1 Introdução a algoritmos Os algoritmos são tão antigos quanto a matemática, os especialistas divergem muito sobre a sua origem. Temos associado esta palavra à computação, mas este é um termo que pode ser usado para várias ciências, inclusive ela nem nasceu da computação. A teoria mais defendida sobre sua origem é a de que um grande matemático que viveu na Pérsia no século IX chamado Abu Abdullah Mohammad Ibn Musa Al-Khawarizmi, nascido em Khawarizm (Kheva), ao sul do mar Aral. Sua influência no crescimento de diversas áreas da ciência, particularmente na matemática e outras como astronomia e geografia é bastante notória. Ele tinha dentre estas obras, a de nome Algorithmi de numero indorum (em indiano), que falava sobre algoritmos que trabalhavam com o sistema de numeração decimal. Suas obras só foram descobertas e apresentadas ao ocidente no século XI. O nome foi sofrendo mudanças por causa da pronuncia de seu nome Al-Karismi, chegando ao falado hoje “algarismo” e deste mesmo radical o termo “algoritmo”, termo usado hoje na computação, mas também é muito utilizado em outras áreas como administração, engenharia, entre outras. Segundo Forbellone e Eberspacher (2005), a principal ideia associada a palavra algoritmos se refere a maneira sistemática de descrever um conjunto de regras formais para a obtenção de uma resposta da solução de um problema incluindo fórmulas de expressão aritmética. Xavier (2014) descreve que algoritmos, de uma maneira bem simples, é uma sequência de passos ou ações para atingir um objetivo. Sua associação à computação se deu a partir da metade do século passado, época da evolução dos computadores, pois é por meio deles que é possível criarmos as instruções contidas nas rotinas que eles trabalham. O crescimento da sua utilização hoje tem crescido exponencialmente, pois eles são a base do desenvolvimento dos programas, dos mais simples aos mais complexos. Com a ampliação do poder de processamento dos computares que possibilita a execução de tarefas muito mais complexas e as novas tecnologias de armazenamento de informações, são os fatores que impulsionaram este crescimento. O avanço da tecnologia dos hardwares (parte física ou componentes que formam os computadores), fez possível a utilização de lógicas cada vez mais complexas e elaboradas para a resolução dos problemas das mais diversas áreas. Um dos grandes exemplos que podemos citar é o Big Data. Ele é um conceito que descreve um grande volume de dados que é gerado a cada segundo. Figura 1 – O Big Data sendo usado para tomada de decisões Hoje as tecnologias que nos auxiliam em diversas atividades do nosso cotidiano geram muitos dados, que antes eram dispensados, mas que hoje são armazenados, tratados e geram informações de grande valor, importantes para a descobertassobre as inúmeras possibilidades de crescimento econômico e social. Estas informações, processadas pelos algoritmos que compõem os sistemas, conseguem dar respostas precisas que até pouco tempo atrás não seriam possíveis. Também não poderíamos deixar de falar sobre a utilização de algoritmos na construção da inteligência artificial, uma área da computação criada na década de 50 que desenvolve algoritmos capazes de simularem o raciocínio humano. Esta área cresceu tão rápido que, em 1997, o supercomputador Deep Blue, da IBM, venceu pela primeira vez o campeão mundial de xadrez da época, o russo Gary Kasparov. Segundo o especialista em Inteligência Artificial, M. Tim Jones, o programa do Deep Blue era feito por algoritmos que possibilitavam que ele imaginasse uma média de 200.000.000 de posições por segundo, por isso o atual campeão acabou perdendo a partida. (JONES, 2018). Ele ressalta a vitória do supercomputador Watson, também da IBM, que enfrentou dois dos jogadores humanos de maior sucesso de todos os tempos e os derrotou na frente de milhões de telespectadores em 2011. 2 Conceitos de algoritmos Usamos a lógica para guiar nossos pensamentos ou ações para chegarmos a uma solução. Devemos ter sempre em mente que a lógica está correta se ela atingir o objetivo para que ela foi proposta. Para conseguirmos inserir lógica em nossas atividades, precisamos aprender a pensar de forma estruturada, ou seja, desenvolver e aperfeiçoar a técnica de pensamento e seguir uma sequência de raciocínio que crie passos objetivos e seguros até a solução. IMPORTANTE Segundo Manzano e Oliveira (2012), para usar o raciocínio lógico, é necessário ter domínio do pensar, bem como saber pensar, ou seja, possuir e usar a “arte de pensar”. Quando organizamos nossos pensamentos de forma lógica conseguimos associar as informações e transformá-las em base para nossas soluções. Analise a lógica a seguir: Se: todo mamífero é um animal E: todos os gatos são mamíferos Logo: todos os gatos são animais! Ou Se: todos os veículos são transportes E: todas as motos são veículos Logo: todas as motos são transportes! No exemplo apresentado usamos a lógica para averiguar uma situação e chegar a uma conclusão, fazendo associações entre eles. A primeira parte analisa que se todos os seres mamíferos são animais e que se todos os gatos são mamíferos, então os gatos também fazem partes do grupo de animais. A segunda faz uma análise parecida, que se todos os veículos são chamados de transportes e se todas as motos são consideradas veículos, então as motos também fazem parte do grupo de transportes. Utilizamos a lógica a todo o momento em nossas vidas, quando pensamos, falamos ou escrevemos, utilizamos a lógica para ordenar as palavras e dar sentido ao que estamos fazendo. Ao longo do dia, usamos o nosso raciocínio lógico para resolvermos questões, das mais simples as mais complexas. A lógica nos ensina a corrigirmos nosso pensamento, nos ensinando a usá-lo corretamente. Usando o raciocínio de forma ordenada dividindo a ação em vários passos até a solução do problema. Analise a lógica a seguir: Se: A porta está fechada E: a mochila está dentro da casa Logo: Preciso primeiro abrir a porta, entrar em casa para depois pegar a mochila! Ou Se: Se Jussara é mais nova que José E: José é mais novo que Fábio Logo: Jussara é mais nova que Fábio! Resolver problemas utilizando o computador não é muito diferente do que falamos agora, devemos encontrar uma maneira de escrever o problema de forma que seguindo uma sequência de passos, atingimos a solução desejada. Isto é algoritmo! De acordo com Manzano e Oliveira (2012, p.27), “Algoritmos na Ciência da Computação (Informática), está associada a um conjunto de regras e operações bem definidas e ordenadas, destinadas à solução de um problema, ou de uma classe de problemas, em um número finito de passos. ” Para termos a necessidade de criar uma solução, precisamos antes ter um problema. A necessidade de enviar mensagens e documentos mais rápido fez com que criarem o e-mail, a necessidade de podermos nos relacionar virtualmente fez com que criassem o Facebook. 3 Descrição narrativa de um algoritmo Podemos utilizar diversas formas para escrever um algoritmo. Isso sempre vai depender muito da sua necessidade e de quem vai ler o que você produziu. Escrevemos um algoritmo utilizando a descrição narrativa quando queremos descrever um problema de forma que o receptor entenda do assunto mesmo não tendo conhecimento de algoritmos. O grande problema da forma narrada é que ela, por ser escrita em uma linguagem comum como o português por exemplo, acaba criando pontos de imprecisão, ou seja, de dupla interpretação. Isso faz com que a forma de narrativa traga uma falta de confiabilidade no entendimento do algoritmo. Outro ponto negativo é o fato dela gerar uma descrição muito grande para dizer poucas coisas, se comparando a outras formas. Quando escrevemos um algoritmo de forma narrativa, mesmo ele sendo um texto em linguagem simples, devemos escrevê-lo de forma ordena, lógica e em passos bem definidos. Se por exemplo, eu fosse passar instruções para uma criança comprar pães em uma padaria desta forma: 1. Sair da padaria. 2. Pegar a comanda. 3. Pegar a fila do caixa. 4. Pedir 10 pãezinhos. 5. Entregar o dinheiro e a comanda. 6. Pegar a fila dos pães. 7. Conferir o troco. 8. Entrar na padaria. Tenho certeza que você percebeu que a criança ficaria totalmente perdida na padaria, pois nada daria certo. Para que uma criança que ainda não conhece os procedimentos necessários para uma simples compra de pães ter êxito, precisamos ordenar os passos na ordem correta. Vamos ver agora como deveríamos escrever o bilhete para a criança: 1. Entrar na padaria. 2. Pegar a comanda. 3. Pegar a fila dos pães. 4. Pedir 10 pãezinhos. 5. Pegar a fila do caixa. 6. Entregar o dinheiro e a comanda. 7. Conferir o troco. 8. Sair da padaria. Para utilizarmos a lógica devemos definir o que deve ser feito para solucionar o problema e colocar na ordem correta para conseguir chegar na solução. Vamos a outro exemplo bem conhecido nosso, que poucas pessoas pensariam que seria um algoritmo. Uma Receita de bolo! 1. Misture os ingredientes. 2. Unte a forma com manteiga. 3. Despeje a mistura na forma. 4. Se houver coco ralado despeje sobre a mistura. 5. Leve a forma ao forno. 6. Enquanto não dourar deixe a forma no forno. 7. Retire do forno. 8. Deixe esfriar. Repare que neste exemplo, mesmo ele estando na sequência certa, alguns passos ficaram um pouco imprecisos, como enquanto não dourar, pois a pessoa que vai fazer o bolo pode não saber o ponto exato que a massa do bolo deve ficar. Por isso quando usarmos a linguagem narrativa devemos ter o nível de detalhes compatível com a precisão que o resultado deve ter, ou seja, o bolo não deve ficar queimado e nem com a massa crua. 4 Representação de algoritmos por fluxograma Podemos representar os algoritmos de forma gráfica, para isso utilizamos os fluxogramas. Os fluxogramas são formados de caixas com formato variado que conectadas de forma ordenada e lógica informam as instruções a serem executadas. São muito populares por serem de fácil entendimento das ideias contidas no algoritmo. A representação do fluxograma é ótima para descrever algoritmos de pequeno e médio tamanho (XAVIER, 2014). Considerado um nível intermediário de descrição, o fluxograma fica entre a narrativa, que vimos a pouco, e a de pseudocódigo, que veremos um pouco mais a frente. Ele expressa melhor a parte física, ou seja, de detalhes como entrada e saída de informações, o fluxo das informações e até mesmo a forma de armazenamento. Seguindo os princípios de entrada, processamento e saída, ele é composto de um símbolo para iniciar, uma sequência de comandos e tomadas de decisão e finaliza, independentemente de quantas bifurcações geradas por tomadas de decisão, aos símbolos finais, que são iguais ao início só que desta vem escrito fim. Figura 2 – Exemplo de um fluxograma,onde se verifica se a impressora está pronta para impressão A seguir temos os símbolos mais utilizados nos fluxogramas: Figura 3 – Simbologia de fluxograma Terminal Símbolo utilizado no início e fim de um fluxograma. Também pode ser usado na definição de sub-rotinas. Entrada manual Simboliza a entrada manual de dados, geralmente feita através de teclado. Processamento Representa a execução de uma operação lógica ou matemática. Exibição Representa a saída visual de dados, geralmente através do monitor. Decisão Representa a execução de uma operação lógica ou matemática. Preparação Representa a modificação de uma instrução em relação à ação de sua atividade subsequente. Processo predefinido Definição de um grupo de operações estabelecidas como uma sub-rotina de processamento anexa ao diagrama. Documento Representa a saída no formato de um documento. Conector Representa a entrada ou saída em outra parte do fluxo. Pode ser usado para quebras de linhas e continuações em outras páginas. Linha Representa a conexão entre os outros elementos do diagrama de blocos. Quando possui a ponta de um seta significa que está mostrando a direção do fluxo. Vamos fazer agora a um exemplo prático, montando um fluxograma de uma funcionalidade do sistema de uma escola. Devemos criar um fluxograma simples, que calcule a média de duas notas de um aluno e logo após confirmando se ele está aprovando. Levando em conta que a nota de aprovação é 7. Figura 4 – Exercício proposto para calcular a média de um aluno e verificar a aprovação Podemos pode perceber que os fluxogramas ajudam a organizar nossos pensamentos e facilita para imaginarmos o código antes mesmo de implementá-lo. Temos várias vantagens como ele, como: Mostrar o código de forma organizada. Simular a execução de um código dentro de um programa. Mostrar a estrutura do programa em formato gráfico. Usá-lo para mostrar a navegação de um programa ou site. Podemos encontrá-los com outros nomes como fluxogramas de processo, mapas de processos, fluxogramas funcionais, entre outros. Considerações finais Para escrevermos instruções para os computadores, precisamos utilizar a lógica de programação, que nada mais é que um conjunto de ações organizadas para resolver o problema proposto à aplicação. Chamamos estes conjuntos de passos de algoritmos e podemos encontra-los em quase tudo que utilizamos para realizar nossas tarefas do dia-a-dia. Podemos escrever estes algoritmos de forma narrativa, que nada mais é que uma lista organizada de ações, que se seguidas de forma correta, leva a solução do problema. Também podemos representa- los de forma gráfica através de fluxogramas, um conjunto de símbolos conectados que mostram o fluxo de execução de um algoritmo. Referências FORBELLONE, André L. V.; EBERSPACHER, Henri F. Lógica de Programação: A Construção de algoritmos e estrutura de Dados. 3. ed. Editora Pearson Prentice Hall, Brasil, 2005. JONE, M. T. As linguagens da IA. 19 jan. 2018. Disponível em: <https://www.ibm.com/developerworks/br/library/cc-languages- artificial-intelligence/index.html>. Acesso: 9 ago.2018. MANZANO, José Augusto N. G.; OLIVEIRA, Jayr F. Algoritmos: Lógica para Desenvolvimento de Programação. São Paulo: Editora Érica, 2012. XAVIER, Gley F. C. Lógica de Programação. São Paulo: Editora Senac São Paulo, 2014. https://www.ibm.com/developerworks/br/library/cc-languages-artificial-intelligence/index.html Capítulo 3 Algoritmos variáveis O computador é uma máquina capaz de realizar comandos e cálculos matemáticos, mas, diferente do que muitas pessoas pensam, ele precisa receber instruções para conseguir realizar todas essas tarefas. Para isso, criamos programas utilizando algoritmos para passar essas instruções a ele. Quando vamos criar um algoritmo, devemos utilizar uma linguagem que seja imperativa, impondo os passos que ele deverá executar, de forma que as instruções fiquem explícitas, diretas, sem deixar dúvidas. As formas de descrição que utilizamos até agora não são tão precisas, elas podem deixar dúvidas na hora de um desenvolvedor implementar a solução. Assim, como na vida real, se não passarmos todos os detalhes quando entregamos uma tarefa a alguém, temos uma grande possibilidade de não recebermos o resultado esperado. Só teremos a garantia de sucesso se escrevemos algoritmos, utilizando valores que precisamos para resolver esses problemas, manipulando-os de forma organizada e com recursos que nos possibilitam utilizar a lógica computacional para gerar a solução para todos esses casos. 1 Programação imperativa Quando vamos criar um programa de computador, devemos analisar qual paradigma, ou seja, qual o conjunto de características que, juntas, definirão como ele deve operar para resolver o problema. A programação imperativa é baseada nos estados de valores que ele recebe – “variáveis” – e em instruções e comandos que dão a ideia de ordens, dizer exatamente o que deve ser feito. Por isso, ela é dinâmica, sendo constantemente mudada durante a sua execução. PARA SABER MAIS Imperativo na língua portuguesa significa que acentua o caráter de mando, de autoridade, ou exprime uma ordem. O programador passa as instruções de como e o que o computador deve fazer quando ler o programa. A utilização de repetições, condições e atribuição de valores que hoje são usados constantemente em todas as linguagens surgiram neste paradigma. Um programa criado em uma linguagem imperativa deixa de ser uma expressão, e passa a ser um comando. Estas são algumas linguagens de programação que se baseiam no modelo imperativo: Basic; C; PHP; Java; Cobol; Pascal; Python e outros. Na figura 1, a seguir, temos o modelo computacional do paradigma imperativo. Figura 1 – Modelo computacional do paradigma imperativo Fonte: adaptado de Sommerville (2011, p. 208). Vamos apresentar como seria uma programação imperativa, aplicada a uma tarefa do nosso cotidiano, como por exemplo fazer um bolo: Separar os ingredientes: leite, ovo, açúcar, margarina, farinha e fermento. Aqueça o forno a 180 graus. Bata as claras em neve e reserve. Misturar em uma vasilha grande o açúcar, a margarina e as gemas. Adicionar a farinha e o leite. Mexa até que esteja bem misturado. Juntar a clara em neve misturando vagarosamente. Colocar a mistura em uma forma untada. Coloque no forno aquecido por 40 minutos. Se colocar o garfo no bolo e ele sair limpo, desligue o forno, senão, o mantenha por mais cinco minutos. Desligar o forno. Repare no exemplo anterior que seu funcionamento utilizou exatamente os conceitos que falamos até agora. Veja: Informamos valores, que são os ingredientes. Damos comandos para o programa executar ações com estes valores, alterando assim o seu estado. Recebemos a solução esperada do programa, um bolo preparado corretamente. Conforme falamos anteriormente, se analisarmos o algoritmo que criamos acima e imaginarmos um robô executando os passos, vamos perceber que devemos melhorar ainda mais este código, uma vez que o robô não teria conhecimentos de coisas que para nós são óbvias, como por exemplo: Verificar se o gás estava aberto antes de ligar o forno. Quebrar os ovos delicadamente e separar a clara da gema antes de fazer as claras em neve. Para untar a forma, deveriam ser utilizadas margarina e farinha. Chamamos isso de refinamento de código, e devemos fazê-lo até que tenhamos certeza que nosso código está performático. Um outro exemplo utilizado por Xavier (2014, p. 26) demonstra a riqueza de detalhes de um código bem refinado. Nele, temos as instruções para começarmos a dirigir um carro: Abrir a porta. Sentar no banco. Fechar a porta. Ajustar o banco e os espelhos retrovisores. Colocar o cinto de segurança. Pisar na embreagem. Pegar o câmbio. Colocar o câmbio em ponto morto. Soltar a embreagem. Ligar o carro. Pisar na embreagem. Pegar o câmbio. Colocar o câmbio na primeira marcha. Acelerar o carro. Soltar o freio de mão. Soltar a embreagem devagar. Neste exemplo, temos passos precisospara executar a ação – repare que temos ações que servem de prevenção, preparação para que o próximo passo tenha sucesso, como garantir que o câmbio esteja em ponto morto, antes de ligar o carro; assim, mesmo que o carro já estivesse em ponto morto, garantimos o bom funcionamento da solução. 2 Utilização de pseudocódigo O pseudocódigo, que poderíamos traduzir ao pé da letra como “falso código”, é a linguagem que mais se assemelha às linguagens que usamos para desenvolver os programas nos computadores. Ela é a descrição de um algoritmo sem a necessidade de utilizar as particularidades de uma linguagem de programação. Segundo Medina e Fertig (2006), o pseudocódigo é uma linguagem intermediária entre a narrativa e as linguagens de programação de alto nível. IMPORTANTE Linguagem de programação de alto nível é aquela que se aproxima mais da linguagem humana e se distancia da linguagem de máquina. Ela não controla a parte física do computador, somente trata da camada de ligação com o usuário, como aplicativos, e não controla o hardware, como o processador, por exemplo. É comum vermos outros nomes sendo atribuídos ao pseudocódigo, como portugol ou português estruturado – geralmente, utilizados para enfatizar que o pseudocódigo está sendo escrito em português. Quando trabalhamos nossos algoritmos utilizando o pseudocódigo, buscamos ao máximo criar uma rigidez semântica e sintática para que o código seja lido e interpretado corretamente pela máquina. Vamos começar com um exemplo simples, sem todos os passos de criação de um pseudocódigo, mas importante para aprendermos a estrutura: Início Escreva: “Qual a nota do aluno?” Leia: nota Se a nota for maior ou igual a 7, então: Escreva: “aluno aprovado” Senão: Escreva: “aluno reprovado” Fim Neste programa que acabamos de criar, ele envia uma pergunta na tela ao usuário, espera ele digitar, verifica e, se o aluno tirou uma nota igual ou maior que 7, ele responde “aluno aprovado”; senão, ou seja, se a nota for menor que 7, ele responderá “aluno reprovado”. Se estivéssemos escrevendo a mesma instrução de forma narrativa, não teríamos essa riqueza de detalhes em cada ação, que na hora da programação faria toda a diferença. IMPORTANTE “Ação: Fato que, a partir de um estado inicial, após um período de tempo finito, produz um estado final previsível e definido” (XAVIER, 2014, p. 32). Você percebeu que temos alguns detalhes que ainda não sabemos por que estão lá, como as aspas nas frases e termos mais curtos e objetivos, como leia ou escreva? Falaremos mais no momento oportuno. Quando for construir um pseudocódigo, nunca comece a escrever desordenadamente o que você tem em mente, procure seguir estes passos: 1. “Compreensão e Estratégia” – Ao se deparar com um problema novo, faça o seguinte: a. Separe os dados e o que você precisa fazer com eles; b. Faça um rascunho para visualizar cada passo. 2. “Crie um plano para a solução” – Agora que tem as informações sobre o problema organizadas: a. Verifique se já resolveu um problema parecido; se sim, o que posso aproveitar neste; b. Se o problema for muito complexo, separe-o em partes, assim fica mais fácil resolver; c. Não se prenda a um só formato, se tiver difícil de prosseguir, busque alternativas para resolver o problema. 3. “Formalize a solução” – Hora de começar a montar o algoritmo: a. Use o pseudocódigo para montar a solução baseada no plano que você desenvolveu; b. Cuide para que cada passo seja escrito de forma correta, não tenha pressa de escrever; muitas vezes, um programa inteiro não funciona por um simples detalhe. 4. “Realize teste” – Agora com o algoritmo montado, vamos executá-lo: a. Ao testar, veja se não apresenta nenhuma falha no passo a passo; b. Verifique se ele solucionou o problema da forma esperada, utilize valores diferentes para comprovar que realmente está funcionando. 5. “Refine o código” – Será que ele pode ser melhorado? a. Veja se não há nenhuma mudança que traga melhorias ao resultado do programa; b. Verifique se existe algum código redundante, ou seja, repetido ou que não seja necessário. Vamos conhecer agora algumas partes que compõem a estrutura do nosso pseudocódigo: “Atribuição” – Quando o programa recebe informações, precisamos atribuí-las a um espaço reservado da memória chamado variável. Para indicar que o valor está sendo atribuído, usamos o símbolo . Exemplo: valor 35 ou nome “João”. “Bloco de Instrução” – Assim, no pseudocódigo, como em outras linguagens de programação, as instruções são executadas na sequência em que foram escritas. Por isso, usamos um bloco de instruções para indicar onde ele se inicia, se desenvolve e termina. Um bloco de instruções é delimitado pelas palavras “início” e “fim”. Exemplo: Início “primeira instrução” “segunda instrução” ........ “última instrução” Fim “Leia” e “Escreva” – Estas duas instruções são utilizadas para a entrada e saída de informações para o usuário, são a interface entre a máquina e quem está utilizando o programa. Todas as vezes que quisermos mostrar uma mensagem ou resultado na tela do computador, utilizamos a palavra escreva, seguida do valor ou mensagem; e quando quisermos receber um valor digitado pelo usuário, utilizamos a palavra leia, seguida do endereço onde armazenaremos esta informação. Exemplo: Início escreva: (“Qual o seu nome?”) leia: (nome_convidado) escreva: (“Seja bem-vindo ”,nome_convidado ) Fim Este código escreve na tela uma pergunta para o usuário, o seu nome recebe a resposta e armazena no espaço de memória “nome_convidado” e depois escreve na tela uma mensagem de boas- vindas personalizada com o nome que ele digitou. 3 Declaração de variáveis e constantes A maior funcionalidade de um computador é manipular informações. Para resolver um problema, ele precisa de dados para processá-los. É necessário que haja formas de se trabalhar com diferentes tipos de dados em um programa. Apesar de internamente um computador manipular unicamente números, as linguagens de programação permitem que utilizemos outros tipos de informações nos programas de forma transparente. (MEDINA; FERTIG, 2006, p. 24) Antes de continuarmos, precisamos entender alguns conceitos: “Dados” – Utilizados para se referir ao que realmente está armazenado, são dados isolados que não fazem sentidos sozinhos. Exemplo: Nome (primeiro nome e sobrenome), Endereço (logradouro, número e complemento). “Informações” – Utilizadas para se referir ao significado dos dados para um determinado usuário. No exemplo abaixo, sabemos agora que o endereço é referente àquela pessoa. Exemplo: Nome e Endereço. Observe que a função dos nossos programas, basicamente, será transformar informações iniciais, que usualmente chamamos de dados, em informações finais, as respostas que serão usadas por quem utiliza o programa. Temos dois tipos de Dados: “Dados de Entrada” – Conjunto de informações que o programa precisa receber para iniciar o processo. “Dados de Saída” – Conjunto de informações que o programa devolve como resposta após o processamento. Agora, vamos fazer uma atividade para fixarmos esses conceitos. Para cada algoritmo abaixo, pense qual seriam os dados de entrada e saída: Algoritmo para calcular a idade de uma pessoa. Algoritmo para calcular o IMC (índice de massa corporal) de uma pessoa. Valor pago referente à dívida de meses de aluguel atrasado. Para essas perguntas, as respostas seriam: “Entrada”: data de nascimento e data atual. “Saída”: a idade naquele instante. “Entrada”: peso e altura da pessoa; “Saída”: a condição física da pessoa relativa ao peso. “Entrada”: valor do aluguel, quantidade de meses, taxa de juros; “Saída”: valor a ser pago até aquela data. 3.1 Tipos de dados Os tipos de dados são formas de representar valores do nosso mundo real computacionalmente. As linguagens de programação representam e manipulam esses dados, que podem ser classificados como primitivos e não primitivos. De acordo com Pinheiro (2012), um tipo de dado caracteriza um conjunto de valores, determinandoa natureza, o tamanho, a representação e a faixa de representação. No momento, nosso enfoque será em sua natureza. 3.1.1 Tipos primitivos Os tipos de dados primitivos são tipos básicos de dados que compõem um programa – eles representam números inteiros, frações, frases, etc. No programa de computador, devemos dizer exatamente os tipos de dados que serão usados na entrada e saída das informações. Exemplo: A linguagem Java é uma linguagem fortemente tipada, ou seja, se você não utilizar o tipo correto, a operação é interrompida e uma mensagem de erro será apresentada. Os tipos de dados primitivos são: “Inteiro” – toda e qualquer informação numérica que pertence ao conjunto de números inteiros relativos (negativo, nula ou positivo). “Real” – também chamada de flutuante, toda e qualquer informação numérica que pertence ao conjunto dos números reais (negativo, nula ou positivo). “Literais” – também chamada de caractere, toda e qualquer informação composta de um conjunto de caracteres alfanuméricos (0 a 9), alfabéticos (A...Z, a...z) e especiais ( . , $ @ # ! ? ...). “Lógico” – também conhecido como booleano, toda e qualquer informação que pode assumir apenas duas situações (verdadeiro ou falso, sim ou não). IMPORTANTE Os números armazenados em variáveis, cujo tipo de dados é Literal, não poderão ser utilizados para cálculos. 3.2 Variáveis Variável é um tipo de dado armazenado no computador. Chamamos ele assim porque o seu valor contido pode variar diversas vezes ao longo do processamento. Ao declararmos uma variável, estamos na verdade reservando um espaço na memória para aquela determinada informação, enquanto ela é processada. Todo dado a ser armazenado na memória de um computador deve ser previamente identificado segundo o seu tipo; ou seja, primeiramente, é necessário saber o tipo de dado, para depois fazer o seu armazenamento adequado. (MANZANO; OLIVEIRA, 1996 p. 43) Figura 2 – Imagem de uma caixa de correios representando as locações de memória das variáveis Imagine as variáveis criadas como se fossem esta caixa de correio de um prédio – o carteiro só sabe onde deve colocar a correspondência, porque todas estão com os números dos apartamentos a que são correspondentes. Para escrevermos corretamente o seu nome, devemos seguir algumas regras: Temos restrição ao primeiro caractere do nome, ele deve ser sempre uma letra do alfabeto, não pode ser um número ou símbolos gráficos, como cifrão, tralha, etc. Não pode haver espaço dentro do nome; se for um nome composto, como “pessoa jurídica”, devemos utilizar o underline para separação. Ex.: pessoa_juridica. Duas variáveis não podem ter o mesmo nome, logo de início o sistema acusará um erro, mas, mesmo se fosse possível começar, elas entrariam em conflito, sobrescrevendo as informações. Existem algumas palavras reservadas da linguagem que também não podem ser utilizadas. Conheceremos estas palavras mais adiante. Devemos declará-las em nosso programa da seguinte forma: var idade: inteiro 3.3 Constantes Chamamos de constantes todos os valores que não devem ser modificados durante o processamento. Usamos as constantes para valores que devem manter o seu valor independentemente dos processos que as utilizarem. Podemos usar como exemplo a letra grega “π” (PI), que precisamos utilizar para cálculos referentes a círculos. Apesar de qual cálculo estejamos fazendo, o seu valor será sempre o mesmo: 3,14159265. Devemos declará-las em nosso programa da seguinte forma: const PI = 3.14159265 Também podemos chamá-las de variáveis somente de leitura. 4 Expressões aritméticas, literais, relacionais e de lógica booleana Agora que já conhecemos as formas de declararmos os valores para serem processados em nossos programas, precisamos aprender as expressões para manipular estes valores. Para cada tipo de dado, temos expressões exclusivas: 4.1 Expressões aritméticas Expressões aritméticas são aquelas que o resultado é do tipo numérico, podendo ser inteiro ou real. Os operadores que são permitidos nestas operações são: Tabela 1 – Símbolos de expressões aritméticas OPERADOR SIGNIFICADO EXEMPLO + Adição 1 + 1 – Subtração 8 – 4 * Multiplicação 5 * 7 / Divisão 520 / 45 % Módulo (resto da divisão) 65 % 6 ** Exponenciação 5 ** 2 4.2 Expressões literais Expressões literais são aquelas que o resultado é do tipo literal, e mudam muito de uma linguagem para outra. O operador mais simples é aquele que faz a concatenação entre dois trechos de texto, que podemos chamar de string (corda, em português, se referindo a uma corda de caracteres). O operador de concatenação no pseudocódigo é o sinal “+”: Tabela 2 – Símbolo de expressões literais OPERADOR SIGNIFICADO EXEMPLO + Concatenação “Avenida” + “Paulista” 4.3 Expressões relacionais Permitem efetuar comparações entre duas variáveis. O resultado da comparação é sempre um valor lógico (booleano), ou seja, verdadeiro ou falso. Os operadores que podemos utilizar nestas expressões são: Tabela 3 – Símbolos de expressões relacionais OPERADOR SIGNIFICADO EXEMPLO > Maior a > 7 >= Maior ou igual b >= a < Menor c < 5 <= Menor ou igual c <= b = Igual a a = 9 <> Diferente de b <> 0 4.4 Expressões de lógica booleana Utilizamos as expressões lógicas para analisar condições, e criamos condições que nos retornam 1 ou 0, ou então, verdadeiro ou falso. Os operadores utilizados para fazermos esta lógica são: Tabela 4 – Símbolos de lógica booleana OPERADOR SIGNIFICADO EXEMPLO e Conjunção a = 3 e b <> 9 Se o valor de “a” for igual a 3 e o valor de “b” for diferente de 9, então retornará verdadeiro; caso contrário, retornará falso. Ou Disjunção a = 3 ou b <> 9 Se o valor de “a” for igual a 3 ou o valor de “b” for diferente de 9, então retornará verdadeiro; caso contrário, retornará falso. não Negação não a > 3 Se o valor de “a” não for maior que 3, então retornará verdadeiro; caso contrário, retornará falso. Considerações finais Os algoritmos foram criados para implementarmos a lógica computacional para a resolução de problemas reais. Para que o programa que desenvolvemos realmente solucione esses problemas, temos de ter sempre em mente que os comandos devem ser expressados de forma imperativa, deixando sempre bem claro o que deve ser executado; guardar os valores que fazem parte do problema a ser solucionado, para ser possível manipulá-los na aplicação; e, for fim, utilizar de forma correta os símbolos que não permitem trabalhar com esses valores de forma lógica e organizada. Estes não são apenas princípios iniciais, mas a base para uma boa programação, que você deverá levar consigo para ter sucesso em todas as aplicações que for desenvolver. Referências MANZANO, J. A. N. G.; Oliveira, J. F. Algoritmos: lógica para desenvolvimento de programação. São Paulo: Editora Érica, 1996. MEDINA, M.; FERTIG, C. Algoritmos e programação: teoria e prática. São Paulo: Editora Novatec, 2005. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. SOMMERVILLE, I. Engenharia de software. 9. ed. São Paulo: Pearson Prentice Hall, 2011. XAVIER, G. F. C. Lógica de programação. São Paulo: Editora Senac São Paulo, 2014. Capítulo 4 Algoritmos: condicional Neste capítulo, abordaremos a arte da tomada de decisão. Digo que é uma arte, pelo fato de não ser nada fácil tomar decisões, apesar de ser essencial. Você, caro leitor, acabou de tomar uma decisão: ler esta obra! E a cada linha, a cada página, a cada capítulo, estamos decidindo o que fazer: se continuamos lendo, se mudamos de emprego, se começamos logo nosso projeto de Verão, se casamos ou compramos uma bicicleta. Por dia, tomamos dezenas e até centenas de decisões para atingirmos nossos objetivos (como acordar, ir trabalhar, ir à academia, ir à faculdade, etc.). Com o computador acontece a mesma coisa. Para que seu computador possa desempenhar uma tarefa, ou um algoritmo, como visto anteriormente, ele deve decidir como fazer, como desenvolver os passos necessários. E adivinhe! Quem diz ao computador qual decisãoele deve tomar? Sim, você. E é exatamente isso que vamos abordar neste capítulo. Entender as condições e avisar ao nosso computador como tomar as decisões, de acordo com cada situação. 1 A arte de tomar decisões Há muito tempo, o Homem escreve e se preocupa com tomadas de decisões que norteiam nossas vidas. A obra A arte da guerra, de Sun Tzu, escrita em 476 a.C., é o exemplo clássico de obra sobre tomada de decisão como estratégia de liderança, negócios e competitividade. Em uma de suas célebres frases, Tzu diz que “devemos conhecer nossos inimigos e a nós mesmos”. Vamos partir desse princípio para conduzir nossas ações e tomar as decisões corretas no nosso sistema, para que execute as tarefas que satisfazem as necessidades dos usuários. Durante o desenvolvimento de um código, existem diversas situa ções em que a resolução vai depender de um valor, para que possa seguir um rumo e, consequentemente, que uma tomada de decisão também seja seguida. Isso ocorre muito em nosso dia a dia, quando planejamos uma tarefa, mas as “variáveis” do nosso cotidiano fazem com que tenhamos que optar por mudanças de planos. Um exemplo típico é quando estimamos um determinado tempo para chegarmos em um local e um simples pneu furado do seu veículo pode atrapalhar todo o planejamento do tempo outrora estimado. Vamos utilizar um exemplo de uma situação bastante comum no dia a dia, de um aluno que quer calcular sua média em uma determinada disciplina e, logo em seguida, vamos determinar se esse aluno está APROVADO ou REPROVADO nesta disciplina. Para nossa situação hipotética, vamos supor que o aluno teve duas provas e a média é dada pela soma das duas notas dividido por 2: Media = (nota1 + nota2) / 2 As regras serão as seguintes: o aluno estará APROVADO, caso sua média seja maior ou igual a 6.0; e estará REPROVADO, caso sua média esteja abaixo de 6.0. Para facilitar o entendimento dessas regras, vamos desenhar seu fluxograma: Figura 1 – Fluxograma para cálculo da média de um aluno e tomada de decisão Baseado no fluxograma anterior, vamos escrever nosso código e montar um de nossos primeiros algoritmos. Para começar, vamos desenvolver em pseudocódigo (ou português estruturado) na IDE[1] VisuAlg. O VisuAlg é um ambiente de desenvolvimento de algoritmos em portugol, gratuito e portátil. Portanto, o primeiro passo é baixar esse ambiente em sua máquina ou no seu pendrive (assim, poderá levá-lo para onde quiser). Figura 2 – IDE do VisuAlg 1.1 Estruturando o algoritmo Antes de falarmos das tomadas de decisões, vamos preparar nosso ambiente de acordo com o modelo do fluxograma anterior. Então, no VisuAlg vamos começar nosso código. Para resolver essa tarefa, teremos que criar três variáveis: duas para armazenar as notas e uma para armazenar a média calculada. Observem que essas variáveis são todas do tipo real, ou seja, são variá veis que armazenam números fracionados (ou números quebrados), pois as notas podem ter casas decimais, certo? Contudo, vamos pensar em uma coisa! Como vamos atribuir as notas do aluno às variáveis? Quem vai digitar essas notas? Por onde? 1.2 Estrutura de entrada e saída de dados Além de declarar as variáveis, deveremos, também, pedir para o usuá rio digitar as notas para que sejam armazenadas em nossas variá veis e, para isso, utilizaremos dois métodos de entrada (input) e saída (output) de dados que, no VisuAlg são leia() e escreva(), respectivamente. Esses métodos são utilizados da seguinte maneira, de acordo com Forbellone e Eberspacher (2005): Leia() Quando você precisar que o usuário entre com alguma informação no seu sistema, utilize esse método. Dentro dos parênteses, coloque onde essa informação será armazenada, ou seja, em qual variável. Portanto, no nosso exemplo, se quisermos armazenar a primeira nota, iremos escrever no VisuAlg: 1. Leia (Nota1) Escreva() Quando você precisar escrever alguma informação na tela, utilize esse método. Essa informação pode ser um texto ou o conteúdo de uma variável. Ambas devem estar dentro dos parênteses. IMPORTANTE Quando a informação for um texto, este deve vir entre aspas “ “. E quando a informação for uma variável, apenas devemos colocar o nome dela. Também podemos escrever na tela os dois tipos de informações juntas, no mesmo método escreva(). Para isso, basta separá-las por vírgula. No VisuAlg, fica assim: 1. Escreva (“Digite sua nota”) // texto simples 2. Escreva (“Sua nota é “, Nota1) // imprime o texto seguido do conteúdo da variável Nota1 Você pode escrever comentários em seu código para entender o que está fazendo. Para isso, basta utilizar duas barras // e, logo em seguida, seu comentário (como feito no exemplo acima). Feito isso, nosso algoritmo estará assim: Figura 3 – Primeira parte do exercício “Cálculo de Média” no VisuAlg Nesse momento, já temos nossas duas variáveis declaradas e as duas notas digitadas pelo usuário e armazenadas nas nossas variáveis. Agora, precisamos fazer o cálculo da média e depois tomar a decisão se o aluno está APROVADO ou está REPROVADO. Não se preocupe, isso é bem simples. Vamos separar nossa missão em duas etapas: 1. Calcular a média; e 2. Tomar decisão. IMPORTANTE No VisuAlg, atribuir um valor a uma variável, ou seja, dar um valor a uma variável qualquer, é representada por uma seta ( <- ) apontando a variável. Exemplo: Nota1 <- 5 Nome <- “João” Na etapa 1, vamos calcular nossa média e atribuí-la à nossa variável Média. Para os cálculos, utilize os operadores aritméticos vistos no capítulo anterior. Veja como ficou nosso algoritmo até agora: Figura 4 – Segunda parte do exercício “Cálculo de Média” no VisuAlg Já na etapa 2, podemos tomar a decisão se o aluno está ou não APROVADO, já que temos a variável na qual decidiremos (que é a media). Para isso, utilizaremos estrutura de controle condicional. 2 Estrutura de controle condicional simples Para que estas tomadas de decisões sejam possíveis, devemos utilizar, segundo Xavier (2014), um comando condicional identificado, no VisuAlg, como se-entao. Sua sintaxe é simples: Se (condição-lógica) entao // comandos Senao // comandos Fimse É importante saber como criar uma condição lógica para se usar nas tomadas de decisões. Toda condição lógica é formada pela comparação de dois valores (sejam esses valores conhecidos ou conteúdo de variáveis), e essa comparação é dada por um operador relacional. O resultado dessa comparação é um FALSO ou VERDADEIRO. Exemplos de condições lógicas: 1. Comparação de um valor conhecido e uma variável: Nota1 = 3 // se a nota1 for igual a 3, esse resultado é VERDADEIRO; se não for igual, o resultado é FALSO 2. Comparação de dois valores desconhecidos, ou seja, de duas variáveis: Nota1 >= Nota2 // se a nota1 for maior ou igual à nota2, o resultado é VERDADEIRO; senão, é FALSO 3. Comparação entre valores não numéricos: Nome <> “João” // se o nome do usuário for diferente de João, o resultado é VERDADEIRO; senão, é FALSO Nem sempre uma tomada de decisão utilizando “SE” vem acompanhada do “SENAO”. Utilizamos o “SENAO” quando a condição lógica analisada no “SE” for “FALSA” e precisamos de uma resposta para essa negativa. Voltemos ao nosso exercício do cálculo da média. Como modelado no fluxograma, vamos comparar a média com o valor 6, perguntando se a média é menor que 6 (media < 6) e, caso o resultado seja VERDADEIRO, vamos escrever na tela “aluno REPROVADO”. Caso contrário (se for FALSO), vamos escrever “aluno APROVADO”. Nosso código ficará da seguinte maneira: Figura 5 – Terceira parte do exercício “Cálculo de Média” no VisuAlg Para verificar o resultado, pressione F9 no VisuAlg para executar seu código. Mas ainda podemos melhorar um pouco e colocar a média dele junto com a situação. Por exemplo: aluno REPROVADO com média _____. Como colocar a média dele impressa na tela junto com esse texto? Você já aprendeu isso nas orientações anteriores. Pense um pouco e resolva esse problema. PARA PENSAR E se o aluno tiver mais do que as duas situações de APROVADO e REPROVADO?Por exemplo, se ele puder fazer exame? Vamos imaginar essa nova situação: Se o aluno tiver a média abaixo de 4.0 estará automaticamente REPROVADO. Se o aluno tiver a média entre 4.0 e 6.0 poderá realizar EXAME. E se a média do aluno estiver acima de 6.0 estará APROVADO. Agora, temos três possibilidades de resultado na tomada de decisão. Como resolver isso? 3 Estrutura de controle condicional composta Para resolvermos esse problema, vamos recorrer às tomadas de decisão compostas que, de acordo com Manzano e Oliveira (1996), realiza ações compostas ou aninhadas, dependendo se a seleção (ou condição) é verdadeira ou falsa. A condição é uma expressão processada e transformada em um valor booleano. Podemos trabalhar esse recurso de duas maneiras: 1. “SE” aninhado positivo Nessa maneira, temos vários “SE” sequenciais, um dependendo do outro. Exemplo: Se (media >= 6), então Se (frequência >= 75), então Escreva (“aluno APROVADO”) Fimse Note que: o sistema só vai verificar a condição da frequência, caso a condição anterior seja VERDADEIRA, ou seja, o segundo “SE” depende do primeiro ser verdadeiro. Caso o primeiro “SE” seja “FALSO”, o sistema não fará nada e sairá do “SE” pelo comando “FIMSE”. 2. “SE” aninhado negativo Nessa segunda maneira, temos, também, vários “SE”, porém, um complementando a negativa do outro, ou seja, para executar o segundo “SE”, o primeiro deve ser “FALSO”. Exemplo: Se (media < 4), então Escreva (“aluno REPROVADO”) Senao Se (media < 6) entao Escreva (“aluno em EXAME”) Senao Escreva (“aluno APROVADO) Fimse Note que: caso o primeiro “SE” seja VERDADEIRO, o sistema não executa o “SENAO”, escrevendo na tela apenas “aluno REPROVADO” e saindo da tomada de decisão pelo último “FIMSE”. Porém, caso o primeiro seja “FALSO”, o sistema executa o “SENAO” e faz uma nova tomada de decisão. Se este for VERDADEIRO, o sistema escreve “aluno em EXAME” e não executa o “SENAO” saindo dos dois “FIMSE”. Todavia, caso este segundo “SE” também seja “FALSO”, o sistema executa o “SENAO” e escreve na tela “aluno APROVADO” e depois sai dos dois “FIMSE”. Aliás, essa é a solução para a situação proposta. Faça no VisuAlg e analise o resultado. Para deixar ainda mais interessante nosso algoritmo, vamos incluir a variável frequência, que deverá ser inserida pelo usuário. A frequência vai armazenar a porcentagem de presença do aluno na disciplina e será um número inteiro de 0 a 100 (onde 0 [zero] o aluno não teve nenhuma presença e 100 [cem] o aluno frequentou todas as aulas). Ainda queremos calcular a média do aluno e informar se ele está APROVADO, REPROVADO ou está de EXAME. A regra para a frequência será: abaixo de 75% o aluno está automaticamente REPROVADO. Vamos analisar como ficará nosso código: algoritmo “Cálculo de média com frequência” var Nota1, Nota2, Media: real freq: inteiro inicio escreval (“Digite sua primeira nota”) leia (Nota1) escreval (“Digite sua segunda nota”) leia (Nota2) escreval (“Digite sua frequência”) leia (freq) Media <- (Nota1 + Nota2) / 2 se (Media < 4) entao escreva (“aluno REPROVADO”) senao se (Media < 6) entao se (freq >= 75) entao escreva (“aluno em EXAME”) senao escreva (“aluno REPROVADO”) fimse senao se (freq >= 75) entao escreva (“aluno APROVADO”) senao escreva (“aluno REPROVADO”) fimse fimse fimse Lembrando que: o algoritmo pode ser construído de várias maneiras, por isso seu código pode ficar diferente do apresentado acima e produzir o mesmo resultado. Além disso, podemos melhorar ainda mais nosso código com o uso de operadores lógicos (apresentados no [capítulo 2]). Vamos abordar mais sobre esse assunto no próximo capítulo; porém, ative sua curiosidade e tente ajustar seu código considerando esses operadores. NA PRÁTICA Sugiro que você tente fazer o exercício sozinho. Comece desenhando o fluxograma e desenvolva o algoritmo no VisuAlg. Depois compare com nossa solução abaixo e compare os resultados. Considerações finais Tomar uma decisão faz parte do nosso dia a dia, além de ser extremamente importante, é imprescindível, ou seja, impossível não fazê-lo. Na computação não é diferente, temos que tomar várias decisões para cumprir as tarefas necessárias aos objetivos dos nossos usuários de sistema. Porém, tomar decisões exige uma comparação (com uso de operadores relacionais) entre dois valores, seja ele um valor conhecido ou o conteúdo de uma variável. Além disso, devemos seguir uma estrutura para tomada de decisão na qual perguntamos SE o resultado da comparação lógica é FALSA ou VERDADEIRA. Caso seja verdadeira, os comandos são executados. Caso contrário, podemos ter ou não o tratamento da sua negativa, ou seja, o SENAO (este comando é executado quando o resultado da comparação lógica do SE for FALSA. Por fim, podemos utilizar esse recurso de tomada de decisão de maneira aninhada, com vários SE e várias comparações lógicas. No aninhamento de SE podemos ter duas situações: 1. Aninhamento positivo (no qual as expressões lógicas dependem de as anteriores serem VERDADEIRAS, em uma sequência) e 2. Aninhamento negativo (no qual as expressões lógicas se complementam e a próxima só será executada caso a anterior seja FALSA). Referências FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de programação: a construção de algoritmos e estrutura de dados. 3. ed. São Paulo: Editora Pearson Prentice Hall, 2005. MANZANO, J. A. N. G.; OLIVEIRA, J. F. Algoritmos: lógica para desenvolvimento de programação. São Paulo: Editora Érica, 1996. TZU, S. A arte da guerra. Adaptação de James Clavell. 38. ed. Rio de Janeiro: Editora Record, 2002. XAVIER, G. F. C. Lógica de programação. São Paulo: Editora Senac São Paulo, 2014. [1] IDE, do inglês integrated development environment, ou ambiente de desenvolvimento integrado, é um programa de computador que reúne características e ferramentas de apoio ao desenvolvimento de software com o objetivo de agilizar esse processo. Capítulo 5 Algoritmos: repetição Exercícios e atividades cotidianas são comuns a todos nós. Diariamente, repetimos, seguindo um processo ou padrão, tarefas costumeiras e cíclicas, como comer, andar, respirar e estudar, por exemplo. Essas tarefas podem ser padronizadas, seguindo procedimentos comuns, estudados aqui neste capítulo, conhecidos como estruturas de repetição. Também chamadas de loops ou laços de repetição, analisam condições lógicas e repetem, de uma forma cíclica, seu trecho de código, de acordo com os resultados obtidos. Este capítulo apresentará os conceitos de laço e contadores, que são recursos usados para “contarmos” a quantidade de vezes que o loop executou. Além disso, você aprenderá como incrementar e decrementar os passos de um contador e aplicar na prática nosso aprendizado. Vamos continuar nosso exercício de cálculo da média, melhorando seu funcionamento e o deixando mais eficiente. Você também será provocado a cumprir desafios, com o objetivo de melhorar a compreensão e se sentir familiarizado com esses comandos tão úteis na programação de sistemas. 1 Repetir para aprender Todos nós temos rotinas diárias e cotidianas preestabelecidas, como levantar cedo, se arrumar, ir trabalhar, almoçar, ir para a faculdade, ir para a academia e dormir, por exemplo. E repetimos tantas vezes essas atividades, todos os dias, que acaba se tornando um ciclo. Note que esse ciclo segue o mesmo processo, sempre; ou seja, não precisamos inventar novas maneiras de acordar ou ir trabalhar, todas seguem o mesmo padrão. Para acordar, precisamos seguir um processo simples de passos: Abrir os olhos. Levantar da cama. Tomar banho. Escovar os dentes. Vestir-se. Tomar café. PARA PENSAR Note que o ato de “acordar” remete a uma ação com várias atividades, e não simplesmente abrir os olhos. Chamamos isso de método ou função, conceitos que discutiremos mais adiante. Agora, imagine fazer isso todos os dias (e nós fazemos, não é mesmo?). Quando já sabemos como se faz, torna-se mecânico o processo e não nos preocupamos em como estamos executando cada passo dessa tarefa. O computador tambémexecuta diversas rotinas (ou funções) repetidas vezes, como um saque em um caixa eletrônico, a verificação de um cadastro, iniciar o sistema operacional quando ligamos nosso computador e efetuar uma compra em algum site de e-commerce, por exemplo. E todas essas rotinas são efetuadas da mesma maneira, seguindo o mesmo processo, independente de quem está utilizando a funcionalidade. Para “facilitar” esse processo, no computador, vamos utilizar alguns recursos de repetição de rotinas bem conhecidos na programação. Esses recursos auxiliam bastante em nossa programação, evitando que nós, programadores, reescrevamos o mesmo código para atividades comuns. Ao invés disso, podemos simplesmente criar um código, uma rotina, com o processo definido pelas regras do nosso negócio e repetimos todas as vezes que alguém precisar utilizá-las. Lembra-se do nosso exercício do capítulo anterior? Do cálculo da média a partir de duas notas do aluno e a tomada de decisão para sabermos a situação desse aluno (APROVADO, REPROVADO ou EM EXAME)? Pois bem, vamos continuar esse programa, mas agora com a seguinte tarefa: Nós pedimos para o usuário digitar sua nota, certo? Mas não verificamos se a nota é válida, ou seja, se a nota está entre 0 (zero) e 10 (dez), pois não existe uma nota escolar fora desses parâmetros. Então, vamos garantir que o usuário não digite uma nota fora dos padrões. IMPORTANTE Toda vez que o usuário digitar uma nota, devemos verificar se a nota está dentro dos parâmetros que nós estabelecemos, neste caso, entre zero e dez. Como fazer isso e garantir que o programa só vai continuar se a nota digitada está válida? Vamos entender o fantástico mundo dos lações de repetição. 1.1 Estruturas de repetição Quando uma sequência de comandos deve ser executada repetidas vezes, usamos uma estrutura de repetição. Segundo Deitel e Deitel (2005), a estrutura de repetição, assim como a de decisão, envolve sempre a avaliação de uma condição. A diferença entre a estrutura de decisão e a estrutura de repetição é a quantidade de vezes que ela executa em nosso sistema. A figura 1 diferencia essas duas estruturas em uma visão macro: Figura 1 – Diferença de estrutura condicional e estrutura de repetição Note que a imagem A é uma tomada de decisão simples, utilizando como recurso o “SE” (apresentado no capítulo anterior). Essa verificação é efetuada apenas uma vez, ou seja, a expressão lógica é analisada e, se seu resultado for FALSO, o programa segue para um lado; e, se for VERDADEIRO, segue por outro lado, não voltando mais para a verificação, o programa segue. A imagem B mostra uma estrutura de repetição com o recurso “ENQUANTO” (que vamos estudar em seguida). A expressão lógica também é analisada, porém, ENQUANTO ela for VERDADEIRA, nosso trecho de código continua se repetindo, até que ela se “torne” FALSA. IMPORTANTE É importante ficarmos atentos ao resultado da expressão lógica na estrutura de repetição. Ela deve ter alguma condição, dentro do código, de mudar seu valor; caso contrário, caímos em um conceito chamado LOOP INFINITO. De acordo com Forbellone e Eberspacher (2005), essas estruturas são também conhecidas como laços de repetição, ou loops, e o loop infinito acontece quando a condição lógica analisada for sempre VERDADEIRA. Para que isso não ocorra, devemos nos preocupar em alterar nossa variável (que está sendo comparada na condição lógica) dentro do laço de repetição. Daqui a pouco, veremos como isso funcionará. Por enquanto, vamos ver alguns tipos de estruturas de repetição e aplicar em nosso exercício. 2 Enquanto-faça (while) Deitel e Deitel (2005) diz que a estrutura de repetição “ENQUANTO” permite especificar instruções que devem ser repetidas enquanto determinada condição for VERDADEIRA. A seguir, é ilustrada a sintaxe dessa estrutura no VisuAlg: Enquanto (condição lógica) faça // código fimenquanto Veja que a condição lógica é verificada e, quando seu resultado for VERDADEIRO, o código (dentro do laço) será executado. Quando o programa chegar na instrução FIMENQUANTO, o programa volta a analisar a condição lógica e verifica novamente seu resultado. O sistema fica nesse loop enquanto o resultado da condição for VERDADEIRA. Caso essa condição seja FALSA, o programa continua o código pulando todo o laço de repetição, ou seja, o sistema encontra a instrução FIMENQUANTO e continua a partir desse ponto, não executando o código dentro do laço. Por isso, a importância de se alterar o valor analisado na condição lógica para que possamos sair desse laço. Caso contrário, ficamos presos dentro dele, causando um loop infinito. Agora que sabemos disso, que tal aplicarmos no nosso exercício? Vamos cumprir nossa tarefa, que é garantir que a nota digitada pelo nosso usuário seja válida, ou seja, esteja entre zero e dez. Para isso, vamos utilizar o recurso de repetição ENQUANTO e os operadores lógicos. PARA SABER MAIS Entender os operadores lógicos é de extrema importância para a compreensão das condições lógicas e seus resultados e, assim, dominar as estruturas de repetição e de tomada de decisão. Sugerimos a leitura do livro C – como programar, de Harvey Deitel e Pearson Deitel (2011). Vamos relembrar que a decisão lógica é a comparação relacional de dois valores. Caso precisemos comparar mais valores para obter o mesmo resultado, deveremos fazer uso dos operadores lógicos. No nosso exercício isso acontecerá, pois deveremos comparar se a nota digitada é menor que zero OU a nota digitada é maior que dez. São duas comparações para se obter um único resultado. Note que estamos fazendo comparações daquilo que NÃO queremos. Estamos comparando se a nota está fora dos padrões estabelecidos. Por que fazemos isso, nesse caso? Se a nossa nota for válida, ou seja, estiver dentro dos padrões de zero a dez, não queremos que o laço de repetição faça nada. Queremos que o programa pule todo o laço e continue o código depois do FIMENQUANTO, pois nossa nota é válida. Nossa intenção é identificar quando a nota está fora dos padrões e pedir para o usuário digitar novamente. Após a nova digitação, devemos verificar outra vez e, se a nota persistir errada (ou seja, se a condição lógica for VERDADEIRA), o laço será executado de novo, ficando em um ciclo, até que a condição lógica se torne FALSA (quando o usuário digitar uma nota válida). Portanto, nosso código, para verificar a primeira nota, ficará assim: Figura 2 – Verificação da Nota1 pela estrutura de repetição “ENQUANTO” Na figura 2, o usuário digita a primeira nota e, em seguida, o sistema a verifica, comparando se ela é menor que zero OU se ela é maior que dez. Essas são as condições que, quando verdadeiras, nos levam a pedir novamente a nota, pois está fora dos padrões estabelecidos. PARA PENSAR O operador lógico “OU” utilizado no código torna o resultado da condição VERDADEIRA se qualquer uma das duas comparações forem verdadeiras. Caso precisássemos que as duas condições fossem verdadeiras, deveríamos usar o operador lógico “E”. Agora é sua vez. Faça a verificação da segunda nota e teste seu programa. Dissemos no início do capítulo que a estrutura de decisão “SE” realiza apenas uma verificação e segue o programa. Quantas verificações a estrutura de repetição “ENQUANTO” executa? Essa estrutura executa enquanto o resultado da condição lógica analisada for VERDADEIRO. Na verdade, essa estrutura pode executar quantas vezes forem necessárias. Nós não sabemos quantas vezes o usuário vai digitar a nota inválida; enquanto isso, nosso sistema estará “preso”, esperando a nota correta (claro que podemos limitar a quantidade de tentativas do usuário, por exemplo, quando ele pode digitar até três vezes a senha incorreta, caso contrário, sua conta é bloqueada). Para isso, podemos utilizar “contadores”, que vão nos ajudar muito no próximo tópico desse capítulo. Pergunta: e se conhecermos a quantidade de vezes que vamos executar o laço? Por exemplo, eu quero selecionar os primeiros 10 alunos da sala, ou quero selecionar os seis números da mega-sena,
Compartilhar