CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE SERGIPE COORDENADORIA DE INFORMÁTICA PROGRAMAÇÃO I LÓGICA DE PROGRAMAÇÃO Prof. André Luiz Sozzi Curso de Informática Módulo 6 - Lógica de Programação Pag. 2 Curso de Informática Pag. ÍNDICE Capítulo 1 Capítulo 2 Capítulo 3 Capítulo 4 Introdução 1.1 Ciclo de Vida do Sw ......................................................................... 1.2 Processamento de Dados .................................................................. Algoritmos Estruturados 2.1 Conceitos ........................................................................................ 2.2 Programação Estruturada ................................................................ 2.3 Constantes ....................................................................................... 2.4 Variáveis ......................................................................................... 2.5 Expressões Aritméticas .................................................................... 2.6 Expressões Lógicas ......................................................................... 2.7 Expressões Literais .......................................................................... 2.8 Comando de Atribuição ................................................................... 2.9 Comandos de Entrada e Saída .......................................................... 2.10 Estruturas de Controle 2.10.1 Seqüência ........................................................................... 2.10.2 Condição (Decisão) ............................................................ 2.10.3 Repetição ........................................................................... 2.11 Lista de Exercícios .......................................................................... 2.12 Algoritmos de Quebras de Controle ................................................ Modularização 3.1 Introdução ...................................................................................... 3.2 Conceito ......................................................................................... Exemplo .......................................................................................... 3.2.1 Visões de um módulo ........................................................... 3.3 Ferramentas para Modularização .................................................... 3.4 Regras de Escopo ............................................................................ 3.5 Comunicação entre módulos ........................................................... Exemplos de Comunicação .............................................................. 3.6 Recursividade .................................................................................. 3.7 Lista de Exercícios .......................................................................... Variáveis Compostas 4.1 Homogêneas 4.1.1 Definição ............................................................................. 4.1.2 Vetor .................................................................................. 4.1.3 Lista de Exercícios............................................................... 4.1.4 Matriz.................................................................................. 4.1.5 Lista de Exercícios............................................................... 4.2 Heterogêneas 4.2.1 Registro............................................................................... 4.2.2 Lista de Exercícios............................................................... Módulo 6 - Lógica de Programação 04 05 08 10 11 11 14 15 18 18 19 20 21 24 26 34 42 42 43 46 47 48 51 53 56 58 59 59 61 63 64 67 73 3 Curso de Informática Capítulo 5 Pag. Algoritmos Especiais 5.1 Pesquisa em Vetor 5.1.1 Pesquisa Seqüencial Única / Múltipla................................... 5.1.2 Pesquisa Binaria Única / Múltipla....................................... 5.2 Ordenação de Vetor 5.2.1 Método da Seleção .............................................................. 5.2.2 Método da Bolha ................................................................. 5.2.3 Método da Inserção ............................................................. 81 83 85 Bibliografia ........................................................................................... Cronograma de Atividades ................................................................... 86 87 Módulo 6 - Lógica de Programação 74 77 4 Curso de Informática Capítulo 1 - Introdução 1.1 Ciclo de Vida do Software (Sw) Módulo 6 - Lógica de Programação Pag. 5 Curso de Informática Pag. 1.2 Processamento de Dados Entrada(s) Processamento Saída(s) Entrada(s) Processamento Processador Saída(s) Exemplo de Processamentos a. Roupa Suja Processo: Detergente Roupa Limpa Lavagem Água b. Sapato Sujo Escova / Pano Graxa Processo Manual Engraxar Sapatos Sapatos Limpos Engraxate c. Maca Leite Açúcar Módulo 6 - Lógica de Programação Processo Automático Fazer Vitamina Liquidificador Vitamina 6 Curso de Informática Pag. d. Dados Processamento de Dados Dados Processados Programa Computador e. Cozinheiro Ingredientes Processador Rotina: Passo 1 Passo 2 Passo 3 ... Passo n Receita Módulo 6 - Lógica de Programação Bolo 7 Curso de Informática Pag. 8 Exercícios: 1. Indique algumas possíveis entradas e saídas dos processamentos abaixo: Cortar Grama Procurar o número do telefone de um colega no catálogo 2. Para cada exemplo abaixo identifique o processamento realizado ou informações fornecidas ao processador: a b a. Relação de Alunos de uma Turma b. Indicação dos Alunos Presentes e Ausentes a c b a. Relação dos Candidatos ao Vestibular b. Média Final de cada Candidato c. Relação dos Candidatos Classificados para ingressar na Universidade 3. Para cada um dos exercícios acima, indique o agente processador. Módulo 6 - Lógica de Programação Curso de Informática Pag. 9 Capítulo 2 - Algoritmos Estruturados 2.1 Conceitos Um programador de computador é, antes de mais nada, um solucionador de problemas. Assim sendo, ele deve lidar com os mesmos de forma rigorosa e sistemática. A dificuldade de se programar o computador provém da complexidade inerente a esta atividade combinada com muitos processos mentais. Podemos afirmar que a arte de programar está dividida entre duas atividades: uma eminentemente inteligente, criativa; e outra mais sistemática, mecânica. É na fase criativa do processo que produzimos um algoritmo (conjunto de instruções, “receita”) que solucione o problema em questão. Existem, na literatura, vários métodos para descrever algoritmos. Na fase subsequente, codificamos o algoritmo usando algumas das linguagens de programação existentes no mercado. Portanto, algoritmo é uma descrição detalhada e não ambígua, de ações que devem ser realizadas para a solução de um problema. É a descrição de um conjunto de comandos que, obedecidos, resultam numa sucessão finita de ações que resultarão na resolução do problema proposto. Grande parte dos algoritmos possuem métodos complicados de organizar o dados envolvidos na computação. Objetos criados para esses fins são chamados “Estrutura de Dados”, que não serão abordados por fugir ao escopo desta disciplina. Frequentemente existe mais que um algoritmo para resolver o mesmo problema. A escolha do melhor algoritmo para um particular problema pode ser um processo muito complicado, geralmente envolvendo uma análise mais sofisticada. A área da Ciência da Computação na qual estas questões são estudadas é chamada “Análise de Algoritmos”. Vamos considerar alguns aspectos de algoritmos e suas relações com o computador: a) Para todo o problema que se queira resolver usando o computador e que tenha uma solução, existirá um algoritmo. b) Todas as tarefas que sabemos que são realizadas num espaço finito de tempo podem ser descritas por algoritmos que existem executarão estas tarefas no computador em um tempo finito. c) O tamanho da descrição de um algoritmo não deve ser proporcional ao número de ações executadas no algoritmo senão, a enorme disparidade entre nossa taxa de criação de algoritmos e a taxa de execução do algoritmo no computador nos levaria a crer que os computadores não teriam grande trabalho a fazer. Deveremos escrever algoritmos cujo tamanho de sua descrição seja independente do número de ações a ser executadas. Existem partes do algoritmo que são executadas muitas vezes pelo computador. d) A execução de um algoritmo no computador deve sempre apresentar o mesmo resultado. Módulo 6 - Lógica de Programação Curso de Informática Pag. 10 Os algoritmos a que nos referimos são aqueles que manipulam símbolos, representados por números, já que estes são algoritmos que tem execução imediata em computadores digitais. Dentre as propriedades dos algoritmos, podemos citar: a) Um algoritmo deve ter um único ponto de “início” e sua execução se faz de passo a passo, até atingir o ponto de “parada” (fim). b) Cada passo do algoritmo deve ser simples e objetivo, para que ele possa ser corretamente executado por uma máquina (o computador) que naquele momento só tem conhecimento sobre os específico passo. c) Para garantir que um algoritmo termina, cada passo dever ser executado em um espaço de tempo finito. d) Já que partes da descrição do algoritmo vão ser “lidas” e executadas mais de uma vez, um algoritmo contém no mínimo um ciclo, isto é, certas sequências de passos recorrendo durante a execução do algoritmo. Como a execução do algoritmo deve terminar em um tempo finito, deve haver uma maneira para encerrar cada ciclo. Em outras palavras, deve existir, em cada ciclo, um passo que decida entre continuar o ciclo ou sair dele. e) Todo o algoritmo deve conter no mínimo uma variável com um domínio de valores. Se um algoritmo não tem variáveis, ou seja, só tem constantes, só será necessário executá-lo uma única vez. Algoritmo para a solução de um problema genérico Passo 1: Entender completamente a descrição do problema. Passo 2: Fazer um esboço geral do algoritmo para a solução do problema dado, sem se preocupar com detalhes específicos. Assegurar que a estratégia esteja correta, rastreando o algoritmo esboçado com amostra de dados. Se não estiver correta revisá-la. Passo 3: Identificar e declarar qualquer variável que seja necessária. Por identificação entenda-se o nome da variável, seu tipo e uma descrição de seu propósito. Esta lista de variáveis pode ser aumentada ou diminuída segundo a necessidade. Passo 4: Refinar os passos individuais do algoritmo esboçado. O nível de detalhamento deve ser aquele onde as instruções descritas nos passos do algoritmo tenham mapeamento quase imediato para a linguagem de programação. Passo 5: Sentindo que o algoritmo está detalhado adequadamente, proceda seu rastreamento a fim de comprovar sua obediência à especificação. Passo 6: Implementação do algoritmo numa linguagem de programação particular. Módulo 6 - Lógica de Programação Curso de Informática Pag. 11 2.2 Programação Estruturada Dentre os diversos leques de atuação da Informática, algumas delas estão voltados para a construção de sistemas de aplicação. Então, a utilização do computador para estes fins exige que se construa algoritmos de todos os programas que irão compor determinado sistema. O algoritmo deve, portanto, prever antecipadamente todas as situações que possam ocorrer quando posto em execução. Devido a evolução das máquinas, os sistemas desenvolvidos podem ser maiores e de maior complexidade. Porém, os algoritmos são ainda desenvolvidos pelo ser humano, mas podem ultrapassar os limites de sua compreensão. Por esta razão, nos últimos anos surgiram técnicas que permitem sistematizar e ajudar o desenvolvimento de algoritmos para a resolução de grandes e complexos problemas nos computadores. O conjunto destas técnicas denominamos de desenvolvimento estruturado ou programação estruturada que é uma ferramenta utilizada para se obter programas confiáveis, manuteníveis e eficientes e objetiva: • • • • • facilitar a escrita dos programas; facilitar a leitura dos programas; permitir a verificação a priori dos programas; facilitar a manutenção e modificação dos programas e permitir que o seu desenvolvimento possa ser empreendido simultaneamente por uma equipe de pessoas. Logo, estas técnicas preconizam que para se resolver um problema devemos dividi-lo, para podermos compreende-lo, que podemos faze-lo utilizando: • desenvolvimento do programa em diferentes fases por refinamento sucessivo; • decomposição do programa total em módulos funcionais, organizados num sistema hierárquico; • dentro de cada módulo só um número muito limitado de estruturas básicas de fluxo de controle. Exercício: Confeccione um algoritmo para substituir uma lâmpada queimada. Módulo 6 - Lógica de Programação Curso de Informática Pag. 12 2.3 Constantes A constante se caracteriza por não se modificar ao longo da execução de um programa. Pode ser classificada em numérica, literal e lógica. 2.3.1 Constante Numérica É definida a partir do sistema decimal, podendo ser um número inteiro ou fracionário. As constantes numéricas podem participar de operações aritméticas. Exemplos: 25, 3.14, 8.5 x 103, - 2.6, 105 2.3.2 Constante Literal É definida a partir de uma seqüência qualquer de caracteres (letras, dígitos ou símbolos especiais) com algum significado para o problema em estudo. Sempre será colocada entre aspas para não seja confundida com outro item. Não podem participar de operações aritméticas. Exemplos: “José da Silva”, “12348”, “MENSAGEM ...:”, “A%B23X-5” 2.3.3 Constante Lógica É um valor lógico que só pode ser verdadeiro ou falso e são representadas pelas palavras: verdadeiro e falso. 2.4 Variáveis A grande parte dos computadores disponíveis comercialmente adota o modelo da Máquina de Von Neumann, matemático que introduziu o conceito de “programa armazenado”, onde variáveis são usadas para representar células de memória e atribuições são usadas para simular armazenamento. Num programa de computador, uma variável é uma entidade que possui um valor, sendo conhecida no programa por um identificador. As variáveis são valoradas com dados do mesmo tipo. Uma variável corresponde uma posição de memória (RAM). Seu conteúdo pode variar ao longo do tempo durante a execução de um programa, ou seja, pode assumir valores diferentes em instantes diferentes. A variável é identificada por um nome ou identificador. Exemplo: Para se realizar o cálculo das raízes de uma equação do 2o grau (ax2 + bx + c = 0), os identificadores A, B e C podem representar as posições de memória que armazenam os coeficientes da equação. RAM A B Módulo 6 - Lógica de Programação C Curso de Informática Pag. 13 2.4.1 Regras para a formação dos nomes ou identificadores • Pode ser formado por um ou mais caracteres, • Obrigatoriamente, o primeiro caractere tem que ser um letra, • É permitido o uso de letras e dígitos e não o de símbolos especiais Nomes Válidos AAA X NOTAALUNO NOMEPECA Nomes Não Válidos 6NOME RUA-ALUNO CEP ALUNO SEXO%EMPREG Observando os exemplos acima, temos AAA e X como nomes válidos. Entretanto, estes nomes não são significativos, ou seja, eles não refletem a natureza dos valores que neles serão armazenados. A utilização de nomes significativos pelo programador torna o algoritmo mais legível. 2.4.2 Declaração de Variáveis Uma variável só pode armazenar valores de um mesmo tipo. Logo, as variáveis são classificadas em numéricas, literais ou lógicas. A declaração é utilizada para indicar o tipo da variável. Alem disso, no momento da declaração é associado um nome a variável (posição de memória). Qualquer referência que se faça a variável implica na referência ao seu conteúdo do local da memória que a representa. Sintaxe: declare lista-de-variáveis tipo, onde: declare lista-de-variáveis tipo Exemplos: declare NOTA, CÓDIGO, X5 numérico declare TESTE, SIM lógico declare NOME, ENDERECO literal Módulo 6 - Lógica de Programação palavra chave do algoritmo nomes escolhidos para as variáveis, usar vírgulas palavra chave que indica o tipo das variáveis Curso de Informática Pag. 14 2.4.3 Comentários A clareza é uma das principais características de um algoritmo e o comentário é um dos instrumentos para cumprir esta finalidade. O comentário pode ser um texto ou uma frase, deve vir delimitado por chaves e podem ser colocados em qualquer parte do algoritmo. Exemplo: declare MAT, {Número da Matrícula do Aluno} NOTA, {Nota do Aluno em determinado Bimestre} COD, {Código do Curso do Aluno} numérico Exercícios: a. Identificar o tipo de cada constante abaixo: Constante 21 “BOLA” falso “verdadeiro” 0.21 x 103 “500” Tipo b. Assinalar com um “X” os identificadores válidos: ( ( ( ( ( ) VALOR ) X2 ) 3x4 ) XYZ ) “NOTA” ( ( ( ( ( ) ) ) ) ) SAL-LIQ NOTA*ALUNO MARIA NOMEDAEMPRESA AH/ ( ( ( ( ( ) ) ) ) ) B248 A1B2C3 KM/H SALA215 M(A) c. Supondo-se que as variáveis NOM, PROF, ID e SAL serão utilizadas para armazenar o nome, a profissão, a idade e o salário de uma pessoa, escrever o conjunto de declarações necessário para criar essas variáveis e associá-las aos respectivos tipos básicos. d. Realizar as declarações necessárias para um algoritmo que calcula as raízes de uma equação do 2o grau. e. Realizar as declarações necessárias para os exercícios propostos no tópico Estrutura Sequencial. Observação: • A quantidade de variáveis declaradas em um programa, definida pelo programador, depende do problema a ser resolvido, • Para facilitar esta definição, o programador deverá ler por varias vezes o enunciado do problema e a partir dele, tentar identificar quais as variáveis serão de entrada, quais serão de saída e quais serão intermediárias (aquelas que não são de entrada, nem de saída, mas que são necessárias ao processamento). Módulo 6 - Lógica de Programação Curso de Informática Pag. 15 2.5 Expressão Aritmética É aquela cujos operadores são aritméticos e os operandos são constantes e/ou variáveis do tipo numérico. 2.5.1 Operações Básicas ( + ) Adição ( - ) Subtração ( / ) Divisão ( x ) Multiplicação ( √ ) Radiciação ( a ) Exponenciação Exemplos: X + Y 2 x NOTA X - Y TOTAL / N √P SOMA2 AxB+C √ F1 + G - H 5 + TOT / M Observações: • Não omitir o operador de multiplicação, • A precedência das operações é igual a da Matemática (1. Potenciação/Radiciação, 2. Multiplicação/ Divisão, 3. Adição/Subtração), • Para alterar a precedência utilizar parênteses e não colchetes e chaves. 2.5.2 Funções Conforme veremos mais adiante, a maioria das linguagens suporta 2 tipos de funções: a da própria linguagem e as definidas pelo usuário (programador). A função numérica atua sobre o(s) argumento(s) que é(são) passado(s) e obrigatoriamente retorna com um valor numérico. Logo, as funções podem ser utilizadas em expressões aritméticas. As funções devem ser escritas em letras maiúsculas. Segue-se relação de algumas funções matemáticas que as linguagens suportam: FUNÇÃO LOG (A) LN (A) EXP (A) ABS (A) TRUNCA (A) ARREDONDA (A) SINAL (A) QUOCIENTE (A, B) RESTO (A, B) Módulo 6 - Lógica de Programação RESULTADO FORNECIDO Logaritmo na base 10 de A Logaritmo neperiano de A O número e elevado a A Valor Absoluto de A A parte inteira de A A parte inteira de A arredondada -1, +1 ou 0 para A respectivamente negativo, positivo ou nulo Quociente inteiro de A / B Resto de A / B Curso de Informática Pag. 16 Exemplos: QUOCIENTE (10, 3) = 3 RESTO (10, 3) =1 Exercícios: a. Sendo A, B, X e Y variáveis do tipo numérico, quais os resultados fornecidos por cada uma das seguintes funções sendo A = 10, B = 3, X = 2.5 e Y = 1.2 ? a1. SINAL ( X + Y - A) a2. ARREDONDA (A - X) a3. TRUNCA (B2 + X) a4. ABS (A - B3) a5. EXP (√ A + 2 x B -B a6. QUOCIENTE (B + Y, X + 1) a7. RESTO (B + Y, X + 1) 2.6 Expressões Lógicas São utilizadas no condicionamento de ações, logo uma condição do algoritmo é representada através de uma expressão lógica. Denomina-se expressão lógica aquela cujos operadores são lógicos e cujos operandos são relações e/ou variáveis do tipo lógico. 2.6.1 Relação É uma comparação realizada entre dois valores do mesmo tipo básico. Os operadores relacionais são aqueles que indicam a comparação a ser realizada entre os dois valores e são: = (igual a) # (diferente de) > (maior que) O resultado obtido de uma relação é sempre um valor lógico. Exemplos: A # B NOME = “ JOAO” B-4 x A x C < 0 X >= 1 Módulo 6 - Lógica de Programação < (menor que) >= (maior igual a) <= (menor igual a) Curso de Informática Pag. 17 2.6.2 Operadores Lógicos Utilizados para a formação de novas proposições a partir de outras já conhecidas, através dos conectivos E - para a conjunção, OU - para a disjunção e não - para negação. Tabela de Conjunção - E Relação-1 Relação-2 Resultado V V V F F V F F Tabela de Disjunção - OU Relação-1 Relação-2 Resultado V V V F F V F F Exemplos: A + B = 0 e C # 1 TESTE ou A x C > B não TESTE e COR = “AZUL” Exercícios: Dadas as variáveis numéricas X, Y, Z e as variáveis literais NOME e COR, definir os resultados obtidos para as relações a partir dos valores fornecidos aos operandos: X Y 1 2 4 3 1 1 1 2 Z 5 1 2 1 VARIÁVEIS COR “AZUL” “ROSA” “BEGE” “AZUL” NOME “PAULO” “JOSE” “PEDRO” “JOSE” 2 X + Y >Z RELAÇÕES COR = “AZUL” NOME # “JOSE” 2.6.3 Prioridade A prioridade entre todos os operadores conhecidos, visto que podem estar presentes na mesma expressão lógica: PRIORIDADE 1 2 3 4 5 Módulo 6 - Lógica de Programação OPERADOR ARITMÉTICO RELACIONAL NÃO E OU Curso de Informática Pag. 18 Exercícios: 1. Dadas as variáveis numéricas X, Y e Z contendo os valores 2, 5 e 9 respectivamente; a variável literal NOME contendo “MARIA” e a variável lógica SIM, contendo o valor falso, informar os resultados obtidos das expressões abaixo: a. X + Y > Z e NOME = “MARIA” b. SIM ou Y >= X c. não SIM e QUOCIENTE (Z, Y) + 1 = X d. NOME = “JORGE” e SIM ou X2 < Z + 10 2. Confeccione uma expressão lógica para que cada condição abaixo seja satisfeita: a. Que a variável numérica X seja positiva. b. Que a variável numérica NUM seja par. c. Que a variável numérica Y esteja no intervalo compreendido de 10 a 20 inclusive. d. Que a variável numérica NUM seja impar. 3. Dados 3 valores X, Y e Z, verificar: a. se eles podem ser comprimentos dos lados de um triângulo. Propriedade: O comprimento de cada lado de um triângulo é menor do que a soma dos comprimentos dos outros dois lados. b. se é um triângulo equilátero. c. se é um triângulo escaleno. d. se é um triângulo isósceles. Módulo 6 - Lógica de Programação Curso de Informática Pag. 19 Tabela de Verificação: COMPRIMENTOS X Y Z 1.5 1 1 1,5 2 2 1 1,5 1 2 3 1.5 1 1 2 EQUILÁTERO ESCALENO ISÓSCELES 2.7 Expressões Literais Formada por operadores literais e operandos que são constantes e/ou variáveis literais. Importantes no estudo de programação, mas variam bastante de linguagem para linguagem. Exemplo: Concatenação Suponhamos que a variável A possua o conteúdo “PAPA” e a variável B o conteúdo “GAIO”, logo: A : B = “PAPAGAIO” 2.8 Comando de Atribuição Permite que se forneça um valor a uma certa variável, onde o tipo do valor tem que ser compatível com o tipo da variável. 2.8.1 Formato: identificador ← expressão, onde: identificador: É o nome da variável a qual esta sendo atribuído o valor da expressão, ←: É o símbolo de atribuição, expressão: Pode ser aritmética, lógica ou literal de cuja avaliação é obtido o valor a ser atribuído a variável. Exemplos: K ← 1 COR ← “VERDE” TESTE ← falso A ← B MEDIA ← SOMA / N COD ← N + 1 >= 5 SIM ← X < 0 e Y = 5 TOTAL ← G + Y + T Módulo 6 - Lógica de Programação TOT ← TOT + 1 Curso de Informática Pag. 20 2.9 Comandos de Entrada e Saída As unidades de entrada e saída são dispositivos que possibilitam a comunicação entre o usuário e o computador. Por exemplo, através do teclado, o usuário consegue dar entrada ao programa e aos dados na memória do computador, por sua vez, o computador pode emitir os resultados e outras mensagens para o usuário através das unidade de saída (monitor de vídeo, impressora, etc). 2.9.1 Formatos: a. leia lista-de-variáveis, onde: leia: É uma palavra chave lista: São os nomes das variáveis, separados por virgulas, nas quais são armazenados os valores provenientes do dispositivo de entrada. Exemplo: leia NOME, NOTA b. escreva lista-de-variáveis e/ou constantes escreva: É uma palavra chave lista : São os nomes das variáveis, cujos conteúdos serão mostrados ao usuário através do meio de saída ou gravados em disco. Além dos conteúdos das variáveis, o valor de uma constante pode ser emitido diretamente. Exemplo: escreva A, X, 35 escreva “Media da Turma:”, MEDIA Módulo 6 - Lógica de Programação Curso de Informática Pag. 21 2.10 Estruturas de Controle Os computadores digitais são projetados segundo o modelo formulado pelo matemático alemão Von Neumann. As partes principais da Máquina de Von Neumann são (a) Unidade de Processamento, (b) Memória e (c) Registradores que estabelecem a comunicação entre (a) e (b). A memória pode ser vista como um vetor onde cada célula (componente do vetor) é designada por um endereço (índice). A memória armazena dados e programa. Normalmente, após executar um comando colocado em um endereço i da memória o comando seguinte a executar deve ser o de endereço i + 1. Isto corresponde à Estrutura Sequencial de controle (i.e., os passos são executados sequencialmente, do passo 1 até o último passo do algoritmo). No entanto, comandos de desvio condicional ou incondicional podem indicar endereço diverso onde encontrar o comando seguinte. O caso de desvio condicional é o mais importante pois pode ser usado para implementar outras duas estruturas: Decisão (a habilidade para selecionar uma ação dentre um conjunto de alternativas especificadas) e Repetição (a habilidade para repetir uma série de ações). Foi demonstrado que as três estruturas de controle, ou seja, Sequência, Decisão e Repetição são suficientes para elaborar algoritmos e, consequentemente programas. 2.10.1 Estrutura Sequencial Num algoritmo aparecem em primeiro lugar as declarações seguidas por comandos que, se não houver indicação ao contrário, deverão ser executados numa seqüência linear, seguindo-se o texto em que estão escritos, de cima para baixo. Algoritmo d1 d2 d3 . . . c1 c2 c3 . . . cn FimAlgoritmo Texto do Algoritmo Módulo 6 - Lógica de Programação C1 C2 C3 Cn Diagrama de Chapin Curso de Informática Pag. 22 Exercícios: a. Escreva um algoritmo que leia dois números e emita o produto dos mesmos. b. Escreva um algoritmo que leia três números e emita estes números e a média aritmética dos mesmos. c. Confeccione um algoritmo que leia o valor do raio, calcule e imprima a área do círculo, o comprimento da circunferência e o volume da esfera. d. Confeccione um algoritmo que leia dois valores como sendo catetos de um triângulo retângulo, calcule e emita o valor da hipotenusa. 2.10.2 Estrutura Condicional A estrutura condicional permite a escolha do grupo de ações e estruturas a ser executado quando determinadas condições, representadas por expressões lógicas, são ou não satisfeitas. A estrutura é delimitada pelo comando Se e pela expressão FimSe. A estrutura pode ser representada de três maneiras: 2.10.2.1 Condicional Simples Se condição então Seqüência de Comandos FimSe Condição V Seqüência Comandos F - Neste caso, não ocorrerá a execução de nenhuma ação se a condição for falsa. Exercícios: a. Confeccione um algoritmo para ler A, B, C e emita a soma de A, B e C se o produto de A por B for maior que C. Módulo 6 - Lógica de Programação Curso de Informática Pag. 23 2.10.2.2 Condicional Composta Se condição então Seqüência A de Comandos senão Seqüência B de Comandos FimSe Condição V F Seqüência A Seqüência B Comandos Comandos Neste caso, a seqüência A de comandos só será executada se a condição (expressão lógica) for verdadeira e a seqüência B de comandos só será executada se a condição for falsa. Exercícios: a. Confeccionar um algoritmo para ler um número e emitir se o mesmo é positivo, negativo ou nulo. b. Confeccionar um algoritmo para ler um número e emitir se o mesmo é par ou impar. c. Confeccionar um algoritmo para ler um número e emitir se o mesmo está compreendido no intervalo de 10 a 20 inclusive. d. Confeccionar um algoritmo para ler três valores e emitir se os mesmos podem ou não ser os comprimentos dos lados de um triângulo. e. Confeccione um algoritmo que leia 3 valores e verifique se eles podem ser os comprimentos dos lados de um triângulo, se forem, imprimir a classificação do triângulo. f. Escrever um algoritmo para ler dois valores e imprimir a diferença entre o maior e menor valor. g. Fazer um algoritmo que leia 3 valores, determine e imprima o maior deles. h. Confeccionar um algoritmo para ler um número e emitir se o mesmo é par ou ímpar. Módulo 6 - Lógica de Programação Curso de Informática Pag. 24 2.10.2.3 Condicional Múltipla Muitas vezes um algoritmo pode conter vários comandos mutuamente exclusivos, isto é, se um ou mais comandos forem executados os demais não o serão. Quando este for o caso, uma condicional múltipla é a mais indicada, cuja execução será aquele grupo de comandos precedido por um valor que seja igual ao valor corrente da variável. Completada a execução do grupo de comandos selecionado, o controle passa para o final da condicional múltipla. Senão houver o “casamento” do valor corrente da variável com nenhum valor explicitado, o grupo de comandos do senão será executado, se especificado. Caso Variável de Valor-1 : Grupo-Comandos-1 Valor-2 : Grupo-Comandos-2 ... Valor-n-1 : Grupo-Comandos-n-1 senão Grupo-Comandos-n FimCaso Exercícios: 1. Confeccione um algoritmo que leia o Código do Estado Civil e escreva a descrição correspondente ao mesmo conforme tabela abaixo. Código Estado Civil “C” “S” “D” “V” “M” Descrição “Casado” “Solteiro” “Divorciado” “Viúvo” “Marital” 2. Confeccione um algoritmo que simule o funcionamento de uma calculadora, ou seja, emita o resultado da operação entre dois operandos a partir da leitura dos mesmos e do operador. Considere que os possíveis operadores são: (+) para adição, (-) para subtração, (x) para multiplicação e (/) para divisão. 3. Confeccione um algoritmo que leia o mês (numérico) e o ano e emita a quantidade de dias deste mês/ ano. Considerar anos bissextos. Módulo 6 - Lógica de Programação Curso de Informática Pag. 25 2.10.3 Estrutura de Repetição A estrutura de repetição permite a execução de um conjunto de ações repetidamente enquanto uma determinada condição permanece válida. (Expressão cujo resultado é o valor lógico verdadeiro). Enquanto condição Condição Seqüência de Comandos Seqüência de Comandos FimEnquanto O controle da repetição (do laço) pode ser feita através de um contador ou de flags (marcas). 2.10.3.1 Tipos de Estruturas de Controle de Repetição utilizando Contador Para Enquanto Algoritmo declare Contador numérico ... Contador ← valor inicial ... Enquanto Contador < valor ... ... Contador ← Contador ± inc FimEnquanto ... ... FimAlgoritmo Algoritmo Repita Algoritmo declare Contador numérico declare Cont numérico ... ... ... Cont ← valor inicial Para Contador = valor inicial ... até valor final Repita passo incremento ... ... ... ... Cont ← Cont ± inc ... FimPara Ate Cont > valor ... ... ... ... FimAlgoritmo FimAlgoritmo Exercícios: a. Confeccionar um algoritmo para ler cinco números e emitir para cada um deles se o mesmo é positivo, negativo ou nulo. Módulo 6 - Lógica de Programação Curso de Informática Pag. 26 2.10.3.2 Controle de Repetição utilizando Flag Nesta abordagem utiliza-se uma marca com uma característica especial que torna o fim do conjunto de dados facilmente identificável, ou seja, o valor do flag deverá ser fornecido. No entanto, será preciso alterar as posições dos comando de leitura, por (1) assegurar-se de que o flag não seja processado pelos comandos do laço e (2) prever a possibilidade que o flag seja o primeiro a ser lido, para o caso em que não existam dados no conjunto. Algoritmo declare Variável_Flag declare Variáveis_Conjunto_Dados ... Leia Variável_Flag ... Enquanto Variável_Flag diferente Valor_Flag Leia Variáveis_Conjunto_Dados ... ... Leia Variável_Flag FimEnquanto ... ... FimAlgoritmo 2.10.3.3 Repetição Embutida São repetições dentro de outras repetições. A amplitude de uma repetição é encaixada na amplitude da outra repetição. A repetição interna é executada completamente para cada passagem da repetição externa. É da responsabilidade do programador garantir que o laço (repetição) termine. Laços que falham em terminar são extremamente caros e embaraçosos. A frequência desta situação é maior em laços condicionais (enquanto, repita), pois o mecanismo para os laços automáticos (para) é realizado pela linguagem. Módulo 6 - Lógica de Programação Curso de Informática Pag. 27 2.11 Lista de Exercícios 1. Quais valores serão emitidos pelo algoritmo abaixo? Algoritmo declare N, QUADRADO numérico N ← 10 Enquanto N > 1 QUADRADO ← N2 escreva QUADRADO N←N-1 FimEnquanto FimAlgoritmo 2. Confeccione um algoritmo que leia 100 números, calcule e imprima a média desses números. 3. Confeccione um algoritmo para determinar e imprimir o maior valor de um conjunto de 10 valores. 4. Confeccione um algoritmo que emita a soma dos números pares de 2 a 100 inclusive. 5. Confeccione um algoritmo que emita os números ímpares de 50 a 80. 7. A conversão de graus Farenheit para centígrados é obtida por C = 5/9 ( F - 32 ). Fazer um algoritmo que calcule e escreva uma tabela de graus centígrados em função de graus Farenheit, que variam de 50 a 100 de 1 em 1. 8. Fazer um algoritmo que dado o valor de N, calcule o valor de H = 1 + 1 + 1 + 1 + ... + 1 2 3 4 N 9. Confeccionar um algoritmo para ler um número e informar se o mesmo é primo ou não. 10. Fazer um algoritmo que calcule o N! ( fatorial de N ), sendo que o valor inteiro de N será informado pelo teclado. Considerar 0! = 1. 11. Confeccione um algoritmo para imprimir a sequëncia de Fibonacci (0, 1, 1, 2, 3, 5, 8, 13, ...) até o enésimo termo informado. Considerar n >= 2. 12. Fazer um algoritmo para ler n números quaisquer, onde número = -1 indica fim, e imprima a soma dos números ímpares, a média dos números pares e o produto desses números. Módulo 6 - Lógica de Programação Curso de Informática Pag. 28 13. Fazer um algoritmo que: • Leia um conj. de dados contendo cada um a idade e o nome de um indivíduo. O último conjunto não entrará nos cálculos, contém o valor da idade igual a 0 (zero). • Calcule e escreva a idade média deste grupo de indivíduos. 14. Tem-se um conjunto de dados contendo a altura e o sexo ( masculino, feminino ) de 50 pessoas. Fazer um algoritmo que calcule e escreva: • a maior e menor altura do grupo; • a média de altura das mulheres; • o número de homens. 15. Num frigorífico existem 90 bois. Cada boi traz em seu pescoço um cartão contendo seu número de identificação e seu peso. Fazer um algoritmo que leia estes dados e escreva a identificação e peso do boi mais gordo e do boi mais magro. 16. Fazer um algoritmo para ler o nome, o sexo e a idade de pessoas, onde o nome = “FIM” indica o fim, imprimir o nome do homem mais velho e da mulher mais nova. 17. O sistema de avaliação de uma determinada disciplina obedece aos seguintes critérios: • • • durante o ano letivo são dadas 4 notas; a nota final é obtida pela média aritmética das notas dadas durante o curso; é considerado aprovado o aluno que obtiver a nota final superior ou = 60 e que tiver comparecido a um mínimo de 40 aulas. Fazer um algoritmo que: a) Leia um conjunto de dados contendo o nome do aluno, as notas e a freqüência ( nº de aulas freqüentadas ) de 5 alunos. b) Calcule: a nota final de cada aluno; o total de alunos reprovados; o total de alunos aprovados. c) Escreva: • para cada aluno, o nome, a freqüência, a nota final e a mensagem (Aprovado / Reprovado). • no final do processamento o total de alunos reprovados e aprovados. Módulo 6 - Lógica de Programação Curso de Informática Pag. 29 18. Existem 3 candidatos a uma vaga no senado. Confeccione um algoritmo que leia um conjunto de dados contendo o voto de cada eleitor, calcule e imprima: • • • • o número do candidato vencedor o número de votos em branco o número de votos nulos o número de eleitores que votaram O voto de cada eleitor foi codificado da seguinte forma: 1 2 3 voto para os candidatos 0} 4} voto branco voto nulo O último voto não entrará nos cálculos, voto = -1. 19. Foi feita uma pesquisa para determinar o índice de mortalidade infantil em um certo período. Fazer um algoritmo que: a) Leia o número de crianças nascidas no período; b) Leia em seguida, um conjunto de dados, contendo cada um, o sexo de uma criança morta e o número de meses de vida da criança. A última criança não entrará nos cálculos, (sexo = branco) c) Determine e imprima; c.1. - a porcentagem de crianças mortas no período; c.2. - a porcentagem de crianças do sexo masculino mortas no período; c.3. - a porcentagem de crianças que viveram menos de 24 meses. 20. Uma companhia de teatro planeja dar uma série de espetáculos. A direção planeja que a, R$ 100,00 o ingresso, serão vendidos 120 ingressos, e as despesas montarão em R$ 500,00. A uma diminuição de R$ 5,00 no preço do ingresso espera-se que haja um aumento de 20 ingressos vendidos. Fazer um algoritmo que escreva uma tabela de valores conforme lay-out abaixo, fazendo-se variar este preço de R$ 100,00 a R$ 10,00 de R$ 5,00 em R$ 5,00. PREÇO - R$ NÚMERO INGRESSOS 100,00 95,00 90,00 ... 10,00 Módulo 6 - Lógica de Programação 120 140 160 ... 999 DESPESA - R$ 500,00 500,00 500,00 ... 500,00 LUCRO - R$ 9999999 9999999 9999999 ... 9999999 Curso de Informática Pag. 30 21. Para se determinar o número de lâmpadas necessárias para cada cômodo de uma residência, existem normas que dão o mínimo de potência de iluminação exigida por metro quadrado ( m2 ), conforme a utilização deste cômodo. Seja a seguinte tabela tomada como exemplo: UTILIZAÇÃO quarto sala de TV salas cozinha varandas escritório banheiro CLASSE 1 1 2 2 2 3 3 POTÊNCIA/m2 15 15 18 18 18 20 20 Supondo que só serão usadas lâmpadas de 60 W, fazer um algoritmo que: a) Leia um conjunto de dados contendo cada um: • cômodo de uma residência; • classe de iluminação deste cômodo; • as duas dimensões do cômodo. b) Calcule e escreva: b.1) para cada cômodo: • o cômodo; • a área do cômodo; • a potência de iluminação; • número de lâmpadas necessárias; b.2) para toda a residência: • total de lâmpadas; • total de potência. c) Considere: 1) Se o número de lâmpadas for fracionário, considerar o menor inteiro que contenha este número. Ex.: 8,3 → 9; 8,7 → 9. 2) O último conjunto de dados , que não entrará nos cálculos, conterá no lugar do cômodo a palavra VAZIO. 22. Supondo que a população de um país A seja da ordem de 90 mil habitantes com uma taxa anual de crescimento de 3% e que a população de um país B seja, aproximadamente, de 200 mil habitantes com uma taxa de crescimento de 1,5%; fazer um algoritmo que calcule e escreva o número de anos necessários para que a população do país A ultrapasse ou se iguale à população do país B, mantidas estas taxas de crescimento. Módulo 6 - Lógica de Programação Curso de Informática Pag. 31 23. Uma empresa decidiu fazer um levantamento em relação aos candidatos que se apresentaram para o preenchimento de vagas no seu quadro de funcionários, utilizando processamento eletrônico. Supondo que você seja o programador encarregado deste levantamento, fazer um algoritmo que: a) Leia um conjunto de dados contendo, para cada candidato, os seguintes dados: • número de inscrição ( Flag = 0 ) • nome • idade (em anos) • sexo (Masculino / Feminino) • experiência no serviço (Sim / Não) b) Calcule: b.1) o número de candidatos do sexo masculino; b.2) o número de candidatos do sexo feminino; b.3) idade média dos homens que já tem experiência no serviço; b.4) o número de mulheres que tem idade inferior a 35 anos e com experiência no serviço. c) Escreva: c.1) o número de inscrição e o nome das mulheres pertencentes ao grupo descrito no item b.4; c.2) o que foi calculado em cada item acima especificado ( do b.1 ao b.4). 24. Foi feita uma pesquisa de audiência de canal de TV em várias casas de uma certa cidade, num determinado dia. Para cada casa visitada, foi registrado um conj. de dados contendo o número do canal ( 4, 5, 7, 12 ) e o número de pessoas que o estavam assistindo naquela casa. Se a televisão estivesse desligada, nada era perfurado, ou seja, esta casa não entrava na pesquisa. Fazer um algoritmo que: • leia estes conjuntos de dados, considerando que o último contém o número do canal igual a 0 (zero); • calcule a porcentagem de audiência para cada emissora (Total de Assistentes do Canal / Total de Assistentes x 100); • escreva o número do canal e sua respectiva porcentagem. Módulo 6 - Lógica de Programação Curso de Informática Pag. 32 25. Uma universidade deseja fazer um levantamento a respeito de seu concurso vestibular. Para cada curso, o conjunto de dados: • o código do curso; • número de vagas; • número de candidatos do sexo masculino; • número de candidatos do sexo feminino. O último conjunto, para indicar fim de dados, contém o código do curso igual a 0 (zero) Fazer um algoritmo que: • calcule e escreva, para cada curso, o número de candidatos por vaga e a porcentagem de candidatos do sexo feminino ( escreva também o código correspondente do curso ); • determine o maior número de candidatos por vaga e escreva esse número juntamente com o código do curso correspondente ( supor que não haja empate ); • calcule e escreva o total de candidatos. 26. Deseja-se fazer uma pesquisa a respeito do consumo mensal de energia elétrica em uma determinada cidade. Para isso, foram registrados o seguinte conjunto de dados: • número do consumidor;’ • quantidade de kWh consumidos durante o mês; • código do tipo de consumidor ( Residencial, Comercial, Industrial ). O último conjunto, que não entrará nos cálculos, contém o número do consumidor igual a 0 (zero). Fazer um algoritmo que: • leia o preço do kWh • leia os dados descritos acima; • calcule: a) para cada consumidor o total a pagar; b) o maior consumo verificado; c) o menor consumo verificado; d) o total de consumo para cada um dos três tipos de consumidores; e) a média geral de consumo; • escreva: a) para cada consumidor, o seu número e o total a pagar; b) o que foi calculado nos itens b, c, d ,e acima especificados. Módulo 6 - Lógica de Programação Curso de Informática Pag. 33 27. A comissão organizadora de um rallye automobilístico decidiu apurar os resultados da competição através de um processamento eletrônico. Um dos algoritmos necessários para a classificação das equipes concorrentes, é o que emite uma listagem geral do desempenho das equipes, atribuindo pontos segundo determinadas normas. O algoritmo deverá: a) Ler: a.1) um conjunto de dados contendo os tempos-padrão para as três fases de competição; a.2) um conjunto de dados contendo cada um o número de inscrição da equipe e os tempos que as mesmas despenderam ao cumprir as três diferentes etapas. O último conjunto (flag), que não entrará nos cálculos, contém o número de inscrição 99999. b) Calcular: b.1) os pontos de cada equipe em cada uma das etapas, seguindo o seguinte critério: Seja ∇ o valor absoluto da diferença entre o tempo padrão (lido no primeiro conjunto) e o tempo despendido pela equipe em cada etapa: ∇ (Delta) <3 de 3 a 5 >5 Pontos da Etapa 100 80 70 b.2) o total de pontos de cada equipe nas três etapas; b.3) a equipe vencedora. c) Escrever: c.1) Para cada equipe, o número de inscrição, os pontos obtidos em cada etapa e o total de pontos obtidos. c.2) A inscrição da equipe vencedora. Módulo 6 - Lógica de Programação Curso de Informática Pag. 34 28) Numa certa loja de eletrodomésticos, o comerciário encarregado da seção de televisores recebe, mensalmente, um salário fixo mais comissão. Essa comissão é calculada em relação ao tipo e ao número de televisores vendidos por mês, obedecendo à tabela abaixo: TIPO A cores preto e branco Nº TELEVISORES VENDIDOS >= a 10 < que 10 >= a 20 < que 20 COMISSÕES R$ 10,00 por televisor R$ 5,00 por televisor R$ 4,00 por televisor R$ 2,00 por televisor Sabe-se, ainda, que ele tem um desconto de 8% sobre seu salário fixo para o INSS. Se o seu salário total (fixo + comissões - INSS) for maior ou igual a R$ 800,00, ele ainda terá um desconto de 5%, sobre esse salário total, relativo ao imposto de renda retido na fonte. Sabendo-se que existem 20 empregados nesta seção, leia o número de inscrição, o nome, o valor do salário fixo, o número de televisores a cores e o número de televisores preto e branco vendidos; calcule e escreva o número de inscrição de cada empregado, seu salário total e seu salário líquido. 29) Um determinado material radiativo perde metade de sua massa a cada 50 segundos. Confeccione um algoritmo para ler uma massa inicial, em gramas e determine o tempo necessário para que essa massa se torne menor que 0,5. Escreva a massa final, e o tempo calculado em horas, minutos e segundos. 30) Escrever um algoritmo para calcular o saldo final da conta de 50 clientes de um banco, a partir do saldo inicial a ser informado e dos N movimentos do cliente, contendo o tipo do movimento (crédito ou débito) e o valor do movimento. Critique o tipo do movimento. Módulo 6 - Lógica de Programação Curso de Informática Pag. 35 2.12 Algoritmos de Quebras de Controle Se observamos os tipos de extração de dados (consultas, relatórios) podemos classificá-las em: a. Relatórios de Detalhes ou de Transações b. Relatórios de Exceções c. Relatórios de Resumo Os relatórios ou consultas de detalhes ou de transações consistem na leitura de um arquivo de dados onde praticamente são criadas saídas para cada registro de entrada lido, ou seja, as saídas são individualizadas. Por exemplo, relatório que emitem contracheques, faturas, posição de estoque, dados básicos de alunos, empregados, etc.. Os relatórios de exceções consistem praticamente quando o usuário necessita não de todos os dados do arquivo, mas sim de parte dele. Como exemplo podemos citar a relação dos clientes que estão atrasados com os pagamentos, a relação de alunos de um determinada turma, relação de pecas cuja quantidade em estoque é inferior a um valor mínimo. Logo, o relatório de exceções é uma listagem de registros específicos que satisfazem certos critérios. Relatórios de Resumo, como o nome sugere, resume, não detalha. Geralmente, os resumos, ou totais podem fornecer ao usuário uma visão mais abrangente do que um relatório de detalhes ou exceções. Considere o exemplo abaixo: Um arquivo em disco contem registros de vendas, cada um com três campos de entrada: o número do departamento do vendedor, o nome do vendedor e o valor das vendas realizadas pelo vendedor, acumulado na semana. Os registros do arquivo de entrada estão em seqüência, por número de departamento. Pode haver vários registros de vendedores para o DEPT 01, DEPT 02, etc. Isto é, pode haver vários registros com o mesmo numero de departamento, dependendo do número de vendedores dentro de cada departamento. As saídas podem ser 1) um relatório que contem não só o valor das vendas de cada vendedor, mas também o valor total das vendas de cada departamento ou 2) um relatório contendo somente o valor total das vendas de cada departamento. O usuário, no caso, é a melhor pessoa para definir qual das saídas pretende que seja realizada. Departamento 01 01 01 02 02 Módulo 6 - Lógica de Programação Nome do Vendedor Ze da Silva Ana da Silva Rui Rita Aida Valor Vendas Realizadas 500,00 300,00 700,00 400,00 450,00 Curso de Informática Pag. Saída 1 RELATÓRIO MENSAL DE SITUAÇÃO DEPARTAMENTO 9999 9999 VENDEDOR VALOR TOTAL X-------------------------X X-------------------------X X-------------------------X 999999999 999999999 999999999 9999999 X-------------------------X X-------------------------X X-------------------------X 999999999 999999999 999999999 9999999 TOTAL DE VENDAS REALIZADAS NO MÊS............................................................ 99999999 SOLUÇÃO PARA SAÍDA 1 Módulo 6 - Lógica de Programação 36 Curso de Informática Pag. Saída 2 RELATÓRIO MENSAL DE SITUAÇÃO DEPARTAMENTO 9999 9999 9999 9999 VALOR 999999999 999999999 999999999 999999999 TOTAL DE VENDAS REALIZADAS NO MÊS......................... 9999999999 SOLUÇÃO PARA SAÍDA 2 Módulo 6 - Lógica de Programação 37 Curso de Informática Pag. 2.12.1 Esquema para solução de Rotinas de Quebras de Controle Algoritmo declare PG Enquanto não EOF PQ Enquanto não EOF e mesmo item de quebra PR FimEenquanto TQ FimEnquanto TG FimAlgoritmo PG - Preparação para o Geral PQ - Preparação para Quebra PR - Processamento do Registro de Dados Módulo 6 - Lógica de Programação TQ - Tratamento da Quebra TG - Tratamento Geral 38 Curso de Informática Pag. Exercícios: 1. Confeccionar um algoritmo que: a. Leia um conjunto de dados (arquivo) ordenado por Número do Armazém, contendo: Número do Armazém Número do Item Quantidade em Estoque Preço Unitário b. Emita relatório conforme lay-out abaixo: RELATÓRIO POSIÇÃO DE ESTOQUE ARMAZÉM ITEM QTD ESTOQUE PAG. 999 PREÇO UNIT. VALOR TOTAL 9999 X----X 99999 99999,99 9999999,99 X----X 99999 99999,99 9999999,99 TOTAL DO ARMAZÉM ....................................................999999999,99 9999 X----X 99999 99999,99 9999999,99 X----X 99999 99999,99 9999999,99 TOTAL DO ARMAZÉM .....................................................999999999,99 TOTAL GERAL EM ESTOQUE .........................................................................999999999,99 TOTAL DE ARMAZÉNS....................................................................................................9999 2. Confeccione um algoritmo que: a. Leia um conjunto de dados ordenado por DEPARTAMENTO, contendo: Departamento Nome do Empregado Salário Total de Descontos b. Leia uma taxa de aumento que será utilizada no cálculo de novos salários dos empregados. c. Emita a FOPAG conforme lay-out abaixo: Módulo 6 - Lógica de Programação 39 Curso de Informática Pag. BEER Cia - FOPAG DEPTO NOME SALÁRIO NOVO SALÁRIO DESCONTOS SALÁRIO LIQUIDO XXX X------X 9-------9 9------------9 9-------------9 X------X 9-------9 9------------9 9-------------9 X------X 9-------9 9------------9 9-------------9 TOTAL A PAGAR .....................................................................: MAIOR SALÁRIO LIQUIDO ........................................................: 9---------------9 9---------------9 9---------------9 9----------------9 9----------------9 XXX X------X 9-------9 9------------9 9-------------9 X------X 9-------9 9------------9 9-------------9 X------X 9-------9 9------------9 9-------------9 TOTAL A PAGAR .....................................................................: MAIOR SALÁRIO LIQUIDO ........................................................: 9---------------9 9---------------9 9---------------9 9----------------9 9----------------9 TOTAL GERAL A PAGAR .........................................................................: 9---------------9 TOTAL GERAL DE EMPREGADOS ...........................................................: 9999 3. Confeccionar um algoritmo que: a. Leia um conjunto de dados ordenado por MÊS, contendo Mês Nome do Produto Quantidade Pedida do produto no mês Preço Unitário do produto b. Emita relatório, conforme lay-out abaixo: PEDIDOS REALIZADOS NO EXERCÍCIO MÊS PRODUTO QTD PEDIDA PR UNITÁRIO VALOR PEDIDO XXX X--------------------------X 9-------9 9------------9 X--------------------------X 9-------9 9------------9 X--------------------------X 9-------9 9------------9 VALOR TOTAL DE PRODUTOS PEDIDOS ................................: 9-------------9 9-------------9 9-------------9 9----------------9 XXX X--------------------------X 9-------9 9------------9 X--------------------------X 9-------9 9------------9 X--------------------------X 9-------9 9------------9 VALOR TOTAL DE PRODUTOS PEDIDOS ................................: 9-------------9 9-------------9 9-------------9 9----------------9 TOTAL GERAL DE VALORES PEDIDOS .......................................................: 9-----------------9 MÊS COM MAIOR VALOR DE PEDIDO ........................................................: XXX Módulo 6 - Lógica de Programação 40 Curso de Informática Pag. 41 4. A Biblioteca da Escola realizou um levantamento do seu acervo referente a livros. Assim sendo, confeccione um algoritmo que: a. Leia um conjunto de dados ordenado por TIPO DO LIVRO, contendo: Tipo do Livro Título do Livro Quantidade do Acervo Quantidade Ideal do Acervo b. Emita relatório conforme lay-out abaixo: ETFSE - SETOR: BIBLIOTECA LEVANTAMENTO DO ACERVO DE LIVROS TIPO DO LIVRO TÍTULO DO LIVRO QTD ACERVO X--------------X X-------------------------------------X 9------9 9------9 X-------------------------------------X 9------9 9------9 X-------------------------------------X 9------9 9------9 TOTAL DE TÍTULOS ...................................................: 9------9 LIVRO MAIS PRIORITÁRIO PARA AQUISIÇÃO ......: X------------X X--------------X X-------------------------------------X 9------9 9------9 X-------------------------------------X 9------9 9------9 X-------------------------------------X 9------9 9------9 TOTAL DE TÍTULOS ...................................................: 9------9 LIVRO MAIS PRIORITÁRIO PARA AQUISIÇÃO ......: X------------X TOTAL DE TIPOS DE LIVROS .........................................................................: QTD IDEAL 9-------9 c. Considere: A não necessidade de aquisição para um determinado tipo de livro, onde a Quantidade do Acervo for maior ou igual a Quantidade Ideal. Módulo 6 - Lógica de Programação Curso de Informática Pag. 5. Confeccionar um algoritmo que: a. Leia um conjunto de dados ordenado por REGIÃO e PARTIDO contendo: Região Partido Nome do Candidato Total de Votos b. Emita relatório conforme lay-out abaixo: ELEIÇÕES 1997 REGIÃO PARTIDO CANDIDATO TOTAL DE VOTOS X--------------X X----------------------X X---------------------X 9------9 X---------------------X 9------9 X---------------------X 9------9 TOTAL DE VOTOS................: 9------9 X----------------------X X---------------------X 9------9 X---------------------X 9------9 X---------------------X 9------9 TOTAL DE VOTOS...............: 9------9 TOTAL DE VOTOS DA REGIÃO ....................................: 9-------9 X--------------X X----------------------X X---------------------X 9------9 X---------------------X 9------9 X---------------------X 9------9 TOTAL DE VOTOS................: 9------9 X----------------------X X---------------------X 9------9 X---------------------X 9------9 X---------------------X 9------9 TOTAL DE VOTOS...............: 9------9 TOTAL DE VOTOS DA REGIÃO ....................................: 9-------9 TOTAL GERAL DE VOTOS ...................................................................................: Módulo 6 - Lógica de Programação 9-------9 42 Curso de Informática Pag. 43 Capítulo 3 - Modularização 3.1 Introdução Nos fins da década de 60, a frequência de um conjunto de problemas no desenvolvimento de sistemas de programação levou os países desenvolvidos à chamada “crise do software”. Os custos da atividade de programação mostravam a cada ano uma clara tendência a se elevar muito em relação aos custos dos equipamentos. Essa tendência é devida, em grande parte, ao rápido avanço tecnológico na fabricação dos equipamentos de computação em contrapartida com o lento desenvolvimento tecnológico que o software tem tido. A não utilização de uma metodologia para a construção de programas conduz à produção de programas geralmente cheios de erro e com alto custo de desenvolvimento, que consequentemente exigem grandes custos para sua correção e manutenção futuras. A programação estruturada é hoje o resultado de uma série de estudos e propostas de disciplinas e metodologias para o desenvolvimento de software. Conceitos associados como técnicas de refinamentos sucessivos e modularização dos programas integram o ferramental para elaboração de programas visando principalmente, os aspectos de confiabilidade, manutenibilidade e flexibilidade. Dijkstra, sem dúvida um dos principais introdutores da programação estruturada, afirma que “a arte de programar consiste na arte de organizar e dominar a complexidade dos sistemas”. Esta complexidade definida pelo número de componentes de um sistema e grau de interação entre eles. Pode-se reunir as idéias da programação estruturada em três grupos: • desenvolvimento de algoritmos por fases ou refinamentos sucessivos; • uso de um número muito limitado de estruturas de controle; • decomposição do algoritmo total em módulos. O desenvolvimento de algoritmos por refinamentos sucessivos e o uso de número limitado de estruturas de controle são técnicas usadas largamente para obter algoritmos de boa qualidade. Abordaremos os aspectos de decomposição de algoritmos em módulos como recurso para dominar a complexidade e organizar o processo de programação. 3.2 Conceito de Modularização A técnica dos refinamentos sucessivos possibilita ao programador nas etapas iniciais do desenvolvimento, certas abstrações sobre os processos a serem descritos no algoritmo. Estas abstrações são definidas apenas pelo seu efeito e constituem uma definição funcional do processo. Nas etapas posteriores, cada descrição funcional é substituída por trechos mais detalhados e que especificam as etapas do processo. Módulo 6 - Lógica de Programação Curso de Informática Pag. 44 Quando no processo de desenvolvimento do algoritmo por refinamento, que se constitui na fase de projeto do programa, faz-se a opção pela divisão do algoritmo; este procedimento conduz à modularização da solução do problema. Um módulo é então um grupo de comandos, constituindo um trecho de algoritmo, com uma função bem definida. Dijkstra, analisando as limitações humanas na tarefa de elaboração de algoritmos mais complexos, propõe a modularização como uma regra áurea da programação: dividir para reinar. Esta divisão da atividade de programação permite que a cada instante toda a atenção do programador esteja concentrada na solução de cada problema específico e bem definido. Da mesma forma, pode-se verificar a correção do algoritmo por etapas analisando-se a correção de cada módulo. Resumindo, a programação modular é uma técnica de programação que tem por objetivo simplificar o desenvolvimento de programas através de sua divisão em “partes”. Cada uma dessas “partes” pode ser mais facilmente entendida, programada, testada e modificada, pois o problema que está sendo resolvido é menor. A decisão pela divisão do algoritmo em módulos traz benefícios como: • reutilização de código; • a elaboração do módulo pode ser feita independentemente e em época diferente do restante do algoritmo; • testes e correção dos módulos podem ser feitos em separado. Até agora temos desenvolvido programas que englobam a lógica completa do algoritmo para a solução de um determinado problema. Exemplo Existem 3 candidatos a uma vaga no senado. Confeccione um algoritmo que leia um conjunto de dados contendo o voto de cada eleitor, calcule e imprima: • • • • o número do candidato vencedor o número de votos em branco o número de votos nulos o número de eleitores que votaram O voto de cada eleitor foi codificado da seguinte forma: 1 2 3 voto para os candidatos 0} 4} voto branco voto nulo O último voto não entrará nos cálculos, voto = -1. Módulo 6 - Lógica de Programação Curso de Informática Pag. 45 Etapa-1 - Decomposição Algoritmo Declare Variáveis Inicialize Variáveis Trabalho Apure Votos Determine Candidato Vencedor Emita Resultados FimAlgoritmo Ao se elaborar tal refinamento (decomposição), não houve preocupação de como o processo de apuração de votos seria efetuado e sim o que deve ser feito para realizar tal processo. Essas ações constituem funções bem definidas no algoritmo e que serão executadas por módulos específicos. O ponto básico para programação modular é a abordagem de resolução de problemas através de sua decomposição. Esta abordagem possibilita a obtenção de bons resultados através de algumas premissas: • Política de “Dividir para conquistar”. • Com a divisão do problema original em vários subprogramas menores, a solução do problema é conseguida através da combinação das soluções dos subprogramas. • Como cada subprograma é menor que o problema original, a solução destes problemas menores também é mais simples. • A cada unidade resultante da decomposição de um algoritmo chama-se Refinamento ou Módulo. • Um problema deve ser subdividido até o ponto em que, se fizermos uma nova subdivisão, cada módulo tenha que ser descrito através de comandos elementares, e não mais por chamadas a outros módulos. A versão final modularizada do algoritmo ficaria então constituída do algoritmo abaixo mais os módulos refinados: Módulo 6 - Lógica de Programação Curso de Informática Pag. Etapa-2 – Especificação dos módulos Ref. Declare Variáveis Declare VOTO, VENC, BRANCO, NULO,ELEIT numérico Declare VCAND1, VCAND2, VCAND3 numérico End-Ref. Ref. Inicialize Variáveis BRANCO ← 0 NULO ← 0 ELEIT ← 0 VCAND1 ← 0 VCAND2 ← 0 VCAND3 ← 0 End-Ref. Ref. Apure Votos Leia VOTO Enquanto VOTO # -1 Caso VOTO de 0 : BRANCO 1 : VCAND1 2 : VCAND2 3 : VCAND3 4 : NULO EndCaso ELEIT ← ELEIT Leia VOTO FimEnquanto End-Ref. ← ← ← ← ← BRANCO + 1 VCAND1 + 1 VCAND2 + 1 VCAND3 + 1 NULO + 1 + 1 Ref. Determine Candidato Vencedor Se VCAND1 > VCAND2 e VCAND1 > VCAND3 então VENC ← 1 senão Se VCAND2 > VCAND3 então VENC ← 2 senão VENC ← 3 FimSe FimSe End-Ref. Ref. Emita Resultados Escreva VENC, BRANCO, NULO, ELEI End-Ref. Módulo 6 - Lógica de Programação 46 Curso de Informática Pag. 47 Podemos observar acima que um módulo é uma “parte” de um algoritmo com uma única função perfeitamente definida à qual pode ser atribuído um nome que a descreva. Uma notação para a descrição estrutural da modularização de problemas é o diagrama hierárquico. Apresenta-se a seguir o diagrama do problema: Módulo Principal Inicialize Variáveis Trabalho Apure Votos Determine Cand. Vencedor Emita Resultados 3.2.1 Visões de um Módulo Visão Externa Interna Atributo Nome Entrada Saída Função Lógica Dados Internos Descrição Identificação pela qual o módulo pode ser referenciado. Parâmetros que são passados do chamador para o módulo. Parâmetros que são passados do módulo para o chamador. O que faz com a Entrada para se produzir a Saída. A codificação de comandos para realizar sua função Seu espaço de trabalho, dados pelos quais somente o módulo faz referências. (objetos locais) A maneira mais intuitiva de proceder a modularização de problemas é feita definindo-se um módulo principal de controle e módulos específicos para as funções do algoritmo. No diagrama anterior, o módulo principal tem a função de controlar a ativação (chamada) aos outros módulos. Módulo 6 - Lógica de Programação Curso de Informática Pag. 48 3.3 Ferramentas para Modularização Em termos funcionais, existem dois tipos de módulos: 3.3.1 Procedimento ou Rotina Módulo que, a partir de dados de entrada, executa uma tarefa e gera informações de saída. A chamada a um procedimento é feita através da indicação do seu nome. No exemplo acima, todos os módulos são do tipo procedimento. 3.3.2 Função Módulo que, a partir de dados de entrada, executa uma tarefa e gera apenas uma informação de saída. A informação de saída é atribuída ao nome da função e devolvida pela função na própria posição em que foi chamada. Toda função possui um tipo associado, que é o tipo de informação que a função retorna. Logo, a chamada a uma função deve estar em uma expressão (lógica, numérica ou literal). Exemplo de Função Algoritmo { Calcula Y = X / N! } Declare X, Y, N numérico Leia Y, N Y ← X / FATORIAL (N) Escreva Y FimAlgoritmo Função FATORIAL (NUMERO) : numérico declare FAT, CONT numérico FAT ← 1 Para CONT = 2 até NUMERO passo 1 FAT ← FAT x CONT FimPara FATORIAL ← FAT FimFunção Módulo 6 - Lógica de Programação Ativação da Função Tipo do valor a ser retornado pela função Retorno do valor através do nome da função Curso de Informática Pag. 49 3.4 Regras de Escopo e os Aspectos de Conflito de Identificadores Um outro aspecto importante que envolve a modularização, em particular a modularização de dados, é a possibilidade de cada módulo poder definir as suas estruturas de dados próprias, suficientes e necessárias apenas para atingir o objetivo final do módulo. Este aspecto disciplina e impõe restrições à utilização das estruturas de dados do algoritmo. Toda a comunicação entre módulos deverá ser bem definida através de vínculos entre os mesmos. As linguagens de programação hoje existentes dispõem de recursos que facilitam a construção e manipulação de módulos. Estes recursos permitem não só a modularização dos comandos do programa como também a modularização dos dados utilizados. O algoritmo apresentado a seguir mostra o aspecto do escopo ou validade das variáveis considerando o bloco existente. Exemplo: Algoritmo declare I,J numérico leia I, J bloco declare I,X numérico I ← 2xJ+1 X ← J+I escreva X fimbloco I ← JxI escreva I FimAlgoritmo Com referência ao algoritmo acima, pode-se observar que: ⇒ Existem duas variáveis I no algoritmo. A primeira, declarada no início do algoritmo, em sua validade antes e após o bloco. Isto se deve ao fato da existência de uma segunda variável declarada no bloco que tem a sua validade apenas dentro do bloco, como indicado por I. Qualquer referência a I dentro do bloco será feita à variável nele declarada que é criada quando do seu início e se destroe no seu fim. As demais referências são feitas a variável I declarada no início do algoritmo. ⇒ A variável J tem validade em todo o algoritmo, inclusive dentro do bloco, por ser externa a ele. ⇒ A variável X só tem validade dentro do bloco. O uso de blocos e objetos locais se constitui em uma ferramenta muito útil para a modularização de algoritmos. O bloco é, pois, um módulo do algoritmo que possui comandos próprios e objetos próprios. Sendo assim, qualquer objeto utilizado apenas no escopo de um bloco não precisa ser conhecido em todo algoritmo, como foi mostrado em exemplo anterior, onde a variável AUXILIAR só é declarada no bloco de valores. Módulo 6 - Lógica de Programação Curso de Informática Pag. 50 A utilização de objetos locais, sempre que possível, e, consequentemente, a redução da utilização de objetos globais é uma técnica muito útil quando se trabalha com algoritmos de maior porte e onde o controle do uso de objetos como, por exemplo, variáveis, torna-se efetivamente complexo. Abordando o aspecto dinâmico do algoritmo, a modularização em blocos pode, dependendo do equipamento utilizado, facilitar a segmentação dos programas quando em execução. Deve-se ter cuidado, no entanto, com o acréscimo de trabalho computacional quando, por exemplo, se utilizar blocos dentro de estruturas de repetição. O conflito de identificadores pode ocorrer em algoritmos quando objetos são definidos em níveis diferentes (por exemplo, no algoritmo propriamente dito e em um bloco) utilizando o mesmo identificador. Estes casos são resolvidos utilizando-se a regra básica de que a referência é primeiramente feita às declarações do mesmo nível. Sendo assim, o objeto efetivamente utilizado na referência será o que estiver no nível mais interno em relação a referência. Um método bastante simples para se analisar o escopo de identificadores é traçar um modelo gráfico do algoritmo e dos blocos nele contido. r3 I J r2 r4 leia I I←IxI leia J bloco I← J x I escreva I r1 I X I ← 2 x J +1 X←J+1 A B No esquema acima, o contorno mais interno corresponde ao bloco e o mais externo, ao algoritmo propriamente dito. Os quadros no canto superior esquerdo contem a legenda descritiva dos identificadores declarados no respectivo contorno. Pode-se voltar agora às observações feitas anteriormente com relação a este algoritmo. Veja-se: 1. Nota-se claramente a dupla existência do identificador I, no entanto, como pode-se ver, são memórias diferentes e existentes em domínios diferentes, apenas possuem uma identificação única. As referências a I de dentro do bloco A (r1) são feitas na legenda de A e as referências (r2) no contorno B são feitas na legenda B. Módulo 6 - Lógica de Programação Curso de Informática Pag. 51 2. Todas as referências (r3) e (r4) ao identificador J, mesmo dentro do bloco A, são feitas à legenda de B, pois não existe J na legenda do bloco. 3. A variável X só pode ser usada dentro do bloco A onde existe. Qualquer referência a X fora do mesmo é ilegal, pois a mesma não existe na legenda mais externa. 3.4.1 A Utilização de Objetos Locais e Globais em Procedimentos/Funções As regras de espaços e para tratamento de conflito de identificadores apresentadas anteriormente são válidas tanto para os blocos como para os mesmos aspectos nos procedimentos. Cada procedimento, para efeito da análise de escopo e conflito de identificadores, é como se fosse um bloco localizado no nível em que está declarado. Sendo assim, uma função ou um procedimento utiliza objetos locais declarados no seu corpo ou pode também utilizar objetos globais declarados em níveis mais externos. As variáveis globais se utilizadas dentro dos procedimentos é uma das formas de transmissão de informações de fora para dentro e de dentro para fora dos procedimentos. O uso de variáveis declaradas globalmente provoca a inserção de dados ao procedimento. Da mesma forma, as modificações feitas em variáveis globais dentro do procedimento é a forma de transmitir ao nível mais externo, em geral o módulo principal algum valor determinado dentro da mesma. É de se notar que as variáveis locais apenas existem quando da execução do procedimento, ou seja, são criadas no início da sua execução e são destruídas ao final. Apesar da possibilidade de uso de objetos globais, os procedimentos devem ser construídos de forma a reduzir ao máximo esta utilização. Poder-se-ia dizer, em outras palavras, que a modularização dos programas deve minimizar a referência feita às variáveis globais em um algoritmo. Este procedimento torna os algoritmos mais estruturados e organizados do ponto de vista de objetos utilizados, o que facilita, sem dúvida, a sua compreensão. O algoritmo abaixo exemplifica o uso de objetos locais e globais em procedimento. Neste algoritmo, X é uma variável local ao procedimento e não tem sentido fora do mesmo. No entanto, as variáveis A,B e C são globais ao mesmo procedimento e existem durante toda a execução do algoritmo principal (são locais ao algoritmo principal). O procedimento EXEMPLO utiliza todas as variáveis X,A,C, a primeira local a ele e as demais locais ao algoritmo e globais ao mesmo procedimento. Algoritmo declare A,B,C numérico leiaA,B,C EXEMPLO escreva A,B,C FimAlgoritmo Procedimento EXEMPLO declare X numérico X← A se B = 0 então B← X senão B← A + C fim-se Fimprocedimento Deve ser observado que a referência feita a objetos globais dentro de um procedimento constitui a maneira mais intuitiva de transferência de informações para dentro de um procedimento e da mesma forma para transferência de resultados para os níveis mais externos. No exemplo, a utilização de A e C dentro do procedimento importa valores do bloco mais externo e a atribuição de valores a B provoca a transferência de valores calculados para fora do procedimento. Módulo 6 - Lógica de Programação Curso de Informática Módulo 6 - Lógica de Programação Pag. 52 Curso de Informática Pag. 53 3.5 Comunicação entre módulos A transferência de informações de e para módulos utilizando-se de variáveis globais não constitui uma boa disciplina de programação. Estas transferências precisam ser mais formalizadas e documentadas, a bem da legibilidade, documentação e organização do algoritmo elaborado. A utilização de parâmetros de transferência se constitui em um método mais adequado e que atende a critérios anteriormente expostos. Além disso, permite que um mesmo procedimento possa ser utilizado com operandos diferentes, dependendo da função que se deseja do mesmo. Parâmetros são dados de entrada para os procedimentos e funções ou dados de saída para os procedimentos. Existem dois tipos de parâmetros: 3.5.1 Atual ou Real É aquele que, na chamada ao módulo, está na lista de parâmetros. Geralmente, este parâmetro é uma variável que envia e/ou recebe dados do módulo Ele também pode ser uma constante ou uma expressão. a. procedimento NOME (lista de parâmetros atuais) b. função NOME (lista de parâmetros atuais) 3.5.2 Formal É aquele que na especificação do módulo, está na lista de parâmetros. Ele tem a função de receber e/ou enviar valor ao parâmetro atual correspondente. A declaração de módulos que utilizam parâmetros é feita como se segue: a. Ref. NOME (lista de parâmetros formais) .... .... FimRef. b. Ref NOME (lista de parâmetros formais) tipo FimRef. É obrigatório que exista uma “correspondência posicional” entre a lista de parâmetros formais e a lista de parâmetros atuais, ou seja, o primeiro parâmetro formal é associado ao primeiro parâmetro atual, e assim por diante. onde: procedimento/função são palavras chaves; tipo é o tipo do resultado da função lista de parâmetros é a lista de objetos globais que serão utilizados dentro do procedimento e que têm seus valores passados do algoritmo ou procedimento chamador para este procedimento. Módulo 6 - Lógica de Programação Curso de Informática Pag. 54 NOME (Atual_1, Atual_2, Atual_3) Ref. NOME (Formal_1, Formal_2, Formal_3) .... .... FimRef. Existem basicamente duas formas de passagem de parâmetros: 3.5.3 Por Valor O conteúdo do parâmetro atual é passado para o seu correspondente formal, mas só permitindo a leitura do mesmo, ou seja, o valor do parâmetro pode ser utilizado dentro do módulo, mas o módulo não conseguirá alterar seu valor. Também chamado de parâmetro de entrada. 3.5.4 Por Referência O endereço do parâmetro atual é passado para o módulo. Permite tanto a leitura quanto a alteração do seu conteúdo através do parâmetro formal correspondente. Também chamado de parâmetro de entrada e saída. Módulo 6 - Lógica de Programação Curso de Informática Exemplos: 1. Procedimentos : Algorítmo Declare MENS literal MENS <= “TESTE” Emita_Linha Escreva MENS Emita_Linha FimAlgorítmo Ref. Emita_Linha Declare COLUNA numérico COLUNA <= 1 Enquanto COLUNA =< 80 Escreva “ - ” COLUNA <= COLUNA + 1 FimEnquanto FimRef. Módulo 6 - Lógica de Programação Pag. 55 Curso de Informática 2. Procedimentos com passagem de parâmetros Algorítmo Declare X , Y numérico Soma_Num ( 4 , 5 ) X <= 10 Y <= 20 Soma_Num (X , Y) FimAlgorítmo Ref. Soma_Num ( NUM1 , NUM2 ) Declare SOMA numérico SOMA <= NUM1 + NUM2 Escreva SOMA FimRef. 3. Procedimentos com passagem de parâmetros de volta Algorítmo Declare X numérico Soma_Num ( 4, 5, X) Escreva X FimAlgorítmo Ref. Soma_Num ( NUM1, NUM2, RESUL ) RESUL <= NUM1 + NUM2 FimRef. Módulo 6 - Lógica de Programação Pag. 56 Curso de Informática Pag. 4. Funções Algorítmo Declare X, Y numérico X <= Soma_Num (10, 20) Y <= Soma_Num (40 , 50) Escreva X , Y Escreva Soma_Num (X , Y) FimAlgorítmo Ref. Soma_Num ( NUM1, NUM2 ) numérico Soma_Num <= NUM1 + NUM2 FimRef. Módulo 6 - Lógica de Programação produz ____ e ____ 57 Curso de Informática Pag. 58 3.6 Recursividade Recursividade é um conceito fundamental em matemática e em computação. São comuns em matemática, as definições recursivas de funções (ditas equações de recorrência). Em computação, um procedimento recursivo é aquele que possui uma chamada a si próprio como subprograma. Como veremos a seguir, aspectos não prático de recursão são ressaltados na implementação de algumas funções matemáticas, definidas por equações de recorrência através de programas recursivos simples. Entretanto, a utilização de recursão se revela como uma ferramenta muito prática em projeto de algoritmos. Como dissemos, um procedimento recursivo é aquele que possui uma chamada a si próprio. Contudo, estas chamadas recursivas não podem ser feitas infinitamente, pois neste caso a execução de tal procedimento nunca irá terminar, caracterizando uma circularidade na definição da função implementada. Portanto, tanto a existência de um ponto (ou condição de parada), quando a possibilidade deste ponto ser alcançado (ou da condição ser satisfeita) são características essenciais numa definição recursiva de uma função e, consequentemente, no procedimento que a implementa. As considerações feitas acima são facilmente exemplificadas pela função fatorial: n! = 1 se n = 0 n! = n * (n-1) * (n-2) *....* 1 se n >0 Observe que, 3! = 3*2*1 4! = 4*3*2*1 = 4 * 3! Logo, temos a seguinte equação de recorrência para a função fatorial: n! = 1 se n = 0 n! = n * (n-1) se n > 0 É importante notar que 0 é um ponto de parada da definição recursiva e ele pode ser alcançado, visto que a aplicação (chamada) recursiva da função é sempre feita a um elemento menor que o inicial. A seguir apresentaremos implementações de uma função recursiva e uma iterativa para o cálculo do fatorial. Módulo 6 - Lógica de Programação Curso de Informática Pag. 59 Exemplo 1: Function Fatorial_R (n : integer) : real; begin if n = 0 then fatorial_R := 1 else fatorial_R := n * fatorial_R (n-1); end; {recursivo} Function Fatorial_I (n : integer) : real ; var i : integer ; f : real; begin f := 1; for i := 2 to n do f := f * i; fatorial_I := f; end; {iterativo} Ao simular a execução da função recursiva para uma entrada n=5, por exemplo, observa-se que o término do processo, que determina o valor de 5!, depende do término do processo que determina 4!, e assim por diante. Logo, cada processo fica “congelado” até que a execução da sua chamada recursiva seja concluída. Esta seqüência de chamadas recursivas incompletas formam uma pilha. 5!=5*4! 4!=4*3! 5!=5*4! 3!=3*2! 4!=4*3! 5!=5*4! 2!=2*1! 3!=3*2! 4!=4*3! 5!=4*4! 1!=1*0! 2!=2*1! 3!=3*2! 4!=4*3! 5!=5*4! 0! 1!=1*0! 2!=2*1! 3!=3*2! 4!=4*3! 5!=5*4! de tal modo que a medida que uma chamada é concluída o seu contexto é retirado da pilha. O! = 1 1!=1*0! 2!=2*1! 3!=3*2! 4!=4*3! 5!=5*4! 1!=1 2!=2*1! 3!=3*2! 4!=4*3! 5!=5*4! Módulo 6 - Lógica de Programação 2!=2 3!=3*2! 4!=4*3! 5!=4*4! 3!= 6 4!=4*3! 5!=5*4! 4! = 24 5! = 5*4! 5! = 120 Curso de Informática Pag. 3.7 Exercícios Utilizando as técnicas de refinamentos sucessivos confeccione o algoritmo para os exercícios: 1. Número 2 da Lista de Exercícios. Realize o refinamento usando procedimento e depois função. 2. Número 4. 3. Número 14 4. Número 17 5. Número 26 6. Número 27 Módulo 6 - Lógica de Programação 60 Curso de Informática Pag. 61 Capítulo 4 - Variáveis Compostas 4.1 Homogêneas Nem sempre os tipos básicos de dados (literal, numérico e lógico) são suficientes para exprimir estruturas de dados em algoritmos. Por exemplo, considere o seguinte enunciado: Confeccione um algoritmo que leia as notas de 5 alunos e imprima a nota e a média das notas dos alunos. Para resolvermos o problema deveríamos utilizar 5 variáveis numéricas para armazenar as notas da turma e a partir destas calcular a média. Imagine que o número de alunos da turma seja 80. Só a declaração destas variáveis tornaria impraticável a redação do algoritmo. Daí a necessidade de novos tipos de dados serem criados, que seriam as variáveis denominadas compostas. 4.1.1 Definição São estruturas de dados homogêneas, que se caracterizam por possuírem elementos do mesmo tipo, também denominadas de arrays. Os arrays são classificados em unidimensionais e multidimensionais, dependendo da quantidade de índices que são necessários para a referência a um determinado elemento.. Os arrays unidimensionais são denominados de vetores e os bidimensionais de matrizes. 4.1.2 Vetor 4.12.1 Definição Constitui um agrupamento de dados homogêneo armazenados sequencialmente com tamanho definido em tempo. Ex-1: Vetor de inteiros de 8 posições (elementos) 0 9 -1 2 5 87 4 3 Ex-2: Vetor de string de 4 posições (elementos) ‘casa’ ‘carro’ ‘fax’ ‘iate’ Ex-3: Vetor de real de 6 posições (elementos) 0.51 9.67 Módulo 6 - Lógica de Programação 0.0 3.0 39.7 53.5 Curso de Informática Pag. 62 4.1.2.2 Acesso Os elementos de um vetor são acessados (referenciados) através de um índice ou subscrito, que indica a posição que o elemento ocupa no vetor. Cada elemento de um vetor é tratado como se fosse uma variável simples Ex: Seja o vetor VET: 0 1 9 -1 2 5 87 2 3 4 5 6 4 3 7 8 4 3 7 8 ⇐ índice ou subscrito logo, VET [4] = 2 VET [7] = 4 Ex: Seja o vetor LUGAR: 0 1 9 -1 2 5 87 2 3 4 5 6 ⇐ índice ou subscrito logo, LUGAR [ 1] = 0 LUGAR [ 3] = -1 4.1.2.3 Declaração Algoritmica Declare nome-vetor VETOR [ li .. ls] : tipo-básico onde: li = limite inferior ls = limite superior Observação: 1. li e ls devem ser inteiros 2. O tamanho do vetor (quantidade de elementos) é calculado por ls - li + 1 . Módulo 6 - Lógica de Programação Curso de Informática Pag. 63 4.1.3 Exercícios 1. Confeccione um algoritmo que leia 10 números e colocá-los num vetor para depois imprimí-los. 2. Confeccione um algoritmo para ler um conjunto de 10 números e colocá-os num vetor para depois imprimir o menor deles. 3. Confeccionar um algoritmo para gerar 10 números aleatórios compreendidos entre 0 e 100 e informar quantos estão acima de 50. 4. Confeccionar um algoritmo que leia uma sequência de 10 números, calcule a média aritmética deste conjunto e imprima a quantidade de elementos que ficam abaixo da média e a quantidade acima. 5. Confeccionar um algoritmo para gerar um vetor de 20 números aleatórios e emitir quantos elementos possuem o seu valor menor que seu índice. 6. Confeccionar um algoritmo para gerar 2 vetores (de 10 posições cada) de números aleatórios variando de 0 a 100, e a partir destes vetores construir um terceiro vetor formado pelos maiores elementos de cada posição correspondente e emita estes vetores. 7. Confeccione um algoritmo para gerar 10 números aleatórios compreendidos entre 0 e 50 e, a seguir, imprima esses números, depois de feita a troca do primeiro elemento com o segundo, do terceiro com o quarto e, assim, sucessivamente. 8. Confeccione um algoritmo para gerar um vetor com 5 elementos de números aleatórios compreendidos de 0 a 10. E, utilizando função, calcule e imprima o fatorial do valor de cada elemento. 9. Confeccione um algoritmo para gerar um vetor com 5 elementos de números aleatórios compreendidos de 0 a 100. E, utilizando função, determine e calcule quantos desses números são primos. 10.Confeccione um algoritmo para gerar 10 números aleatórios compreendidos entre 0 e 50 e, a seguir, imprima esses números, depois de feita a troca do primeiro elemento com o último, do segundo com o penúltimo e, assim, sucessivamente. 11.Confeccione um algoritmo para gerar 10 números aleatórios compreendidos entre 0 e 50 e, a seguir, imprima esses números e depois gerar dois vetores, um, contendo os valores pares e o outro, os valores ímpares. 12.Confeccione um algoritmo para gerar 2 vetores com 10 números aleatórios compreendidos entre 0 e 50 cada. A seguir, imprima esses vetores e a soma dos produtos de seus elementos de mesmo índice. 13.Confeccione um algoritmo para ler dois vetores A e B, cujos elementos estão em ordem crescente. A seguir, formar o vetor C, intercalando os elementos de A e B, de modo que os elementos de C fiquem, também, em ordem crescente, sem repetição. Exemplo: Módulo 6 - Lógica de Programação Curso de Informática VETOR A B C Pag. 2 1 1 3 3 2 4 5 3 ELEMENTOS 6 7 6 8 4 5 6 7 64 8 14. Um professor de certa disciplina aplica, durante um semestre, quatro provas numa turma de 5 alunos. Escrever um programa que leia para cada aluno (no formato de tabela) seu número de matrícula, nome e as quatro notas. E, a seguir, imprima o relatório conforme lay-out abaixo, considerando como aprovado o aluno que obtiver média maior ou igual a 6,0: APLICAÇÃO FINAL DA DISCIPLINA X----------------------------------------X MATRIC NOME NOTA-1 NOTA-2 NOTA-3 NOTA-4 MEDIA 9999 9999 9999 9999 9999 X-----------X X-----------X X-----------X X-----------X X-----------X 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 RESUMO DA DISCIPLINA NÚMERO DE ALUNOS APROVADOS NÚMERO DE ALUNOS REPROVADOS MÉDIA GLOBAL DA TURMA QTD DE ALUNOS COM MÉDIA ACIMA DA GLOBAL 99 99 99.9 99 15.Confeccione um algoritmo para gerar 6 vetores de 5 elementos cada com números compreendidos entre 0 a 100. A seguir, determinar (através de procedimento) e escrever o menor valor de cada vetor e o menor valor dos números gerados. Imprimir, também, cada vetor gerado na forma de tabela através de procedimento. 16.Confeccione um algoritmo para ler dois vetores, ambos em ordem crescente de seus valores, o primeiro, com N elementos e o segundo com M elementos. A seguir, determinar e imprimir o vetor união e o vetor interseção. Módulo 6 - Lógica de Programação Curso de Informática Pag. 65 4.1.4 Matrizes 4.1.4.1 Definição / Acesso Como os vetores, as matrizes são agrupamentos de dados homogêneos mas que para serem acessadas (referenciadas) necessitam de 2 (dois) índices, o primeiro designando a linha, e o segundo a coluna, que indicam a posição que o elemento ocupa na mesma. Exemplo: Seja a matriz MAT do tipo char: linhas ⇓ 1 2 3 4 1 A H J S 2 X D L G 3 B P M T 4 E O Z Y 5 Q K C U 6 W R V F 7 R T Q B ⇐ colunas logo, MAT [4, 3] = “T” MAT [2, 5] = “K” 4.1.4.2 Declaração Algorítmica Declare nome-matriz = Matriz [lil..lsl, lic, lsc] : tipo-básico onde lil = limite inferior da linha lsl = limite superior da linha lic = limite inferior da coluna lsc = limite superior da coluna Módulo 6 - Lógica de Programação Curso de Informática Pag. 66 4.1.5 Exercícios 1. Confeccione um algoritmo para gerar a matriz quadrática M de 5 linhas e, a seguir imprima essa matriz na sua estrutura convencional. 2. Confeccione um algoritmo para gerar a matriz quadrática M de 5 linhas e, a seguir imprima a soma de seus elementos. 3. Confeccione um algoritmo para gerar a matriz quadrada M de dimensão 5 x 5 e, a seguir imprima a matriz e a soma dos elementos da diagonal principal. 4. Confeccione um algoritmo para gerar a matriz quadrada M de dimensão 5 x 5 e, a seguir imprima a soma dos elementos situados abaixo da diagonal principal. 5. Confeccione um algoritmo para gerar a matriz quadrada M de dimensão 5 x 5 e, a seguir determine, através de procedimento, o maior elemento da diagonal principal e o imprima. 6. Confeccione um algoritmo para gerar a matriz quadrática M de 5 linhas e, a seguir imprima os elementos da diagonal secundária e os acima dela. 7. Confeccione um algoritmo para ler duas matrizes de dimensão M x N e, a seguir, obtenha e imprima a matriz soma e as matrizes lidas. 8. Confeccione um algoritmo para ler 3 (três) vetores com M elementos e a partir desses, utilizando procedimento, gerar uma matriz de ordem 3 x M. Imprima os vetores lidos e a matriz gerada. 9. Confeccione um algoritmo para ler uma matriz de dimensão M x N e, a seguir, troque os elementos da primeira linha pelos elementos da linha onde se encontra o maior elemento da primeira coluna. Imprima a matriz antes e depois da troca. 10.Confeccione um algoritmo para ler uma matriz quadrada de dimensão 5 x 5 e, a seguir, divida cada linha da matriz pelo respectivo elemento da diagonal principal. Imprima a matriz antes e depois da divisão. 11.Confeccione um algoritmo para ler uma matriz quadrada de dimensão M x N e, a seguir, determine e imprima o menor valor de cada linha e o maior valor de cada coluna. 12.Confeccione um algoritmo para ler uma matriz quadrada de dimensão M x N e, a seguir, eliminar dessa matriz a primeira linha e a segunda coluna. Imprima a matriz antes e após a eliminação. 13.Confeccione um algoritmo para ler uma matriz quadrada de dimensão 5 x 5 e, a seguir, eliminar dessa matriz os elementos da diagonal secundária. Imprima a matriz antes e após a eliminação dos elementos. Módulo 6 - Lógica de Programação Curso de Informática Pag. 67 14.Confeccione um algoritmo para gerar uma matriz de dimensão M x N e, a seguir, calcular os totais de cada linha e de cada coluna através de procedimentos e imprima o resultado conforme lay-out abaixo: 99 99 99 9999 Totais Matriz Lida 99 99 99 9999 Totais 9999 9999 9999 99 99 99 9999 15.Dado um tabuleiro de xadrez onde, para faciliatr a indicação das peças, foi convencionado: 0 - Ausência de Peças 4 - Bispos 1 - Peões 5 - Reis 2 - Cavalos 6 - Rainhas 3 - Torres Confeccione um algoritmo para contar a quantidade de cada tipo de peça no tabuleiro. Por exemplo, no tabuleiro: 1 2 3 4 5 6 7 8 1 6 0 0 0 1 0 1 1 2 0 1 1 0 0 0 0 5 3 0 0 1 2 1 1 0 0 4 5 2 1 0 1 3 0 6 5 0 0 0 3 0 0 2 0 6 0 3 1 4 1 4 2 1 7 1 0 0 4 0 0 2 1 8 0 2 0 3 0 1 1 0 Temos: Peões com 17 peças Cavalos com 6 peças Torres com 4 peças, etc.. 16. Confeccione um algoritmo para corrigir testes de múltipla escolha de N alunos. O teste tem 10 questões, cada uma valendo 1 (um) ponto. As opções para cada questão são designadas pelas letras A, B, C, D e E. O algoritmo deverá: • Ler o número de alunos, o nome e o gabarito da prova; • Ler para cada aluno seu número de matrícula, seu nome e as opções escolhidas como resposta da prova numa mesma linha; • Calcular a nota de cada aluno, a média das notas e, para cada questão, quantos alunos responderam as opções A, B, C, D e E; • Imprimir relatório conforme lay-out abaixo: Módulo 6 - Lógica de Programação Curso de Informática Pag. RESULTADO DA CORREÇÃO DA PROVA DE: X----------------------------------------X GABARITO: X X X X X X X X X X MATRIC 999 999 999 999 999 NOME X---------------------X X---------------------X X---------------------X X---------------------X X---------------------X X X X X X X X X X X X X X X X RESPOSTAS X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X NOTA 99 99 99 99 99 MÉDIA DAS NOTAS - 99.9 A B C D E 1 99 99 99 99 99 2 99 99 99 99 99 3 99 99 99 99 99 Módulo 6 - Lógica de Programação TOTAIS POR OPÇÃO QUESTÕES 4 5 6 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 7 99 99 99 99 99 8 99 99 99 99 99 9 99 99 99 99 99 10 99 99 99 99 99 68 Curso de Informática Pag. 69 4.2 Heterogêneas Para muitas aplicações que manipulam informações, o tratamento dessas informações como uma coleção de dados individuais fica muito restritivo. Veremos como organizar os dados em grupos e, depois, agregá-los em entidades mais abrangentes. 4.2.1 Registros 4.2.1.1 Definição Os registros (records) são estruturas de dados heterogêneas, que se caracterizam por possuírem elementos de tipos diferentes e estarem logicamente relacionados. O uso de registros permitirá ampliar a gama de aplicações da linguagem. Por exemplo: A ficha de um empregado de uma empresa. Os dados estão logicamente relacionados entre si, pois constituem informações cadastrais do mesmo indivíduo. Inscrição Nome Rua Registro do Empregado Número CEP CPF Sexo Dt Nasc. 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. Registros correspondem a conjuntos de posição de memória conhecidos por um mesmo nome e individualizados por identificadores associados a cada conjunto de posições O registro é o caso mais geral de variável composta na qual os elementos do conjunto não precisam ser, necessariamente, homogêneos ou do mesmo tipo. O registro é constituído por campos. 4.2.1.2 Declaração Declare lista-de-identificadores registro (campos) onde: Declare lista-de-identificadores campos registro Módulo 6 - Lógica de Programação É uma palavra chave São os nomes que estão sendo associados aos registros que se deseja declarar São declarações e/ou identificadores de variáveis compostas, separados por vírgula É uma palavra chave Curso de Informática Pag. 70 O registro acima seria então declarado: Declare EMPREG registro INSC numérico NOME, RUA literal NUM, CEP, CPF numérico SEXO numérico DTNASC numérico 4.2.1.3 Acesso ao dados do Registro Conforme mencionado, cada elemento do registro é denominado de campo do registro, ou simplesmente campo. O acesso a um campo do registro é feito usando-se um “.” entre o nome do registro e o nome do campo. Logo, para acessarmos o campo SEXO do registro do empregado usaríamos: EMPREG.SEXO Exemplo Leia EMPREG.SEXO Se EMPREG.SEXO = “M” então TOTMASC ← TOTMASC + 1 senão TOTFEM ← TOTFEM + 1 FimSe Um registro também pode receber ou ser atribuído diretamente a um outro registro, contanto que ambos sejam do mesmo tipo. Exemplo: Declare EMPREG, MAISVELHO registro INSC, NUMERO, CEP, CPF, DTNASC numérico NOME, RUA, SEXO literal ... MAISVELHO ← EMPREG A execução da atribuição acima faz com que o valor de cada campo da variável EMPREG seja armazenada no campo correspondente da variável MAISVELHO. Essa atribuição é possível, somente porque EMPREG e MAISVELHO têm exatamente o mesmo tipo (variáveis declaradas na mesma lista) Módulo 6 - Lógica de Programação Curso de Informática Pag. 71 4.2.1.4 Conjunto de Registros (Arrays de Registros) Os registros podem ser agrupados formando arrays de registros, sendo, cada um, individualizados através de um índice. O uso de arrays de registros é recomendado quando queremos definir tabelas na memória, principalmente para consulta. Exemplo: 1 Contas 2 Rua 3 Cliente Nome Numero Saldo CPF 4 5 4.2.1.4.1 Declaração 1 Declare CLIENTE registro NOME, RUA literal NUMERO, CPF, SALDO numérico Declare CONTAS Vetor [ 1..5 ] : CLIENTE 2 Declare CONTAS [ 1:5 ] registro NOME, RUA literal NUMERO, CPF, SALDO numérico Com a declaração passa existir a variável CONTAS (vetor), onde cada elemento é um registro, com os campos NOME, RUA, NUMERO, CPF, SALDO. 4.2.1.4.2 Acesso aos Campos O acesso aos campos de array de registros depende de como a declaração do mesmo foi realizada. Forma Genérica identificador-variável [ I ].identificador-registro.identificador-campo Módulo 6 - Lógica de Programação Curso de Informática Pag. 72 A especificação do nome do registro depende da declaração feita, podendo portanto, ser omitido. Exemplo: Referenciar o campo NOME do 3º elemento do conjunto, ou seja, o nome do cliente número 3. 1 I←3 Leia CONTAS [I].CLIENTE.NOME Leia CONTAS [3].CLIENTE.NOME I←3 Leia CONTAS [I].NOME Leia CONTAS [3].NOME 2 4.2.1.5 Variação das Estruturas a.1 Estrutura Inscrição Nome Rua Registro Empregado Endereço Num CEP CPF Sexo Dt Nasc. a.2 Declaração Declare ENDERECO registro RUA literal NUMERO, CEP numérico Declare EMPREG registro INSC numérico NOME literal ENDERECO CPF numérico SEXO literal DTNASC numérico a.3 Acesso Na estrutura acima foi especificada a técnica de refinamento à declaração dos registros. Nestes casos, quando na declaração do regsitro se encontra um outro registro, o acesso aos campos é feito hierarquicamente. Primeiro, fez-se menção aos registros mais externos, depois aos mais internos e, finalmente, aos identificadores dos campos. Módulo 6 - Lógica de Programação Curso de Informática Pag. Exemplo: Para acessarmos ao componente CEP usaríamos: EMPREG.ENDERECO.CEP b.1 Estrutura 1 Registro de Pagamento CPF IDENTIDADE HORAS TRABALHADAS 2 3 4 5 (1, 1) SALARIO FGTS (1, 2) (2, 1) (2, 3) 6 b.2 Declaração Declare HORAS vetor [1:6] numérico Declare FGTS matriz [1:2, 1:2] numérico Declare PAGEMP registro NOME literal CPF, IDI numérico HORAS SALARIO numérico FGTS b.3 Acesso aos Campos Ex-1: Referenciar à quantidade de horas trabalhadas pelo empregado em abril Escreva PAGEMP.HORAS[4] Ex-2: Referenciar ao Fgts recolhido no 3º trimestre Escreva PAGEMP.FGTS [2, 1] Módulo 6 - Lógica de Programação 73 Curso de Informática Pag. c. Conjunto de Pagamentos para 50 Empregados c.1 Estrutura 1 Estrutura b.1 2 3 4 c.2 Declaração Declare PAGAMENTOS Vetor [1.. 50] : PAGEMP c.3 Acesso Ex-1: Referenciar à quantidade de horas trabalhadas em abril pelo empregado nº 3 Escreva PAGAMENTOS[3].PAGEMP.HORAS[4] Ex-2: Referenciar ao Fgts recolhido no 3º trimestre pelo empregado nº 3 Escreva PAGAMENTOS[3].PAGEMP.FGTS [2, 1] Módulo 6 - Lógica de Programação 74 Curso de Informática 4.2.2 Pag. 75 Exercícios 1. Confeccionar um algoritmo para ler o nome de grupo de pessoas e, a seguir, encontrar e imprimir o telefone de cada uma delas. A tabela contendo o nome e o telefone das pessoas deverá ser previamente lida. 2. Confeccionar um algoritmo que leia o nome do empregado, o sexo e o salário de 10 empregados e depois emita para cada empregado os dados acima bem como o percentual da diferença entre o salário e média dos salários e no final o nome do empregado com maior salário e a média dos salários. 3. Em certo município, vários proprietários de imóveis estão em atraso com o pagamento do imposto predial. Desenvolver um algoritmo que calcule e escreva o valor da multa a ser paga por estes proprietários considerando que: • os dados de cada imóvel: identificação, valor do imposto e número de meses em atraso deverão ser lidos; • as multas devem calculadas a partir do valor do imposto e de acordo com a seguinte tabela que também deverá ser informada previamente. Valor do Imposto (R$) até 500,00 de 500,01 até 1.000,00 de 1.000,01 até 2.000,00 de 2.000,01 até 5.000,00 acima de 5.000,00 % por mês em atraso 1 2 4 7 10 • último registro lido, que não deve ser considerado, contém a identificação do imóvel igual a 0. • na saída deverão ser impressos: a identificação do imóvel, valor do imposto, meses em atraso e a multa a ser paga. • as estruturas de dados a serem adotadas para a solução do problema são: a. a tabela acima em forma de matriz b. o registro de imóveis contendo os campos: identificação, valor do imposto e meses em atraso. Módulo 6 - Lógica de Programação Curso de Informática Pag. 76 Capítulo 5 - Algoritmos Especiais 5.1 Pesquisa em Vetor A capacidade de armazenar informações foi um passo decisivo na evolução da ciência da computação e para o nível generalizado de utilização do computador. Com isto, a capacidade de recuperar informações, para posterior processamento, assume papel de suma importância na utilização cotidiana do computador, existindo para isso inúmeros exemplos. Dentre eles podemos citar o problema de recuperação de dados de transações bancárias de um cliente através de um número de conta, no cadastro de clientes/operações de um banco. Portanto, algoritmos de pesquisa devem ser projetados de forma a garantir a confiabilidade e eficiência exigidas pela importância das aplicações existentes. A pesquisa de dados pode ser efetuada tanto em unidades de memória secundária (disco rígido, disquetes, fita), quanto na memória principal do computador. A estes casos, chamamos, respectivamente, de problemas de pesquisa externa e interna. Neste texto trataremos somente de problemas de pesquisa interna. Os métodos aqui apresentados podem ser utilizados em problemas de pesquisa externa, considerando-se as adaptações necessárias. Apresentaremos nas seções seguintes os métodos de pesquisa sequencial e binária. 5.1.1 Pesquisa Sequencial O método mais simples de determinar a presença, ou não, de um elemento numa sequência, é percorrêla a partir do seu início, efetuando comparações, até que o elemento seja encontrado ou o fim seja alcançado. Este método é chamado de pesquisa sequencial. Apesar da aparente simplicidade do método proposto, podem ser consideradas inúmeras variações sobre a sequência de elementos considerada, cada qual exigindo uma forma de aplicação específica do método. Para a análise de tais casos, consideremos a seguinte especificação de entradas e saídas para o problema de pesquisa, de modo geral. Dados: Ö vetor de n elementos (n conhecido); Ö elemento a ser pesquisado no vetor (E). Resultado: Ö Se o elemento existe mostra-se a sua posição ou o total de ocorrências deste elemento no vetor (sucesso); Ö Se o elemento não existe, mostra-se uma mensagem de falha. As considerações que podem ser feitas sobre os dados de entrada (vetor), são do tipo: o vetor está ou não ordenado; o elemento ocorre uma única vez (pesquisa única) ou repetidas no vetor (pesquisa múltipla). Módulo 6 - Lógica de Programação Curso de Informática Pag. 5.1.1.1 Pesquisa Única Caso 1: Vetor Desordenado 35 10 1 30 2 35 3 30 4 5 5 80 6 7 Para E = 30 Ö sucesso (3 testes) Para E = 12 Ö falha (7 testes) Caso 2: Vetor Ordenado 5 10 30 30 35 35 80 2 3 4 5 6 7 1 Para E = 30 Ö sucesso (3 testes) Para E = 12 Ö falha (3 testes) 5.1.1.2 Pesquisa Múltipla Caso 1: Vetor Desordenado 35 1 10 2 30 35 3 30 4 5 5 80 6 7 Para E = 30 ⇒ 2 sucessos (7 testes) Para E = 12 ⇒ falha (7 testes) Caso 2: Vetor Ordenado 5 10 1 30 2 Para E = 30 ⇒ 2 sucessos (5 testes) Para E = 12 ⇒ falha (3 testes) Módulo 6 - Lógica de Programação 30 3 35 35 4 5 80 6 7 77 Curso de Informática Exercícios Propostos: 1- Desenvolver cada um dos algoritmos de pesquisa. Program Usa_Pesquisa_Sequencial; Uses crt; {implementa o algoritmo de pesquisa sequencial unica e multipla} Type vetor = array [1..100] of integer; {--------------------------- subprogramas ----------------------------------} Procedure Ler_Sequencia (var vet : vetor; var n : integer); var i : integer; begin writeln('Digite o valor de n'); readln(n); writeln('Digite o valor da sequencia'); for i := 1 to n do begin write('elemento [',i,'] : '); readln( vet[i] ); end; writeln; end; {------------------------ programa principal -------------------------------} Var vet : vetor; {espaço para pesq. } n : integer; {tamanho do espaço } dado : integer; { dado procurado } achou : boolean; {resultado da pesq.} posicao : integer; {posição encontrada} frequencia : integer; { frequência. Encontrada } tipo_pesq : integer; Begin clrscr; writeln('***** pesquisa sequencial *****':50); Ler_Sequencia (vet, n); repeat writeln('Escolha o tipo de pesqisa.'); writeln('1 -> pesquisa sequencial £nica desordenada'); writeln('2 -> pesquisa sequencial £nica ordenada'); writeln('3 -> pesquisa sequencial m£ltipla desordenada'); writeln('4 -> pesquisa sequencial m£ltipla ordenada'); writeln; Módulo 6 - Lógica de Programação Pag. 78 Curso de Informática Pag. 79 readln(tipo_pesq); writeln('Digite o dado (0 - termina)'); readln(dado); case tipo_pesq of 1 : Pesq_Seq_unica_1 (vet, n, achou, posicao); 2 : Pesq_seq_unica_2 (vet, n, dado, achou, posicao); 3 : Pesq_Seq_multipla_1 (vet, n, dado, achou, frequencia); 4 : Pesq_Seq_multipla_2 (vet, n, dado, achou, frequencia); end; case tipo_pesq of 1,2 : if achou then writeln('Existe na posi‡Æo = ',posicao) else writeln('NÆo existe'); 3,4 : if achou then writeln('Total de ocorrˆncias = ',frequencia) else writeln('NÆo existe'); end; until dado = 0; End. 5.1.2 Pesquisa Binária O método de pesquisa sequencial é fácil de escrever e é razoavelmente eficiente para sequências com poucos elementos. Entretanto, para sequências de tamanho considerável, que ocorre na maioria das aplicações existentes, a utilização do método torná-se inviável. Uma estratégia interessante e eficiente é utilizada no método de pesquisa binária. → Definir intervalo inicial (i,f) de busca → Definir a posição média do intervalo (m= (i + f) / 2 ) Comparar o elemento da posição média (v[m]) com o elemento E: caso sejam iguais então terminou a pesquisa caso contrário definir o novo intervalo de busca → Aplicar sucessivamente o passo anterior até encontrar E ou não existir mais intervalo de busca. Módulo 6 - Lógica de Programação Curso de Informática São aspectos fundamentais do método: → O vetor de entrada tem que estar ordenado; → O intervalo de busca inicial é (i,f) = (l,n); → O intervalo de busca, considerado a cada iteração, é definido do seguinte modo: • (i, m-l), se (E < v[m]) • (m+1,f), se (E > v[m]) tendo a metade do tamanho do intervalo original; → Não existirá intervalo de busca quando (i > f); Dados: → vetor de n elementos (n conhecido); → elemento a ser pesquisado no vetor (E); Resultado: → se o elemento existe, mostra-se a sua posição no vetor. (sucesso) → se o elemento não existe, mostra-se uma mensagem de falha. Módulo 6 - Lógica de Programação Pag. 80 Curso de Informática Pag. Exemplo-1: Para E = 10 10 15 20 25 30 35 40 1 2 3 4 5 6 7 10 15 20 25 30 35 40 1 ↑I 2 4 ↑M 5 6 7 ↑F 10 15 20 25 30 35 40 1 ↑I 2 ↑M 3 ↑F 4 5 10 15 20 25 30 1 I↑F M 2 3 4 5 3 6 35 6 7 40 7 Sucesso com 3 testes Exemplo-2: Para E = 37 10 15 20 25 1 ↑I 2 3 4 ↑M 10 15 20 25 1 2 3 4 10 15 20 25 1 2 3 4 30 5 35 40 6 7 ↑F 40 30 35 5 ↑I 6 ↑M 30 35 5 6 7 ↑F 40 7 I↑ F M 10 15 20 25 1 2 3 4 Falha com 3 testes Módulo 6 - Lógica de Programação 30 5 35 6 ↑F 40 7 ↑I 81 Curso de Informática Pag. Exercício: 1- Desenvolver um algoritmo de pesquisa (trecho de programa em PASCAL abaixo): program Usa_Pesquisa_Binaria; Uses crt; {Implementa o algoritmo de pesquisa binária} Type vetor = array [1..100] of integer; Var vet : vetor; n : integer; dado : integer; achou : boolean; posicao : integer; {espaço para pesquisa. } {tamanho do espaço } { dado procurado } {resultado da pesq.} {posição entrada } {----------------------------- subprogramas --------------------------------} {------------------------- programa principal ------------------------------} Begin clrscr; writeln('**** pesquisa binária ****':50);; Ler_Sequencia (vet, n ); {A mesma definida em pesqseq.pas} repeat writeln; writeln('Digite o dado (0 - termina)'); readln(dado); {---- executar a pesquisa binária ----} Pesquisa_Binaria (vet, n, dado, achou, posicao); if achou then writeln('Existe na posição ¯ ',posicao) else writeln('Não existe'); until dado = 0; End; Módulo 6 - Lógica de Programação 82 Curso de Informática Pag. 83 5.2 Algoritmos de Ordenação Os problemas de ordenação são comuns tanto em aplicações comerciais quanto em científicas. Entretanto, raro são os problemas que se resumem a pura ordenação de sequências de elementos. Normalmente, os problemas de ordenação são inseridos em problemas de pesquisa, intercalação e atualização. Isto torna ainda mais importante o projeto e a construção de algoritmos eficientes e confiáveis para tratar o problema. De modo análogo ao problema de pesquisa, uma dada aplicação pode exigir que seja feita uma ordenação em mémoria secundária, chamada ordenação externa, A ordenação interna normalmente é efetuada no próprio vetor em que os elementos são armazenados, sem a utilização de um vetor adicional. Agora analizaremos três métodos de ordenação1 interna: SelectionSort, BubbleSort e InsertionSort. 5.2.1 SelectionSort Este método é um dos mais simples e intuitivos dentre os métodos existentes. Sua estratégia básica é selecionar o menor elemento da sequência considerada e colocá-lo no início da sequência. Assim, dada uma sequência de tamanho n, várias iterações são efetuadas, sendo que a cada vez que esta estratégia é aplicada, uma nova sequência é gerada pela eliminação do menor elemento da sequência original. Exemplo-1: Algoritmo SelectionSort Procedure SelectionSort ( var vet : vetor; n : integer); {ordenação crescente} var i, j, pmin : integer; begin for i := 1 to (n-1) do begin pmin := 1; for j := (i + 1) to n do if vet[j] < vet[pmin] then pmin := j; trocar (vet[i], vet[pmin]); end; end; 1 {inicializa} {procura o menor} {troca com o menor} A forma de ordenação pode ser crescente ou decrescente. Neste texto optou-se pela ordenação crescente. Módulo 6 - Lógica de Programação Curso de Informática Pag. Consideramos a execução do procedimento acima para o vetor 40 30 20 10 30 20 ↑ pmin 2 ↑ j 40 10 30 20 30 20 1 10 2 3 4 Para i = 1, são feitas as seguintes comparações 40 1 1 2 ↑ pmin 40 1 10 2 3 4 3 ↑ j 4 3 ↑ pmin 10 4 ↑ j 40 30 20 troca realizada Para i = 2, são feitas as seguintes comparações: 10 1 10 1 40 30 ↑ pmin ↑ j 40 30 2 2 3 ↑ pmin 10 Módulo 6 - Lógica de Programação 20 30 3 20 4 20 4 ↑ j 40 84 Curso de Informática Pag. 85 Para i = 3, são feitas as seguintes comparações: 10 1 20 2 30 3 ↑ pmin 10 20 30 vetor ordenado 40 4 ↑ j 40 5.2.2 BubbleSort Este método é levemente mais complexo que o SELECTIONSORT, mas apesar de possuir a mesma ordem de complexidade do método anterior , ele efetua em média um número menor de comparações como veremos a seguir. A estratégia utilizada pelo BUBBLESORT consiste em comparações e trocas entre elementos consecutivos da sequência, a fim de “empurrar” o maior elemento para a última posição. Assim, várias iterações são efetuadas e, para cada sequência considerada, a aplicação da estratégia gera uma nova sequência pela eliminação do maior elemento da sequência original. Além disto, uma variável de controle (lógica) é utilizada para registrar a ocorrência ou não de troca entre elementos da sequência. Quando nenhuma troca é efetuada, tem-se que a sequência considerada já estava ordenada. Esta particularidade determina, em alguns casos, um número menor de comparações que o método SelectionSort. Procedure BubbleSort (var vet : vetor; n : integer); {ordenação crescente } var i, limite : integer; trocou : boolean; begin limite := n; repeat trocou := false; for i := 1 to (limite - 1) do begin if vet [i] > vet [i + 1] then begin trocar (vet [i], vet[i + 1]); trocou := true; limite := i end end; until not trocou; end; Módulo 6 - Lógica de Programação {ordenação crescente} {otimização} Curso de Informática Pag. Consideremos a execução do procedimento acima para o vetor 40 1 10 30 20 2 3 4 Para i de l a 3, são feitas as seguintes comparações: 40 10 30 20 1 ↑ 2 ↑ 3 4 10 40 30 20 1 2 ↑ 3 4 ↑ 10 30 40 20 1 2 3 ↑ 4 ↑ 10 30 20 40 ocorreram 3 trocas. Para i de 1 a 2, são feitas as seguintes comparações: 10 30 1 ↑ 2 ↑ 10 30 1 2 ↑ 10 20 20 40 3 20 3 4 40 4 ↑ 30 ocorreu 1 troca. Módulo 6 - Lógica de Programação 40 86 Curso de Informática Pag. Para i = 1, é feita a seguinte comparação: 10 30 20 40 1 ↑ 2 ↑ 3 4 10 20 30 40 não ocorreram trocas 5.2.3 InsertionSort Este método baseia-se no seguinte processo de inserção controlada: • Com o primeiro elemento de sequência original (desordenada) forma-se uma sequência ordenada de tamanho 1. • Cada elemento restante da sequência original é inserido na nova sequência, de modo que esta permaneça ordenada. Isto é feito através de uma pesquisa na sequência ordenada que determina a posição que ele deverá ocupar. • Quando um elemento é inserido a frente de outros, estes deverão ser deslocados de uma posição. Exemplo: Para a entrada (40, 10, 30, 20). O método determina as seguintes inserções: 40 1 10 40 1 2 10 30 40 1 2 3 10 20 30 40 3 4 1 2 Módulo 6 - Lógica de Programação 87 Curso de Informática Pag. 88 Bibliografia 1. Harry Farrer, Algoritmos Estruturados, Rio de Janeiro, 1985. 2. Guimarães / Lages, Algoritmos e Estruturas de Dados, Rio de Janeiro, Livros Técnicos e Científicos, 1985. 3. Sérgio E.R. de Carvalho, Introdução a Programação com Pascal, Rio de Janeiro, Campus, 1985. 4. Kathleen Jensen e Niklaus Wirth, Pascal ISO, Rio de Janeiro, Campus, 1988. 5. Eber A. Schmitz e Antônio A. S. Teles, Pascal e Técnicas de Programação, Rio de Janeiro, Livros Técnicos e Científicos, 1985. 6. Steve Wood, Turbo Pascal - Guia do Usuário, São Paulo, McGraw-Hill, 1987. Módulo 6 - Lógica de Programação Curso de Informática Pag. Cronograma de Atividades Atividade Mês Data 1 2 3 4 5 6 7 8 Módulo 6 - Lógica de Programação Conteúdo 89