Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE DEPART. DE INFORMÁTICA E MATEMÁTICA APLICADA - DIMAP APOSTILA DE CONSTRUÇÃO DE ALGORITMOS DISCIPLINA: ALGORITMO E PROGRAMAÇÃO DE COMPUTADORES PROF.: JOÃO CARLOS XAVIER JÚNIOR Natal/RN Fevereiro, 2008 1ª Unidade 2 Lógica de Programação e Construção de Algoritmos 1. LÓGICA É a ciência que estuda as leis e critérios de validade que regem o pensamento e a demonstração, ou seja, ciência dos princípios formais do raciocínio. A lógica auxilia os profissionais de informática na tomada de decisão (na solução dos problemas). O uso corriqueiro da palavra lógica está normalmente relacionado à coerência e racionalidade. Freqüentemente associa-se lógica apenas à matemática, não percebendo sua aplicabilidade e relação com as demais ciências. Pode-se dizer que a lógica é a “arte de bem pensar”, que é a “ciência das formas do pensamento”. Pode-se dizer ainda que a lógica tem em vista a “ordem da razão”. Ela estuda e ensina a colocar “ordem no pensamento”. Exemplo: • Todo mamífero é um animal. • Todo cavalo é um mamífero. • Logo, todo cavalo é um animal. 2. ALGORITMO É uma seqüência finita de ações que descrevem como um problema pode ser resolvido. Quando as ações de um algoritmo obedecem à sintaxe de uma linguagem de programação, passamos a chamá-lo de programa. Algoritmo é a especificação formal dos passos para que um problema seja resolvido. Esta especificação é feita de forma escrita, representada por expressões imperativas. Exemplo: Pode-se escrever um primeiro algoritmo de exemplo, utilizando português coloquial, que descreva o comportamento na resolução de uma determinada atividade (a troca de uma lâmpada). Algoritmo 01 ! pegar a escada. ! posicionar a escada embaixo da lâmpada. ! buscar uma lâmpada nova. ! retirar a lâmpada velha. ! colocar a lâmpada nova. O mesmo algoritmo pode ser demonstrado graficamente da maneira que é mostrado na figura 01. 3. TIPOS DE INFORMAÇÕES As informações podem ser classificadas em dois tipos básicos: dados e instruções. • Dados são valores passados ou recebidos; 1ª Unidade 3 • Instruções são expressões imperativas passadas para o computador. Os dados podem ser caracterizados por três tipos: numéricos (inteiros e reais), caracteres e lógicos. • Inteiros: São todos os numéricos positivos ou negativos. Exclui-se deste qualquer número fracionário. • Reais: São todos os números positivos, negativos e fracionários. • Caracteres: São todas as seqüências contendo letras (A..Z, a..z), números (0..9) e símbolos especiais (#, ?, !, @) que estiverem entre aspas (“ “‘). Este tipo de dado também é conhecido como: alfanumérico, string, literal ou cadeia. • Lógicos: São todos os dados que possuírem valores verdadeiro e falso. É também conhecido como tipo booleano. Figura 01 - Mostra o algoritmo 01 na forma de fluxograma. 4. CONSTANTES: Constantes são endereços de memória destinados a armazenar informações fixas, inalteráveis durante a execução do programa. Exemplos: PI = 3.1415; Circunferência = 360º; Valor = falso; 1ª Unidade 4 5. VARIÁVEIS: Tem-se como definição de variável tudo aquilo que é sujeito à variação, que é incerto, instável ou inconstante. Variável é um dado /entidade que durante sua existência pode assumir diversos valores de um determinado tipo. Variáveis são identificadas por um nome (etiqueta) e estão associadas a células de memória. Como a memória de um computador é constituída por várias células, cada variável deve ser univocamente identificada. Cada variável pode guardar apenas um objeto (valor) de cada vez, sendo sempre esses valores de mesmo tipo. O nome associado a uma variável é denominado identificador. É uma boa prática utilizar nomes significativos (que digam mais ou menos o significado da variável) quando utilizarmos uma variável em um algoritmo; Algumas regras para nomear as variáveis: • Sempre começar por um caractere alfabético. Os caracteres seguintes podem ser alfabéticos ou numéricos; • Não colocar espaços nem outros sinais que possam ser confundidos com operadores; • Evitar nomes desnecessariamente compridos; Exemplos de identificadores válidos: Alpha, X, nota1, media, ABC, FGTS, CPF Exemplos de identificadores inválidos: 5E3, 4X, A(12), A:B, A-B, Nota/2. 6. DECLARAÇÃO DE VARIÁVEIS As variáveis devem ser declaradas de acordo com a seguinte estrutura: <tipo>: <lista de identificadores>; Exemplos: var Inteiro: Idade, Ano; Caractere: Nome, Endereço, Sexo; Real: Peso, media; Lógico: Certo, Aprovado; Exercícios: 1. Assinale os identificadores válidos: a) (X) b) x c) ah! d) "aluno” e) #55 f) KM/L g) UYT h) AB*C i) CEP h) dia 2. Declare adequadamente variáveis para armazenar a nota do aluno, o nome do aluno, o número de matrícula e o sexo. Usar os tipos primitivos que foram apresentados. 1ª Unidade 5 7. OPERAÇÃO DE ATRIBUIÇÃO Esta operação associa um valor a uma variável. O tipo do valor a ser atribuído deve ser o mesmo da variável. Estrutura sintática: <identificador> ← <expressão>; Exemplos: A ← 21; nome ← “CARLOS”; X ← Falso; Onde a expressão à direita da operação (comando) de atribuição pode ser definida como um valor básico, uma constante, uma variável, ou qualquer combinação de dados, incluindo outras variáveis, números, etc. Exemplos: media ← (n1*4 + n2*5 + n3*6)/15; velocidade ← espaço/tempo; Resposta ← ((A + B) = C); dependendo dos valores de A, B e C, pode ser V ou F. 8. OPERADORES ARITMÉTICOS Chamamos de operadores aritméticos o conjunto de símbolos que representa as operações básicas da matemática: Operador Função Exemplos + Adição 2 + 3, X + Y - Subtração 4 – 2, N – M * Multiplicação 3 * 4, A * B / Divisão 10/2, X1/X2 Para representar as operações de radiciação e potenciação, usaremos as palavras- chave rad e pot: Operador Função Significado Exemplos pot(x,y) Potenciação x elevado a y pot(2,3) rad(x) Radiciação Raiz quadrada de x rad(9) Para representar as operações matemáticas não-convencionais de resto da divisão e quociente da divisão inteira, usaremos mod e div. Operador Função Exemplos mod Resto da divisão 9 mod 4 (resulta em 1) div Quociente da divisão 9 div 4 (resulta em 2) 1ª Unidade 6 9. OPERADORES RELACIONAIS: Utilizamos os operadores relacionais para realizar comparações entre dois valores de mesmo tipo. Tais valores são representados por constantes, variáveis ou expressões aritméticas. Os operadores relacionais são: Operador Função = Igual a > Maior que < Menor que >= Maior ou igual <= Menor ou igual <> Diferente Obs: O resultado obtido de uma relação é sempre um valor lógico. 10. OPERADORES LÓGICOS Utilizamos três conectivos básicos para a formatação de novas proposições lógicas compostas a partir de outras proposições lógicas simples. Os operadores lógicos são: Operador Função Não Negação E Conjunção Ou Disjunção A seguir mostraremos as tabelas-verdade que servem para representar as possibilidades combinatórias entre os valores de diversas variáveis lógicas, as quais se encontram em apenas duas situações (V ou F), e um conjunto de operadores lógicos. Operação de Conjunção: A B A e B F F F F V F V F F V V V Dica: Qualquer falsidade, significa falsidade. Operação de Disjunção: A B A ou B F F F F V V V F V V V V Dica: Qualquer verdade, significa verdade. 1ª Unidade 7 11. COMANDO DE ENTRADA DE DADOS: Para que o algoritmo possa receber os dados que necessita, usaremos o comando leia, cuja finalidade é atribuir o dado a ser fornecido à variável identificada. leia (<lista de identificadores>); Obs: O comando leia representa a entrada de dados mais comum em um sistema computacional, via teclado. Exemplos:Leia (nota1): Leia (nota1, nota2, nota3); 12. COMANDO DE SAÍDA DE DADOS Para que o algoritmo possa mostrar os dados que calculou, usaremos o comando escreva, cuja finalidade é exibir o conteúdo da variável identificada. Escreva (<lista de itens>); Exemplos: Escreva (x); Escreva (A, Nota); Escreva (A + B); Escreva (“Bom Dia”, Nome); Escreva (2+1 >= 5+3); 13. BLOCOS Estrutura sintática que define um conjunto de ações como uma única função. Dessa forma, um algoritmo pode ser visto como um bloco. Os limites de um bloco são delimitados pelas palavras início e fim. A seguir temos a estrutura sintática de um bloco: Início <conjunto de ações separadas por ponto e vírgula> Fim Exemplo: início // início do bloco (algoritmo) // declaração de variáveis // seqüência de variações fim 1ª Unidade 8 Exercícios: 3. Escreva um algoritmo que leia dois números e calcule a soma deles. 4. Escreva um algoritmo que leia 3 notas e calcule a média. A seguir imprima a média. 5. Escreva um algoritmo que leia a matricula, nome e sexo de um aluno. A seguir imprima todas as informações digitadas via teclado. 6. Escreva um algoritmo que calcule o salário dos funcionários de uma empresa. O salário bruto é R$ 750,00. Porém esse salário pode ser acrescido de horas extras. A única dedução existente nessa empresa é o INSS que é de 11% para todos os empregados. Sabendo que o salário líquido é o bruto – o INSS, calcule o salário líquido. 14. ESTRUTURAS DE SELEÇÃO A maioria dos algoritmos precisa de um fluxo de controle mais flexível. Nos algoritmos estudados até aqui, o fluxo de controle era sempre seqüencial. Cada ação era executada na seqüência em que aparecia; entretanto, existem situações em que apenas uma das várias opções deve ser executada (seleção). Uma estrutura de seleção permite então a escolha de um grupo de ações (bloco) a ser executado quando determinadas condições, representadas por expressões lógicas ou relacionais, forem ou não satisfeitas. 14.1 SELEÇÃO SIMPLES Em um algoritmo quando precisamos executar uma ação que depende de uma condição ser VERDADEIRA, adotamos o seguinte modelo. Sintaxe: se <condição> então ação; // comando único (ação primitiva) fim_se Onde <condição> é uma expressão lógica que, quando avaliada(inspecionada) resulta em valor V ou F. Se <condição > for verdadeira, a ação associada ao então é executada. Caso contrário encerra-se o comando. Quando vinculada à condição forem associadas várias ações, basta escrevê-las como um bloco: Sintaxe: se <condição> então inicio ação 1; ação 2; 1ª Unidade 9 ... fim; fim_se Se <condição> for verdadeira, então todas as ações serão executadas. Caso contrário, nenhuma delas será executada. Exemplo: Tomando o algoritmo anterior para cálculo da média, considerar que a aprovação só ocorrerá se a média for igual ou superior a 7. Programa Media01; var Nota1, nota2, nota3: Real; início Leia (nota1, nota2, nota3); se ((nota1 + nota2 + nota3)/3) >= 7) então escreva(‘Aluno Aprovado, Parabéns!’); fim_se; fim. 14.2 SELEÇÃO COMPOSTA Quando tivermos situações em um algoritmo que duas alternativas dependem de uma mesma condição, uma condição ser verdadeira e outra condição ser falsa, adotamos o seguinte modelo: Sintaxe: se <condição> então início ação 1; ação 2, fim senão Ação alternativa; fim_se Quando a condição for verdadeira, o bloco vinculado ao então será executado. Caso contrário, a condição resulta em F, a ação primitiva associada ao senão é executada. Se o problema requisitasse várias ações para esse caso, deveríamos agrupar essas ações em um bloco, como foi feito no caso do então. 1ª Unidade 10 Exemplo: Programa Media02; var nota1, nota2, nota3: Real; início leia (nota1, nota2, nota3); se ((nota1 + nota2 + nota3)/3) >= 7) então escreva (“Aluno Aprovado, Parabéns !”); senão escreva (‘Aluno Reprovado, estude mais da próxima vez’); fim_se; fim. 14.3 SELEÇÃO ENCADEADA HOMOGÊNEA Quando, devido à necessidade de processamento, agruparmos várias seleções, formaremos uma seleção encadeada. Normalmente, tal formação ocorre quando uma determinada ação ou bloco deve ser executado se um grande conjunto de possibilidades ou combinações de situações for satisfeito. O encadeamento utiliza o mesmo padrão lógico: se <condição 1> então início ação1; ação2; fim senão se <condição 2> então ação3; senão se <condição> então ação4; fim_se; fim_se; Exercício: 7. Escreva um algoritmo que efetue o cálculo do reajuste de salário de um funcionário. Considere que o funcionário deverá receber um reajuste de 15% caso seu salário seja menor que R$ 500,00, se o salário for igual a R$ 500,00 mas menor ou igual a R$ 1.000,00, seu reajuste será de 10%, caso seja maior que R$ 1.000,00, o reajuste será de 5%. 1ª Unidade 11 14.4 SELEÇÃO MÚLTIPLA ESCOLHA Quando um conjunto de valores discretos precisa ser testado e ações diferentes são associadas a esses valores, estamos diante de uma seleção encadeada homogênea do tipo se-senão-se. Como esta situação é bastante freqüente na construção de algoritmos que dependem de alternativas, utilizaremos uma estrutura específica para este casos, a seleção múltipla escolha. A estrutura abaixo permite expressar de forma mais conveniente uma seleção envolvendo múltipla escolha: Sintaxe: escolha x caso 1: ação1; caso 2: ação2; caso 3: ação3; caso 4: ação4; fim escolha; Exemplo: escolha y caso 1, 2: x ← x +5; caso 3: x ← x – 4; caso 4..6: x ← x * 2; caso contrario: x ← x + 1; fim escolha; Exemplo 02: início // Declaração das variáveis Preço: Real; Origem: Inteiro; Leia (Preço); Leia (Origem); escolha Origem caso 1: 1ª Unidade 12 escreva (Preço, “ – produto do Sul”); caso 2: escreva (Preço, “ – produto do Norte”); caso 3: escreva (Preço, “ – produto do Leste”); caso 4: escreva (Preço, “ – produto do Oeste”); caso 7,8,9: escreva (Preço, “ – produto do Sudeste”); caso 10..20: escreva (Preço, “– produto do C-oeste”); caso 5,6,25..50: escreva (Preço, “ – produto do Nordeste”); caso contrário: escreva (Preço, “ – produto Importado”); fim_escolha; 15. ESTRUTURAS DE REPETIÇÃO As estruturas de repetição são usadas sempre que uma determinada ação ou várias ações precisão ser executados várias vezes. As estruturas de repetição são classificadas em três tipos. Veja abaixo a definição dos tipos. 15.1 REPETIÇÃO COM VARIÁVEL DE CONTROLE Quando se conhece o número de vezes que um trecho do algoritmo deve ser repetido pode- se utilizar a estrutura para. Essa estrutura descreve a repetição de um número definido de vezes fixando limites iniciais e finais para a variável de controle. Sintaxe: para <var controle> de inicio até fim passo valor faça comando 1; comando 2; comando 3; fim_para; ! variável de controle é a variável que terá seu valor testado; ! início é o valor inicial da variável de controle; ! fim é o valor final da variável de controle; ! valor é o incremento dado à variável. Exemplo: Programa Repetição03; var x, r, cont : inteiro; 1ª Unidade 13 inicio para (cont de 1 até 5 passo 1 faça) início leia (x); r ← x * 3; escreva (r); fim fim_para; fim. 15.2 REPETIÇÃO COM TESTE NO INÍCIO DO LOOPING Consiste em uma estrutura de controle de fluxo de execução que permite repetir diversas vezes um mesmo trecho do algoritmo, porém, sempre verificando antes de cada execução se é “permitido” executar o mesmo trecho. Para realizar a repetição com teste no início, utilizamos ocomando enquanto que permite que um bloco, ou uma ação simples, seja repetida enquanto uma determinada <condição> for verdadeira. Sintaxe: enquanto (<condição>) faça ação 1; ação 2; .. ação N; fim_enquanto Exemplo: Programa Repetição01; var x, r, vezes : Inteiro; inicio vezes ← 1; enquanto (vezes <= 5) faça início Leia (x); r ← x * 3; escreva (r); vezes ← vezes + 1; fim fim_enquanto; fim. F V ENQUANTO Condição 1ª Unidade 14 15.3 REPETIÇÃO COM TESTE NO FINAL DO LOOPING Para realizar a repetição com teste no final, utilizamos a estrutura repita, que permite que um bloco, ou uma ação simples, seja repetida até que uma determinada <condição> seja verdadeira. O modelo genérico deste tipo de repetição é o seguinte: Sintaxe: repita ação 1; ação 2; .. ação N; até <condição>; Exemplo: Programa Repetição02; var x, r, vezes: Inteiro; inicio vezes ← 1; repita início leia (x); r ← x * 3; escreva (r); vezes ← vezes + 1; fim até (vezes > 5); fim. Obs: A utilização de uma estrutura repita no lugar de uma estrutura enquanto corresponde a utilizar como condição para o repita a negação da condição do enquanto. 15.4 CONSIDERAÇÕES ENTRE OS TIPOS DE ESTRUTURAS DE LOOPINGS Foram apresentadas três estruturas de controle a nível de repetição: enquanto, repita e para, cada qual com sua característica de processamento. Dentro deste aspecto, você deve ter notado que as estruturas enquanto e repita são dinâmicas, ao passo que a estrutura para é mais estática. • Toda estrutura enquanto pode ser convertida para repita e vice-versa • Toda estrutura para pode ser convertida para enquanto, mas nem toda estrutura enquanto pode ser convertida para estrutura para V F REPITA Condição 1ª Unidade 15 16. ESTRUTURAS DE CONTROLE ENCADEADAS Assim como há o encadeamento das estruturas de decisão, há também o encadeamento das estruturas de repetição. Tal encadeamento pode ser entre estruturas do mesmo tipo, como também entre estruturas de tipos diferentes. Exemplos: enquanto (condição1) faça enquanto (condição2) faça instruções; fim_enquanto; fim_enquanto; enquanto (condição1) faça repita instruções; até que (condição2); fim_enquanto; para (<var1> de <início> até <fim> passo <incr>) faça para (<var1> de <início> até <fim> passo <incr>) faça instruções; fim_para; fim_para; Programa Fatorial; var N, Fat, Cont: Inteiro; início Fat ← 1; Leia (N); Enquanto (N >=1) faça início Para Cont de 1 até N passo 1 faça Fat ← Fat * Cont; fim_para; Escreva (“Fatorial de”, N, “é ”, Fat); Leia (N); fim fim_enquanto; fim. 1ª Unidade 16 Lista de Exercício I 1. Escreva um algoritmo que peça dois números inteiros e que indique qual deles é o maior. 2. Escreva um algoritmo que leia um número e diga se este é par ou ímpar. 3. Escreva um algoritmo que leia vários números, e que diga quantos desses números são pares e quantos são ímpares. O programa deve permitir somente valores maiores que 0. 4. Escreva um algoritmo que leia três números reais e diga qual deles é o maior. 5. Escreva um algoritmo que calcule o fatorial de um número. 6. Escreva um algoritmo que leia vários notas e dê a média delas. O programa permitirá somente notas maiores que 0. 7. Escreva um algoritmo que teste vários números e diga se eles são primos ou não. O programa finaliza quando for digitado um número menor ou igual a 1. 8. Escreva um algoritmo que leia dois números e imprima a soma, subtração, produto e divisão deles. 9. Escreva um algoritmo que imprima todos os números ímpares de 1 a 100. 10. Escreva um algoritmo que leia vários números e imprima o quadrado e o cubo de cada número lido. O programa terminará quando for digitado o número 0. 11. Escreva um algoritmo que leia dois números e faça a divisão entre eles. Depois mostre o resto e o dividendo dessa divisão. 12. Escreva um algoritmo para converter várias temperaturas em graus Celsius para Fahrenheit (°F = 32 + 1.8° * C). Temperaturas negativas não serão válidas para esse algoritmo. 13. Escreva um algoritmo que leia dois lados de um triângulo retângulo e calcule a hipotenusa. 14. Escreva um algoritmo que dados os litros gastos e os quilômetros percorridos por um automóvel, calcule os gastos de combustível em Reais/Km e em litros/100Km (considere que um litro custa R$ 1,70). 15. Escreva um algoritmo que dado um determinado valor em Reais, indique quantas células de R$ 100,00, R$ 50,00, R$ 10,00, R$ 5,00, R$ 2,00 e R$ 1,00, serão necessárias para essa quantia (com o mínimo de cédulas possível). 1ª Unidade 17 16. Escreva um algoritmo que leia vários números e imprima a tabuada de cada número lido. O algoritmo encerra quando for digitado o número 0. 17. Escreva um algoritmo que leia a hora atual em horas, minutos e segundos, calcule e expresse resultado apenas em segundos segundos. 18. Escreva um algoritmo que leia a idade de uma pessoa expressa em anos, meses e dias, e mostre-a apenas em dias. 19. Escreva um algoritmo que tendo como dados de entrada a altura e o sexo de uma pessoa (‘M’ = masculino e ‘F’ = feminino), calcule seu peso ideal, utilizando as seguintes fórmulas: para homens: (72.7 * altura) – 58; para mulheres: (62.1 * altura) – 44.7; 20. Escreva um algoritmo que leia vários números e escreva os 20 primeiros múltiplos de cada número lido. Por exemplo, caso o número lido seja 7, seus múltiplos seriam 7, 14, 21, 28, ... Use o número 0 como terminador desse algoritmo. 21. Dados o nome e a idade de um nadador, classifique-o em uma das seguintes categorias: Infantil A -- de 5 a 7 anos Infantil B -- de 8 a 10 anos Juvenil A -- de 11 a 13 anos Juvenil B -- de 14 a 17 anos Sênior -- maiores de 17 anos. 22. Escreva um algoritmo que leia o sexo, altura e peso de um grupo de 250 pessoas e informe: a) Média das alturas dos homens e dos pesos das mulheres. b) O homem mais alto e a mulher mais gorda. 2ª Unidade 18 17. VETORES OU MATRIZES DE UMA DIMENSÃO Este tipo de estrutura em particular é também conhecido como matrizes unidimensionais. Sua utilização mais comum está vinculada à criação de tabelas. Vetor é uma única variável dimensionada com um determinado tamanho. A dimensão de um vetor é constituída por constantes inteiras e positivas. Os nomes dados aos vetores seguem as mesmas regras de nomes utilizados para inicializar as variáveis simples. Observe que para resolver um problema trivial de somatório de médias de 8 alunos, por exemplo, sem a utilização de vetor, seria necessário a declaração de 8 variáveis diferentes para receber cada valor correspondente a média de cada aluno. Já com a utilização de vetor, declara-se apenas um vetor que possua o tamanho de 8 elementos. Exemplo: Variáveis Simples Vetor MD1 = 4.5 MD[1] = 4.5 MD2 = 6.5 MD[2] = 6.5 MD3 = 8.0 MD[3] = 8.0 MD4 = 3.5 MD[4] = 3.5 MD5 = 6.0 MD[5] = 6.0 MD6 = 7.0 MD[6] = 7.0 MD7 = 6.5 MD[7] = 6.5 MD8 = 6.0 MD[8] = 6.0 Observe que o nome é um só, o que muda é a informação indicada dentro dos colchetes. A esta informação dá-se o nome de índice, sendo este o endereço onde o elemento está armazenado. É necessário que fique bem claro que elemento é o conteúdo do vetor, neste caso os valores das notas. No caso de MD[1] = 4.5, o número 1 é o índice, ou seja endereço cujo elemento é 4.5. Exemplo: Program Média_Turma; var MD: vetor[1..8] de Real; Soma, Media: Real; I: Inteiro; inicio Soma ← 0; para I de 1 até 8 passo 1 faça início leia (MD[I]); Soma ← Soma + MD[I]; fim fim_para; Media ← Soma / 8; escreva (Media); fim. 2ª Unidade 19 Note que a estrutura deste programa permiteuma grande mobilidade, pois se houver a necessidade de aumentar o número de alunos, bastaria re-dimensionar o vetor, de tal forma que o valor final da instrução para seria acrescido. A tabela a seguir, mostra como ficam os valores armazenados no vetor: Vetor: MD Índice Elemento 1 4.5 2 6.5 3 8.0 4 3.5 5 6.0 6 7.0 7 6.5 8 6.0 17.1 ESCRITA DE DADOS DE UM VETOR O processo de escrita de um vetor é 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. Exemplo: Program Média_Turma; var MD: vetor[1..8] de Real; Soma, Media: Real; I: Inteiro; início Soma ← 0; // Inclusão dos Dados. para I de 1 até 8 passo 1 faça início leia (MD[I]); Soma ← Soma + MD[I]; fim fim_para; // Escrita dos Dados. para I de 1 até 8 passo 1 faça escreva (MD[I]); fim_para; Media ← Soma / 8; escreva (Media); fim. 2ª Unidade 20 17.2 MANIPULAÇÃO DE DADOS DO TIPO CARACTERE EM UM VETOR OU MATRIZ Para se declarar um vetor que armazenará dados do tipo caractere, basta definir um nome, a quantidade de elementos e indicar que tipo de dados é do tipo caractere. Exemplo01: Programa Lista_Nome; var nome: vetor [1..20] de caractere[30]; cont: inteiro; início // Inclusão dos nomes. para cont de 1 até 20 passo 1 faça Leia (nome[cont]); fim_para; // Escrita dos nomes cadastrados. para cont de 1 até 20 passo 1 faça Escreva (nome[cont]); fim_para; fim. Exemplo02: Programa Soma_Vetores; var vet1, vet2, vet3: Vetor [1..50] de inteiro; I: inteiro; início para i de 1 até 50 passo 1 faça inicio // Inclusão de elementos vetores vet1 e vet2. leia (vetor1[i], vetor2[i]); // Adição dos elementos dos vetores. vet3[i] ← vet1[i] + vet2[i]; // Impressão do resultado. escreva (vetor3[i]); fim fim_para; fim. 17.3 ORDENAÇÃO DE VETORES Uma operação com vetores muito utilizada tanto no meio acadêmico quanto no meio comercial, é a ordenação de valores ou elementos de um vetor. Observe o vetor abaixo: [1] [2] [3] [4] [5] [6] [7] 10 -1 34 -5 8 15 1 2ª Unidade 21 Agora, como seria o pseudocódigo que pudesse colocar cada número na sua ordem crescente. Veja o pseudocódigo abaixo, ele trás uma rotina de ordenação simples. Programa Ordena_Vetor início var inteiro: Vetor[1..7], I, J, Aux; //Digitação e armazenação de valores numéricos. para I de 1 até 7 passo 1 faça início Escreva (“Digite um valor qualquer.:”); Leia (Vetor[I]); fim fim_para //Ordenação dos elementos do vetor. para I de 1 até 6 passo 1 faça para J de I+1 até 7 passo 1 faça início se (Vetor[I] > Vetor[J]) então início Aux ← Vetor[I]; Vetor[I] ← Vetor[J]; Vetor[J] ← Aux; fim fim_se fim fim_para fim_para //Impressão dos elementos do vetor. para I de 1 até 7 passo 1 faça Escreva (Vetor[I]); fim_para fim Após a execução do pseudocódigo acima, o vetor ficaria assim: 17.4 MÉTODO DE PESQUISA EM VETORES Quando se trabalha com vetores, estes poderão gerar grandes tabelas onde ficaria difícil localizar determinado elemento de forma rápida. Imagine um vetor que possua 4.000 elementos (4.000 nomes de pessoas). Em geral usa-se o método seqüencial para efetuar a operação de busca em um vetor. [1] [3] [3] [4] [5] [6] [7] -5 -1 1 8 10 15 34 2ª Unidade 22 Este método consiste em efetuar a busca de uma informação desejada a partir do primeiro elemento seqüencial até o último. Tal método de pesquisa é considerado lento, porém eficiente nos casos em que um vetor encontra-se com seus elementos desordenados. Exemplo: Programa Pesquisa_Seqüencial; var nome: vetor [1..10] de caractere[30]; I: inteiro; resp: caractere[3]; pesq: caractere[30]; acha: lógico; inicio para I de 1 até 10 faça leia (nome[I]); fim_para resp ← “SIM”; // inicio da rotina de pesquisa enquanto (resp = “SIM”) faça inicio escreva (“Entre nome a ser pesquisado.: “) leia (pesq); I ← 1; acha ← falso; enquanto (I <= 10) .e. (acha = falso) faça se (pesq = nome[I]) então acha ← verdadeiro; senão I ← I + 1; fim_se; fim_enquanto; se (acha = verdadeiro) então escreva (pesq, “ foi encontrado na posição “, I); senão escreva (pesq, “ não foi encontrado “); fim_se; // fim da rotina de pesquisa escreva (“Deseja continuar ?”); leia (resp); fim fim_enquanto; fim. 2ª Unidade 23 Lista de Exercício II Vetor: 1. Escreva um algoritmo que leia um vetor de 50 posições de números inteiros e mostre somente os positivos. 2. Escreva um algoritmo que leia os nomes e salários dos 150 funcionários de uma empresa e armazene-os em vetores. A seguir, ler o nome de uma pessoa e verificar se ela é funcionária da empresa. Se for, então deve ser informado seu salário. 3. Escreva um algoritmo para armazenar 15 valores inteiros e distintos em um vetor. Após, encontrar o menor valor contido no vetor e sua posição. 4. Escreva um algoritmo que leia um vetor inteiro de 20 posições. Crie um segundo vetor e copie todo o conteúdo dos elementos do 1° para o 2° vetor. Porém, todo o conteúdo do 1° vetor que for negativo, deve ser transformado em 0. Imprima ambos os vetores. 5. Escreva um algoritmo que permita a digitação de 30 nomes em um vetor de string. A seguir imprima os elementos desse vetor da metade para o fim e da metade para o início. 6. Escreva um algoritmo que permita a digitação de 20 nomes em um vetor de string. A seguir, faça a pesquisa de um determinado nome testando se esse nome existe. Se existir, mostre qual seu índice. 7. Escreva um algoritmo que faça a multiplicação dos conteúdos de dois vetores inteiros (números positivos e negativos). Atribua o resultado desta multiplicação a um terceiro vetor e faça a impressão do mesmo. 8. Escreva um algoritmo que permita a digitação de 50 valores inteiros (positivos e negativos) em um vetor. A seguir imprima o vetor com o resumo de quantos números negativos e quantos números positivos pares e ímpares foram digitados. 2ª Unidade 24 18. MATRIZES BIDIMENSIONAIS Matrizes bidimensionais são utilizadas freqüentemente para representar tabelas de valores consistindo em informações organizadas em linhas e colunas. Para identificar um elemento específico de tabela, deve-se especificar os dois índices. Por convenção, o primeiro índice identifica a linha, enquanto o segundo identifica a coluna do elemento. Exemplo: coluna 1 coluna 2 coluna 3 coluna 4 linha 1 A [1] [1] A [1] [2] A [1] [3] A [1] [4] linha 2 A [2] [1] A [2] [2] A [2] [3] A [2] [4] linha 3 A [3] [1] A [3] [2] A [3] [3] A [3] [4] Observe que estudaremos apenas as matrizes bidimensionais. Porém, a literatura trata também de multidimensionais, que são aquelas que possuem mais de dois índices. 18.1 OPERAÇÕES BÁSICAS COM MATRIZES DE DUAS DIMENSÕES Uma matriz de duas dimensões estará 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..3, 1..4], onde seu nome é TABELA, possuindo um tamanho de 3 linhas e 4 colunas, ou seja, é uma matriz 3 por 4 (3 x 4). Isto significa dizer que poderão ser armazenados 12 elementos (veja tabela acima). Atribuição: Notas[I, J] ← 8.5; Nomes[I, J] ← ‘JOSÉ DA SILVA’; Leitura: Leia (Notas[I, J]); Leia (Nomes[I, J]); Impressão: Escreva (Notas[I, J]); Escreva (Nomes[I, J]); Exemplo: Programa Ler_Notas; var notas: vetor [1..8, 1..4] de real; I, J: inteiro; inicio // Rotina de leitura. paraI de 1 até 8 faça para J de 1 até 4 faça leia (notas [I, J]); fim_para; 2ª Unidade 25 fim_para; // Rotina de impressão. para I de 1 até 8 faça para J de 1 até 4 faça escreva (notas [I, J]); fim_para; fim_para; fim. 18.2 OPERAÇÕES BÁSICAS COM MATRIZES Não há muita diferença entre manipular valores inteiros/reais em vetores e matrizes. Os valores são guardados em células/elementos da mesma forma. Que muda na verdade é a forma de endereçar esses elementos. Por exemplo: Vetor[4] → seria o quarto elemento do vetor. Matriz[2, 1] → seria o quarto elemento da matriz. Então como fazer para copiar todos os valores contidos nos elementos de uma matriz 3x3 para um vetor de 9 elementos? Outros Exemplos: Dado uma matriz A, imprimir os elementos em uma ordem inversa: Dado uma matriz 3x3 com os seguintes valores, imprimir somente a diagonal principal: Ou, somente a diagonal secundária: Matriz A 1 2 3 4 5 6 7 8 9 Matriz B 9 8 7 6 5 4 3 2 1 -4 50 25 1 21 3 99 -7 48 -4 50 25 1 21 3 99 -7 48 -4 50 25 1 21 3 99 -7 48 -4 50 25 1 21 3 99 -7 48 2ª Unidade 26 19. REGISTRO É uma estrutura de dados que trabalha com vários dados de tipos diferentes (os campos) em uma mesma estrutura. Por isso, este tipo de dado é considerado heterogêneo. Até então se trabalhou com dados do mesmo tipo, ou seja, com tipos de dados homogêneos. Todo registro é formado por campos. Por exemplo, imagine um cadastro pessoal onde você tem nome, endereço, bairro, cep, estado civil, etc. Estes itens formam os campos de um registro. 19.1 DECLARAÇÃO DE REGISTRO Para se declarar um tipo registro usa-se a instrução tipo em conjunto com a instrução registro ... fim_registro, conforme sintaxe indicada abaixo. Sintaxe: tipo <identificador> = registro <lista dos campos e seus tipos> fim_registro var <variáveis> : <identificadores> Tomando como exemplo a proposta de se criar um registro denominado Aluno, cujos compôs são Nome, Nota1, Nota2, Nota3 E Nota4, este seria assim declarado: tipo CAD_ALUNO = registro NOME : caractere[35]; NOTA1 : real; NOTA2 : real; NOTA3 : real; NOTA4 : real; fim_registro; var Aluno : Cad_Aluno; Observe que é especificado um registro denominado CAD_ALUNO, o qual é um conjunto de dados heterogêneos (um campo tipo caractere e quatro do tipo real). Desta forma é possível guardar em uma mesma estrutura vários tipos diferentes de dados. 19.3 LEITURA DE REGISTROS A leitura de um registro é feita da mesma forma de uma variável comum, usa-se a instrução leia seguida do nome da variável registro e seu campo correspondente separado por um caractere “.” ponto. 2ª Unidade 27 Exemplo: Programa Leitura; tipo CAD_ALUNO = registro Nome : caractere[35]; Nota1 : real; Nota2 : real; Nota3 : real; Nota4 : real; fim_registro; var Aluno : Cad_Aluno; inicio leia (Aluno.Nome); leia (Aluno.Nota1); leia (Aluno.Nota2); leia (Aluno.Nota3); leia (Aluno.Nota4); fim. Uma leitura de registros também pode ser feita como leia ALUNO. Neste caso, estaria sendo feita uma leitura do tipo genérica, onde todos os campos estariam sendo referenciados implicitamente. A forma explicita apresentada acima é mais legível, uma vez que se faz referência a um campo específico. 19.4 ESCRITA DE REGISTROS O processo de escrita de um registro também se parece bastante com a escrita de uma variável comum, usa-se a instrução escreva de forma semelhante ao processo de leitura. Assim sendo, observe o código abaixo: Exemplo: Programa Escrita; tipo CAD_ALUNO = registro Nome : caractere[35]; Nota1 : real; Nota2 : real; Nota3 : real; Nota4 : real; fim_registro; var Aluno : Cad_Aluno; inicio 2ª Unidade 28 Escreva (Aluno.Nome); Escreva (Aluno.Nota1); Escreva (Aluno.Nota2); Escreva (Aluno.Nota3); Escreva (Aluno.Nota4); fim. 19.5 ESTRUTURA DE UM REGISTRO DE CONJUNTOS (VETORES) Como o nome indica, é possível definir um vetor ou mesmo uma matriz dentro de um registro. Considere ainda o exemplo do registro Aluno, onde temos o campo Nome tipo caractere[35] e mais quatro notas sendo, Nota1, Nota2, Nota3 e Nota4 tipo real. Neste caso, um campo Nota poderá ser digitado 4 vezes, ao invés de termos a digitação de 4 campos diferentes. Para esclarecer o que foi dito acima, veja a seguinte declaração: Exemplo01: tipo Bimestre = vetor [1..4] de Real; Cad_Aluno = registro Nome : Caractere[35]; Nota : Bimestre; fim_registro; Observe que ao ser especificado o registro Cad_Aluno, existe nele um campo chamado Nota do tipo Bimestre, onde Bimestre é a especificação de um tipo de vetor com a capacidade para quatro elementos. Também poderíamos ter a mesma estrutura escrita de outra froma, seja o exemplo abaixo: Exemplo02: tipo Cad_Aluno = registro Nome : Caractere[35]; Nota : vetor[1..4] de Real; fim_registro; A leitura de um registro de conjunto é efetuada com a utilização da instrução leia, geralmente dentro de uma estrutura de repetição. Veja o exemplo abaixo para um melhor entendimento do assunto abordado. Exemplo: Programa Leitura; tipo Bimestre = vetor [1..4] de Real; 2ª Unidade 29 Cad_Aluno = registro Nome : Caractere[35]; Nota : Bimestre; fim_registro; var Aluno: Cad_Aluno; I: inteiro; inicio Leia (Aluno.Nome); para I de 1 até 4 passo 1 faça Leia (Aluno.Nota[I]); fim_para; fim. O processo de escrita de um registro de conjunto segue os mesmos padrões usados acima. Veja exemplo abaixo: Exemplo: inicio Escreva (Aluno.Nome); para I de 1 até 4 passo 1 faça Escreva (Aluno.Nota[I]); fim_para; fim. 19.6 ESTRUTURA DE UM CONJUNTO DE REGISTROS Até agora, toda a teoria vista se refere à manipulação de leitura e escrita de um único registro. Por isso, há a necessidade de se criar mecanismos que podem manipular vários registros ao mesmo tempo. O primeiro deles, refere-se à implementação de Vetores ou conjuntos de registros. O segundo, e mais complexo corresponde à leitura e gravação física dos registros, que compõe um arquivo físico. Este último será estudado mais à frente. Para se declarar um conjunto de registros é necessário em primeiro lugar, possuir a definição de um registro, ou seja, é necessário ter o formato de um único registro para então definir o número de registros que serão manipulados pelo algoritmo ou programa. Veja a seguir a definição do tipo registro e também a definição do conjunto de registros para oito alunos: Exemplo: tipo Bimestre = vetor [1..4] de Real; Cad_Aluno = registro Nome : Caractere[35]; Nota : Bimestre; fim_registro; 2ª Unidade 30 var Aluno: Vetor [1..8] de Cad_Aluno; A leitura será feita de forma semelhante as anteriores. No entanto, serão utilizadas duas estruturas de repetição, pois além de controlar a entrada das quatro notas de cada aluno, tem-se que controlar a entrada de oito alunos. Assim sendo, observe o código (algoritmo) abaixo: Programa Leitura; tipo Bimestre = vetor [1..4] de Real; Cad_Aluno = registro Nome : Caractere[35]; Nota : Bimestre; fim_registro; var Aluno: Vetor [1..8] de Cad_Aluno; I, J: inteiro inicio para J de 1 até 8 passo 1 faça início Leia (Aluno[J].Nome); para I de 1 até 4 passo 1 faça leia (Aluno[J].Nota[I]); fim_para; fim fim_para; fim. O processo de escrita não difere muito do processo de leitura. Veja abaixo somente a parte que trata da escrita. Exemplo:inicio para J de 1 até 8 passo 1 faça início Escreva (Aluno[J].Nome); para I de 1 até 4 passo 1 faça Escreva (Aluno[J].Nota[I]); fim_para; fim fim_para; fim. 2ª Unidade 31 19.7 ESTRUTURAS DE REGISTROS DE UM ARQUIVO Como mencionado na seção anterior, uma estrutura de registros faz parte de um arquivo, que é gravado fisicamente em disco. Os registros também são constituídos de campos. Ou seja, toda a estrutura não difere em nada das estruturas estudadas até aqui. Para manipular vários registros, precisa-se de uma estrutura de repetição (loop) que controle a quantidade dos mesmos. A seguir, usa-se um comando que nomeia o arquivo e outro que o deixa pronto para ser gravado fisicamente em disco. O código a seguir mostra os passos necessários para a manipulação e gravação de um arquivo composto por vários registros. Exemplo: Programa Formulario_Inclusao; tipo Cad_Pessoa = registro Matricula: caractere[5]; Nome: caractere[35]; Sexo: caractere; fim_registro; Pasta = Arquivo de Cad_Pessoa; var Reg : Cad_Pessoa; Pessoal : Pasta; inicio Abre(Pessoal; Leia (Reg.Matricula); Leia (Reg.Nome); Leia (Reg.Sexo); enquanto (Reg.Matricula <> '0') faça inicio Grava (Pessoal, Reg); Leia (Reg.Matricula); Leia (Reg.Nome); Leia (Reg.Sexo); fim fim_enquanto; Fechar (Pessoal); fim. Bem, a rotina de consulta dos dados já gravados em disco, poderia ser implementada da seguinte forma: Programa Formulario_Consulta; tipo Cad_Pessoa = registro Matricula: caractere[5]; 2ª Unidade 32 Nome: caractere[35]; Sexo: caractere; fim_registro; Pasta = Arquivo de Cad_Pessoa; var Reg : Cad_Pessoa; Pessoal : Pasta; inicio Abra (Pessoal); // Lê o primeiro registro do arquivo. Leia (Pessoal, Reg); // Escreve na tela o primeiro registro. Escreva ('Matricula.: ',Reg.Matricula); Escreva ('Nome......: ',Reg.Nome); Escreva ('Sexo......: ',Reg.Sexo); //Rotina que irá ler os registros seguintes enquanto (não fda (Pessoal)) faça inicio Leia (Pessoal, Reg); Escreva ('Matricula.: ',Reg.Matricula); Escreva ('Nome......: ',Reg.Nome); Escreva ('Sexo......: ',Reg.Sexo); fim fim_enquanto; Fecha (Pessoal); fim. 2ª Unidade 33 Lista de Exercício II Matrizes: 1. Escreva um algoritmo que armazene quaisquer valores inteiros em uma matriz 3x4, e imprima todo o conteúdo da referida matriz. 2. Dada uma determinada matriz 4x4: 3. Dada a seguinte matriz [3 x 3]: 4. Escreva um programa que carregue uma matriz [4][4] e imprima somente sua diagonal principal. 5. Escreva um programa que carregue uma matriz [4][4] e imprima somente os elementos que estiverem acima da diagonal principal. Registros: 1. Dada a seguinte estrutura de um registro: tipo Cad_Aluno = registro Caractere: Nome; Real: Nota[1..4]; fim_registro var Cad_Aluno[1..20]: Aluno; -4 50 25 1 21 3 99 -7 48 -4 50 25 -1 1 21 3 10 99 -7 48 -6 0 15 -9 0 Escreva um algoritmo que imprima somente os valores positivos armazenados nela. Observe que a rotina de inclusão de valores deve também ser feita. Escreva um algoritmo que permita a escolha e alteração de um determinado elemento da referida matriz através da seleção de uma linha por uma coluna. 2ª Unidade 34 Escreva um programa que leia e imprima os dados de 20 alunos conforme estrutura acima descrita. 2. Escreva um algoritmo que leia e imprima os dados dos 100 funcionários de uma empresa. Os dados são: Matrícula (numérica), Nome (caractere), Telefone (caractere) e CPF (numérica). 3. Escreva um algoritmo que cadastre os 20 funcionários de uma pequena empresa. Os dados são: Nome(caractere), Sexo (caractere), CPF(numérico) e Matrícula (caractere). A matrícula do funcionário será formada pela letra referente ao sexo, seguida do ano e mais uma letra do alfabeto que dependerá da ordem de cadastramento. Exemplo, a primeira pessoa do sexo femenino terá uma matrícula igual a “F2003A”, e assim por diante. 3ª Unidade 35 20. PROGRAMAÇÃO MODULAR O objetivo de estudo, a partir de agora será a aplicação de sub-rotinas em algoritmos, também conhecidas pela denominação de módulos ou sub-algoritmos. No geral, problemas complexos exigem algoritmos complexos. Mas sempre é possível dividir um problema grande em problemas menores. Desta forma, cada parte menor tem um algoritmo mais simples, e é este trecho que é chamada de sub-rotina. Uma sub-rotina é na verdade um programa, e sendo um programa poderá efetuar diversas operações computacionais (entrada, processamento e saída). As sub-rotinas são utilizadas na divisão de algoritmos complexos, permitindo assim a modularização de um determinado problema, considerado grande e de difícil solução. Basicamente, há dois tipos de sub-rotinas, sendo que há algumas diferenças entre elas. O primeiro tipo é conhecido como procedimento, e o segundo é chamado de função. 20.1 DECLARAÇÃO: Para modularizar um algoritmo, necessita-se de uma sintaxe para expressar essa nova estrutura compreendida por módulos. De certo modo, precisamos uniformizar determinado conjunto de ações afins, que obedeçam à mesma estruturação de um algoritmo, com o objetivo de representar um bloco lógico em especial. Para delimitar uma sub-rotina, utilizaremos o seguinte: Sintaxe: Sub-rotina <nome da sub-rotina>; var <lista de variáveis> início <instruções>; fim. A melhor maneira de se entender como trabalhar com uma sub-rotinas é fazer a sua aplicação em um programa mais complexo. Para tanto, imagine o seguinte problema: Criar um programa que apresente um menu de 3 opções: 1. Adição; 2. Subtração; 3. Fim do Programa. Programa Exemplo Sub-Rotina; var Opção: caractere; // Sub-rotina que efetua a adição entre dois números. Sub-rotina Faz_Adição; var Num1, Num2: Real; 3ª Unidade 36 início Escreva (‘Rotina de Soma’); Escreva (‘Entre com o 1° Número’); Leia (Num1); Escreva (‘Entre com o 2° Número’); Leia (Num2); Escreva (‘A soma de ‘, Num1,’ + ‘, Num2, ‘é = ‘, Num1+Num2); fim. // Sub-rotina que efetua a subtração entre dois números. Sub-rotina Faz_Subtração; var Num1, Num2: Real; início Escreva (‘Rotina de Subtração’); Escreva (‘Entre com o 1° Número’); Leia (Num1); Escreva (‘Entre com o 2° Número’); Leia (Num2); Escreva (‘A subtração de ‘, Num1,’ – ‘, Num2, ‘é = ‘, Num1-Num2); fim. // Programa Principal. início Opção ← ‘0’; Enquanto (Opção <> ‘3’) faça Escreva (‘1 – Adição’); Escreva (‘2 – Subtração’); Escreva (‘3 – Fim do Programa”) Escreva (‘Escolha uma Opção.:’); Leia (Opção); se (Opção = ‘1’) então Faz_Adição; fim se; se (Opção = ‘2’) então Faz_Subtração; fim se fim enquanto; fim. 3ª Unidade 37 O programa anterior apresenta a aplicação da técnica de programação estruturada, permitindo assim construir programas mais elaborados. Porém, no tocante a seleção de sub- rotinas, a instrução se não constitui a melhor opção. Uma opção de seleção mais eficiente seria a instrução escolha... fim_escolha, que possuía a seguinte estrutura: Sintaxe: escolha x caso 1: ação1; caso 2: ação2; caso 3: ação3; caso 4: ação4; fim escolha; Então, o código do exemplo acima ficaria da seguinte forma: início opção ← ‘0’; enquanto (Opção <> ‘3’) faça escreva (‘1 – Adição’);escreva (‘2 – Subtração’); escreva (‘3 – Fim do Programa’); escreva (‘Escolha uma Opção.:’); leia (Opção); escolha opção caso ‘1’: Faz_Adição; caso ‘2’: Faz_Subtração; caso contrário: escreva (‘opção inválida’); fim escolha; fim enquanto; fim. 20.2 VARIÁVEIS GLOBAIS E LOCAIS: No exemplo usado anteriormente, foram utilizadas variáveis dentro das sub-rotinas (A, B e R, respectivamente), e também fora delas (opcao). Isto ilustra os tipos de variáveis que podem ser utilizadas em um programa. As variáveis são dividas em dois grupos distintos: as Globais e as Locais. Uma variável é considerada Global quando é declarada no início do algoritmo principal de um programa, podendo ser utilizada por qualquer sub-rotina subordinada ao algoritmo principal. Assim sendo, este tipo de variável passa a ser visível a todas as sub- rotinas hierarquicamente subordinadas à rotina principal. 3ª Unidade 38 Uma variável é considerada Local quando é declarada dentro de uma sub-rotina e é somente válida dentro da rotina à qual está declarada. Desta forma, as demais sub-rotinas e programa principal não poderão fazer uso de uma variável local, pois não podem visualizar a mesma. Exemplo: Programa Troca_Valores_Exemplo01; var X, A, B: inteiro; início leia (A, B); X ← A; A ← B; B ← X; escreva (A, B) fim. Programa Troca_Valores_Exemplo02; var A, B: inteiro; Sub-rotina Troca; var X: inteiro; início X ← A; A ← B; B ← X; fim. início leia (A, B); Troca; escreva (A, B); fim. Observe que apesar do segundo exemplo ser um pouco maior que o primeiro, ele possibilita uma economia de espaço em memória, bastante interessante, pois o espaço a seu utilizado pela variável X é somente solicitado quando a sub-rotina TROCA é executada. Terminada a execução, a variável X é desconsiderada, ficando em uso somente os espaços reservados para as variáveis globais A e B. 20.3 PARÂMETROS FORMAIS E REAIS: Parâmetros são considerados elos de ligação entre uma sub-rotina e o programa principal. Usando parâmetros é possível passar valores de uma sub-rotina ou rotina chamadora à outra sub-rotina e vice-versa. 3ª Unidade 39 São considerados parâmetros Formais quando forem declarados através de variáveis juntamente com a identificação do nome da sub-rotina. Estes serão tratados exatamente da mesma forma que são tratadas as variáveis globais e locais. Exemplo: Sub-rotina CalcSoma(A,B: Inteiro); var Z : Inteiro; início Z ← A + B; escreva (Z); fim Observe que a variável Z é uma variável local e está sendo usada para armazenar a soma das variáveis A e B que representam os parâmetros formais da sub-rotina CalcSoma. Serão considerados parâmetros Reais quando estes substituírem os parâmetros formais, quando da utilização da sub-rotina por um programa principal ou por uma rotina chamadora. Exemplo: início leia (X); leia (Y); CalcSoma(X, Y); leia (W); leia (T); CalcSoma(W, T); CalcSoma(8, 2); fim. No trecho acima, toda vez que a sub-rotina CalcSoma é chamada, faz-se uso de parâmetros reais. Desta forma, são parâmetros reais as variáveis X, Y, W e T, pois são fornecidos seus valores pela instrução leia e também os valores 8 e 2. 20.4 PASSAGEM DE PARÂMETROS: A passagem de parâmetro ocorre quando é feita a substituição dos parâmetros formais pelos reais no momento da execução da sub-rotina. Estes parâmetros podem ser passados por Valor: " A passagem de parâmetro por valor caracteriza-se pela não alteração do valor do parâmetro real quando o parâmetro formal é manipulado dentro da sub-rotina. Assim sendo, o valor passado pelo parâmetro real é copiado para o parâmetro formal, que no caso assume o papel de variável local da sub-rotina. Desta forma, 3ª Unidade 40 qualquer modificação que ocorra na variável local da sub-rotina não afetará o valor do parâmetro real correspondente. Exemplo: Programa Calc_Fatorial; // início da sub-rotina Sub- rotina(N: inteiro); var I, FAT : inteiro; inicio FAT ← 1; para I de 1 até N passo 1 faça FAT ← FAT * I; fim_para; escreva (FAT) fim. // início do programa var limite : Inteiro; início Escreva (‘Qual Fatorial: ‘); Leia (limite); Fatorial (limite); fim. No exemplo acima, é indicado o uso da passagem de parâmetro por valor, no caso, a variável N é o parâmetro formal, que receberá o valor fornecido à variável limite, através da sub-rotina Fatorial. Este valor estabelece o número de vezes que o looping deve ser executado. Dentro do procedimento é encontrada a variável FAT que irá desempenhar um tipo de acumulador, tendo ao final do looping o valor do fatorial referente ao valor informado para o parâmetro N. Exercício: 1. Escreva uma sub-rotina de ordenação para um algoritmo que carregue um vetor de 10 elementos com valores inteiros. 20.5 SUB-ROTINA: PROCEDIMENTO: Procedimento é um tipo de sub-rotina chamada pelo programa principal para desempenhar uma determinada ação específica. Por ser uma sub-rotina, o procedimento possui início e fim. No procedimento, parâmetros são passados, porém nenhum valor é retornado. Sintaxe: Procedimento <nome do procedimento> (lista de parâmetros) 3ª Unidade 41 var <variáveis> início <instruções> fim. Exemplo: Programa Testa_Numeros; // início do Procedimento Procedimento Verifica(X: Inteiro); inicio se (X mod 2 = 0) então Escreva (X, ‘ é par’); senão Escreva (X, ‘ é ímpar’); fim_se; fim. // início do programa principal var N : Inteiro; início Escreva (‘Digite um Nº Qualquer: ‘); Leia (N); Enquanto (N > 0) faça início Verifica (N); Escreva (‘Digite outro Nº ‘); Leia (N); fim fim_enquanto; fim. 20.6 SUB-ROTINA: FUNÇÃO: Uma função também é um tipo de sub-rotina que contem início e fim, e sendo identificado por um nome, através do qual será referenciado em qualquer parte do programa principal. As características são semelhantes as do procedimento. Sintaxe: função <nome da função> (parâmetros) : <tipo da função> var <variáveis> início <instruções> fim. 3ª Unidade 42 Obs.: A principal diferença entre funções e procedimentos é que as funções retornam valores, enquanto que os procedimentos não. Exemplo: Função Fatorial (N: inteiro) : inteiro; var I, FAT: inteiro; início FAT ← 1; se (N = 0) então FAT ← 1; senão início para I de 1 até N faça FAT ← FAT * I; fim_para; fim fim_se; FATORIAL ← FAT fim. Observe que o nome da função, no caso Fatorial, é também o nome da variável interna que recebe o valor acumulado da variável FAT, caso o número fornecido para o parâmetro N não seja zero (0). Pois se for zero, o valor da função Fatorial é igualado a 1, que é o valor do fatorial de 0. Desta forma, uma função retorna um valor pelo seu próprio nome, pois é este nome, que é usado dentro do corpo da função para a recepção do valor calculado. Outro detalhe a ser considerado numa função além do seu nome ser usado como variável de retorno, é o fato da definição do seu tipo, no caso, função FATORIAL(N: inteiro) : inteiro, onde N está sendo considerado como inteiro dentro dos parênteses. Isto significa que o valor fornecido pelo parâmetro N é inteiro, porém existe uma segunda definição de tipo fora dos parênteses, que é o tipo de retorno da função. Desta forma entra um valor inteiro com o parâmetro N e sai um valor inteiro para Fatorial. Observe que poderá ocorrer o fato de se entrar um parâmetro de um tipo e retorna-lo como outro tipo. Exercícios: 2. Escreva um algoritmo que contenha uma sub-rotina de procedimento, que esta receba dois valores reais, faça a multiplicação entre eles e escreva o resultado. 3. Escreva um algoritmo que contenha uma sub-rotina defunção, e que esta receba dois valores reais e retorne o resultado da subtração entre eles. 4. Escreva um algoritmo que contenha uma sub-rotina do tipo procedimento, e que esta sub-rotina receba vários números inteiros. O objetivo principal do procedimento é calcular 3ª Unidade 43 o quadrado de cada número passado como parâmetro. O programa principal se encerra quando o número 0 for digitado. 5. Escreva um algoritmo que contenha uma sub-rotina do tipo função, e que esta sub-rotina receba vários números inteiros e retorne o cubo de cada número lido. O programa principal se encerra quando o número 0 for digitado. 6. Escreva um algoritmo que calcule o mínimo múltiplo comum (MMC) entre dois números. Utilizar uma sub-rorina de procedimento que receba os valores, efetue o calculo do MMC. 7. Escreva um algoritmo que calcule o máximo divisor comum (MDC) entre dois números. Utilizar uma sub-rorina de função que receba os valores, efetue o calculo do MDC e retorne o resultado. 3ª Unidade 44 Lista de Exercício III 1. Escreva um algorítmo para calcular a Soma, Subtração, Divisão e Multiplicação de dois valores reais. Utilizar uma sub-rotina de procedimento que receba os valores, efetue as operações e imprima os resultados. 2. Escreva um algoritmo que calcule o quadrado e o cubo de vários números digitado via teclado. Imprima os números e seus quadrados e cubos, respectivamente. Use uma rotina de função para resolver esse problema. Somente números inteiros e maiores que 1 serão permitidos. 3. Escreva um algoritmo que calcule o fatorial de vários números. Só serão considerados válidos os números maiores que 1. Use uma sub-rotina de procedimento para resolver esse problema. 4. Escreva um algoritmo que leia vários números e informe se eles são pares ou ímpares. O programa deve aceitar somente números maiores que zero (0). Use uma sub-rotina de função para desempenhar a avaliação dos números (se par ou ímpar). 5. Escreva um algoritmo para calcular qualquer potência. Serão passados o expoente e a base para uma sub-rotina de função que retornará a potência. Ambos os valores da base e expoente devem ser inteiros e positivos. 6. Escreva um algoritmo que tendo como dados de entrada a altura e o sexo de uma pessoa (‘M’ = masculino e ‘F’ = feminino), calcule seu peso ideal, utilizando as seguintes fórmulas: para homens: (72.7 * altura) – 58; para mulheres: (62.1 * altura) – 44.7; Utilize uma sub-rotina de função para resolver esse problema.
Compartilhar