Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Lógica de Programação, Notas de estudo de Informática

Muitos anos se passaram desde os primórdios da história da computação, mas apesar de já termos vivido vários paradigmas de programação, existe uma base de conhecimento que não mudou e não mudará nunca ? a Lógica de Programação.

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 24/09/2008

anderson-zanichelli-8
anderson-zanichelli-8 🇧🇷

1 documento

Pré-visualização parcial do texto

Baixe Lógica de Programação e outras Notas de estudo em PDF para Informática, somente na Docsity! Edited by Foxit Reader Copyright(C) by Foxit Software Company,2005-2007 For Evaluation Only. MAMMA á postilandoscom O maior Site de apostilas da Internet Apartir deste arquivo o Upload foi realizado por Furions CopyrightO Furionsô | Upload by. Furionsô | 2008 | Mantenha os Créditos afinal de contas esse é salário. APOSTILA DE LÓGICA DE PROGRAMAÇÃO Autor: Elias Andrade Pereira APOSTILA DE LÓGICA DE PROGRAMAÇÃO PARTE I Apostila de Lógica de Programação – Parte I 1 LÓGICA DE PROGRAMAÇÃO 1. INTRODUÇÃO Muitos anos se passaram desde os primórdios da história da computação, mas apesar de já termos vivido vários paradigmas de programação, existe uma base de conhecimento que não mudou e não mudará nunca – a Lógica de Programação. Faço uma associação direta da Lógica de Programação com o Raciocínio Matemático, onde o importante é a interpretação de um problema e a utilização correta de uma fórmula, e não a sintaxe pré-definida da mesma. O saber da Lógica está no “praticar”. Não existem “fórmulas” em Informática, o que existe é o aperfeiçoamento de nossa forma de pensar e raciocinar sobre um problema, podendo extrair do mesmo uma solução eficiente e eficaz, sob um determinado ângulo de visão. Assim, verificamos que é preciso aprender a pensar sobre os problemas, extraindo deles o máximo de informações. A solução que criamos para um determinado problema necessita ser exteriorizada e expressa numa linguagem publicamente conhecida. Assim, utilizamos a lógica de programação para desenvolver nossas soluções e os algoritmos para apresentar essas soluções ao mundo. Venho acompanhando nos últimos anos vários livros de Algoritmos e Estruturas de Dados. Todos ensinam como representamos estruturas de controle e atribuições, ou como declaramos variáveis, mas nenhum deles – que eu tenha lido até o momento –, orientou o aluno na forma de pensar. Precisamos mais do que “fórmulas”, precisamos aprender a pensar.  Os princípios da programação estruturada surgidos no final da década de 60 – introduzidos por Dijkstra – levaram a necessidade de se ter uma linguagem que implementasse essas idéias, já que as linguagens de época (FORTRAN, COBOL e BASIC) não permitiam aplicar claramente as técnicas ensinadas. Assim, o professor Niklaus Wirth e Apostila de Lógica de Programação – Parte I 2 seus colegas da Universidade Técnica de Zurique (Suíça) desenvolveram, no início dos anos 70, a linguagem PASCAL – uma derivação da linguagem ALGOL 60, porém de implementação mais simples e com uma estrutura de dados mais poderosa. O nome Pascal foi uma homenagem a Blaise Pascal, famoso matemático, que criou a calculadora baseada em discos de madeira, que foi a predecessora da calculadora de mesa e serviu de inspiração para diversos computadores. Assim, nossa apostila oferecerá, inicialmente, conceitos gerais sobre Programação. Posteriormente, vocês terão exercícios de Raciocínio Matemático que lhes exercitarão o poder de PENSAR! Em seguida, apresentaremos como desenvolver algoritmos de soluções para Sistemas. E por último, vamos conhecer a Linguagem Pascal, a fim de vermos nossos algoritmos funcionando – ao vivo e à cores ! 2. CONCEITOS GERAIS PROGRAMAÇÃO ESTRUTURADA A Programação Estruturada pode ser entendida como uma forma de programar que visa facilitar a escrita, entendimento, validação e manutenção de programas. Para Dijkstra, “a arte de programar consiste na arte de organizar e dominar a complexidade”. A Programação Estruturada procurar reduzir o nível de complexidade através de três níveis: a) desenvolvimento do programa em diferentes fases por refinamento sucessivo (desenvolvimento top-down); b) decomposição do programa total em módulos funcionais, organizados de preferência num sistema hierárquico; c) uso de um número limitado de estruturas básicas de fluxo de controle dentro de cada módulo. Apostila de Lógica de Programação – Parte I 3 DESENVOLVIMENTO TOP-DOWN Na Programação Estruturada, ao desenvolvermos um algoritmo, temos como objeto um produto final – o programa. Todavia, para termos esta transição, passamos por várias fases, no sentido “cima para baixo”, onde cada fase é documentada e principalmente obtida por “refinamento” da fase anterior, até chegarmos a um nível de detalhamento que permita implementar o algoritmo diretamente na linguagem de programação. MODULARIZAÇÃO A solução final de um problema é obtida através de soluções de subproblemas, o que permite dividir o programa em módulos com subfunções claramente delimitadas, que podem, inclusive, ser implementados separadamente, por diversos programadores de uma equipe. ESTRUTURAS DE CONTROLE São representadas pela seqüência simples, o comando condicional e o comando repetitivo, e fornecem ao programador um aumento da legibilidade e compreensão de cada módulo de programa. Assim, temos como uma das principais normas da Programação Estruturada : não usar comandos de desvio (GOTO). CONFIABILIDADE Medimos a confiabilidade de um sistema através de sua resposta ao uso constante, no tocante a: - não apresentar erros; e, - corresponder às especificações. Atualmente, a sociedade está totalmente dependente dos sistemas de computação. Assim, aumenta exponencialmente a importância do nosso trabalho. Nos fins dos anos 60, constatou-se que as sistemáticas usadas pelos programadores eram os grandes responsáveis pela baixa confiabilidade dos programas. Como solução destes problemas, surgiu a Programação Estruturada (PE). Apostila de Lógica de Programação – Parte I 6 4. Qual o número que completa a seqüência: 1, 1, 2, 3, 5, ... (a) 5 (b) 6 (c) 7 (d) 8 (e) 9 5. Num concurso de saltos, Maria foi, simultaneamente, a 13ª melhor e 13ª pior. Quantas pessoas estavam em competição ? (a) 13 (b) 25 (c) 26 (d) 27 (e) 28 6. Bruno é mais alto que Joaquim. Renato é mais baixo que o Bruno. Então, Joaquim é o mais alto dos três. ( ) Verdadeiro ( ) Falso 7. O preço de um produto foi reduzido em 20% numa liquidação. Qual deverá ser a percentagem de aumento do preço do mesmo produto para que ele volte a ter o preço original ? (a) 15% (b) 20% (c) 25% (d) 30% (e) 40% Use a descrição abaixo para resolver os exercícios 8 e 9. Chapeuzinho Vermelho ao entrar na floresta, perdeu a noção dos dias da semana. A Raposa e o Lobo Mau eram duas estranhas criaturas que freqüentavam a floresta. A Raposa mentia às segundas, terças e quartas-feiras, e falava a verdade nos outros dias da Apostila de Lógica de Programação – Parte I 7 semana. O Lobo Mau mentia às quintas, sextas e sábados, mas falava a verdade nos outros dias da semana. 8. Um dia Chapeuzinho Vermelho encontrou a Raposa e o Lobo Mau descansando à sombra de uma árvore. Eles disseram: Raposa: “Ontem foi um dos meus dias de mentir” Lobo Mau: “Ontem foi um dos meus dias de mentir” A partir dessas afirmações, Chapeuzinho Vermelho descobriu qual era o dia da semana. Qual era? 9. Em qual dia da semana é possível a Raposa fazer as seguintes afirmações? Eu menti ontem. Eu mentirei amanhã. 10. (ESAF) José quer ir ao cinema assistir ao filme “Fogo Contra Fogo”, mas não tem certeza se o mesmo está sendo exibido. Seus amigos, Maria, Luis e Julio têm opiniões discordantes sobre se o filme está ou não em cartaz. Se Maria estiver certa, então Julio está enganado. Se Julio estiver enganado, então Luís está enganado. Se Luis estiver enganado, então o filme não está sendo exibido. Ora, ou o filme “Fogo conta Fogo” está sendo exibido, ou José não irá ao cinema. Verificou-se que Maria está certa. Logo,. (a) O filme “Fogo contra Fogo” está sendo exibido (b) Luis e Julio não estão enganados (c) Julio está enganado, mas Luis não. (d) Luis está enganado, mas Julio não. (e) José não irá ao cinema. 4. ALGORITMOS Segundo Wirth, “programas são formulações concretas de algoritmos abstratos, baseados em representações e estruturas específicas de dados”. Apostila de Lógica de Programação – Parte I 8 De forma bem simples, um algoritmo pode ser definido como “um conjunto de passos lógicos, bem definidos, que descreve a solução de um problema”. Ao pensarmos na solução de um problema, encontramos ações imperativas que são expressas por comandos. Os algoritmos não são aplicados apenas ao mundo da Informática; pelo contrário, usamos – até sem perceber – algoritmos em todos os momentos de nossa vida. Uma receita de cozinha é claramente um algoritmo. Veja um exemplo: Faça um algoritmo para “Ir de casa para o trabalho de ônibus” Solução 1 Algoritmo Trajeto_Casa_Trabalho_V1 início Andar até o ponto de ônibus Aguardar o ônibus Ao avistar o ônibus correto, fazer sinal Entrar no ônibus pela porta traseira Pagar passagem Escolher um assento e sentar Quando chegar próximo do local a saltar, dar o sinal para descida No ponto, descer do ônibus, pela porta dianteira Andar até o trabalho fim Veja que resolvemos esse algoritmo em 9 passos, todavia se pedirmos que n pessoas resolva o mesmo problema, provavelmente, teremos n respostas diferentes. Isto ocorre pois, normalmente, abstraímos um problema, de ângulos diferentes, com maior ou menor riqueza de detalhes. Apostila de Lógica de Programação – Parte I 11 Podemos pensar também num algoritmo como um “mecanismo” de transformação de entradas em saídas. Assim, um algoritmo ao ser “executado”, receberá algumas entradas, que serão processadas e nos devolverá algumas saídas. FLUXO DE CONTROLE EM ALGORITMOS Um algoritmo é um texto estático, onde temos vários passos que são lidos e interpretados de cima para baixo. Para que venhamos a obter o(s) resultado(s) deste algoritmo, necessitamos “executá-lo”, o que resulta em um processo dinâmico. No fluxo de controle identificamos em cada passo da execução qual é o próximo comando a ser executado. A compreensão da lógica de programação de um algoritmo está diretamente ligada a compreensão de seu fluxo de controle. A partir de uma compreensão correta, podemos traçar as diversas execuções possíveis de um algoritmo. Se testarmos todas essas possibilidades, e obtivermos resultados corretos, podemos ter certeza de estar entregando um produto final confiável. Os iniciantes no mundo da programação encontram alguma dificuldade em diminuir a distância conceitual que separa a representação estática de um algoritmo do(s) processo(s) dinâmico(s) de sua execução. É importante frisar que quando nos propomos a   Apostila de Lógica de Programação – Parte I 12 entender um algoritmo, lidamos fisicamente com um texto, mas mentalmente temos processos. CRIANDO ALGORITMOS Toda linguagem é composta de sintaxe e semântica, onde a sintaxe corresponde à forma e a semântica corresponde ao conteúdo. Vocês devem aprender a sintaxe dos comandos, mas a principal preocupação deve ser de “como usar esses comandos”. Regras para criação de bons algoritmos 1. Use comentários com freqüência. Isto torna o algoritmo mais legível e facilita o entendimento da lógica empregada. Seus algoritmos deverão ser lidos e entendidos por outras pessoas (e por você mesmo) de tal forma que possam ser corrigidos e receber manutenção. Obs: Não se esqueça de atualizar os comentários, em caso de manutenção. Pior do que um programa sem comentários, é um programa com comentários errados. 2. Use comentários, também, no cabeçalho do algoritmo, incluindo, principalmente: - descrição do que faz o algoritmo - autor - data de criação 3. Escolha nomes de variáveis significativos, todavia evite nomes muito longos. Ex: Prefira SalBruto ou SalarioBruto ao invés de SB ou VAR1 Prefira TotAlunosAprovDireta ao invés de TotalAlunosAprovacaoDireta 4. Destaque as palavras-chave das estruturas de controle e comandos com sublinhado. Ex: se media >= 7 então ... senão ... fim-se 5. Utilize espaços e linhas em branco para melhorar a legibilidade. Apostila de Lógica de Programação – Parte I 13 6. Coloque apenas um comando por linha. Vários comandos em uma linha causa ilegibilidade e dificulta a depuração. 7. Utilize parênteses para aumentar a legibilidade e prevenir-se de erros. 8. Use identação nos comandos de acordo com o nível que estejam, ou seja, alinhe comandos de mesmo nível e desloque comandos de nível inferior. Ex.: início comando 1; se condicao1 então comando2; comando3; senão comando4; comando5; fim-se comando6; fim Método para desenvolvimento de algoritmos 1. Faça uma leitura de todo o problema até o final, a fim de formar a primeira impressão. A seguir, releia o problema e faça anotações sobre os pontos principais. 2. Verifique se o problema foi bem entendido. Questione, se preciso, ao autor da especificação sobre suas dúvidas. Releia o problema quantas vezes for preciso para tentar entendê-lo. 3. Extraia do problema todas as suas saídas. 4. Extraia do problema todas as suas entradas. 5. Identifique qual é o processamento principal. 6. Verifique se será necessário algum valor intermediário que auxilie a transformação das entradas em saídas. Esta etapa pode parecer obscura no início, mas com certeza no desenrolar do algoritmo, estes valores aparecerão naturalmente. 7. Teste cada passo do algoritmo, com todos os seus caminhos para verificar se o processamento está gerando os resultados esperados. Crie valores de teste para submeter ao algoritmo. 8. Reveja o algoritmo, checando as boas normas de criação. Conselho: Só tente conseguir o ótimo, depois de realizar o bom. Apostila de Lógica de Programação – Parte I 16 REAL: qualquer número real, negativo, nulo ou positivo Ex.: -1, -0.5, 0, 5, 9.5 CARACTER: qualquer conjunto de caracteres alfanuméricos Ex.: “AB”, “ 123”, “ A123” , “CASA” LÓGICO: conjunto de valores ( FALSO ou VERDADEIRO ) COMENTÁRIOS Comentários devem ser inseridos no algoritmo a fim de esclarecer o desenvolvimento do mesmo. Os comentários são inseridos entre { e }. { Texto de comentário delimitado por chaves } COMANDO DE ATRIBUIÇÃO Ao criarmos uma variável, partimos do princípio que em algum momento ou vários momentos dentro do nosso algoritmo, ela receberá valores, ou seja, armazenaremos dados na memória através de nossas variáveis. Para atribuirmos um valor ou uma expressão a uma variável, utilizamos o comando de atribuição ←. Assim, a sintaxe do comando é: identificador ← expressão ; ✍ Exemplo: Salario ← 1000 Nome ← ‘Ana’ Apostila de Lógica de Programação – Parte I 17 OPERADORES ARITMÉTICOS É comum necessitarmos realizar cálculos matemáticos com as informações que estamos manipulando. Para isso, é necessário sabermos qual a representação dos símbolos de operações matemáticas. Vejamos: Operador Operação Exemplo + Adição 10 + 15 - Subtração 20 – 10 * Multiplicação 3 * 5 / Divisão (onde o resultado será um número real) 5 / 2 = 2,5 DIV Divisão (onde o resultado será um número inteiro) 10 div 2 = 5 7 div 2 = 3 MOD Resto de uma divisão 7 mod 2 = 1 ** ou exp(a, b) Exponenciação 5 ** 2 ou exp(5, 2) OPERADORES RELACIONAIS Além de operações matemáticas, é freqüente nossa necessidade em comparar informações. Por exemplo: Se média for maior ou igual a 7. Para isso, utilizamos operadores relacionais. Operador Relação = Igualdade ≠ Diferente > Maior que ≥ ou >= Maior ou igual que < Menor que ≤ ou <= Menor ou igual que Apostila de Lógica de Programação – Parte I 18 OPERADORES LÓGICOS É freqüente precisarmos analisar expressões lógicas, aquelas que só possuem dois valores possíveis: Verdadeiro ou Falso. Os operadores usados em expressões lógicas são os Operadores Lógicos. Veja: Operador Relação E (And) E lógico Ou (Or) Ou lógico Não (Not) Negação lógica Ou-X (Xor) Ou ‘Exclusivo’ Veja a seguinte tabela para entender melhor os operadores lógicos. P Q P e Q P ou Q P ou-X Q F F F F F F V F V V V F F V V V V V V F PRIORIDADE NA AVALIAÇÃO DE EXPRESSÕES 1º Parênteses e funções (resolvidos da esquerda para a direita) 2º Multiplicação (*), Divisão ( / e div ) e Resto ( Mod ) (resolvidos da esquerda para a direita) 3º soma e subtração 4º Operadores relacionais: >, <, ≥, ≤, =, ≠ 5º Operador Lógico Não 6º Operador Lógico E 7º Operador Lógico Ou COMANDOS DE ENTRADA E SAÍDA Para atingirmos os objetivos de um algoritmo, necessitamos receber dados do mundo externo e precisamos exteriorizar as informações produzidas. No momento do Apostila de Lógica de Programação – Parte I 21 Seqüências Simples Conjunto de comandos que serão executados numa seqüência linear de cima para baixo. Estes comandos podem aparecer em qualquer estrutura de controle, agrupados ou não por blocos. Ao final de cada comando é obrigatório a colocação de um ponto-e-vírgula ( ; ). Mais de um comando pode ser colocado por linha, mas isso não é aconselhável. Um comando pode ocupar mais de uma linha. Nesse caso, o ponto-e-vírgula só vai aparecer no final da última linha. Veja a sintaxe: comando 1; comando 2; início comando 3 ... meio comando 3 ... fim comando 3 ; ... comando n; Exemplo 1 Faça um algoritmo que leia dois números inteiros e mostre a soma deles. Algoritmo SomaNumerosInteiros declare num1, num2, soma : inteiro; inicio ler (num1, num2); soma ← num1 + num2; escrever(‘A soma dos números é : ‘, soma); fim Exemplo 2 Faça um algoritmo que leia 3 nomes e mostre-os na ordem inversa de leitura Obs: Veja como este algoritmo já apresenta mais detalhes. Algoritmo LeituraNomes declare Apostila de Lógica de Programação – Parte I 22 nome1, nome2, nome3 : string; inicio escrever (‘Entre com primeiro nome : ‘); ler (nome1); escrever (‘Entre com segundo nome : ‘); ler (nome2); escrever (‘Entre com terceiro nome : ‘); ler (nome3); escrever (‘A ordem inversa dos nomes é ‘); escrever (nome3); escrever (nome2); escrever (nome1); fim Exemplo 3 Fazer um algoritmo que leia uma palavra e mostre a primeira letra dela. Algoritmo PrimeiraLetra declare palavra, letra1 : caractere; inicio escrever(‘Digite palavra : ‘ ); ler(palavra); letra1 ← Substring(palavra, 1, 1); escrever(‘A primeira letra da palavra é : ‘ , letra1); fim Estruturas Condicionais Quando uma ação para ser executada depender de uma inspeção ou teste, teremos uma alternativa simples ou composta. Sintaxe da Alternativa Simples: se <condição> então <comando 1>; <comando 2>; <comando n>; fim-se; Sintaxe da Alternativa Composta: se <condição> então execução caso condição seja verdadeira Apostila de Lógica de Programação – Parte I 23 <comando 1>; <comando 2>; <comando n>; senão <comando 1>; <comando 2>; <comando m>; fim-se; onde: <condição> é qualquer expressão cujo resultado seja Falso ou Verdadeiro. ✍ Exemplo: se media >= 7 então situacao ← ‘Aprovado’; senão situacao ← ‘Reprovado’; fim-se Estruturas de Repetição Quando um conjunto de ações é executado repetidamente enquanto uma determinada condição permanece válida. Para Usamos a estrutura Para, quando precisamos repetir um conjunto de comandos um número pré-definido de vezes. Utiliza uma variável de controle, que é incrementada em 1 unidade de um valor inicial até um valor final. para varControle ← ValInicial até ValFinal faça <comando 1>; <comando 2>; <comando n>; fim-para; execução caso condição seja verdadeira execução caso condição falsa execução enquanto varControle for menor ou igual a ValFinal Apostila de Lógica de Programação – Parte I 26 ✍ Exemplo: ler(Numero); escolha Numero caso 1: Extenso ← ‘Um’; caso 2: Extenso ← ‘Dois’; caso 3: Extenso ← ‘Três’; caso 4: Extenso ← ‘Quatro’; caso 5: Extenso ← ‘Cinco’; caso 6: Extenso ← ‘Seis’; caso 7: Extenso ← ‘Sete’; caso 8: Extenso ← ‘Oito’; caso 9: Extenso ← ‘Nove’; senão: Extenso ← ‘Erro’; fim-escolha; VETORES Os vetores são estruturas de dados que permitem o armazenamento de um conjunto de dados de mesmo tipo. Por este motivo, são chamadas de estruturas homogêneas. Os vetores são unidimensionais, pois cada elemento do vetor é identificado por um índice. Similarmente, podemos definir vetores como posições de memória, identificadas por um mesmo nome, individualizadas por índices e cujo conteúdo é de mesmo tipo. Para acessarmos um elemento de um vetor, referimo-nos ao nome do vetor acompanhado pelo seu índice que virá entre colchetes ( [ e ] ). Pense num prédio com 120 apartamentos. Para enviar uma correspondência a um determinado apartamento, devemos colocar no endereço de destinatário, o número do prédio mais o número do apartamento. O vetor funciona de forma similar. Veja a sintaxe da declaração de um vetor: Nome do vetor : vetor [ nº de elementos ] de <tipo básico do vetor > Para fazermos referência a um elemento do vetor, colocamos: Nome do vetor [ elemento ] Apostila de Lógica de Programação – Parte I 27 Cada elemento de um vetor é tratado como se fosse uma variável simples. ✍ Exemplo: Supondo que pedíssemos para criar um algoritmo para ler o nome de 5 pessoas, e mostrasse esses nomes na ordem inversa de leitura. A princípio, vocês pensariam em cinco variáveis: nome1, nome2, nome3, nome4 e nome5. Veja como ficaria a solução, nesse caso: declare nome1, nome2, nome3, nome4, nome5 : caracter; início escrever(‘Informe o nome de 5 pessoas: ‘); ler(nome1); ler(nome2); ler(nome3); ler(nome4); ler(nome5); escrever(‘Ordem Inversa de Leitura ‘); escrever(nome5); escrever(nome4); escrever(nome3); escrever(nome2); escrever(nome1); fim Assim, na memória teríamos ... Nome1 Nome2 Nome3 Nome4 Nome5 ANA PAULA CRISTINA GUSTAVO ANTONIO Todavia, se alterássemos esse algoritmo para ler o nome de 100 pessoas, a solução anterior se tornaria inviável. Para casos como este, podemos fazer uso de vetores. Se tivéssemos criado 100 variáveis, teríamos que declarar e usar: nome1, nome2, nome3, ... , nome99, nome100. Com o vetor passamos a ter: nome[1], nome[2], nome[3], nome[99], nome[100], onde a declaração do vetor se limita à linha: nome : vetor[1..100] de caracter. Veja que para todos os elementos nos referimos ao mesmo nome de vetor. Assim, veja a solução do algoritmo anterior com o uso de vetores: Apostila de Lógica de Programação – Parte I 28 declare nome : vetor[5] de caracter; aux : inteiro; início para aux ← 1 até 5 faça escrever (‘Informe o Nome ‘, aux); ler (nome[aux]); fim-para; escrever(‘Ordem Inversa de Leitura ‘); para aux ← 5 até 1 faça escrever (nome[aux]); fim-para fim Veja a representação da memória: Nome[1] Nome[2] Nome[3] Nome[4] Nome[5] ANA PAULA CRISTINA GUSTAVO ANTONIO MATRIZES As matrizes são estruturas de dados que permitem o armazenamento de um conjunto de dados de mesmo tipo, mas em dimensões diferentes. Os vetores são unidimensionais, enquanto as matrizes podem ser bidimensionais (duas dimensões) ou multidimensionais. Similarmente podemos conceituar matrizes como um conjunto de dados referenciado por um mesmo nome e que necessitam de mais de um índice para ter seus elementos individualizados. Para fazer referência a um elemento da matriz serão necessários tantos índices quantas forem as dimensões da matriz. Veja a sintaxe da declaração de uma matriz: Nome da matriz : matriz [ li1: ls1, li2:ls2, ... , lin:lsn ] de <tipo básico da matriz > onde: Apostila de Lógica de Programação – Parte I 31 escrever (‘Faturamento do Dia : ‘, DiasSemana[indColuna]); ler (VendasDiarias[indLinha, indColuna]); fim-para; fim-para; fim Um algoritmo que apenas lê e nada faz com esses resultados, não serve para grande coisa, certo ?! Por isso, vamos melhorar esse algoritmo e apresentar como resultado o faturamento diário de todas as vendedoras. Algoritmo LeVendasDiariasVersao3; declare VendasDiarias : matriz[3,5] de real; Vendedoras : vetor[3] de caracter; DiasSemana : vetor[5] de caracter; indLinha, indColuna : inteiro; FaturaDia : real; início Vendedoras[1] ← ‘Sandra’; Vendedoras[2] ← ‘Vera’; Vendedoras[3] ← ‘Maria’; DiasSemana[1] ← ‘Segunda’; DiasSemana[2] ← ‘Terça’; DiasSemana[3] ← ‘Quarta’; DiasSemana[4] ← ‘Quinta’; DiasSemana[5] ← ‘Sexta’; { Variando o número de linhas – Vendedoras } para indLinha ← 1 até 3 faça escrever (‘Vendedora : ‘, Vendedoras[indLinha]); { Variando o número de colunas – Dias da Semana} para indColuna ← 1 até 5 faça escrever (‘Faturamento do Dia : ‘, DiasSemana[indColuna]); ler (VendasDiarias[indLinha, indColuna]); fim-para; fim-para; { Vamos começar variando a coluna, para poder obter o faturamento de cada dia da semana } para indColuna ← 1 até 5 faça { A cada novo dia, a variável que recebe o faturamento é zerada } Apostila de Lógica de Programação – Parte I 32 FaturaDia ← 0; { Vamos variar a linha, para obter os valores faturados de cada vendedora } para indLinha ← 1 até 3 faça FaturaDia ← FaturaDia + VendasDiarias[indLinha, indColuna]; fim-para escrever(Faturamento de : ‘, DiasSemana[indColuna]); escrever(FaturaDia); fim-para; fim Até agora, está fácil, certo ?! Então vamos complicar um pouquinho. Na matriz anterior, estamos controlando o faturamento de apenas uma semana. Todavia, as vendedoras trabalham o mês todo. E o correto seria termos uma planilha para cada semana do mês, que vamos considerar que sejam quatro semanas. ✍ Exemplo: A representação deste conjunto de planilhas em forma de matriz, seria: VendasDiarias : matriz [ 3, 5, 4 ] de real; Indicando a declaração de uma matriz com 3 linhas e 5 colunas, repetidas em 4 faces, cujos valores serão do tipo real. SEMANA 4 ( Segunda ) COLUNA 1 ( Terça ) COLUNA 2 ( Quarta ) COLUNA 3 ( Quinta ) COLUNA 4 ( Sexta ) COLUNA 5 ( SANDRA ) LINHA 1 1050,00 950,00 1241,00 2145,00 1256,00 ( VERA ) LINHA 2 785,00 1540,00 1400,00 546,00 0,00 ( MARIA ) LINHA 3 1658,00 1245,00 1410,00 245,00 1546,00 SEMANA 3 ( Segunda ) COLUNA 1 ( Terça ) COLUNA 2 ( Quarta ) COLUNA 3 ( Quinta ) COLUNA 4 ( Sexta ) COLUNA 5 ( SANDRA ) LINHA 1 1050,00 950,00 1241,00 2145,00 1256,00 ( VERA ) LINHA 2 785,00 1540,00 1400,00 546,00 0,00 ( MARIA ) LINHA 3 1658,00 1245,00 1410,00 245,00 1546,00 SEMANA 2 ( Segunda ) COLUNA 1 ( Terça ) COLUNA 2 ( Quarta ) COLUNA 3 ( Quinta ) COLUNA 4 ( Sexta ) COLUNA 5 ( SANDRA ) LINHA 1 1050,00 950,00 1241,00 2145,00 1256,00 ( VERA ) LINHA 2 785,00 1540,00 1400,00 546,00 0,00 ( MARIA ) LINHA 3 1658,00 1245,00 1410,00 245,00 1546,00 SEMANA 1 ( Segunda ) COLUNA 1 ( Terça ) COLUNA 2 ( Quarta ) COLUNA 3 ( Quinta ) COLUNA 4 ( Sexta ) COLUNA 5 ( SANDRA ) LINHA 1 1050,00 950,00 1241,00 2145,00 1256,00 ( VERA ) LINHA 2 785,00 1540,00 1400,00 546,00 0,00 ( MARIA ) LINHA 3 1658,00 1245,00 1410,00 245,00 1546,00 Apostila de Lógica de Programação – Parte I 33 Assim, vejamos como fica o algoritmo para lermos os faturamentos diários por semana. Algoritmo LeVendasDiariasVersao4; declare VendasDiarias : matriz[3,5,4] de real; Vendedoras : vetor[3] de caracter; DiasSemana : vetor[5] de caracter; indLinha, indColuna, indFace : inteiro; início Vendedoras[1] ← ‘Sandra’; Vendedoras[2] ← ‘Vera’; Vendedoras[3] ← ‘Maria’; DiasSemana[1] ← ‘Segunda’; DiasSemana[2] ← ‘Terça’; DiasSemana[3] ← ‘Quarta’; DiasSemana[4] ← ‘Quinta’; DiasSemana[5] ← ‘Sexta’; { Variando o número de faces – Semanas do mês } para indFaces ← 1 até 4 faça escrever (‘Semana do Mês : ‘,indFaces); { Variando o número de linhas – Vendedoras } para indLinha ← 1 até 3 faça escrever (‘Vendedora : ‘, Vendedoras[indLinha]); { Variando o número de colunas – Dias da Semana } para indColuna ← 1 até 5 faça escrever (‘Faturamento do Dia : ‘, DiasSemana[indColuna]); ler (VendasDiarias[indLinha, indColuna, indFaces]); fim-para; fim-para; fim-para; fim REGISTROS O conceito de registro visa facilitar o agrupamento de variáveis que não são do mesmo tipo, mas que guardam estreita relação lógica. Assim, registros correspondem a uma estrutura de dados heterogênea, ou seja, permite o armazenamento de informações de Apostila de Lógica de Programação – Parte I 36 escolaridade : caracter; cargo : caracter; salario : real; data_admissao : caracter; fim-registro; Veja um exemplo de como podemos criar conjuntos de registros, utilizando vetores e/ou matrizes: ✍ Exemplo: declare tipo Funcionario = registro nome : caracter; endereco : caracter; data_nascimento : caracter; data_admissao : caracter; cargo : caracter; salario : real; fim-registro; Funcionarios_Empresa : vetor[1:100] de Funcionario; ARQUIVOS Na maioria das vezes, desejaremos desenvolver um algoritmo de forma que os dados manipulados sejam armazenados por um período longo de tempo, e não somente durante o tempo de execução do algoritmo. Como a memória principal do computador é volátil, ou seja, ao ser desligado o computador, todos os dados da memória são perdidos, necessitamos de uma memória auxiliar que seja permanente, como por exemplo, um disquete ou o disco rígido (HD). Assim, passamos a ter um novo conceito no mundo computacional – o de arquivos. Arquivo é um conjunto de registros armazenados em um dispositivo de memória auxiliar (secundária). Por sua vez, um registro consiste de um conjunto de unidades de informação logicamente relacionadas – os campos. Assim, podemos definir que um registro corresponde a um conjunto de campos de tipos heterogêneos. Veja que neste momento estamos tratando de registros físicos, ao contrário, do que vimos no item anterior, que são os registros lógicos. Apostila de Lógica de Programação – Parte I 37 O fato do arquivo ser armazenado em uma memória secundária, o torna independente de qualquer algoritmo, isto é, um arquivo pode ser criado, consultado, processado e eventualmente removido por algoritmos distintos. Sendo o arquivo uma estrutura fora do ambiente do algoritmo, para que este tenha acesso aos dados do arquivo é necessária a operação de leitura do registro no arquivo. As operações básicas que podem ser feitas em um arquivo através de um algoritmo são: obtenção de um registro, inserção de um novo registro, modificação ou exclusão de um registro. A disposição dos registros no arquivo – organização – oferece ao programador formas mais eficientes e eficazes de acesso aos dados. Vamos considerar, aqui, as duas principais formas de organização de arquivos: a seqüencial e a direta. • Organização Seqüencial : A principal característica da organização seqüen- cial é a de que os registros são armazenados um após o outro. Assim, tanto a leitura quanto a escrita, são feitas seqüencialmente, ou seja, a leitura de um determinado registro só é possível após a leitura de todos os registros anteriores e a escrita de um registro só é feita após o último registro. • Organização Direta : A principal característica da organização direta é a facilidade de acesso. Para se ter acesso a um registro de um arquivo direto, não é necessário pesquisar registro a registro, pois este pode ser obtido diretamente – acesso aleatório. Isto é possível porque a posição do registro no espaço físico do arquivo é univocamente determinada a partir de um dos campos do registro (chave), escolhido no momento de criação do arquivo. O acesso a um arquivo dentro do algoritmo é feito através da leitura e escrita de registros. No algoritmo, o arquivo deve ser declarado e aberto, antes que tal acesso possa ser feito. No final do algoritmo, ou quando houver necessidade, o arquivo deve ser fechado. A sintaxe da declaração de arquivos é : nome_arquivo : arquivo organização de nome_registro; onde: Apostila de Lógica de Programação – Parte I 38 • organização – indica o tipo de organização do arquivo, que pode ser seqüencial ou direta. • nome_registro – nome do registro lógico que será usado para se ter acesso aos registros físicos do arquivo. ✍ Exemplo: tipo Registro_Endereco = registro rua : caracter; numero : inteiro; bairro, cidade, uf, cep : caracter; fim-registro; Agenda : arquivo sequencial de Registro_Endereco; Abertura de Arquivos A declaração do arquivo é a definição, para o algoritmo, do modelo e dos nomes que estarão associados à estrutura de dados, isto é, ao arquivo. A sintaxe da declaração de arquivos é : abrir nome_ arq1, nome_arq2, ... , nome_arqn tipo_utilização; onde: • tipo_utilização – especifica se o arquivo será usado somente para leitura, somente para escrita ou ambos, simultaneamente. ✍ Exemplo: abrir Agenda leitura; abrir Agenda escrita; abrir Agenda; abrir Agenda, ContasPagar; Apostila de Lógica de Programação – Parte I 41 Assim, definimos módulo como um grupo de comandos, constituindo um trecho de algoritmo, com uma função bem definida e o mais independente possível em relação ao resto do algoritmo. A maneira mais intuitiva de trabalharmos com a modularização de problemas é definir-se um módulo principal de controle e módulos específicos para as funções do algoritmo. Módulos de um programa devem ter um tamanho limitado, já que módulos muito grandes são difíceis de serem compreendidos. Os módulos são implementados através de procedimentos ou funções. Sintaxe de definição de um procedimento: Procedimento Nome_Procedimento [ (parâmetros) ]; declare < variáveis locais > início comando 1; comando 2; comando n; fim Os parâmetros podem ser passados por valor ou por referência. Um parâmetro passado por valor, não pode ser alterado pelo procedimento. Os parâmetros por referência são identificados usando-se a palavra VAR antes de sua declaração. Sintaxe da chamada do procedimento: Nome_Procedimento (<lista de parâmetros>); Os valores passados como parâmetros na chamada de um procedimento, devem corresponder sequencialmente à ordem declarada. A função é semelhante ao procedimento, todavia sua diferença consiste no fato de que um procedimento não retorna valor quando é chamado para execução, enquanto que a função retorna um valor. Definição de uma função: Função Nome_Função [ (parâmetros) ] : valor_retorno; Apostila de Lógica de Programação – Parte I 42 declare < variáveis locais > início comando 1; comando 2; comando n; fim Chamada da função: Nome_Função (<lista de parâmetros>); Ou Variável ← Nome_Função (<lista de parâmetros>); Apostila de Lógica de Programação – Parte I 43 PASCAL 5. MAPEAMENTO DE ALGORITMOS PARA PASCAL Algoritmo Exercicio1 Program Exercicio1; declare var nome : caracter; nome : string; aux : inteiro; aux : integer; salario : real; salario : real; nivel_superior : lógico; nivel_superior : boolean; início begin para aux ← 1 até 10 faça for aux := 1 to 10 do begin escrever(‘Digite nome: ‘); writeln(‘Digite nome : ‘); ler(nome); readln(nome); escrever(‘Digite salario : ‘); writeln(‘Digite idade : ‘); ler(salario); readln(idade); escrever(‘Tem nível superior : ‘); writeln(‘Tem nível superior : ‘); ler(nivel_superior); readln(nivel_superior); se nivel_superior então if nivel_superior then salario ← 1000 * 1.15; salario := 1000 * 1.15 senão else salario ← 1000; salario := 1000; fim-se; fim-para; end; aux ← 0; 2 aux := 0; enquanto aux <= 10 faça while aux <= 10 do escrever(aux); write(aux); fim-enquanto fim end. 6. SINTAXE DO PASCAL Estrutura de um programa em Pascal Program nome_Programa; uses nome_unit1, nome_unit2, ... , nome_unit3; < Bibliotecas usadas pelo programa > Apostila de Lógica de Programação – Parte I 46 Comandos de Entrada read ( <lista de identificadores> ); readln ( <lista de identificadores> ); O comando READLN posiciona o cursor no início da próxima linha da tela. Comandos de Saída write ( <lista de identificadores> ); writeln ( <lista de identificadores> ); O comando WRITELN posiciona o cursor na próxima linha da tela. Comando Condicional If <condição> then <comandos para condição verdadeira> else <comandos para condição falsa>; Se houver mais de um comando, eles devem ser colocados entre BEGIN e END. If <condição> then begin <comando1>; <comando2>; <comandon>; end else begin <comando1>; <comando2>; <comandon>; end; Estruturas de repetição for <variavel> := <valor_inicial> to <valor_final> do <comando1>; ou for <variavel> := <valor_inicial> downto <valor_final> do <comando1>; Apostila de Lógica de Programação – Parte I 47 while <condição> do <comando>; repeat <comandos>; until <condição>; Nas estruturas while e for, se houver mais de um comando a ser processado, eles devem ser colocados entre BEGIN e END. while <condição> do begin <comando1>; <comando2>; <comandon>; end; for <variavel> := <valor_inicial> to <valor_final> do begin <comando1>; <comando2>; <comandon>; end; Vetores var array [ lim_inf .. lim_sup ] of <tipo>; ✍ Exemplo: var Alunos : array [1..100] of string; Alunos[1] := ‘Valeria’; Matrizes var array [ li1 .. li1 , li2 .. li2, lin .. lin] of <tipo>; ✍ Exemplo: var Valores : array [1..4,1..5] of integer; Apostila de Lógica de Programação – Parte I 48 Valores[1,1] := 100; Valores[1,2] := 115; Registros var nome_registro : record campo : tipo; end; ou type nome_registro = record campo : tipo; end; ✍ Exemplo 1(a): var CadFunc : record nome, endereco : string; cpf : string; sexo : char; TemDependentes : boolean; end; begin ... CadFunc.nome := ‘Alvaro’; ... ✍ Exemplo 1(b): type CadFuncionario = record nome, endereco : string; cpf : string; sexo : char; TemDependentes : boolean; end; var CadFunc : CadFuncionario; begin ... CadFunc.nome := ‘Alvaro’; ... Apostila de Lógica de Programação – Parte I 51 CLREOL; Limpa todos os caracteres da posição do cursor até o final da linha. GOTOXY (Xpos , Ypos); Move o cursor para a posição na tela especificada pelas expressões inteiras “Xpos” (coluna) e “Ypos” (linha). Um terminal de vídeo normalmente possui 25 linhas e 80 colunas. O canto esquerdo/superior da tela tem coordenadas (1,1). Apostila de Lógica de Programação – Parte I 52 APÊNDICE Gabarito dos exercícios de Raciocínio Matemático 1. b 2. b 3. d 4. d 5. b 6. Falso 7. c 8. quinta-feira 9. não existe um dia em que seja possível essa afirmação 10. e Apostila de Lógica de Programação – Parte I 53 Tabela ASCII 32 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127  128 € 129  130 ‚ 131 ƒ 132 „ 133 … 134 † 135 ‡ 136 ˆ 137 ‰ 138 Š 139 ‹ 140 Œ 141  142 Ž 143  144  145 ‘ 146 ’ 147 “ 148 ” 149 • 150 – 151 — 152 ˜ 153 ™ 154 š 155 › 156 œ 157  158 ž 159 Ÿ 160 161 ¡ 162 ¢ 163 £ 164 ¤ 165 ¥ 166 ¦ 167 § 168 ¨ 169 © 170 ª 171 « 172 ¬ 173 - 174 ® 175 ¯ 176 °
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved