Baixe o app para aproveitar ainda mais
Prévia do material em texto
MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 1 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Técnicas de Programação MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 2 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL CAPÍTULO 01 A LÓGICA NA PROGRAMAÇÃO DE COMPUTADORES A lógica é, filosoficamente, a ciência do pensamento correto. Isso não nos dá a segurança de afirmar que tudo que é lógico é verdadeiro. Mesmo que tudo que se permita afirmar dentro da lógica seja supostamente verdadeiro em determinado contexto, quando aplicada a elementos do mundo real pode invalidar-se e tomar-se falsa. Desta forma, a lógica seria uma forma de organizar o raciocínio, de colocar ordem no pensamento, e assim sendo, são várias as técnicas desenvolvidas ao longo dos anos por matemáticos e lógicos a fim de desenvolverem teorias e axiomas que pudessem ser representados em notação computacional para poderem ser programáveis e assim dotar as máquinas de certa inteligência lógica. Boole (1815-1864) e Morgan (1806-1971) foram os primeiros estudiosos a empregarem a lógica na representação dos processos de raciocínio, o que viria a se chamar posteriormente de Álgebra de Boole, porém, esses trabalhos estavam mais próximos de outras teorias matemáticas do que propriamente da lógica. Foi o matemático alemão Gõttlob Frege em sua obra Begriffsschrift (1879) que propôs uma ferramenta para formalizar princípios lógicos que nos dias atuais denominamos de cálculo de predicados. Esse sistema apresentou uma notação consistente onde é possível representar todos os conceitos matemáticos e formalizar de forma exata o raciocínio dedutivo sobre tais conceitos. Esta obra marca o nascimento da lógica moderna. Durante o quarto de século seguinte, Frege empregou seu cálculo lógico em pesquisas sobre fundamentos da matemática e outros os matemáticos começaram a explorar novas áreas que demandavam profundo entendimento lógico assim como procedimentos sistemáticos de prova de teoremas mais poderosos e eficientes dos que já existiam até o momento. Novos trabalhos surgiram, como o de David Hilbert (1899), que transformou a geometria euclidiana em axiomas, tornando-a mais consistente e com superior rigor formal; Giuseppe Peano (1889) reduziu a aritmética comum a puro simbolismo formal, atingindo novo nível de precisão, sem ambiguidade de sentido e sem hipóteses ocultas e também desenvolveu a lógica simbólica; Georg Cantor (1870) pro pôs a exploração intuitiva da teoria geral dos conjuntos e a teoria dos números transfinitos. O relacionamento entre lógica e matemática foi investigado amplamente por Alfred North Whitehead e Bertrand Russel, que em sua obra Principia Mathematica (1910) demonstraram que a lógica é um instrumento adequado para a representação formal de grande parte da matemática. Em 1930, a área teve um grande avanço, nos estudos independentes do matemático alemão Kurt Gõdel e o francês Jacques Herbrand. Ambos demonstraram, simultaneamente, em suas teses de doutorado, que toda fórmula logicamente válida pode ser demonstrada no cálculo de predicados de primeira ordem, ou seja, existe uma derivação formal para esta fórmula, que é uma lista finita de passos em que cada passo é obtido através de um axioma, ou de regras de inferência básicas aplicadas a passos anteriores. Em 1931 Gõdel apresentou um estudo de maior impacto sobre lógica matemática, chamado Teorema da Incompletude, demonstrando que seria impossível estabelecer uma base axiomática completa para toda a matemática, enquanto os outros matemáticos tentavam fazê-lo. Ele demonstrou que em qualquer sistema matemático estritamente lógico há proposições cuja verdade ou falsidade não podem ser demonstradas com os axiomas do sistema. Em 1934, Alfred Tarski apresentou a primeira teoria semântica rigorosamente formal do cálculo de predicados, e caracterizou matematicamente os conceitos de “verdade”, constante lógica e consequência lógica para sentenças de linguagens formalizadas clássicas. Outros matemáticos também engrandeceram os estudos sobre o cálculo de predicados, como Alan Turing e Alonzo Chur aproximando-o à forma como hoje é conhecido e estudado. Tarski é considerado um dos maiores lógicos da história, juntamente com Aristoteles, Frege e Kurt Gõdel. Em 1939, com o início da Segunda Guerra Mundial, toda a fundamentação teórica da logica computacional já estava pronta. Porém, apenas alguns métodos muito simplistas podiam ser resolvidos manualmente, com lápis e papel, muitos deles, por serem mais complexos, demandavam uma maneira prática e mecânica para efetuar o grande volume de cálculos dos procedimentos de prova. Inicialmente os recursos financeiros eram destinados a pesquisas teóricas para o desenvolvimento de técnicas de assassinato em massa, foi só a partir da metade dos anos 50 que a tecnologia de desenvolvimento de computadores começaram a oferecer aos pesquisadores o potencial do cálculo mecânico, podendo assim eles se beneficiarem deste advento para a realização de experiências mais MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 3 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL significativos com o cálculo de predicados. Em 1958 uma forma simplificada do cálculo de predicados denominada forma clausal começou a despertar o interesse dos estudiosos do assunto. Tal forma empregava um tipo particular muito simples de sentença lógica de nominada cláusula - uma (possivelmente vazia) disjunção de literais. Em 1960 Dag Prawitz propôs um novo tipo de operação sobre os objetos do cálculo de predicados, conhecido por unificação. A unificação se revelou fundamental para o desenvolvimento de sistemas simbólicos e de programação em lógica. Os primórdios da ciência da computação, e o início da programação em lógica em sistemas computacionais ocorreram no final dos anos 50 e início dos anos 60, com o intuito de automatizar o processo de demonstração de teoremas. Entretanto isso só foi possível a partir da descoberta do Princípio da Resolução por Alan Robinson (1965), onde “resolução é uma regra de inferência que permite a computação das proposições inferidas a partir de proposições dadas, constituindo, assim um método com potencial aplicação na demonstração automática e teoremas” (Sebesta, 2002). A resolução foi idealizada para ser aplicada a proposições na forma clausal. Cordell C. Green (1969) foi um dos primeiros estudiosos a empregar o Princípio da Resolução com a programação de computadores, que mostrou como o mecanis mo para a extração de respostas em sistemas de resolução poderia ser empregado para sin tetizar programas convencionais. Em 1974, Robert Kowalski designa o uso da lógica como linguagem de programação de computadores, e nasce o termo programação em lógica (logicprogramming, originalmente em inglês). Ele identificou, em um procedimento de prova de teoremas, um procedi mento computacional, dando desta forma uma interpretação procedimental da lógica e estabelecendo regras e condições para permitir o entendimento como uma linguagem de programação de uso geral. Este foi o salto crucial que permitiu que todos os esforços dos matemáticos e lógicos relacionados com a prova de teoremas fossem adaptados a técnicas computacionais num esforço em se desenvolver linguagens computacionais baseadas em lógica, e que pudessem criar programas para dotar as máquinas com capacidade de pensar, ou seja, a inteligência artificial, porém isso se tornou mais difícil do que o esperado, devido a complexidade do raciocínio humano. Desta forma, surgiu o primeiro interpretador experimental desenvolvido por um grupo de pesquisadores liderados por Alain Colmerauer na Universidadede Aix-Mar seille (1972) batizado de Prolog, um acrônimo para Programmation em Logique. Algaritmos Computacionais Introdução Desde os primórdios da existência huma na, o homem tem procurado mecanismos para tornar o trabalho menos maçante e a sua pro dução mais rendável. O advento do computador é sem dúvida uma das máquinas que mais auxilia a produção do homem ajudando-o a diminuir os esforços e ganhar tempo, por ser uma máquina rápida e segura. Apesar de o computador ser uma máquina de grande auxílio, ele não consegue por si só gerar programas úteis aos humanos por não ter a propriedade de ser dotado de inteligência e criatividade. São os humanos que devem passar-lhe instruções para que ele se torne util. Essas instruções devem ser passadas detalhadamente e são chamadas de programas. Os computadores só conseguem gerar rela tórios, gráficos, imprimi-los, editar textos e planilhas, realizar cálculos complexos rapidamente, entre outras funções, por meio de programas. A principal finalidade dos computadores é o processamento de dados, para tanto, eles devem receber, manipular e armazenar dados. O recebimento é realizado através de dispositivos de entrada, como o teclado, o mouse, o scanner entre outros, realizar processamentos com esses dados adquiridos, como um cálculo, uma geração de relatório, e emitir uma resposta ao usuário através dos dispositivos de saída, como o monitor e a impressora, entre outros (ASCENCIO; CAMPOS, 2002). Ainda existem alguns dispositivos que funcionam como entrada e saída, como é o caso das impressoras multifuncionais que possuem ao mesmo tempo, scanner e impressora e os monitores touchscreen. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 4 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Figura 1.1 - Processamento de dados e dispositivos de entrada e salda. Fonte: do autor, 2016. Para que o computador possa completar corretamente uma determinada tarefa, ele deve trabalhar em conjunto com o hardware e o software. O hardware é composto da parte física do computador, como seus componentes e periféricos, e o software é a parte dos programas que dão funcionalidade ao computador, desde o sistema operacional até os programas de aplicação. Qualquer pessoa pode se tornar um programador de computadores, basta aprender as técnicas necessárias para fazê-lo, e requer raciocínio lógico e criatividade. Quando há o interesse em desenvolver um programa que efetue determinada tarefa, este pode ser um único programa, ou um conjunto de programas interligados entre si, como é o caso do sistema operacional. Para começarmos a desenvolvê-los, temos que dominar uma linguagem de programação, que são regras e termos entendíveis por nós humanos, mas que são também processáveis pelo computador. A criação de um programa deve seguir algumas etapas: » análise: nesta etapa deve ser feito um levantamento dos requisitos do sistema para saber quais são os dados de entrada, quais os processamentos que o mesmo deve efetuar, e quais são os dados de saída que o programa deve emitir; » algoritmo: utilização de ferramentas de auxílio ao desenvolvimento, como descrição narrativa, fluxograma ou português estruturado para descrever o problema e suas soluções; » codificação: transformação do algoritmo seguindo as regras de alguma linguagem de programação escolhida pelo usuário. O programa passa a existir efetivamente quando o algoritmo é codificado segundo as regras de uma determinada linguagem de programação, que pode ser escolhida pelo programador, levando-se em consideração os benefícios de sua aplicação. Conceito de Algoritmos Segundo a definição do Dicionário Aurélio, algoritmo é um “conjunto bem definido de regras e operações bem definidas e ordenadas, destinadas a solução de um problema, ou uma classe de problemas, em um número finito de etapas”. Algoritmos são padrões de ações que de vem ser respeitadas para se atingir com sucesso um objetivo ou a resolução de um problema de acordo com um grupo de ações pré-estabelecidas, caso algum desses padrões não seja obedecido, o resultado pode não ser o desejado. Embora estejamos conhecendo o termo agora, executamos diversos algoritmos no nosso dia a dia, desde o momento que acordamos até o momento que vamos dormir. Por exemplo, o próprio ato de escovar os dentes ao se levantar é considerado um algoritmo, pois você deve seguir algumas etapas para completar a tarefa, como: » Passo 1- pegar a escova de dente. » Passo 2 - pegar a pasta de dente. » Passo 3 - passar a pasta na escova. » Passo 4 - coloca a escova na boca e esfregar todos os dentes. » Passo 5 - tirar a escova da boca. » Passo 6 - enxaguar a boca. Para que um algoritmo seja útil, necessário que tanto quem MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 5 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL escreveu como quem o executará tenha conhecimento da linguagem adotada e conheça os termos utilizados na instruções. O algoritmo do exemplo acima só será útil para quem entenda a língua portuguesa e tenha conhecimento do significado dos verbos pegar, passar, colocar, tirar e enxaguar. Se precisarmos passar no banco para sacar dinheiro nos terminais de autoatendimento precisaremos efetuar algumas- tarefas sequenciais, que é o algoritmo de saque: » Passo 1- ir até o banco, nos terminais de autoatendimento. » Passo 2 - inserir o cartão. » Passo 3 - digitar a senha numérica. » Passo 4 - digitar as letras de segurança. » Passo 5 - digitar a quantia desejada. » Passo 6 - se o saldo for maior do que a quantia desejada, sacar. Caso contrário, emitir uma mensagem de impossibilidade de saque. » Passo 7 - retirar o cartão. » Passo 8 - sair do banco. Você pode estar pensando que realiza essas tarefas de outra forma, não há problema algum em pensar isso, realmente um mesmo problema pode ser resolvido de diversas formas, não estando necessariamente errado. O que deve acontecer é que os passos descritos, mesmo que diferentemente, devem levar a pessoa a executar tais ações. Portanto, podem existir vários algoritmos para resolver o mesmo problema. Um algoritmo não é a solução de um problema, pois se fosse dessa forma, cada problema apresentaria um único algoritmo, este é sim, um caminho a ser seguido para a resolução de um determinado problema, e diferentes caminhos podem estar corretos. A seguir, seguem alguns conceitos de algoritmos de outros autores: “Algoritmo é urna sequencia de passos que visa atingir um objetivo bem definido” (FORBELLONE; EBERSPACHER, 1999). “Algoritmo são regras formais para a obtenção de um resultado ou da solução de um problema, englobando fórmulas de expressões aritméticas” (MANZANO, 2000). “Ação é um acontecimento que, a partir de um estado inicial, após um período de tempo finito, produz um estado final previsível e bem definido. Por tanto, um algoritmo é a descrição de um conjunto de comandos que, obedecidos, resultam numa sucessão finita de ações” (FARRER; BECKER, 1999). Computacionalmente, um algoritmo é um conjunto de regras e um número finito de passos que se organizados corretamente levam à construção de um programa de computador que realize uma tarefa específica. ANOTAÇÕES MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 6 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL MÉTODOS PARA A CONSTRUÇÃO DE ALGORITMOS Antes de começar a construir qualquer algoritmo, é necessário se atentar a alguns procedimentos que ajudarão na escrita e na eficiência do seu algoritmo. São eles: a) Leia atentamente o problema a ser resolvido, destacando os principais pontos; b) Defina quais serão os dados de entrada; c) Defina quais serão o processamento peloqual esses dados terão que passar. Se haverá cálculos, quais as fórmulas, e quais restrições para esses dados, se houver. d) Defina os dados de saída, ou seja, os dados que estarão disponíveis para o usuário após o processamento. e) Construa o algoritmo com alguma forma de representação descrita na próxima aula; f) Teste o algoritmo realizando simulações. Formas de representação de algoritmos Os algoritmos podem ser representados de várias formas, como em uma língua (português ou inglês), seguindo a forma como um manual de instruções, a bula de um medicamento, em receitas culinárias, etc. Através de representações gráficas, como diagramas ou fluxogramas, que substitui muitas palavras, é fácil e entender e fica mais compacto. Cada uma das formas de representação possuem suas vantagens e desvantagens, o programador quem irá decidir qual forma utilizar, de acordo com os benefícios e até mesmo com a sua habilidade e facilidade da forma que mais lhe agradar. As principais formas de representação de algoritmos são: Descrição Narrativa, Diagrama de Nassi-Shneiderman (Diagrama de Chapin), Fluxograma (Diagrama de fluxo) e Pseudocódigo (Português Estruturado, Portugal ou Pseu do linguagem). Descrição Narrativa A descrição narrativa utiliza a descrição dos passos a serem executados pelo algoritmo, feita diretamente em linguagem natural (no nosso caso a língua portuguesa). Os passos são listados um após o outro, na sequencia em que devem ser executados, cada um em uma nova linha de texto. » Vantagem: não é necessário aprender nenhum recurso adicional, pois é escrito em linguagem natural. » Desvantagem: a língua natural permite diferentes interpretações o que pode ocasionar um erro na transcrição do algoritmo para uma linguagem de programação. Exemplo de algoritmo para calcular a média de dois números, utilizando a descrição narrativa: » Passo 1- receber os dois números. » Passo 2 - somar os dois números. » Passo 3 - pegar o resultado da soma e dividir por 2. » Passo 4 - mostrar o resultado da divisão. Fluxograma (Diagrama de fluxo) Os fluxogramas são uma representação gráfica que utilizam formas geométricas padronizadas ligadas por setas de fluxo, para indicar as diversas ações (instruções) e decisões que devem ser seguidas para a resolução do problema. Eles permitem visualizar os caminhos (fluxos) e as etapas de processamento de dados possíveis e, dentro destas, os passos para a resolução do problema. » Vantagem: é mais fácil de interpretar, pois é formado por desenhos. » Desvantagem: é necessário aprender a simbologia dos fluxogramas, para que serve cada elemento e a transcrição do algoritmo para uma linguagem de programação é mais difícil por ele não apresentar os detalhes. CAPÍTULO 02 MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 7 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Tabela 1 - Conjunto de símbolos utilizados nos fluxogramas Fonte: do autor, 2016. Exemplo de algoritmo para calcular a média de dois números, utilizando o Fluxograma: Figura 2.1 - Fluxograma de um algoritmo para calcular a média de dois números. Fonte: do autor, 2016. Diagrama de Nassi-Shneiderman (Diagrama de Chapin) Os Diagramas de N a s s i - S h n e i d e r m a n , também conhecidos como Diagrama de Chapin surgiram nos anos 70 como uma maneira de ajudar nos esforços da abordagem de pro gramação estruturada. A ideia básica deste diagrama é represen tar as ações de um algoritmo dentro de um retângulo, subdividindo-o em retângulos menores, que representam os diferentes blo cos de sequencia de ações do algoritmo. As vantagens e desvantagens são equiva às da descrição narrativa. Exemplo de algoritmo para calcular a mé dia de dois números, utilizando o Diagrama de Nassi-Shneiderman: MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 8 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Quadro 1- Exemplo do Algoritmo para calcular a média de dois números utilizando o Diagrama do Nassi - Shneiderman. Inicio receber os dois números. somar os dois números. pegar o resultado da soma e dividir por 2 mostrar o resultado da divisão. Fim. Pseudocódigo (Português Estruturado, Pseudolinguagem ou Portugol) o pseudocódigo, conhecido também como portugol, português estruturado ou pseudolinguagem, consiste em escrever os passos para a resolução do problema por meio de regras predefinidas. » Vantagem: a passagem do algoritmo para qualquer linguagem de programação é quase imediata, bastando conhecer as palavras reservadas da linguagem de programação que será utilizada. » Desvantagem: é necessário conhecer as regras do pseudocódigo. Exemplo de algoritmo para calcular a média de dois números, utilizando o pseudocódigo: ALGORITMO DECLARE N1,N2, M REAL ESCREVA “Digite dois numeros” LEIA N1, N2 M ← (N1*N2)/2 ESCREVA “Média = ”, M FIM_ ALGORITMO Iremos desenvolver algoritmos utilizando o pseudocódigo e suas regras serão apresenta das nas próximas aulas. Variáveis e Constantes As variáveis e constantes são conceitos fundamentais para a construção de algoritmos e programas de computadores, pois são através deles que um algoritmo armazena os da dos do problema. Todo dado que tenha que ser alterado durante o programa, no decorrer de certo período de tempo, deverá ser tratado como uma variável, e tem que ser definido no algoritmo. Quando um dado não tem que alterar seu valor durante a execução de um programa, ele pode ser tratado como uma constante, e tem que ser definido no algoritmo. Uma variável e uma constante são fisicamente um espaço reservado na memória RAM (memória de acesso randômico) do computa dor para armazenar dados durante a execução de um programa. Elas possuem um nome e um tipo, e no caso da variável, pode ter seu conteúdo alterado durante a execução de um programa. Como exemplo, considere o desenvolvimento de um algoritmo que calcule o raio de um círculo. A fórmula para o cálculo da área de um círculo é: onde o valor de π é sempre 3,14 e r é o raio do círculo. Sendo assim, r é um valor que irá variar durante a execução do programa e, portanto deverá ser tratada como variável. O valor de é um dado constante, ele sempre será 3,14 e não mudará durante a execução do programa e, portanto deverá ser tratado como constante. Para manipularmos corretamente as variáveis e constantes em um algoritmo, temos que atribuir-lhes nomes próprios, chamados de identificadores. A atribuição de nomes para as variáveis e constantes devem seguir algumas regras: 1. Devem começar por um caractere alfabético, nunca podem começar com números; 2. Podem ser seguidos de outros caracteres alfabéticos e/ ou numéricos; MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 9 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL 3. Não é permitido o uso de caracteres especiais, como: !@#$%”&*(), etc, exceto o sublinhado, que é possível utilizar. Exemplos de identificadores válidos: a)Num1 b) X c) raio d)num2 e)base_triangulo Exemplos de identificadores inválidos: a) 1num b) n 3 e) raio/2 d) variável nome e) <4 Tipos Primitivos de Dados As variáveis ou constantes de um algoritmo armazenarão tipos de dados que podem ser: textual, numérico inteiro, numérico real ou lógico (para armazenar valores verdadeiro/falso ou estados ligado/desligado). É necessário informar ao algoritmo o tipo de dado que será armazenado em uma determinada variável, pois, quando o algoritmo for traduzido para uma linguagem de computador, é o tipo de dado que informará à memória RAM, a quantidade em bytes que deverá ser reservado para o armazenamento daquela variável. Abaixo serão detalhados os tipos primitivos de dados em algoritmo: » Inteiro: compreendemos dados numéricos que pertençam ao conjunto de números inteiros, sejam eles negativos, nulos ou positivos. Esse tipo de dado, quando armazenado na memória do computador, ocupa 2 bytes. Exemplos: -4, 0, 128. » Real: compreendem os dados numéricos que pertençam ao conjunto de números reais (com parte decimal), sejam eles negativos, nulos ou positivos. Esse tipo de dado, quando armazenado na memória do computador, ocupa 4 bytes. Exemplos: -16,8 0,02 145,23 Caractere: compreendem os dados textuais que pertençam ao conjunto de caracteres alfanuméricos (números, letras e caracteres especiais), porém que contenham apenas um único caractere. Esse tipo de dado, quando armazenado na memória do computador, ocupa 1byte. Exemplos: “s”,”n”,”2”. » literal: compreendem os dados textuais que pertençam ao conjunto de caracteres alfa numéricos (números, letras e caracteres especiais) formado por uma cadeia de caracteres. Esse tipo de dado, quando armazenado na memória do computador, ocupa 1 byte para cada caractere. Exemplos: “escolha a opção desejada”, “Eveline Rodrigues”, “sim”. » Lógico: compreendem os dados que só terão dois valores possíveis, como: verdadeiro/ falso. São também chamados de dados Booleanos (devido à álgebra de Boole). Esse tipo de dado, quando armazenado na memória do computador, ocupa apenas 1byte. Exemplos: verdadeiro, falso. Declaração de Variáveis Toda variável é responsável por armazenar um dado, e, portanto ela deve ser identificada pelo algoritmo através do seu nome e também deve possuir um tipo. Para tanto, quando for necessária uma determinada variável em um algoritmo, você deve declarar a variável. A declaração de uma variável indica o tipo de dado que ela pode armazenar no decorrer da execução do algoritmo. Para declaramos uma variável, temos que criar um identificador válido, como visto na seção acima, que será o nome da variável no algoritmo, e também temos que definir o tipo de dado que a variável pode armazenar. A sintaxe para a declaração de uma variável é: DECLARE <identificador> <tipo> Onde <identificador> é o nome da variável que você irá declarar seguindo as regras de nomes e <tipo> é um tipo de dado que pode ser inteiro, real, caractere ou lógico. A palavra reservada DECLARE é para indicar que a seguir vem o bloco de declaração de variáveis em um algoritmo. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 10 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL LINERIZAÇÃO E MODULARIZAÇÃO DE EXPRESSÕES Linearização de Expressões Para a construção de algoritmos todas as expressões aritméticas devem ser linearizadas, ou seja, colocadas em linha e deverá ser feito um mapeamento dos operadores da aritmética tradicional, convertendo-os para os operadores do português estruturado. Desta forma, a notação tradicional abaixo: Computacionalmente, passa a ser: 2*((1/5+(4-1))*4) Um exemplo de conversão é o operador de multiplicação, que no português estruturado é utilizado o símbolo *. A tabela 1 mostra os operadores aritméticos empregados pelo português estruturado, que permitem a construção de expressões matemáticas utilizando soma, subtração, multiplicação e divisão, são eles: Tabela 1- Operadores aritméticos do português estruturado. Operadores aritméticos Função Operador Soma + Subtração - Multiplicação * Divisão / Divisão inteira (truncada) \ Resto da divisão inteira % Exponenciação ^ Fonte: do autor, 2016. Exemplos: a<- 10+5 muItipIicação <-x*y soma <-a+b Modularização de Expressões A modularização é a divisão de uma expressão aritmética em unidades menores, melhorando a compreensão dos cálculos que terão precedência sobre outros. Computacionalmente, utilizamos apenas os parênteses “()” para separarmos módulos em uma expressão. A mesma expressão pode conter vários parênteses, substituindo o uso de colchetes e chaves na matemática. Os parênteses indicam quais sub-expressões, dentro de uma expressão, serão executadas primeiro. A princípio, a execução ocorre da esquerda para a direita, porém, além dos parênteses há também a precedência de operadores envolvidos na expresão. A prioridade dos operadores em uma ex pressão matemática é mostrada na tabela 2: Tabela 2 - Prioridade de operadores aritmético sem uma expressão matemática Prioridade de operadores Operador aritmético Prioridade Exponenciação 3(maior) Multiplicação 2 Divisão 2 Adição 1 Subtração 1 (menor) Fonte: do autor, 2016. Exemplo: (4+4)/2 resulta 4 e 4 + 4/2 resulta 6. 12.{[ (4 1)].4} 5 + − CAPÍTULO 03 MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 11 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Exemplo: (7>1) ou (3<4) e (5<2) O resultado da expressão acima é falso. (7>1) e (3<4) ou (5<2) O resultado da expressão acima é verdadeiro. Entre as categorias de operadores também há prioridades, conforme mostrado na tabela 4: Tabela 3 - Prioridade de operadores lógicos em uma ex- pressão matemática. Prioridade de operadores Operador lógico Prioridade E 3 OU 2 NÃO 1 Fonte: do autor, 2016. Tabela 4 - Prioridade entre as categorias de operadores em uma expressão matemática Operador Prioridade Operadores aritméticos 3 Operadores relacionais 2 Operadores lógicos 1 Fonte: do autor, 2016. Exemplo: 3*7>3 ou 6+2<12 e 2 < 8-4 // resulta em erro. (3*7>3) ou (6+2<12) e (2<8-4) // certo seria assim. Operadores relacionais e Lógicos Quando queremos fazer comparações entre valores ou entre expressões, sejam elas matemáticas ou lógicas, devemos utilizar os operadores relacionais. Operadores relacionais definem relações de igualdade, maior, maior ou igual, menor, menor ou igual e diferente. Os operadores relacionais são mostrados na tabela 5: Tabela 5 - Operadores relacionais do português estruturado. Operadores relacionais Função Operador maior que > menor que < maior ou igual > = menor ou igual < = igual = diferente < > Fonte: do autor, 2016. O resultado de uma expressão relacional é sempre um nível (verdadeiro ou falso). Exemplos: 2+6 = 4+4 8=8 Resultado: verdadeiro 2+6 > 4+4 8>8 Resultado: falso Os operadores lógicos atuam sobre expressões e também possuem resultado verdadeiro ou falso. Eles servem para unir duas ou mais expressões cujo resultado final é apenas um único valor (verdadeiro ou falso). Os operadores lógicos são mostrados na tabela 6: MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 12 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Tabela 6- Operadores lógicos do português estruturado. Operadores lógicos Operadores lógicos Português estruturado Multiplicação lógica E Adição lógica OU Negação NÃO Fonte: do autor, 2016. A multiplicação lógica (E) resulta verdadeiro se todas as expressões envolvidas forem verdadeiras. A adição lógica (OU) resulta verdadeira se uma e apenas uma das expressões for verda deira. A negação (NÃO) nega uma afirmação, invertendo o seu nível: se a expressão for verdadeira, ela torna-se falsa e se a expressão for falsa, ela torna-se verdadeira. De acordo com a necessidade, as expressões podem ser unidas através de operadores lógicos. Faz-se necessário conhecer a tabela-verdade, que é o conjunto de todas as possibilidades combinatórias entre os valores das variáveis lógicas. A tabela-verdade é mostrada na tabela 7: Tabela 7- Tabela - verdade A B A E B A OU B NÃO A NÃO B V V V V F F V F F V F V F V F V V F F F F F V V Fonte: do autor, 2016. Dados valores iniciais para as expressões A e B, como V para verdadeiro, e F para falso, são mostradas todas as combinações possíveis entre os pares de expressões A e B, para os operadores lógicos E, OU e NÃO. Exemplos: (8<6) E (4=4) Resultado: falso, pois apenas uma expressão é verdadeira. (2<5) E (4=4) Resultado: verdadeiro, pois ambas as ex pressões são verdadeiras. (2>6) ou (4>=4) Resultado: verdadeiro, pois sendo apenas uma expressão verdadeira com o operador OU, o resultado é verdadeiro. (2>6) ou (8<4) Resultado: falso, pois ambas as expressões são falsas. ((2>6) OU (8<4)) E (2=2) Resultado: falso, pois sendo apenas uma ex pressão falsa com o operador E, o resultado é falso. ((2>6) E (8<4)) OU (2=2) Resultado: verdadeiro, pois sendo apenas uma expressão verdadeira com o operador OU, o resultado é verdadeiro. NÃO (2>6) Resultado: verdadeiro, pois nega a expres são que é falsa. NÃO (4<5) Resultado: falso, pois nega a expressão que é verdadeira. ANOTAÇÕES MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 13 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL VISUAL G: PROGRAMA DE APOIO PARA CONSTRUÇÃO DE ALGORITMOS Utilizaremos como programa de apoio para escrevermos e testarmos os algoritmos o programa VisuAlg. Você pode obtê-lo gratuitamente pelo link: http://ultraDownloads.com.br/Download/Visualg/ O VisuAlg (Visualizador de Algoritmo) é um programa onde você pode escrever seus algoritmos. Ele interpreta as instruções contidas no seu algoritmo e ao final o executa. Assim você tem a possibilidade de vê-lo funcionando. Isso lhe permite realizar vários testes e conferir se a lógica do seu algoritmo está solucionando o problema proposto. A figura 4.1 mostra a tela do VisuAlg: Figura 4.1 - Tela do programa VisuAlg. Fonte: do autor: 2016. Como dito anteriormente, para que um algoritmo seja útil, é necessário que tanto quem o escreve como quem o executa tenha conhecimento da linguagem adotada e conheça os termos utilizados na instruções. Desta forma, em algoritmos computacionais, a notação uti lizada deve ser entendível por quem escreve e executável pelo computador. Após a escrita do algoritmo, é possível testá-lo através do menu Arquivo, opção Executar, ou simplesmente pela tecla de atalho F9, como pode ser visto na figura 4.2: CAPÍTULO 04 MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 14 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Figura 4.2 - Execução de um algoritmo no programa VisuAlg. Fonte: do autor: 2016. A linguagem utilizada pelo VisuAlg é próxima do português estruturado e será abordada ao longo das próximas aulas. Para facilitar a digitação e evitar confusões, todas as palavras-chave do VisuAlg foram implementadas sem acentos, cedilha, etc. Por tanto, o tipo de dados lógico é definido como logico, o comando se..então..senão é definido como se..então..senão, e assim por diante. O VisuAlg também não distingue maiúsculas e minúsculas no reconhecimento de palavras -chave e nomes de variáveis. Formato básico de um pseudocódigo Os primeiros elementos que compõem o português estruturado e que são elementos obrigatórios em qualquer algoritmo são escritos a seguir: Algoritmo “<nome do algoritmo>” var < declaração de variáveis> inicio < lista de comandos> Fimalgoritmo Onde as palavras algoritmo e fimalgoritmo fazem parte da linguagem e delimitam o início e fim do algoritmo; a <declaração de variáveis> é seção onde declaramos as variáveis, colocando seu nome e tipo; inicio indica o início da seção de comandos; <lista de comandos> é uma indicação do local onde você deve digitar as instruções, que deve ficar entre as palavras reservadas inicio e MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 15 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL fimalgoritmo. O VisuAlg permite a inclusão de comentários: qualquer texto digitado após “//” é ignorado, até atingir o final da sua linha. Se for necessário utilizar mais de uma linha de comentário, cada linha deverá começar por “//”. As palavras que fazem parte da linguagem são conhecidas como palavras reservadas e você não pode utilizá-las em outras seções do código de um algoritmo a não ser naquele onde seu uso foi previsto. Abaixo segue uma tabela (tabela 1) com todas as palavras reservadas da linguagem: Tabela 1 - Lista de palavras reservadas do VisuAlg. aleatorio fimescolha passo algoritmo fimfuncao pausa arquivo fimpara pos asc fimprocedimento real ate fimrepita procedimento carac fimescolha repita caracpnum fimse retorne caractere fimfuncao se caso funcao senao compr inicio timer copia int var cronometro inteiro vetor debug interrompa verdadeiro e leia xou eco limpatela maiusc enquanto logico minusc então maiusc mod escolha minusc nao escreva mod numpcarac escreval nao passo faca numpcarac pausa falso ou pos fimalgoritmo outrocaso real fimenquanto para Fonte: do autor, 2016. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 16 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Programação Sequencial A estrutura sequencial é a estrutura mais simples que utilizamos na construção de al goritmos estruturados. Ela é formada por um conjunto de instruções que serão executados em uma sequencia linear de cima para baixo e da esquerda para a direita, na mesma ordem em que foram escritas. O comando seguinte é executado apenas quando o comando anterior termina a sua execução. A sintaxe básica para uma estrutura sequencial é a seguinte: ALGORITMO DECLARE bloco de instruções FIM_ALGORITMO As variáveis são declaradas após a palavra DECLARE. Comando de atribuição em algoritmo O comando de atribuição é utilizado para atribuir valores ou operações matemáticas a variáveis, e é representado no Visualg pelo símbolo <-. O tipo do dado atribuído para a variável deve ser compatível com o tipo declarado previamente para a variável. Exemplos: a <-10 resposta <- falso peso <- 56.8 materia <- “algoritmo” soma <- resultado Comando de entrada em algoritmo O comando de entrada é utilizado para receber os dados digitados pelo usuário. Os dados recebidos são armazenados em variáveis. Isso permite que o programa receba dados externos, ou seja, dados que o usuário envia para ele. Esse comando é representado pela palavra LEIA. Exemplos: LEIA a Um valor digitado pelo usuário será armazenado na variável a. LEIA materia Um ou vários caracteres digitados pelo usuário serão armazenados na variável materia. LEIA resposta Um dado lógico digitado pelo usuário será armazenado na variável resposta. Comando de saída em algoritmo O comando de saída é utilizado para mostrar os dados no monitor do computador ou imprimi-los em uma impressora. Esse comando é representado pela palavra ESCREVA e ele pode mostrar o conteúdo de variáveis, constantes, expressões ou mensagens. Exemplos: ESCREVA a Mostra o valor armazenado na variávela. ESCREVA “ A matéria escolhida foi:”, matéria Mostra a frase “A matéria escolhida foi:”, seguida Mostra o valor armazenado na variável matéria. ESCREVAresposta Mostra o valor armazenado na variável res posta. ESCREVA(a+b) Mostra o valor resultante do cálculo das variáveis a+b. Com os comandos de atribuição, entrada e saída já é possível desenvolver algoritmos simples. O algoritmo abaixo mostra a resolução de um algoritmo MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 17 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL que recebe o nome de uma pessoa e mostra-o. Exemplo: algoritmo var norne: literal inicio escreva(“Digite o seu nome:”) leia(nome) escreva(nome) fimalgoritmo O algoritmo abaixo mostra a resolução de um algoritmo que recebe o peso e a altura de um atleta, calcula o IMC e mostra. Exemplo: algoritmo var peso, altura, imc: real inicio escreva(“Digite o peso:”) leia(peso)escreva (“Digite a altura:”) leia(altura) imc <- peso / (altura*altura) escreva(“O seu IMC é”, imc) fimalgoritmo O algoritmo abaixo mostra a resolução de um algoritmo que faz um cadastro dos seguintes dados de um animal para um pet shop: o nome do dono do cão, o nome do cão, a sua raça, a sua idade e seu peso. Depois de lidos os dados, eles são mostrados. Exemplo: Algoritmo var nomedono, nomecao, raca : literal idade: inteiro peso: real inicio escreva(“Digite o norne do dono:”) leia(nornedono) escreva(“Digite o nome do cão:”) leia(nomecao) escreva(“Digite a raca:”) leia (raca) escreva(“Digite a idade:”) leia(idade) escreva(“Digite o peso:”) leia(peso) escreval(nomedono) escreval(nomecao) escreval(raca) escreval(idade) escreval(peso) fimalgoritmo Como pode ser observado no código acima, variáveis do mesmo tipo podem ser declaradas na mesma linha entre vírgulas e o comando escreval () serve para pular linha após a escrita. Programação com Decisão MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 18 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Estrutura Condicional Simples Em vários momentos de nossas vidas, precisamos tomar decisões baseadas em condições, por exemplo: “se eu concluir o curso então terei grandes chances de trabalhar em uma empresa multinacional”. A condição no exemplo acima é “eu concluir o curso” e caso isso aconteça (a condição seja verdadeira) ocorrerá a situação descrita a seguir: “terei grandes chances de trabalhar em uma empresa multinacional”. Portanto, só irei trabalhar em uma grande empresa multinacional SE eu passar no curso. Analogamente, nos algoritmos também podemos empregar o uso de condições, para fazer com que o fluxo de execução mude de acordo com alguma situação que tenha ou não ocorrido e para executar instruções que dependam daquela condição. Nos algoritmos a condição é uma expressão lógica, que se torna verdadeira quando é satisfeita ou falsa quando não é satisfeita. Assim, as ações a serem executadas são uma ou várias instruções e só serão realizadas caso a condição seja verdadeira. Vamos colocar a frase acima mais próxima do português estruturado: se “eu concluir o curso” então “Terei grandes chances de trabalhar em uma empresa multinacional” fimse As palavras grifadas são as palavras reservadas que constroem uma estrutura condicional nos algoritmos. A sintaxe para criar uma estrutura condicional simples é: secondição entao comando 1 comando 2 . . . comandoN fimse O(s) comando(s) só será(ão) executado(s) se a condição for verdadeira. Caso a condição seja falsa, esses comandos são desprezados e o algoritmo continua a sua execução a partir da primeira linha depois do fimse. Uma condição é uma expressão lógica que resulta em dois valores verdadeiro ou falso. Você pode colocar apenas um ou vários comandos dentro de um bloco de estrutura condicional simples. Não há limite na quantidade de comandos. As condições são expressões lógicas, ou seja, são formadas por comparações entre variáveis ou entre variáveis e valores. São comparações de igualdade, diferença, maior, maior ou igual, menor, menor ou igual e, portanto utilizam os operadores relacionais. Exemplos: se ( a > 10) então Essa expressão lógica testa se o valor da variável a é maior do que 10. se ( a > 10) então Essa expressão lógica testa se o valor da variável a é maior do que o valor da variável b. O algoritmo abaixo recebe o nome e a idade de uma pessoa. Há uma condição: se (ida de> = 18) que testa se o valor da variável idade é maior ou igual a 18. Caso a expressão seja verdadeira, a mensagem “você pode tirar carta” é exibida. Caso a expressão seja falsa, o algoritmo prossegue a partir do primeiro comando depois da palavra reservada fimalgoritmo. Exemplo: algoritmo var nome: literal idade: inteiro inicio escreva(“Digite seu nome:”) leia(nome) escreva(“Digite sua idade:”) leia(idade) se(idade>=18) entao escreva(“Você pode tirar carta”) fimse fimalgoritmo MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 19 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL O algoritmo abaixo recebe duas notas e calcula a média dessas notas. Há uma condição: se (media>=7) que testa se o valor da variável media é maior ou igual a 7. Caso a expressão seja verdadeira, a mensagem “você está aprovado” é exibida. Caso a expressão seja falsa, o algoritmo prossegue a partir do primeiro comando depois da palavra reservada fimalgoritmo. Exemplo: algoritmo var nota1,nota2,media:real inicio escreva(“Digite a 1ª nota:”) leia(nota1) escreva(“Digite a 2ª nota:”) leia(nota2) media<-(nota1+nota2)/2 se(media>=7) entao escreva(“Você está aprovado”) fimse fimalgoritmo Mas você deve estar pensando: e se o aluno estiver reprovado? O algoritmo não faz nada? Neste algoritmo, não foram previstos um bloco de comandos que executassem quando a condição fosse falsa. Essa construção é possível e extremamente útil. A estrutura que possui resposta tanto para expressões lógicas verdadeiras, quanto falsas, é chamada de estrutura condicional composta, e será estudada na próxima aula. ANOTAÇÕES MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 20 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL LAÇOS DE SELEÇÃO (OU CONDIÇÃO) Estrutura Condicional Composta Na aula anterior vimos como construir um bloco de estrutura condicional simples, onde são previstos apenas comandos para serem executados se a expressão lógica for verdadeira. Porém na maioria dos casos, o algoritmo também deve fornecer resposta ou executar determinados comandos caso a condição seja falsa. A sintaxe para criar uma estrutura condicional composta é mostrada a seguir: se condicão entao comando ou lista de comandos senao comando ou lista de comandos fimse Utilizando o senão, o algoritmo da maioridade ficaria assim: Exemplo: algoritmo var nome: literal idade: inteiro escreva(“Digite seu nome:”) leia(nome) escreva(“Digitesua idade:”) leia(idade) se(idade>=18) entao escreva (“Você pode tirar carta”) senao escreva(“Você deve ter 18 anos para tirar carta”) fimse fimalgoritmo No algoritmo acima, se a condição: se(idade>=18) for verdadeira, a mensagem “você pode tirar carta” é executada. Senão, caso a condição seja falsa, a mensagem “você deve ter 18 anos para tirar carta” é executada. Utilizando o senão, o algoritmo dos aprova dos ficaria assim: Exemplo: algoritmo var nota1,nota2,media:real inicio escreva(“Digite a 1ª nota:”) leia(nota1) escreva(“Digite a 2ª nota:”) leia(nota2) media<-(nota1+nota2)/2 se(media>=7) entao escreva(“Você está aprovado”) senao escreva(“Você está reprovado”) fimse fimalgoritmo No algoritmo acima, se a condição: se (me dia>=7) for verdadeira, a mensagem “você está aprovado” é executada. Senão, caso a condição seja falsa, a mensagem “você está reprovado” é executada. Ainda podemos construir blocos de estrutura condicional com duas ou mais condições conectando-as através dos operadores lógicos E e OU. Suponha o seguinte problema: para que um aluno seja aprovado em uma escola, durante o ano letivo, ele deve ter média igual ou superior a 7.0 e frequência igual ou superior a 75%. De nada adianta o CAPÍTULO 05 MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 21 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL aluno ter 10.0 de média e ter frequência inferior a 75%. O mesmo acontece se o aluno tiver 100% de frequência e notas abaixo da média. Vamos analisar o algoritmo para esse caso: Exemplo: algoritmo var bim1,bim2,bim3,bim4,media,freq:real inicio escreva(“Digitea nota do 1ª bimestre:”) leia(bim1) escreva(“Digite a nota do 2ª bimestre:”) leia(bim2) escreva(“Digite a nota do 3ª bimestre:”) leia(bim3) escreva(“Digite a nota do 4ª bimestre:”) leia(bim4) escreva (“Digite a frequencia do aluno:”) leia(freq) media<-(bim1+bim2+bim3+bim4)/4 se(media>=7) e (freq>=75) entao escreva(“Você está aprovado) senao escreva(“Você está reprovado”) fimse fimalgoritmo O algoritmo acima resolveu o problema da média acima de 7.0 e da frequência acima d 75% com duas condições conectadas pelo operador lógico E. Somente se ambas as condições: se(media>= 7) e se(freq>= 75) forem verdadeiras o aluno “está aprovado”. Caso contrário, se quaisquer umas das condições forem falsas, o resultado também é falso, e o aluno “está re provado”. Como vimos anteriormente, com o opera dor lógico E, somente se ambas as condições forem verdadeiras o resultado é verdadeiro. Em quaisquer outras circunstâncias o resultado é sempre falso. Não há limites para a quantidade de condições em uma estrutura condicional, o que irá delimitar a quantidade é o problema em questão. Estrutura Condicional Composta Escolha-Caso Quando precisarmos comparar o conteúdo de uma variável com uma lista de possíveis valores que esta pode assumir no programa, a estrutura mais apropriada é a estrutura condicional composta escolha-caso. O conteúdo de uma variável é comparado com uma lista de valores constantes incluídos pelo programador. Para cada elemento da lista pode ser incluída a execução de um ou mais comandos, que será executado caso o resultado da comparação seja uma igualdade. Esses comandos são mutuamente exclusivos, ou seja, quando um comando for executado, os demais não o serão. Recomenda-se utilizar esta estrutura quando o programa tiver que apresentar várias opções, como é o caso da escolha de itens em um menu. A sintaxe para criar uma estrutura condicional composta escolha-caso é mostrada a seguir: escolha(variavel) caso valor1 comando ou lista de comandos caso valor2 comando ou lista de comandos outrocaso comando ou lista de comandos fimescolha A estrutura escolha (variável) avalia o valor de uma variável para decidir qual caso será executado. Cada caso está associado a um possível valor que a variável pode assumir. Quando nenhum caso for executado, pois o valor da variável não foi previsto em nenhum dos casos, então será MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 22 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL executado o comando outrocaso. O comando fimescolha é utilizado para estipular o fim da estrutura escolha-caso. A variável testada na estrutura escolha-caso só poderá ser do tipo inteiro, caractere ou literal. Outra construção possível com a estrutura escolha-caso é colocar uma lista de valores entre vírgula, como a seguir: escolha(variavel) caso valorl,valor2,valor3 comando ou lista de comandos caso valor4,valor5,valor6 comando ou lista de comandos outrocaso comando ou lista de comandos fimescolha Neste caso, a estrutura escolha (variável) avalia o valor de uma variável para decidir qual caso será executado. Cada caso possui uma lista de valores possíveis para aquela variável, sendo executado sempre que o valor for igual a qualquer um dos valores previstos entre vírgula. No algoritmo abaixo são lidos dois números inteiros e é apresentado um menu de opções para o usuário, onde ele tem que digitar o número 1para escolher a operação de soma dos números, o número 2 para escolher a operação de subtração dos números, o número 3 para escolher a operação de multiplicação dos números e o número 4 para escolher a operação de divisão dos números. A estrutura escolha-caso(op) testa o valor presente na variável op e caso seja as opções de 1 a 4 realiza os cálculos relativos a cada opção. O comando outrocaso é executado quando a opção digitada pelo usuário é diferente daquelas previstas no menu. No final o resultado da operação é mostrado para o usuário. Exemplo: continuação... algoritmo var n1,n2,op:inteiro result:real inicio escreva(“Digite o 1° número:”) leia(n1) escreva(“Digite o 2° número:”) leia(n2) escreva(“Digite:1 - somar 2 - subtrair 3 - multiplicar 4 - dividir”) leia(op) escolha(op) caso1 result<-n1+n2 caso2 result<- n1-n2 caso3 result<- n1*n2 caso4 result<-n1/n2 outrocaso escreval(“opção invalida”) fimescolha escreva(“Resultado:”,result) fimalgoritmo No algoritmo abaixo a variável testada pela estrutura escolha-caso é uma variável do tipo literal ou caractere. É lida uma senha do usuário. A senha é do tipo literal, e por isso é testada entre aspas (caso “abc”). Caso a senha seja “abc” é mostrada a mensagem “Acesso total ao sistema 11 ao usuário; caso a senha seja “def” é mostrada a mensagem “Acesso parcial ao sistema” ao usuário e finalmente, caso a senha não seja nenhuma das opções anteriores é mostrada a mensagem “Você não tem acesso ao sistema”. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 23 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Exemplo: algoritmo var senha: literal inicio escreva(“Digite a senha:”) leia(senha) escolha(senha) caso”abc” escreval(“Acesso total ao sistema”) caso “def” escreval(“Acesso parcial ao sistema”) outrocaso escreva(“Você não tem acesso ao sistema”) fimescolha fimalgoritmo Você pode testar o mesmo algoritmo trocando o tipo da variável senha para caractere e testando a senha com apenas um caractere que a estrutura escolha-caso também irá executar corretamente. ANOTAÇÕES MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 24 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL LAÇO DE REPETIÇÃO Os laços de repetição, conhecidos também por estruturas de repetição, servem para você repetir um trecho do algoritmo sem ter que digitá-lo várias vezes, o que aumentaria consideravelmente o tamanho do algoritmo. O laço de repetição para é utilizado quando se sabe previamente o número de vezes que um determinado trecho do algoritmo deve ser repetido. Este tipo de laço é dotado de estruturas que permitem a contagem de vezes em que foi executado até que se atinja um limite estipulado. Recomenda-se utilizar este laço de repetição quando se sabe de antemão a quantidade de vezes que ele deve executar. A sintaxe para criar um laço de repetição para é mostrada a seguir: para i de valori ate valorf faca comando ou lista de comandos fimpara A variável i é uma variável de controle do laço, e deve ser uma variável do tipo inteiro. Esta variável não precisa necessariamente se chamar i, ela pode ter outro nome, portanto é comum em algoritmo e nas linguagens de programação nomear a variável do laço para como i. A variável i é uma variável de controle do laço para, e esta recebe um valor inicial (valori) e é incrementada automaticamente a cada repetição, até atingir o valor final (valorf) definido pelo programador, executando assim uma quantidade predeterminada de vezes. O processo de repetição é executado enquanto a variável i tenha um valor menor ou igual ao valor da variável valorf. O laço é finalizado quando a variável i ultrapassar o valor de valorf. Desta forma, o comando ou a lista de comandos são executados tantas vezes quanto for estipulado no laço para. O comando fimpara é utilizado para estipular o fim do laço de repetição para, é ele quem delimita o bloco de comandos que fica dentro do laço. O laço de repetição para é utilizado quando se sabe antecipadamente a quantidade de vezes que um comando ou um conjunto de comandos deve ser executado. No algoritmo abaixo são lidos 10 nomes e idades diferentes. Para isto, foram declaradas a variável nome como literal e as variáveis idade e i como inteiro também. Exemplo: algoritmovar nome:literal i,idade:inteiro inicio para i de 1 ate 10 faca escreva(“Digite o nome:”) leia(nome) escreva(“Digite a idade:”) leia(idade) fimpara fimalgoritmo Se fossemos resolver o algoritmo acima sem a estrutura de repetição para, o algoritmo teria que escrever e ler 10 vezes cada variável: nome e idade. O tamanho do algoritmo ficaria muito extenso, com 40 linhas apenas para as leituras das duas variáveis. O laço de repetição para é inicializado através da sua variável de controle i com o valor 1,e será incrementada até o valor 10, ou seja, a execução do laço para só termina quando a variável de controle i for maior do que 10. O comando fimpara termina a execução do laço de repetição para. O algoritmo mostrado abaixo é um exemplo de um algoritmo envolvendo cálculos. O algoritmo deve contar e mostrar o resultado de todos os números pares de 1 até 100. CAPÍTULO 06 MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 25 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Exemplo: algoritmo var i,cont:inteiro inicio cont<-0 para i de 1 ate 100 faca se ((i mod 2)=0) entao cont<-cont+i fimse fimpara escreva(“Contagem dos números pares:”, cont) fimalgoritmo No algoritmo acima, foram declaradas duas variáveis: a variável cont do tipo inteiro servirá para armazenar a contagem dos números pa res, e a variável contadora i para auxiliar o laço de repetição para. O laço de repetição para foi inicializado com 1 e executará até 100. Isso significa que o laço executará 100 vezes. O comando se((i mod 2) = 0)é responsável para testar se o valor da variável contadora i, em um determinado momento, é par. Caso o resto da divisão (comando mod) da variável por 2 seja igual a 0, isso significa que a variável é par, e então há o cálculo da soma dessa variável com uma variável acumuladora cont, que é inicializada com 0 e servirá para armazenar a contagem de todos os números pares. Uma variável acumuladora tem a seguinte sintaxe: cont <- cont + i Ela deve ser sempre inicializada com o valor 0, e sempre que tal condição seja satisfeita, ela irá acumular o seu valor prévio somado ao valor de outra variável,desta forma acumulando o resultado de uma soma, como é o caso do nosso exemplo. A execução do laço para só termina quando a variável de controle i for maior do que 100. Ao final do laço de repetição para, o valor da variável acumuladora é escrito, apresentado para o usuário a soma de todos os números pares. Laço de Repetição Enquanto O laço de repetição enquanto é uma estrutura que efetua um teste lógico (ou condição) no início, sendo assim, a sua execução está condicionada à veracidade desse teste e só executará se a condição for verdadeira. O laço é executado retornando novamente ao teste lógico e assim o processo será repetido enquanto a condição testada for verdadeira. Se a condição for falsa logo no primeiro teste, o laço não executa. Este laço é mais indicado em casos onde não se sabe a quantidade de vezes que um determinado trecho de código deve ser repetido, e sim quando a sua repetição está condicionada à veracidade de um teste lógico. A sintaxe para criar um laço de repetição enquanto é mostrada a seguir: enquanto condição faca comando ou lista de comandos fimenquanto O comando enquanto é seguido de uma condição, ou teste lógico, e depois da palavra faca, seguido por um comando ou lista de comandos e finalizando com a palavra fimenquanto. O laço permanece em execução enquanto a condição for verdadeira, terminando a sua execução quando a mesma se tornar falsa. Devemos nos atentar à variável testada pela condição do laço enquanto. Se o valor da variável testada na condição não for alterado dentro do próprio laço enquanto, o laço pode executar sem parar, pois a condição de teste nunca ficará falsa, e dessa forma dizemos que o laço fica em loop infinito. Um exemplo de execução de um laço enquanto, com loop infinito: Exemplo: MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 26 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL algoritmo var resp: literal num:real inicio resp<- “nao” enquanto resp = “nao” faca num<- rand() escreval(“Numero randômico:”,num) fimenquanto fimalgoritmo O algoritmo acima foi desenvolvido para escrever na tela valores gerados randomicamente pela função rand(). Existe um laço enquanto que executa baseado na veracidade da condição resp = “nao”. Observe que a variável resp, que será testada pela condição, deve ser inicializada antes de ser utilizada, como foi o caso do exemplo:resp<- “nao” ou deve ter seu valor lido pelo usuário. Neste caso, a variável respfoi inicializada com o valor “nao”, pois é o valor que lhe dará acesso de entrada no laço. O laço enquanto irá repetir enquanto o valor de resp for igual a “nao”. Acontece que o valor da variável respnão é alterado dentro do laço, portanto seu valor será sempre “nao” e isso acarretará um loop infinito, ou seja, o programa não deixa nunca de executar o laço, pois a condição testada no início nunca fica falsa. Podemos corrigir o programa acima, com o exemplo a seguir: Exemplo: inicio resp<- “nao” enquanto resp= “nao” faca num <- rand() escreval(”Numero randômico:”,num) escreval(”Deseja sair? (sim/nao)”) leia(resp) fimenquanto fimalgoritmo algoritmo var resp : literal num: real continua Observe que adicionamos os comandos escreval(“Deseja sair? (sim/não)”) leia(resp) Desta forma, o usuário tem a opção de responder “sim” - quero sair do programa - e a execução do laço termina, pois a condição testada fica falsa. Veja o exemplo de um algoritmo cuja condição de parada é invalidada pelos comandos internos ao laço enquanto. O algoritmo deve ler uma quantidade indeterminada de números e a condição de parada é quando o programa ler 5 números negativos. Exemplo: algoritmo var cont,num : inteiro inicio cont <- 0 enquanto cont < 5 faca escreval(”Digite um numero”) leia(num) se(num < 0) entao cont <- cont + 1 fimse fimenquanto continua MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 27 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL escreval(”Quantidade de numeros negativos: “,cont) fimalgoritmo No algoritmo acima, foram declaradas duas variáveis, a variável cont é uma variável contadora e serve para contar a quantidade de números negativos (os contadores são explicados detalhadamente na próxima aula). A variável num serve para armazenar o número lido. A condição de entrada no laço enquanto é o contador ser menor do que 5. Para isso, deve-se inicializar a variável contadora com o valor 0. Depois de lido o número dentro do laço, há um teste se (num < 0) que irá verificar se o número digitado é negativo, caso seja, a variável contadora irá atualizar em 1 o seu valor. O laço só termina a sua execução quando forem lidos 5 números negativos. Neste exemplo, a variável testada na condição do laço enquanto (cont) é atualizada por uma expressão aritmética cont <- cont + 1 dentro do próprio laço, evitando loop infinito. Contadores e Acumuladores Foi utilizado na aula anterior o conceito de contador, portanto é necessário aprender sobre os contadores e também os acumuladores, pois são mecanismos de contagem muito utilizados dentro de laços de repetição. Contador O contador é utilizado para contar o número de vezes que um determinado evento ocorre. Obrigatoriamente é utilizado dentro de laços de repetição que não possuem quantidade fixa de execuções, como o caso dos laços de repetição repita e o enquanto. Um contador é sempre inicializado em 0 e é somado com a constante1, mas também pode ser somado a outras constantes. A sua sintaxe é: variavel <-0 variavel <- variavel + constante Onde variável deve ser uma variável numérica do tipo inteiro ou real e primeiramente deve-se inicializa-la com 0, para garantir que seu valor inicial seja conhecido. A constante determina o valor do incremento, que normalmente é 1, mas que não impede de ser outra constante. Abaixo segue um exemplo de um contador chamado cont: Exemplo: cont <- 0 cont <- cont+1 Ele é inicializado com o valor 0 e na próxi ma linha, a instrução cont <- cont + 1 soma o seu conteúdo anterior com o valor 1. Assim, a cada execução dessa instrução, a variável é somadacom o valor 1. Um exemplo gráfico do funcionamento do contador por ser visto na tabela 10: Tabela 1- Demonstração do funcionamento do contador. cont con<-cont+1 0 0<-0+1 1 1<-1+1 2 2<-2+1 3 3<-3+1 4 Fonte: do autor, 2016. O exemplo abaixo mostra o uso do conta dor dentro de um laço de repetição enquanto. O contador cont é inicializado com o valor 0, o laço executa enquanto o número digitado pelo usuário for diferente de -1, e o contador dentro do laço servirá para contar quantos números o usuário digitou. Exemplo: algoritmo num,cont:inteiro inicio //Seção de Comandos cont <-0 escreva(“Digite um número:(-1 para sair):”) continua MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 28 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL leia(num) enquanto num<> -1 faca escreval(“Você digitou:”,num) escreva(“Digite outro número(-1 para sair):”) leia(num) cont<-cont+1 fimenquanto escreva(“Você digitou”,cont,”números antes de digitar -1 para sair.”) fimalgoritmo Acumulador (ou Somador) O acumulador é utilizado para obter somatória de uma variável. Obrigatoriamente é utilizado dentro de laços de repetição, que neste caso podem ser os laços de repetição para, repita e o enquanto. Um acumulador é sempre inicializado em 0 e seu valor é somado com o valor de outra variável, que é o valor a ser acumulado. A sua sintaxe é: variavel1<-0 variavel1<- variavel1 + variavel2 Onde variável1 deve ser uma variável nu mérica do tipo inteiro ou real e primeiramente deve-se inicializa-la com 0 para garantir que seu valor inicial seja conhecido, e a variavel2 indica uma segunda variável que será o valor a ser acumulado (somado). Abaixo segue um exemplo de um acumula dor chamado ac: Exemplo: ac<-0 ac<- ac + nota Ele é inicializado com o valor 0 e na próxima linha, a instrução ac<- ac + nota soma o seu conteúdo anterior com o conteúdo da va riável nota. Assim, a cada execução dessa ins trução, a variável ac tem seu valor acumulado (somado) ao valor de nota. O exemplo abaixo mostra o uso do acumu lador dentro de um laço de repetição para. o acumulador ac é inicializado com o valor 0, o laço executa 4 vezes e o acumulador dentro do laço tem a função de somar as quatro notas digitadas pelo usuário para o cálculo da média aritmética. Exemplo: algoritmo var i:inteiro nota,media,ac:real inicio //Seção de Comandos ac<-0 para i de 1 ate 4 faca escreva(“Digite a “,i,” a nota:”) leia(nota) ac<-ac+nota fimpara media<-ac/4 escreva(“A sua média bimestral é:”, media) fimalgoritmo A tabela 2 demonstra uma simulação do algoritmo acima: Tabela 2 - Demonstração do funcionamento do acumulador. ac nota ac<-ac+nota 0 9 0<-0+9 9 7.5 9<-9+7.5 16.5 8.5 16. 5< -16.5+8.5 25 10 25<-25+10 35 Fonte: do autor, 2016. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 29 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Como pode ser observado na tabela #, o valor do acumulador começa em 0 e é somado à variável nota, que é 9. Tem-se então: 0 + 9 = 9. O próximo valor armazenado na variável ac é 9 que deve ser somado à próxima nota, temos então: 9 + 7.5 = 16.5. As somas ocor rem até a quarta execução do laço de repetição para, onde o valor da variável acumuladora ac é somado à ultima nota, assim: 25 + 10 = 35. Ao final da execução do laço para, a variável acumuladora possui o valor 35. Este valor é a soma de todas as notas, que deve então ser dividido por 4 para obter a média aritmética. Laço de Repetição Repita O laço de repetição repita é uma estrutura que permite que um comando ou um conjunto de comandos sejam executados até que o resultado do teste lógico seja verdadeiro. Este laço também é indicado em casos onde não se sabe a quantidade de vezes que um determinado trecho de código deve ser repetido, e sim quando a sua repetição está condicionada à veracidade de um teste lógico. Neste caso o laço é executado pelo menos uma vez, pois a condição é testada no final do laço. Se o resultado da condição for falso o laço é executado novamente até que o resultado da condição seja verdadeiro. Este laço difere do enquanto pelo fato dele executar pelo menos uma vez antes de passar pela condição de teste, já o laço enquanto, não executa nenhuma vez caso a condição de teste seja falsa. A sintaxe para criar um laço de repetição repita é mostrada a seguir: repita comando ou lista de comandos ate condição O comando repita aparece no início do laço, seguido pelo comando ou lista de comandos. O último comando do laço é o ate seguido da condição, que é um teste lógico. O laço permanece em execução até que a condição se torne verdadeira, quando para de executar. Vamos transcrever o exemplo do algoritmo que foi desenvolvido com o laço enquanto para o laço repita. O algoritmo deve ler uma quantidade indeterminada de números e a condição de parada é quando o programa ler 5 números negativos. O algoritmo com o laço repita irá ler pelo menos um número, pois ele executa pelo menos uma vez até testar a sua condição, que fica no final do laço. Exemplo: algoritmo var cont,num:inteiro inicio //Seção de Comandos cont<-0 repita escreval(“Digite um numero”) leia(num) se(num < 0) entao cont <- cont+1 fimse ate cont >4 escreval(“Quantidade de números negativos:”,cont) fimalgoritmo No algoritmo acima, foram declaradas duas variáveis, a variável cont é uma variável contadora e serve para contar a quantidade de números negativos. A variável num serve para armazenar o número lido. O laço é executado pelo menos uma vez, mas como a condição de parada do laço é a leitura de 5 números negativos, isso não vai acarretar problemas. A condição de parada do laço repita é o contador ser maior do que 4 (ele ser 5). Para isso, deve-se inicializar a variável contadora com o valor 0. Depois de lido o número dentro do laço, há um teste se (num < 0) que irá verificar se o número digitado é negativo, caso seja, a variável contadora irá atualizar em 1 o seu valor. O laço só termina a sua execução quando forem lidos 5 números negativos. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 30 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Neste exemplo, a variável testada na condição do laço enquanto (cont) é atualizada por uma expressão aritmética cont <- cont + 1 dentro do próprio laço, evitando loop infinito. Outro exemplo com o laço repita pode ser observado a seguir, mostrando que a condição de teste realizada no final pode envolver duas condições unidas pelo operador lógico e ou pelo operador lógico ou: Exemplo: algoritmo var preco, npreco:real produto:literal resp:caractere inicio resp<- “s” repita escreval(“Digite o nome do produto”) leia(produto) escreval(“Digite o preço do produto”) leia(preco) npreco<-preco*1.3 escreval(“O novo preço de ”,produto,”é = “,npreco) escreval(“Deseja continuar S/N”) leia(resp) ate(resp=“N”) ou (resp= “n”) fimalgoritmo O algoritmo acima realiza a leitura do nome de um produto e seu preço, calcula o reajuste do preço desse produto em 30% e mostra para o usuário. O algoritmo fica repetindo até que o usuário digite “n” OU “N” para sair. Foram declaradas as variáveis preco e produto para serem lidas pelo usuário; npreco para armazenar o valor de um cálculo aritmético de aumento de 30% do preço e resp para armazenar a resposta do usuário em querer ou não continuar a execução do programa. Note que há duas condições depois do até do laço repita: ate (resp = “N”) ou (resp = “n”) Essas condições estão unidas pelo opera dor lógico ou o que quer dizer que, se o usuário digitar o caractere “n” OU o caractere “N” a execução do laço é interrompida. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 31 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL VETORES A declaração de variáveis únicas é eficiente na construção de algoritmos para entrada/saída de dados e armazenamento de cálculos, porém é insuficiente em muitos problemas com putacionais, como é o caso, por exemplo, se você desejar ler o nome e a nota de 40 alunos de uma sala de aula. Você teria que declarar 40 variáveis e armazenar uma a uma? Isso se torna inviável. É aí que os vetores, conhecidos também como variáveis indexadas unidimensionais, en tram em cena. Eles correspondem a posições sequenciais de memória, identificadas por um único nome cujo conteúdo é de um mesmo tipo - assim como as variáveis únicas - mas são individualizadas por índices. Dessa forma é possível, armazenar em uma única estrutura, vários valores diferentes. O nome que deve ser dado a uma variável composta é um identificador que obedece às mesmas regras deformação de identificadores de variáveis únicas. O nome irá se referir a to dos os elementos da variável composta, onde cada uma delas será diferenciada apenas pelo número do índice, que é a sua localização den tro da estrutura. A sintaxe de declaração de um vetor é a seguinte: identificador: vetor [índice-inicial..índice-final] de tipo Onde identificador é o nome do vetor; a palavra vetor é uma palavra reservada da pseudolinguagem e deve ser utilizada para in dicar que é um vetor; o índice-inicial..índice -final devem vir entre colchetes, da seguinte forma[0 ..n-1] começando por 0 e indicar o ta manho final em n-1; de é uma palavra reser vada que deve ser incluída antes do tipo (que podem ser inteiro, real, caractere ou literal). A declaração de um vetor chamado nome, com 5 posições é: nome: vetor[0..4] de literal Onde nome indica o identificador do vetor que terá 5 posições iniciando o índice em 0 e terminando em 4 (n-1), e será do tipo inteiro. Este vetor possui a seguinte estrutura: Onde a primeira posição do vetor é representada pelo índice 0, a segunda posição representada pelo índice 1 e assim sucessivamente, até n-1. No exemplo acima, declaramos um vetor nome para armazenar nomes de pessoas com 5 posições, então a primeira posição inicia-se em 0 e termina em 4 (n-1). Para referenciar um elemento em particular, é necessário colocar o nome da variável, seguido do índice, entre colchetes. Nas próximas linhas é demonstrado o preenchimento do vetor nome, com 5 nomes diferentes: Exemplo: nome[0]<- “Julio” nome[1]<- “Nara” nome[2]<- “Hilton” nome[3]<- “Lucimara” nome[4]<- “Emerson” É preciso colocar o nome do vetor seguido do índice, o comando de atribuição e o valor. Como neste exemplo o vetor é do tipo literal, o valor deve vir entre aspas. Após esta atribui ção, o vetor ficará assim: Para realizar a atribuição em um vetor numérico, não se deve utilizar as aspas. O exemplo abaixo demonstra a declaração e o preenchimento de um vetor numérico, chamado nota, do tipo real: Exemplo: nome Julio Nara Hilton Lucimara Emerson 0 1 2 3 4 nota: vetor[0 ..2] de real nota[0] <-9.5 nota[1] <-9 nota[2] <-6.5 nome 0 1 2 3 4 CAPÍTULO 07 MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 32 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL No exemplo acima, foi colocado o nome do vetor seguido do índice, o cornando de atribulção e o valor, mas neste caso sem aspas, por se tratar de valores reais. Assim como os reais, os inteiros também não devem vir entre aspas. Após esta atribuição, o vetor ficará assim: nota 9.5 9 6.5 0 1 2 Após as atribuições, o vetor fica preenchido e já é possivel escrever na tela os valores armazenados. 0 exemplo a seguir escreve na tela o conteúdo de uma determinada posição de um vetor: Exemplo: escreva(nota[1]) No exemplo acima, a nota 9, que ocupa a segunda posição do vetor, seria impressa na tela. Suponha que você tenha um vetor com muitas posições e queira ler e imprimir seus valores de forma mais rápida, pois nos casos acima, você teria que ler cada elemento do vetor individualmente. Neste caso o mais indica do é utilizar o laço de repetição para. O laço de repetição para é ideal para a leitura e escrita dos elementos de um vetor, pois é o laço onde o programador pode definir a quantidade de vezes que ele irá executar e essa quantidade é exatamente o número total de elementos de um vetor. Armazenamento e Leitura de Dados de um Vetor Como foi visto na aula anterior, é possível fazer a leitura de dados de um vetor com o laço de repetição para. Este laço, através de sua estrutura, permite ser inicializado com o índice do primeiro elemento do vetor e ser finalizado com o índice do último elemento. Como exemplo, o algoritmo abaixo fará a leitura de 5 nomes digitados pelo usuário, armazenando num vetor chamado nome. Exemplo: algoritmo var i:inteiro nome: vetor[0..4] de literal continua inicio para i de 0 ate 4 faca escreval(“Digite o”, i+1, “o nome:”) leia(nome[i]) fimpara fimalgoritmo O exemplo acima declara a variável i para funcionar como o contador do laço de repetição para e ao mesmo tempo como a variável do índice do vetor. Foi declarado um vetor identificado por nome que possui 5 posições, onde a primeira posição começa com o índice 0 e a última possui o índice 4 (n-1). O laço de repetição para foi inicializado da seguinte forma: para i de 0 ate 4 faca Onde i é a variável contadora do laço para e será inicializada com o valor 0 e contará até o seu valor atingir o valor 4, executando desta forma, 5 vezes os comandos dentro do laço. Observe os dois comandos a seguir: escreval(“Digite o ”, i+1, “o nome:”) leia(nome[i]) Onde o comando escreval informa ao usuário para digitar o i-ésimo+ 1 nome, onde no local de i, será mostrado na tela o valor corrente do contador somado com 1(isso se deve ao fato do contador ser iniciado em 0). O comando leia fará a leitura do valor corrente digitado pelo usuário e armazenará no vetor nome, na posição corrente do contador, igualmente, i. A tabela 1 mostra o teste de mesa realizado para a leitura dos elementos do vetor: Tabela 1 - Teste de mesa da leitura dos elementos do vetor. i escreval nome[i] 0 Digite o 1° nome Julio 1 Digite o 2° nome Nara 2 Digite o 3° nome Hilton 3 Digite o 4° nome Lucimara 4 Digite o 5° nome Emerson Fonte: do autor, 2016. MUNDI - UNIVERSO EDUCACIONAL Módulo I - Técnicas de Programação 33 COPYRIGHT © 2007 by@ MUNDI LTDA. PROPRIEDADE INTELECTUAL PROTEGIDA. PROIBIDA SUA REPRODUÇAO TOTAL OU PARCIAL Uma vez armazenados os valores em um vetor, este pode ser escrito sequencialmente, com a ajuda de um laço de repetição para. Anteriormente, com o uso de variáveis únicas, a cada leitura na mesma variável o valor anterior era sobrescrito, com vetores esse problema é eliminado, pois há os índices que armazenam para a mesma variável, em posições diferentes, valores diferentes. Como exemplo, o trecho de algoritmo abaixo fará a escrita dos 5 nomes digitados pelo usuário.
Compartilhar