EDUCAÇÃO PROFISSIONAL TÉCNICA DE NÍVEL MÉDIO EM INFORMÁTICA LÓGICA DE PROGRAMAÇÃO Módulo II 2013/2 Professor: Marcelo Reis Mendes Manaus - 2013 1 OBJETIVO “Habilitar e desenvolver o raciocínio lógico do aluno através de iniciação em algoritmos e demonstração de várias técnicas utilizadas em programação de computadores, proporcionando juntamente com o conhecimento de estruturas de dados básicos o estimulo da criatividade para o desenvolvimento de software”. INTRODUÇÃO A automatização de tarefas é um aspecto marcante da sociedade moderna. O aperfeiçoamento tecnológico alcançado, com respeito a isto, teve como elementos fundamentais a análise e a obtenção de descrições da execução de tarefas em termos de ações simples o suficiente, tal que pudessem ser automatizadas por uma máquina especialmente desenvolvida para este fim, O COMPUTADOR. Em ciência da computação houve um processo de desenvolvimento simultâneo e interativo de máquinas (hardware) e dos elementos que gerenciam a execução automática (software) de uma dada tarefa. E essa descrição da execução de uma tarefa, como considerada acima, é chamada algoritmo. O objetivo desta disciplina é a Lógica de Programação dando uma base teórica e prática, suficientemente boa, para que, o aluno domine os algoritmos e esteja habilitado a aprender uma linguagem de programação. Será mostrado também um grupo de algoritmos clássicos para tarefas cotidianas, tais como : ordenação e pesquisa. 2 Lógica de programação Processo de construção de um algoritmo contendo passos para a solução de um problema. Algoritmo o Ferramenta textual Fluxograma o Ferramenta gráfica utilizada da descrição da lógica Fluxograma: início processo cartão decisão disco impressão PRINCÍPIOS DE RESOLUÇÕES DE PROBLEMAS Primeiramente, devemos entender e compreender a palavra “problema”. Problema é uma proposta duvidosa, que pode ter inúmeras soluções, ou questão não resolvida e que é o objeto de discussão, segundo a definição encontrada no Dicionário Aurélio. Preferimos dizer que problema é uma questão que foge a uma determinada regra, ou melhor, é o desvio de um percurso, o qual impede de atingir com sucesso um determinado objetivo com eficiência e eficácia. Uma das soluções utilizadas para a resolução de problemas tem sido a utilização dos diagramas que são utilizados com o intuito de auxiliar os aprendizados tanto na resolução de problemas como no conhecimento das técnicas de programação. Como exemplos de algoritmos podemos citar os algoritmos das operações básicas (adição,multiplicação, divisão e subtração) de números reais decimais. Outros exemplos seriam os manuais de aparelhos eletrônicos, como um videocassete, que explicam passo-a-passo como, por exemplo, gravar um evento. 3 Até mesmo as coisas mais simples, podem ser descritas por seqüências lógicas. Por exemplo: “Chupar uma bala”. Pegar a bala Exemplos de Diagrama de Bloco “Chupar uma bala”. Retirar o papel Chupar a bala Jogar o papel no lixo INÍCIO PEGAR A BALA RETIRAR O PAPEL CHUPAR A BALA JOGAR O PAPEL NO LIXO FIM Num diagrama de bloco, toda decisão terá sempre como resposta o resultado verdadeiro ou falso. Imaginemos que algumas pessoas não gostem de chupar bala de Morango, neste caso teremos que modificar o algoritmo para: “Chupar uma bala”. Pegar a bala A bala é de morango? Se sim, não chupe a bala Se não, continue o algoritmo Retirar o papel. Chupar a bala Jogar o papel no lixo Vejamos agora utilizando o diagrama de blocos: 4 PROGRAMA Um programa é um Algoritmo escrito em uma linguagem computacional. MAIS O QUE É UM ALGORITMO? Algoritmo é um processo de cálculo matemático ou de resolução de um grupo de problemas semelhantes, em que se estipulam, com generalidade e sem restrições. Podemos dizer também, que são regras formais para obtenção de um resultado ou da solução de um problema, englobando fórmulas de expressões aritméticas. LINGUAGENS DE PROGRAMAÇÃO São Softwares que permitem o desenvolvimento de programas. Possuem um poder de criação ilimitado, desde jogos, editores de texto, sistemas empresariais até sistemas operacionais. Existem várias linguagens de programação, cada uma com suas características próprias. Exemplos: Pascal Clipper 5 C Visual Basic Java Delphi e etc. TÉCNICAS ATUAIS DE PROGRAMAÇÃO Programação Seqüencial Programação Estruturada Programação Orientada a Eventos e Objetos Programação Orientada a Objetos Constantes Numéricas o Utiliza sistema decimal inteiro ou fracionado(+,-) Ex. 25; 12,35 Lógicas o Representadas pelas palavras FALSO e VERDADEIRO Literal o Qualquer seqüência de caracteres (letra, dígitos ou símbolos especiais) o É utilizado entre aspas. o Ex. “Joaquim”; “FUCAPI”; “12345”; “12/02/2004” Constantes são endereços de memória destinados a armazenar informações fixas, inalteráveis durante a execução do programa. Exemplo: PI = 3.1416 Variável Cada variável corresponde a uma posição de memória O seu conteúdo pode variar ao longo do tempo durante a execução de um programa. Variáveis são endereços de memória destinados a armazenar informações temporariamente. É a representação simbólica dos elementos de um conjunto. Nos algoritmos, destinados a resolver um problema no computador, a cada variável corresponde uma posição de memória, cujo conteúdo pode variar ao longo do tempo durante a execução de um programa. Embora uma variável possa assumir diferentes valores, ela só pode armazenar um valor a cada instante. Todo Algoritmo ou programa deve possuir variável. Ex: A = 2 e B = 5 C = A + B = 7. Formação de identificadores Formado por um ou mais caracteres 6 O primeiro caracter deve ser letra e os seguintes, podem ser letras, underline(_) ou dígitos Não usa símbolos especiais exceto o underline(_) Ter no máximo 127 caracteres; Não possuir espaços em branco; Ex. Válido nota X5 A não válido 5b nota#2 9ç Declaração de variáveis Classificados como Numéricas, Lógicas e Literais. Declare lista-de-identificares nome-do-tipo Onde, o Declare: é uma palavra-chave do algoritmo o Lista....: são os nomes definidos para as variáveis, devem estar separados por vírgulas o Nome..: podem ser Numérico, Lógico ou Literal Ex. o Declare Nota, codigo, X5 numérico; o Declare teste lógico; o Declare nome, endereço literal; Comentários Utilizado para comentar detalhes específicos sobre o programa, na identificação do autor do programa, data, etc. Ex. { Autor: desconhecido } { Data de criação: 26/02/2004 } /** * Autor: Marcelo Reis Mendes * Data criação: 01/07/2013 * Última alteração: 22/07/2013 * Versão homologada: 1.89 */ Expressões Aritméticas Adição, Subtração, Multiplicação, Divisão, Potenciação e Radiciação Ex. o X + Y; X – Y; 2 * nota; total / N; Prioridade das Operações o 1o. Potenciação, Radiciação. o 2o. Multiplicação, Divisão. o 3o. Adição, Subtração. Expressões Lógicas 7 Relações (comparação) o Dois valores de mesmo tipo básico o = igual a; <> diferente de; > maior que o < menor que; >= maior ou igual a o <= menor ou igual a Operadores Lógicos A Álgebra das Proposições define três conectivos: o E – para a conjunção o OU – para a disjunção o NÃO – para a negação Conjunção o o o o Verdadeiro E Verdadeiro E Falso E Falso E Verdadeiro = Verdadeiro Falso = Falso Verdadeiro = Falso Falso = Falso Disjunção o o o o Verdadeiro OU Verdadeiro = Verdadeiro Verdadeiro OU Falso = Verdadeiro Falso OU Verdadeiro = Verdadeiro Falso OU Falso = Falso Negação o Não é Verdadeiro TABELA VERDADE A V V F F B V F V F AEB V F F F A OU B V V V F NÃO (A) F F V V LINEARIZAÇÃO DE EXPRESSÕES Para a construção de Algoritmos todas as expressões aritméticas devem ser linearizadas, ou seja, colocadas em linhas. M (N1+N2) / 2 8 MODULARIZAÇÃO DE EXPRESSÕES A modularização é a divisão da expressão em partes, proporcionando maior compreensão e definindo prioridades para resolução da mesma. Como pode ser observado no exemplo abaixo, em expressões computacionais usamos somente parênteses “( )” para modularização. Na informática podemos ter parênteses dentro de parênteses. Exemplos de prioridades: (2+2) / 2=2 ou seja 2 + 2 = 4 e 4 / 2 = 2; 2+2 / 2=3 ou seja 2 / 2 = 1 e 1 + 2 = 3; OPERADORES ESPECIAIS (MOD e DIV) MOD . Retorna o resto da divisão entre 2 números inteiros. DIV . Retorna o valor inteiro que resulta da divisão entre 2 números inteiros. FUNÇÕES Uma função é um instrumento (Sub–algoritmo) que tem como objetivo retornar um valor ou uma informação. A chamada de uma função é feita através da citação do seu nome seguido opcionalmente de seu argumento inicial entre parênteses. As funções podem ser predefinidas pela linguagem ou criadas pelo programador de acordo com o seu interesse. BIBLIOTECAS DE FUNÇÕES Armazenam um conjunto de funções que podem ser usadas pelos programas. FUNÇÕES NUMÉRICAS PRE-DEFINIDAS IN(EA) EXP(EA) ABS(EA) TRUNC(EA) ROUND(EA) SQR(EA) SQRT(EA) SIN(EA) COS(EA) ARCTAN(EA) LOGARITMO NEPERIANO NÚMERO É ELEVADO A (EA) VALOR ABSOLUTO VALOR TRUNCADO VALOR ARREDONDADO QUADRADO RAIZ QUADRADA SENO COSENO ARCO DA TANGENTE Exemplos: exp(y*(b+2)-6) ln(sqrt(a+2*b)-b) 9 As funções acima são as mais comuns e importantes para nosso desenvolvimento lógico, entretanto, cada linguagem possui suas funções próprias. As funções podem ser aritméticas, temporais, de texto e etc. TIPOS PRIMITIVOS DE DADOS INTEIRO - admite somente números inteiros. geralmente é utilizado para representar uma contagem (quantidade). REAL - admite números reais (com ou sem casas decimais), geralmente é utilizado para representar uma medição. CARACTERE - admite caracteres alfanuméricos, os números quando declarados como caracteres tornam se representativos e perdem a atribuição de valor. LÓGICO - admite somente valores lógicos(verdadeiro/falso). COMANDOS DE I/O (INPUT/OUTPUT) LEIA(READ) . Comando de entrada que permite a leitura de Variáveis de Entrada. ESCREVA(WRITE) . Comando de saída que exibe uma informação na tela do monitor. IMPRIMA(WRITE LST). Comando de saída que envia uma informação para a impressora. SINAL DE ATRIBUIÇÃO Uma Variável nunca é eternamente igual a um valor, seu conteúdo pode ser alterado a qualquer momento. Portanto para atribuir valores a variáveis devemos usar o sinal de “:= em pascal”, “ ← em algoritmo”. Exemplos: A := 2; A ← 2; B := 3; B ← 3; C := A + B; C ← A + B; SINAL DE IGUALDADE As constantes são eternamente iguais a determinados valores, portanto usamos o sinal de “=”. Exemplos: PI = 3.1416; Escola = ‘CEEF’ 1 0 ESTRUTURAS SEQÜÊNCIAIS Como pode ser analisado no tópico anterior, todo programa possui uma estrutura seqüencial determinada por um ÍNICIO e FIM. ENTRADA, PROCESSAMENTO E SAÍDA Para se criar um programa que seja executável dentro de um computador, você deverá ter em mente três pontos de trabalho: a entrada de dados, o seu processamento e a saída dos mesmos. Sendo assim, todo programa estará trabalhando com estes três conceitos. Se os dados forem entrados de forma errada, resultarão conseqüentemente em respostas erradas. O processo de execução de um programa ocorre segundo o exposto, após a entrada de dados com a instrução leia e saída dos mesmos com a instrução escreva, o processamento será uma conseqüência da manipulação das variáveis de ação. Uma entrada e uma saída poderão ocorrer dentro de um computador de diversas formas. Por exemplo, uma entrada poderá ser feita via teclado, moddem, leitores óticos, disco, entre outras. Uma saída poderá ser feita em vídeo, impressora, disco, entre outras formas. Devido a esta grande variedade, faremos menção apenas às instruções leia e escreva. EXERCÍCIO DE APRENDIZAGEM 1. Desenvolver um algoritmo que lê o nome e as 4 notas bimestrais de um aluno e: a) Calcule e escreva a média obtida. ALGORITMO ALGORITMO MEDIA; LINGUAGEM PASCAL PROGRAM MEDIA; 1 1 VAR NOTA1,NOTA2, NOTA3, NOTA4, MEDIA: NUMERICAS; NOME : LITERAL; INICIO ESCREVA(‘DIGITE O NOME DO ALUNO’); LEIA (NOME); ESCREVA (‘DIGITE A NOTA1’); LEIA (NOTA1); ESCREVA(‘DIGITE A NOTA2’); LEIA(NOTA2); ESCREVA(‘DIGITE A NOTA3’); LEIA( NOTA3); ESCREVA(‘DIGITE A NOTA4’); LEIA(NOTA4); MEDIA . (NOTA1 + NOTA2 + NOTA3 + NOTA4) / 4; ESCREVER (NOME, MEDIA) FIM ALGORITMO. USES CRT; VAR NOTA1, NOTA2, NOTA3, NOTA4, MEDIA: REAL; NOME : STRING; BEGIN CLRSCR; WRITE(‘DIGITE O NOME DO ALUNO ’); READLN(NOME); WRITE(‘DIGITE A NOTA1 ’); READLN(NOTA1); WRITE(‘DIGITE A NOTA2 ’); READLN(NOTA2); WRITE(‘DIGITE A NOTA3 ’); READLN(NOTA3); WRITE(‘DIGITE A NOTA 4’); READLN(NOTA4); MEDIA := (NOTA1 + NOTA2 + NOTA3 + NOTA4) / 4; WRITELN(´Nome Aluno ´, NOME, ´ Media ´, MEDIA); READKEY; END. 1 2 2. Desenvolver um algoritmo que lê o raio de uma circunferência e calcula sua área. ALGORITMO AREA_CIRCUNFERENCIA; CONST PI = 3.1416; VAR RAIO, AREA : REAL; INICIO ESCREVA(‘DIGITE O VALOR DO RAIO´); LEIA (RAIO) {ENTRADA} AREA ← PI * SQR(RAIO) {PROCESSAMANETO} ESCREVA (“AREA = “, AREA) {SAÍDA} FIM ALGORITMO. LINGUAGEM PASCAL PROGRAM AREA_CIRCUNFERENCIA; USES CRT; CONST PI = 3.1416; VAR RAIO, AREA : REAL; BEGIN CLRSCR; WRITELN(‘DIGITE O VALOR DO RAIO´); READLN(RAIO); {ENTRADA} AREA := PI * SQR(RAIO); {PROCESSAMENTO} WRITELN(’AREA = ’, AREA:3:2); {SAÍDA} READKEY; END. ESTRUTURA DE CONTROLE – E TOMADA DE DECISÕES Executa uma seqüência de comandos de acordo com o resultado de um teste. A estrutura de decisão pode ser Simples ou Composta, baseada em um resultado lógico. 1 3 Um algoritmo e seus refinamentos são formados por comandos, que determinam as ações a serem executadas pelo seu destinatário e por estruturas de controle que determinam a ordem em que os comandos devam ser Executados, se devem ser executados ou não e quando devem ser executados. Estrutura seqüencial, segundo a qual os comandos devem ser executados um após o outro, na mesma ordem em que aparecem escritos. Início Receba o valor do Salário Processe calcular Salário liquido Processe escrever Salário liquido Fim Estrutura condicional, se um comando de um refinamento for um tanto vago, ele poderá, por sua vez, ser desdobrado em novos comandos, produzindo-se o refinamento de um 1 4 refinamento, e assim sucessivamente. Portanto, o comando “calcular salário liquido “, poderia ser desdobrado em: Inicio Atribua um valor(qualquer) ao salário bruto Se salário bruto for maior que 1000,00 Então Calcular valor do IR Fim se Calcular valor do Inss Calcular salário liquido Escreva salário liquido Fim Algoritmo par; Var A : numérico; Inicio A ← 1; Enquanto A < 10 faça Se resto A divido por 2 for igual a zero Então Escreva (´O valor ´, A . ´e par´) Senão Escreva (´O valor ´, A . ´e imparr´) Fim se; A ← A + 1; Fim enquanto; Fim Na estrutura de repetição, os comandos e as estruturas de controles abrangidos devem ser executados repetidamente até que se verifique uma condição (FIM) para que se interrompa a repetição. 1 5 1 6 NINHOS DE SE Usados para tomadas de decisões para mais de 2 opções. Forma Geral: SE <<CONDIÇÃO>> ENTÃO <<COMANDO1>> SENÃO SE <<CONDIÇÃO>> ENTÃO <<COMANDO1>> SENÃO <<COMANDO1>> Exemplo 01. Desenvolva um algoritmo que lê 3 números e escreve o maior. ALGORITMO LINGUAGEM PASCAL ALGORITMO ACHA_MAIOR; VAR A, B, C : INTEIRO; INICIO ESCREVA(‘DIGITE O VALOR LEIA(A); ESCREVA(‘DIGITE O VALOR LEIA(B); ESCREVA(‘DIGITE O VALOR LEIA(C); SE (A>B) E (A>C) ENTÃO INICIO ESCREVER (A); FIM SENÃO SE (B>A) E (B>C) ENTÃO INICIO ESCREVER (´MAIOR VALOR FIM SENÃO INICIO ESCREVER (´MAIOR VALOR FIM; FIM ALGORITMO. PROGRAM ACHA_MAIOR; USES CRT; {biblioteca de funções pré-definidas} VAR A, B, C : INTEGER; BEGIN CLRSCR; {limpa a tela} WRITELN(‘DIGITE O VALOR A ‘); READLN(A); WRITELN(‘DIGITE O VALOR B ‘); READLN(B); WRITELN(’DIGITE O VALOR C ’ ); READLN(C); IF (A>B) AND (A>C) THEN BEGIN WRITELN(‘MAIOR VALOR ’,A); END ELSE IF (B>A) AND (B>C) THEN BEGIN WRITELN(‘MAIOR VALOR ‘,B); END ELSE BEGIN WRITELN(‘MAIOR VALOR ‘,C); END; DELAY(1000); {pausa em milesegundo} END. A ’); B ’); C ’); É :´,B); É:´, C); 1 7 ESTRUTRA DE CONTROLE – LAÇOS OU MALHAS DE REPETIÇÃO Existem ocasiões onde é necessário efetuar a repetição de um trecho de programa um determinado número de vezes. Neste caso, poderá ser criado um looping que efetue o processamento de um determinado trecho, tantas vezes quantas forem necessárias. Os loopings também são chamados de: laços de repetição ou malhas de repetição. Na programação estruturada existem comandos apropriados para efetuar a repetição de determinados trechos de programas o número de vezes que for necessário. A principal vantagem deste recurso é que o programa passa a ter um tamanho menor, podendo sua amplitude de processamento ser aumentada em se alterar o tamanho do código de programação. Desta forma, pode-se determinar repetições com números variados de vezes. REPETIÇÃO: Serve para efetuar um conjunto de ações repetidas vezes. Existem três tipos básicos de repetições, sendo elas. REPETIÇÃO DO TIPO: TESTE LÓGICO NO INÍCIO DO LOOPING É usada para repetir N vezes uma ou mais instruções. Tendo como vantagem o fato de não ser necessário o conhecimento prévio do número de repetições. Forma Geral 1: ENQUANTO <<CONDIÇÃO>> FAÇA <<COMANDO1>>; Forma Geral 2: ENQUANTO <<CONDIÇÃO>> FAÇA ÍNICIO <<COMANDO1>>; <<COMANDON>> FIM; Exemplo 01. Desenvolver um algoritmo que calcule a soma dos salários dos funcionários de uma empresa. O programa termina quando o usuário digitar um salário igual a ZERO. ALGORITMO LINGUAGEM PASCAL ALGORITMO SOMA_SALARIOS; VAR SOMA, SALARIO : REAL; INICIO SOMA:=0; PROGRAM SOMA_SALARIOS; USES CRT; VAR SOMA, SALARIO : REAL; BEGIN 1 8 SALARIO:=0; ESCREVA(‘DIGITE O VALOR DO SALÁRIO, OU ZERO PARA FINALIZAR’); LEIA (SALARIO); ENQUANTO SALARIO>0 FAÇA INICIO SOMA:=SOMA+SALARIO; ESCREVA(‘DIGITE O VALOR DO SALÁRIO, OU ZERO PARA FINALIZAR’); LEIA (SALARIO); FIM; ESCREVER (´A SOMA DO SALARIO E ´,SOMA); FIM ALGORITMO. CLRSCR; SOMA:=0; SALARIO:=0; WRITE(‘DIGITE O VALOR DO SALÁRIO, OU ZERO PARA FINALIZAR´); READLN(SALARIO); WHILE SALARIO > 0 DO BEGIN SOMA:= (SOMA+SALARIO); WRITE(‘DIGITE O VALOR DO SALÁRIO, OU ZERO PARA FINALIZAR´); READLN(SALARIO); END; WRITELN(‘A SOMA DO SALARIO E ´,SOMA:3:2); DELAY(1000); END. Desenvolver um algoritmo que escreve os 100 primeiros números pares. ALGORITMO LINGUAGEM PASCAL; ALGORITMO PARES_2; VAR A : INTEIRO; INICIO A := 2; REPITA SE A > 100 ENTÃO INTERROMPA; FIM SE; ESCREVER (´O NÚMERO ´, A , ´ E PAR´); A := A+2; FIM REPITA; FIM ALGORITMO. PROGRAM PARES_2; USES CRT; VAR A : INTEGER; BEGIN CLRSCR; A := 2; REPEAT WRITELN(´O NUMERO ´, A, ´ E PAR´); A := A+2; UNTIL A >100; DELAY(1000); END. A estrutura repita..até_que tem o seu funcionamento controlado por decisão. Porém, irá efetuar a execução de um conjunto de instruções pelo menos uma vez antes de verificar a validade da condição estabelecida. Diferente da estrutura enquanto que executa somente um conjunto de instruções, enquanto a condição é verdadeira. Desta forma repita tem seu funcionamento em sentido contrário a enquanto, pois sempre irá processar um conjunto de instruções, no mínimo uma vez até que a condição se torne Verdadeira. Para a estrutura repita um conjunto de instruções é executado enquanto a condição se mantém Falsa e até que ela seja Verdadeira. REPETIÇÃO DO TIPO: VARIÁVEL DE CONTROLE Anteriormente, foram vistas duas formas de se elaborar looping. Uma usando o conceito enquanto e a outra usando o conceito repita. Foi visto também como se estabelecer rotinas que efetuarem a execução de um looping um determinado número de vezes através da utilização de um contador (através de uma variável de controle). Porém, existe uma possibilidade de facilitar o uso de contadores finitos, sem fazer uso das estruturas anteriores, deixando-as para a utilização de loopings onde não se conhece de antemão o número de vezes que uma determinada seqüência de instruções deverá ser executada. Os looping que possuem um número finito de execuções poderão ser processados através de estrutura de laços contados para, sendo conseguida com a 1 9 utilização do conjunto de instruções para..de..até..passo.faça..fim_para. A estrutura para..de..até..passo.faça..fim_para tem seu funcionamento controlado por uma variável denominada contador. Sendo assim, poderá executar um determinado conjunto de instruções um determinado número de vezes. Sua sintaxe é a seguinte: Para <variável> de <inicio> até <fim> passo<incremento> faça <instruções> fim_para Desenvolver um algoritmo que lê um valor para a variável X, multiplicar este valor por 3 atribuindo o resultado à variável de resposta R e apresentar o valor obtido, repetindo esta seqüência por cinco vezes. ALGORITMO LINGUAGEM PASCAL ALGORITMO LOOPING_PARA VAR X, R ,CONT: INTEIRO; INICIO PARA CONT DE 1 ATÉ 5 PASSO 1 FAÇA INICIO ESCREVA(‘DIGITE O VALOR X’); LEIA (X); R . X * 3; ESCREVA(´O NVALOR DE R É : ´, R); R . 0; FIM_PARA; FIM ALGORITMO. PROGRAM LOOPING_PARA; USES CRT; VAR X, R ,CONT: INTEGER; BEGIN CLRSCR; FOR CONT := 1 TO 5 DO BEGIN WRITE(‘DIGITE O VALOR X ’); READLN(X); R := X * 3; WRITELN(‘O VALOR DE R É : ´, R); DELAY(1000); R := 0; END; END. Será executado o conjunto de instruções entre a instrução para e a instrução fim_para, sendo a variável CONT (variável de controle) inicializada com valor 1 e incrementada de mais 1 através da instrução passo até o valor 5. Este tipo de estrutura de repetição poderá ser utilizado todas as vezes que se tiver a necessidade de repetir trechos finitos, onde se conhece o valor inicial e o valor final. ESTRUTURA DE DADOS – TABELAS EM MEMÓRIAS 2 0 Vimos anteriormente como um identificador referencia um tipo, como inteiro, real, char, boolean e string. A linguagem Pascal também dispõe meios para que um mesmo identificador referencie vários dados, do mesmo tipo ou de tipos diferentes. Isso é conhecido em Pascal como variável estruturada. Há dois tipos dessas variáveis: Variáveis Compostas Homegêneas Variáveis Compostas Heterogêneas Variáveis Compostas Homogêneas São variáveis conhecidas em Pascal como arrays (vetores), e correspondem a um conjunto de dados de um mesmo tipo. Essas variáveis podem ser unidimensionais ou multidimensionais, ou seja, dependem da quantidade de índices necessários para individualização de cada elemento do conjunto. Variáveis Compostas Homegêneas Unidimensionais São variáveis compostas que necessitam de somente um índice para individualizar um elemento do conjunto. A criação desse tipo de variável é feita com a seguinte declaração: Para se declarar uma variável nota do tipo real com 10 elementos basta escrever nota : array[1..10] of real; Os índices para a variável nota estão no intervalo 1,2,3,...,10. Para acessar um elemento i dessa variável basta referenciá-lo como nota[i]. Por exemplo, nota[1], nota[10], que referenciam respectivamente o valor do primeiro e o valor do décimo elemento da variável nota. Utilizando-se, por exemplo um variável i do tipo inteiro, tem-se a possibilidade de acesso a qualquer um dos elementos. Seja nota[i] uma referência em um programa. Antes da variável nota ser consultada, a variável i seria substituída pelo seu conteúdo no dado instante. Se i=2, então o elemento da acessado seria nota[2]. Os elementos da variável nota podem ser referenciados por expressões como por exemplo nota[I+1] e nota[I+Jj+1]. Exemplo 01. Nota Índice 80 1 70 2 75 3 100 85 4 5 92 6 68 7 80 8 90 9 75 10 nota[1] = 80 nota[2] = 70 nota[3] = 75 nota[4] = 100 nota[5] = 85 . . nota[10] = 75 2 1 LEITURA DOS DADOS DE UMA MATRIZ A leitura de uma matriz é processada passo a passo, um elemento por vez. A instrução de leitura é leia seguida da variável mais o índice. Abaixo, é apresentado a codificação em portugol da leitura de 10 notas de 10 alunos, cálculo da média e a apresentação da mesma. ALGORITMO ALGORITMO MEDIA_TURMA; VAR MD : VETOR [1..10] DE REAL; SOMA, MEDIA : REAL; I : INTEGER; INICIO SOMA := 0; PARA I DE 1 ATÉ 10 PASSO 1 FAÇA INICIO ESCREVA(“DIGITE A NOTA DO “, I,”º ALUNO”); LEIA(MD[I]); SOMA := SOMA + MD[I]; FIM; MEDIA SOMA / 10; ESCREVA(´A MEDIA DA TURMA É :´, MEDIA:2:2); FIM ALGORITMO.. LINGUAGEM PASCAL PROGRAM MEDIA_TURMA; USES CRT; VAR MD : ARRAY [1..10] OF REAL; SOMA, MEDIA : REAL; I : INTEGER; BEGIN CLRSCR; SOMA := 0; FOR I := 1 TO 10 DO BEGIN WRITE(‘DIGITE A NOTA DO ´, I,´º ALUNO ’); READLN(MD[I]); SOMA := SOMA + MD[I]; END; MEDIA := SOMA / 10; WRITELN(´A MEDIA DA TURMA E :´, MEDIA:2:2); DELAY(1000); END. ESCRITA DOS DADOS DE UMA MATRIZ O processo de escrita de uma matriz é bastante parecido com o processo de leitura de seus elementos. Para esta ocorrência deverá ser utilizada a instrução escreva seguida da indicação da variável e seu índice. Supondo que após a leitura das 10 notas, houvesse a necessidade de apresentá-las antes da apresentação do valor da média. Abaixo é exibido a codificação da escrita dos 10 alunos antes de ser apresentado o cálculo da média. ALGORITMO ALGORITMO MEDIA_TURMA; VAR MD : CONJUNTO [1.10] DE REAL SOMA, MEDIA : REAL I : INTEIRO INICIO SOMA 0; PARA I DE 1 ATE 10 LINGUAGEM PASCAL PROGRAM MEDIA_TURMA; USES CRT; VAR MD : ARRAY [1..10] OF REAL; SOMA, MEDIA : REAL; I : INTEGER; BEGIN CLRSCR; SOMA := 0; FOR I := 1 TO 10 DO 2 2 PASSO 1 FAÇA INICIO BEGIN WRITE(‘DIGITE A NOTA DO ´,I,´º ALUNO ´ ); ESCREVA(‘DIGITE A NOTA DO ´,I, ´º ALUNO ’); READLN(MD[I]); LEIA (MD[I]) SOMA := SOMA + MD[I]; SOMA SOMA + MD[I] END; FIM_PARA; CLRSCR; FOR I := 1 TO 10 DO PARA I DE 1 ATE 10 PASSO 1 FAÇA BEGIN INICIO WRITELN(´A NOTA DO ALUNO ´,I, ESCREVA (´A NOTA DO ALUNO ´, I, ´ E ´, MD[I]); ´ E ´, MD[I] :2:2); FIM_PARA; END; MÉDIA SOMA / 10; MEDIA := SOMA / 10; ESCREVA (´A MEDIA DA TURMA É : ´, MEDIA); WRITELN(´A MEDIA DA TURMA É : ´, FIM ALGORITMO. MEDIA:2:2); DELAY(1000); END. 2 3 MATRIZES COM MAIS DE UMA DIMENSÃO Anteriormente, você teve contato com o uso de uma única variável indexada com apenas uma dimensão (uma coluna e várias linhas), quanto foi utilizado o exemplo para efetuar o cálculo da média geral das médias dos oito alunos. A partir deste ponto, serão apresentadas as tabelas com mais colunas, sendo assim teremos variáveis no sentido horizontal e vertical. Com o conhecimento adquirido até este ponto, você teria condições suficientes para elaborar um programa que efetuasse a leitura das notas dos alunos, o cálculo da média de cada aluno e no final apresentar a média do grupo, utilizando-se de matrizes unidemensionais. Porém, há de se considerar que o trabalho seria grande, uma vez que se necessitaria manter um controle de cada índice em cada matriz para um mesmo aluno. Para facilitar o trabalho com estruturas deste porte é que serão utilizadas matrizes com mais dimensões. A mais comum é a matriz de duas dimensões por se relacionar diretamente com a utilização de tabelas. Matrizes com mais de duas dimensões são utilizadas com menos freqüência, mas poderão ocorrer com momentos em que se necessite trabalhar com um número maior de dimensões, estas serão fáceis de serem utilizadas se você dominar bem a utilização de uma matriz com duas dimensões. Um importante aspecto a ser considerado é que na manipulação de uma matriz é utilizada uma única instrução de looping(enquanto, para ou repita). No caso de matrizes com mais dimensões, deverá ser utilizado o número de loopings relativos ao tamanho de sua dimensão. Desta forma, uma matriz de duas dimensões deverá ser controlada com dois loopings, sendo que de três dimensões deverá ser controlada por três loopings e assim por diante. Em matrizes de mais uma dimensão os seus elementos serão também manipulados de forma individualizada, sendo a referência feita sempre através de dois índices: o primeiro para indicar a linha e o segundo para indicar a coluna. Desta forma, TABELA[2,3], indica que está sendo feita uma referência ao elemento armazenado na linha 2 coluna 3. Pode-se considerar que uma matriz com mais de uma dimensão é também um vetor, sendo válido para este tipo de matriz tudo o que já foi utilizado anteriormente para as matrizes de uma dimensão. 2 4 Vetor V Matriz 4 7 2 5 3 Array Tridimensional 3 8 1 5 6 3 8 1 = M 0 2 4 7 7 3 0 2 5 2 1 5 9 4 0 3 = 2 5 9 3 T 3 8 = 0 2 4 7 1 5 2 5 9 3 Cada elemento dos arrays podem ser referenciados através de índices. Exemplos: V[1] = 4 V[2] = 7 V[5] = 3 M[1,1] = 3 M[2,3] = 4 M[3,1] = 2 T[1,1,1] = 3 T[2,3,2] = 9 T[1,2,3] = 3 2 5 OPERAÇÕES BÁSICAS COM MATRIZES DE DUAS DIMENSÕES Uma matriz de duas dimensões está sempre fazendo menção a linhas e colunas e será representada por seu nome e seu tamanho (dimensão) entre colchetes, desta forma seria uma matriz de duas dimensões TABELA[1..8, 1..5], onde TABELA é o seu nome, possuindo um tamanho de 8 linhas (de 1 a 8) e 5 colunas (de 1 a 5), ou seja, é uma matriz de 8 por 5 (8X5). Isto significa que poderão ser armazenados em TABELA até 40 elementos. Exemplos: L C O L U N A 1 2 3 4 5 I N 1 10 11 12 13 14 H 2 20 21 22 23 24 A 3 30 31 32 33 34 4 40 41 42 43 44 5 6 7 8 50 51 52 53 54 60 61 62 63 64 70 71 72 73 74 80 81 82 83 84 ATRIBUIÇÃO DE UMA MATRIZ Uma matriz de duas dimensões será atribuída pelas instrução vetor já utilizada para definir o uso de uma matriz de uma dimensão, sendo bastante parecidos em sua referência. A sintaxe será: VARIAVEL : vetor [<dimensão1: dimensão2>] de <tipo de dado>, onde <dimensão1> e <dimensão2> serão indicação do tamanho da tabela e <tipo de dado> o tipo da matriz, que poderá ser formada por valores reais, inteiros, lógicos ou caracteres. LEITURA DOS DADOS DE UMA MATRIZ A leitura de uma matriz de duas dimensões assim como as matrizes de uma dimensão é processada passo a passo, um elemento por vez, sendo utilizada a instrução leia seguida da variável mais os seus índices. A seguir é apresentado a codificação em português estruturado da leitura das 5 notas bimestrais de 8 alunos, sem considerar o cálculo da média. ALGORITMO ALGORITMO LER_ELEMENTOS; VAR NOTAS : VETOR [1..8, 1..5] DE REAL I, J : INTEIRO; INICIO PARA I DE 1 ATÉ 8 PASSO 1 FAÇA LINGUAGEM PASCAL PROGRAM LER_ELEMENTOS; USES CRT; VAR NOTAS : ARRAY [1..8, 1..5] OF REAL; I, J : INTEGER; BEGIN 2 6 INICIO PARA J DE 1 ATÉ 5 PASSO 1 FAÇA INICIO LEIA(NOTAS[I,J]); FIM_PARA FIM_PARA FIM ALGORITMO. CLRSCR; FOR I := 1 TO 8 DO BEGIN FOR J := 1 TO 5 DO BEGIN WRITELN(´Informe o valor da linha ´, I, ´coluna ´,j); READLN(NOTAS[I,J]); END; END; Delay(1000); END. ESCRITA DOS DADOS DE UMA MATRIZ O processo de escrita será bastante parecido com o processo de leitura de seus elementos. Supondo que após a leitura das notas dos 8 alunos, houvesse a necessidade de efetuar a apresentação das notas. Abaixo é apresentado a codificação em português estruturado da escrita das 5 notas dos 8 alunos. ALGORITMO ALGORITMO LER_ELEMENTOS; VAR NOTAS : VETOR [1..8, 1..5] DE REAL I, J : INTEIRO; INICIO PARA I DE 1 ATÉ 8 PASSO 1 FAÇA INICIO PARA J DE 1 ATÉ 4 PASSO 1 FAÇA INICIO ESCREVA(NOTAS[I,J]); FIM_PARA; FIM_PARA; FIM ALGORITMO. LINGUAGEM PASCAL PROGRAM LER_ELEMENTOS; VAR NOTAS : ARRAY [1..8, 1..5] OF REAL I, J : INTEGER; BEGIN FOR I := 1 TO 8 DO BEGIN FOR J := 1 TO 5 DO BEGIN WRITELN(NOTAS[I,J]); END; END; END. ESTRUTURA DE DADOS HETEROGÊNEAS No tópicos anteriores, você teve um contato com técnicas de programação que envolveram o uso de estruturas de dados homogêneas, através da utilização de matrizes de uma e duas dimensões. Observou que somente foi possível trabalhar com um tipo de dado por matriz. No momento em que se precisou trabalhar com dois tipos de dados diferentes, foi necessária a utilização também de duas matrizes, uma de cada tipo. 2 7 EXERCÍCIO DE APRENDIZAGEM Cria um programa calculadora que apresente um menu de seleções no programa principal. Este menu deverá dar ao usuário a possibilidade de escolher uma entre quadra operações aritméticas. Escolhida a opção desejada, deverá ser solicitada a entrada de dois números, e processada a operação deverá ser exibido o resultado. Note que este programa deverá ser um conjunto de 5 rotinas, uma principal e 4 secundárias. A rotina principal efetuará o controle sobre as 4 rotinas secundárias, que por sua vez pedirão a leitura de dois valores, farão a operação e apresentarão o resultado obtido. Observe agora a codificação: ALGORITMO LINGUAGEM PASCAL PROGRAMA CALCULADORA; PROGRAM CALCULADORA; VAR OPCAO : CARACTERE; VAR OPCAO : CHAR; {SUB-ROTINAS DE CÁLCULOS} {SUB-ROTINAS DE CÁLCULOS} PROCEDIMENTO ROTSOMA; VAR R, A, B : REAL; INÍCIO ESCREVA (‘ROTINA DE SOMA‘); ESCREVA (‘ENTRE UM VALOR PARA A: ‘); LEIA(A); ESCREVA (‘ENTRE UM VALOR PARA B: ‘); LEIA(B); R A + B; ESCREVA (‘A SOMA DE A COM B É = ‘, R); FIM; PROCEDURE ROTSOMA; VAR R, A, B : REAL; BEGIN WRITELN(‘ROTINA DE SOMA‘); WRITELN(‘ENTRE UM VALOR PARA A: ‘); READLN(A); WRITELN(‘ENTRE UM VALOR PARA B: ‘); READLN(B); R := A + B; WRITELN(‘A SOMA DE A COM B É = ‘, R); END; PROCEDIMENTO ROTSSUBTRACAO; VAR R, A, B : REAL; INÍCIO ESCREVA (‘ROTINA DE SUBTRAÇÃO ‘); ESCREVA (‘ENTRE UM VALOR PARA A: ‘); LEIA(A); ESCREVA (‘ENTRE UM VALOR PARA B: ‘); LEIA(B); R A – B; ESCREVA(‘A SUBTRAÇÃO DE A COM B É = ‘, R); FIM; PROCEDIMENTO ROTMULTIPLICACAO; VAR PROCEDURE ROTSSUBTRACAO; VAR R, A, B : REAL; BEGIN WRITELN (‘ROTINA DE SUBTRAÇÃO ‘); WRITELN (‘ENTRE UM VALOR PARA A: ‘); READLN(A); WRITELN (‘ENTRE UM VALOR PARA B: ‘); READLN(B); R := A – B; WRITELN(‘A SUBTRAÇÃO DE A COM B É = ‘, R); 2 8 R, A, B : REAL; INÍCIO ESCREVA (‘ROTINA DE MULTIPLICAÇÃO ‘); ESCREVA (‘ENTRE UM VALOR PARA A: ‘); LEIA(A); ESCREVA (‘ENTRE UM VALOR PARA B: ‘); LEIA(B); R A * B; ESCREVA (‘A MULTIPLICAÇÃO DE A COM B É = ‘, R); FIM; PROCEDIMENTO ROTDIVISAO; VAR R, A, B : REAL; INÍCIO ESCREVA (‘ROTINA DE DIVISÃO’); ESCREVA (‘ENTRE UM VALOR PARA A: ‘); LEIA(A); ESCREVA (‘ENTRE UM VALOR PARA B: ‘); LEIA(B); R A / B; ESCREVA (‘A DIVISÃO DE A COM B É = ‘, R); FIM; {PROGRAMA PRINCIPAL} INICIO OPCAO ‘0’ ENQUANTO (OPCAO <> ‘5’) FAÇA ESCREVA (‘1 –ADIÇÃO’); ESCREVA (‘2 – SUBTRAÇÃO’); ESCREVA (‘3 – MULTIPLICAÇÃO’); ESCREVA (‘ 4 – DIVISÃO’); ESCREVA (‘5 – FIM DO PROGRAMA’); ESCREVA (‘ESCOLHA UMA OPÇÃO’); LEIA (OPCAO); SE OPCAO = ‘1’ ENTÃO ROTSOMA; FIM_SE; SE OPCAO = ‘2’ ENTÃO ROTSUBTRACAO; FIM_SE; SE OPCAO = ‘3’ ENTÃO ROTMULTIPLICACAO; FIM_SE; SE OPCAO = ‘4’ ENTÃO ROTDIVISAO; FIM_SE; FIM_ENQUANTO; FIM. END; PROCEDURE ROTMULTIPLICACAO; VAR R, A, B : REAL; BEGIN WRITELN (‘ROTINA DE MULTIPLICAÇÃO ‘); WRITELN (‘ENTRE UM VALOR PARA A: ‘); READLN(A); WRITELN (‘ENTRE UM VALOR PARA B: ‘); READLN(B); R := A * B; WRITELN(‘A MULTIPLICAÇÃO DE A COM B É =‘,R); END; PROCEDURE ROTDIVISAO; VAR R, A, B : REAL; BEGIN WRITELN (‘ROTINA DE DIVISÃO’); WRITELN (‘ENTRE UM VALOR PARA A: ‘); READ(A); WRITELN (‘ENTRE UM VALOR PARA B: ‘); READ(B); R := A / B; WRITELN (‘A DIVISÃO DE A COM B É = ‘, R); END; {PROGRAMA PRINCIPAL} BEGIN OPCAO := ‘0’ WHILE (OPCAO <> ‘5’) DO WRITELN (‘1 – ADIÇÃO’); WRITELN (‘2 – SUBTRAÇÃO’); WRITELN (‘3 – MULTIPLICAÇÃO’); WRITELN (‘ 4 – DIVISÃO’); WRITELN (‘5 – FIM DO PROGRAMA’); WRITELN (‘ESCOLHA UMA OPÇÃO’); READLN (OPCAO); IF OPCAO = ‘1’ THEN ROTSOMA; IF OPCAO = ‘2’ THEN ROTSUBTRACAO; IF OPCAO = ‘3’ THEN ROTMULTIPLICACAO; IF OPCAO = ‘4’ THEN ROTDIVISAO; END; END. Obs: Observe que em cada sub-rotina possui suas próprias variáveis, estas porém só podem ser acessadas dentro de cada procedimento, neste caso são chamadas de variáveis locais. No caso da variável opção é uma variável global, pode ser acessada em qualquer local do programa, tanto nos procedimentos como no programa principal. FUNÇÕES 2 9 Uma função também é um bloco de programa como são os procedimentos, contendo início e fim e sendo identificado por um nome, através do qual também será referenciada em qualquer parte do programa principal. Uma sub-rotina de função é na verdade muito parecida com uma sub-rotina de procedimento. A sintaxe em português estruturado será também idêntica ao estudo anterior. Observe a seguir, o código em português estruturado de uma função. Português Estruturado Função <nome da função> (parâmetros) : <tipo da função> Var <variáveis> início <instruções> fim. A sua principal diferença está no fato de uma função retornar um determinado valor, que é retornado no próprio nome da função. Quando se diz valor, devem ser levados em consideração os valores numéricos, lógicos ou literais (caracteres). Você deve ter observado a presença de um item na sintaxe da função, que são os parâmetros, que tanto podem ser referenciados nos procedimentos, mas vejamos sua utilidade. Os parâmetros têm por finalidade servir como um ponto de comunicação bidirecional entre uma sub-rotina e o programa principal ou com uma outra sub-rotina hierarquicamente de nível mais alto. Desta forma, é possível passar valores de uma sub-rotina ou rotina chamadora à outra sub-rotina e vice-versa, através do uso de parâmetros que poderão ser formais ou reais. Serão considerados parâmetros formais quando forem declarados através de variáveis juntamente com a identificação do nome da sub-rotina, os quais serão tratados exatamente da mesma forma que são tratadas as variáveis globais ou locais. Serão considerados parâmetros Reais quando estes substituírem os parâmetros formais, quando a utilização da sub-rotina por um programa principal ou por uma rotina chamadora. UTILIZAÇÃO DE FUNÇÕES Criaremos uma função que calcule a raiz cúbica de um determinado número inserido pelo usuário. Observe o Programa: ALGORITMO PASCAL PROGRAMA RAIZ_CUBICA VAR I : INTEIRO FUNÇÃO CUBO(N) : REAL INICIO CUBO N * N * N FIM LINGUAGEM PROGRAM RAIZ_CUBICA; USES CRT; VAR I : INTEGER; FUNCAO CUBO(N) : REAL; BEGIN CUBO := N * N * N; 3 0 INICIO ESCREVA(‘DIGITE O VALOR I ); LEIA (I) ESCREVA(CUBO(I)) FIM. END; BEGIN CLRSCR; WRITELN(‘DIGITE O VALOR I ‘); READ(I); WRITELN(CUBO(I)); DELAY(800); END. Observe que neste caso o parâmetro formal foi a variável “ N ”, enquanto o parâmetro real foi a variável “I ”. Cada parâmetro passado na lista de parâmetros de uma função ou de um procedimento pode ser passado por valor ou por referência. Parâmetros passados por valor permanecem inalterados após a chamada de uma função. Parâmetros passados por referência guardam as modificações sofridas no interior destas. Um parâmetro passado por referência possui antes do nome do parâmetro a palavra reservada var. Quando a palavra var está ausente é assumido que o parâmetro é passado por valor. Para observar a diferença entre a passagem de parâmetros por valor e por referência, acompanhe os seguinte exemplos: procedure somaUmPorValor(x: integer); begin x := x+1; end; procedure somaUmPorRef(var x: integer); begin x := x+1; end; procedure Teste; var x: integer; begin x := 1; { Atribuir 1 a variável X ( X vale 1 aqui) } somaUmPorRef(x); { chamar a função} { ao retornar da chamada ao procedimento (X vale 2 neste ponto) } somaUmPorValor(x); { chamar a função} { ao retornar da chamada do procedimento (X ainda vale 2 neste ponto. Pois as modificações no parâmetro X dentro do procedimento somaUmPorValor não fizeram efeito pois x foi passado por valor neste caso.} end; A regra básica para a utilização de parâmetros por valor e por referência é desenhar um módulo na forma de um esquemático de "caixa–preta". Parâmetros que sejam somente de entrada serão mapeados como parâmetros passados por valor enquanto que parâmetros de entrada e saída ou somente de saída serão mapeados como parâmetros passados por referência. 3 1 Considere, por exemplo, um módulo que deva receber dois valores inteiros e trocar os seus valores. Desta forma, a chamada ao módulo Troca(A,B) com os valores de A igual a 2 e o valor de B igual a 3 antes da chamada deve produzir a troca desta valores, colocando o valor 3 na variável A e o valor 2 na variável B. A: = 2; B := 3; troca (A,B); { A vale 3 e B vale 2 agora} PROGRAMA TROCA; PROCEDIMENTO TROCA (VAR A,B : INTEIRO); VAR X : INTEIRO; INICIO X := A; A := B; B := X; FIM; var A,B : INTEIRO; INICIO { Procedimento principal } ESCREVA ('INFORME O VALOR DE A : ') ; LEIA (A); ESCREVA ('INFORME O VALOR DE B : '); LEIA(B); TROCA(A,B); ESCREVA (' VALORES INVERTIDOS '); ESCREVA ('O VALOR DE A AGORA E : ', A); ESCREVA ('O VALOR DE B AGORA E : ', B); FIM. PROGRAM TROCA; USES CRT; PROCEDURE TROCA (VAR a,b : INTEGER); VAR X : INTEGER; BEGIN X := A; A := B; B := X; End; VAR A,B : INTEGER; BEGIN { Procedimento principal } CLRSCR; WRITE ('INFORME O VALOR DE A : ') ; READLN (A); WRITE ('INFORME O VALOR DE B : '); READ(B); TROCA(A,B); WRITELN (' VALORES INVERTIDOS '); WRITELN('O VALOR DE A AGORA E : ', A); WRITELN('O VALOR DE B AGORA E : ', B); DELAY(800); END. Se desenhássemos o esquemático ("caixa–preta") associada a esta rotina teríamos o seguinte desenho: A maneira mais intuitiva de proceder à modularização de problemas é feita definindo-se um módulo principal de controle e módulos específicos para as funções do Algoritmo. As linguagens de programação hoje existentes dispõem de recursos que facilitam a construção e manipulação de módulos. A experiência recomenda que os módulos de um algoritmo devem ter um tamanho limitado. Módulos muito grandes são difíceis de ser compreendidos e, em geral, são multifuncionais. Objetos globais são entidades que podem ser usadas em módulos internos a outro modulo do algoritmo onde foram declaradas. Objetos locais são entidades que só podem ser usadas no módulo do algoritmo onde foram declaradas. Estes objetos não possuem qualquer significado fora deste módulo. São Exemplo de objetos globais ou locais: variáveis, arquivos, outros módulos etc. 3 2 Um módulo pode usar objetos globais ou locais em relação a ele. Porém não pode usar objetos declarados em módulos que não o abrangem. Isto significa que objetos globais, declarados em módulos mais externos ou mesmo a nível do modulo principal, podem ser também utilizados em módulos mais externos. A comunicação entre os módulos deverá ser feita através de vínculos, utilizando-se objetos globais ou transferência de parâmetros. FERRAMENTAS PARA MODULARIZAÇÃO Dentre as ferramentas de modularização pode-se destacar: Sub-rotinas Funções As sub-rotinas e as funções são módulos de programação que servem basicamente a três objetivos: * Evitar que uma certa seqüência de comandos necessário em vários locais de um algoritmo tenha que ser escrita repetidamente nestes locais; * Dividir e estruturar um Algoritmo em partes fechadas e logicamente coerentes; * Aumentar a legibilidade de um algoritmo; Sub-rotinas e funções são módulos hierarquicamente subordinados a um algoritmo, comumente chamado de módulo principal. Da mesma forma uma função pode conter outras sub-rotinas e funções aninhadas, como pode ser visto no diagrama hierárquico a seguir: A figura ilustra um algoritmo constituído de um módulo principal MP, as sub-rotinas S1,S2,S3 e S4 e as funções F1, F2, F3 e F4. CONCLUSÕES A técnica apresentada neste módulo para o desenvolvimento de algoritmo é útil e indicada mesmo quando não se cogita da utilização de computadores. Ao se defrontar com 3 3 problemas de organização de empresa, do estabelecimento de uma política de economia, do projeto de uma obra de engenharia, da fixação do plano de ação de uma equipe de pesquisa, do planejamento de uma novela, romance ou mesmo de um livro didático, as técnicas de desenvolvimento estruturado de algoritmos podem e devem ser empregadas. Os problemas devem ser abordados, primeiro, na sua generalidade e somente depois, gradativamente, nas suas particularidades. As ações devem ser consideradas na sua sequenciação, na sua condicionalidade e na sua repetição. O desenvolvimento de um algoritmo capaz de fazer com que as operações básicas de um computador conduza à solução de um problema, até a obtenção dos seus resultados finais, é apenas uma das fases necessárias para o uso do computador. Particularmente, para se resolver um problema num computador, é necessário passar pelas seguintes fases: DEFINIÇÃO DO PROGRAMA Antes de se utilizar o computador, é necessário saber qual é o problema que se deseja resolver. É necessário caracteriza-lo de uma maneira clara e completa. DESENVOLVIMENTO DE UM ALGORÍTMO Definido o problema, passa-se em seguida à fase de desenvolvimento de um algoritmo capaz de produzir os resultados desejados. Nesta fase, quanto mais complexo for o problema, mais se recomenda a utilização da técnica apresentada neste módulo. CODIFICAÇÃO Desenvolvido satisfatoriamente um algoritmo, faz-se nesta fase a sua transcrição para uma linguagem de programação aceita pelo computador. DIGITAÇÃO Escrito o programa, na linguagem escolhida, é necessário introduzi-lo no computador, a fim de executa-lo. Faz-se estão a sua digitação num teclado, ligado a um computador diretamente ou através de um terminal ligado a uma maquina separada, que perfura cartões ou grava disquetes ou fitas magnéticas que serão, posteriormente, lidos pelo computador. PROCESSAMENTO DO PROGRAMA Esta fase é feita pelo próprio computador, verificando a correção sintática do programa, considerando o significado de suas sentenças e procedendo a sua execução. Em alguns casos, a analise das sentenças do programa e a sua execução são realizadas alternadamente: diz-se, então, que o programa esta sendo interpretado. Em outros casos, é 3 4 feita, antes, a tradução de todo o programa para a linguagem de máquina e somente depois se processa a sua execução: diz-se, neste caso, que oi programa foi compilado. ANÁLISE DOS RESULTADOS A obtenção de resultados através de um computador não é garantia de que eles estejam corretos. Mas apenas uma indicação de que o programa está escrito sem erros de linguagem. Geralmente, o computador não executa programas com erro de linguagem, mas emite mensagem, tentando localizar o erro e determinar a sua natureza. Por conseqüência, os primeiros resultados de cada alternativa contida num programa devem ser cuidadosamente verificadas. BIBLIOGRAFIA FORBELLONE, André L.V. & EBERSPÄCHER,Henri F. - "Lógica de programação - A construção de Algoritmos e estrutura de dados" - São Paulo - Makron, McGraw-Hill,1993. SALIBA, Walter L. C. - "Técnicas de programação - Uma abordagem estruturada"- Makron, McGraw-Hill, 1992. GUIMARÃES, Ângelo M. & LAGES, Newton A. C. - "Algoritmos e estruturas de dados" - Rio de Janeiro - LTC, 1985. FARRER, Harry, BECKER, Christiano G.,FARIA, Eduardo C., MATOS, Helton F., SANTOS, Marcos A., MAIA, Miriam L.- "Algoritmos estruturados" - Rio de Janeiro - Ed. Guanabara,1989. 3 5 ANEXO I - ESTRUTURA SEQUENCIAL COM SELEÇÃO 1. Ler um valor e escrever a mensagem É MAIOR QUE 10 se o valor lido for maior que 10, caso contrário escrever NÃO É MAIOR QUE 10. 2. Ler um valor e escrever se é positivo ou negativo (considere o valor zero como positivo). 3. Ler as notas da 1a. e 2a. avaliações de um aluno. Calcular a média aritmética simples e escrever uma mensagem que diga se o aluno foi ou não aprovado (considerar que nota igual ou maior que 6.0 o aluno é aprovado). Escrever também a média calculada. 4. Ler o ano atual e o ano de nascimento de uma pessoa. Escrever uma mensagem que diga se ela poderá ou não votar este ano (não é necessário considerar o mês em que a pessoa nasceu, considere idade maior ou igual a 16 nos ). 5. Desenvolver um algoritmo que leia dois valores V1 e V2 e calcule a diferença do maior pelo menor. 6. Desenvolver um algoritmo que escreva os números de 10 até 50. Quando o número for igual a 25 escreva a mensagem “Parabéns”. 3 6 ANEXO II - ESTRUTURA DE REPETIÇÃO 1. Desenvolver um algoritmo que calcule a soma dos números pares de 10 até 200 e mostre a soma. 2. Desenvolver um algoritmo que mostre os números impares de 20 até 30 quando o número for maior que 30 finalize. 3. Calcular o fatorial de um número informado via teclado. 4. Em uma classe existem 40 alunos e, após a aplicação de três provas deseja-se saber a situação dos alunos, para tanto desenvolva um algoritmo que leia o nome, e as três notas de cada aluno e: a) calcular a média aritmética ( N1 + N2 + N3) / 3; b) se média for maior ou igual a 6.0, escreva o nome a média e a mensagem “Aprovado”; c) se média for maior ou igual a 4.0 e menor que 6.0, escreva o nome a média e a mensagem “Recuperação”; d) se média for menor que 4.0, escreva o nome a média e a mensagem “Reprovado”; no final calcular e escrever a média geral da turma (Total_medias ) / (Total de alunos); 5. Uma pesquisa sobre algumas características físicas da população de uma determinada região, coletou os seguintes dados, referente a cada habitante para serem analisados. - Sexo (M ou F) masculino ou feminino - Idade; - Cor dos olhos (A/ V/ C) azul, verde ou castanho; Fazer um programa que leia os dados coletados para cada habitante e quando for digitada uma idade igual a -1, finalize o programa e escreva o seguinte relatório : a) Quantidade de habitantes que possuem olhos azuis ou verdes; b) Quantidade de mulheres com idade superior a 20 anos; c) Sexo e idade do habitante mais velho; 6. Desenvolver um algoritmo para somar os números inteiros positivos de 1 a 100 e no final imprimir o resultado. 7. Desenvolver um algoritmo que leia o nome a idade e altura de 50 pessoas e escreva: a. Nome, idade, altura da pessoa mais baixa; b. Nome, idade, altura da pessoa mais alta; 8. Desenvolver um algoritmo para ler 2 valores (se o segundo valor informado for ZERO, deve ser lido um novo valor) e imprimir o resultado da divisão do primeiro pelo segundo. Utilizar a estrutura REPEAT-UNTIL (Repita - Até). 3 7 9. Desenvolver um algoritmo que solicite ao usuário 5 números. Faça a soma destes 5 números e imprima na tela. Utilize a estrutura FOR...TO...DO (De...Até...Faça). 10. Escreva um programa que calcule e imprima a tabuada do 8 (1 a 10). (com Arrays): 11. Preencher um vetor X de 10 elementos com o valor inteiro 30. Escrever o vetor X após seu total preenchimento. 12. Preencher um vetor A de 10 elementos com os números inteiros de 1 a 10. Escrever o vetor A após o seu total preenchimento. 13. Dado o seguinte vetor: v [1] v [2] v [3] v [4] v [5] v [6] v [7] 5 1 4 2 7 8 3 v [8] 6 Qual será seu conteúdo depois de executado o seguinte algoritmo? for i := 8 downto 5 do begin aux := v [i]; v [i] := v [8 - i + 1]; v [8 - i + 1] := aux; end; v [3] := v [1]; v [3] := v [2]; 14. Ler um vetor C de 10 elementos inteiros, trocar todos os valores negativos do vetor C por 0. Escrever o vetor C modificado. 15. Ler um vetor D de 10 elementos. Criar um vetor E, com todos os elementos de D na ordem inversa, ou seja, o último elemento passará a ser o primeiro, o penúltimo será o segundo e assim por diante. Escrever todo o vetor D e todo o vetor E. 16. Ler duas matrizes A e B, cada uma de duas dimensões com 5 linhas e 3 colunas. Construir uma matriz C de mesma dimensão, onde C é formada pela soma dos elementos da matriz A com os elementos da matriz B. 3 8 17. Ler duas matrizes A e B, de (8,8) e criar três matrizes C,D e É que sejam : O produto matricial de A * B; A soma de A com B; A diferença de A com B; Escreva o resultado das matrizes A ,B,C,D e E; 18. Faça um algoritmo que leia uma matriz M(4,4) e escreva a soma dos valores da diagonal principal; 19. Faça um algoritmo que leia uma matriz M(30,15) de inteiros e escreva a quantidade de linhas pares existentes na matriz. 20. Faça um algoritmo que leia uma matriz M(5,5) de inteiros. A seguir transforme-a em um vetor e escreva o resultado. 21. Faça um algoritmo que leia uma matriz m (5,5) e calcule as somas: dos elementos da linha 4 de M; dos elementos da coluna 2 de M; dos elementos da diagonal principal de M; de todos os elementos da matriz M; escreva todas as somas encontradas e a matriz; 22. Faça um algoritmo que leia uma matriz M(6,6) e um valor A e multiplique a matriz M pelo valor de A e coloque os valores da matriz multiplica em um vetor V(36) e escreva-o; 23. Faça um algoritmo que leia uma matriz M(20x15) de inteiros. Calcule e mostre: a soma dos elementos das linhas pares da matriz; a soma dos elementos das colunas impares da matriz; a quantidade de colunas pares; a quantidade de linhas impares; escreva os resultados obtidos. 24. Faça um algoritmo que calcule a média dos elementos da diagonal principal de uma matriz M(10,10) de inteiros; (com Módulos - Procedimentos e Funções): 25. Escreva um programa em Pascal que leia do teclado um valor inteiro e armazene este valor em uma variável. Este valor deverá ser passado como parâmetro(por valor) para um módulo denominado Quadrado. Este módulo imprime na tela o quadrado do valor passado como parâmetro. 26. Escreva um programa em Pascal que leia do teclado um valor inteiro e armazene este valor em uma variável. Este valor deverá ser passado como parâmetro(por 3 9 referência) para um módulo denominado Quadrado. Imprimir o valor passado como parâmetro e seu quadrado. 4 0