Baixe o app para aproveitar ainda mais
Prévia do material em texto
Construção de Algoritmos (Parte 2) Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas Profª: Kellen Nery Sumário VARIÁVEIS COMPOSTAS ......................................................................................................... 2 Variáveis Vetoriais Unidimensionais .................................................................................. 2 Exercícios ........................................................................................................................ 4 Variáveis Vetoriais Multidimensionais ............................................................................... 8 Exercícios ...................................................................................................................... 10 SUBALGORITMOS ................................................................................................................. 13 Elementos de um subalgoritmo ........................................................................................ 14 Escopo de variáveis ........................................................................................................... 14 Funções ............................................................................................................................. 16 Procedimentos .................................................................................................................. 18 Passagem de parâmetros ................................................................................................. 19 Passagem de parâmetros por valor .............................................................................. 21 Passagem de parâmetros por referência ..................................................................... 21 Exemplo Passagem de Parâmetro Valor x Referência .................................................. 22 Profª: Kellen Nery 2 VARIÁVEIS COMPOSTAS Até o momento, vimos apenas variáveis que são utilizadas para o armazenamento de dados simples. Entretanto, as variáveis podem ser compostas, formadas por uma ou mais posições (campos ou entradas), podendo armazenar um ou mais dados. As variáveis compostas são classificadas em homogêneas (vetoriais) ou heterogêneas (registros). Em função de sua capacidade de armazenar diferentes valores, este tipo de variável pode ser encarado como uma “estrutura” de armazenamento. Variáveis Vetoriais Unidimensionais As variáveis vetoriais unidimensionais, chamadas muitas vezes simplesmente de variáveis vetoriais, são variáveis compostas homogêneas indexadas, as quais contêm um ou mais campos de mesmo tipo, onde cada campo é acessado pelo seu índice (posição). Sua declaração geral é definida da seguinte forma: var <nome>: vetor[<inicio>..<fim>] de <tipo_da_variavel> Exemplo 1: Declaração de uma variável chamada A que pode armazenar 10 números inteiros. var A: vetor[1..10] de inteiro Neste exemplo, a variável A será armazenada na memória do computador em uma área equivalente a 10 vezes o que é armazenado para uma única variável inteira. Esta variável é representada como na figura abaixo. Nela, os números 1, 2, 3...10 são os índices (posição ou localização) de cada número inteiro que pode ser armazenado. O índice serve para localizar qual elemento do vetor estará sendo referido em determinado instante. Por exemplo, o elemento A[5] é localizado no campo de índice 5 do vetor A e, no exemplo da figura, vale -12. Para atribuir um valor qualquer para um campo de posição i faz-se o seguinte: A[i]←←←←<valor_qualquer> Neste caso, diz-se que a posição i-ésima do vetor A foi indexada. Profª: Kellen Nery 3 Exemplo 2: Algumas operações que podem ser realizadas com vetores. B[3] ←←←←”flor” A[6] ←←←←A[8] leia(B[2]) escreva(B[i]) A[i] ←←←←A[i+1]-C[j] Exemplo 3: Trecho de programa que inicializa todos os campos de um vetor A com o valor 0 (zero). Diz-se “inicializar o vetor com zeros” ou simplesmente “zerar o vetor”. Primeira Opção: atribui-se 0 (zero) a todos os campos, um a um, da seguinte forma: A[1] ←←←←0 A[2] ←←←←0 A[3] ←←←←0 A[4] ←←←←0 A[5] ←←←←0 A[6] ←←←←0 A[7] ←←←←0 A[8] ←←←←0 A[9] ←←←←0 A[10] ←←←←0 Segunda Opção: utiliza-se uma variável para indexar as 10 posições com um comando de repetição. A ideia aqui é usar a própria variável de contagem do comando “para” para indexar o vetor todo, da seguinte forma: para i:=1 até 10 faça A[i] ←←←←0 fimpara Neste exemplo dizemos que o vetor A foi completamente indexado (percorrido, visitado, pesquisado, varrido, ...) em todas as suas entradas e para cada uma um valor zero foi inserido. Dizemos que para cada iteração do “para”, ou seja, para cada valor de i, o elemento i-ésimo (elemento da vez, elemento corrente, elemento atual etc...) é zerado. A figura abaixo mostra uma possível representação gráfica da indexação com comando de repetição. Profª: Kellen Nery 4 Exercícios 1) Faça um algoritmo que leia, via teclado, 200 valores do tipo inteiro e os guarde na memória. 2) Amplie o exercício anterior emitindo um relatório com todos os números pares que você leu. 3) Faça um algoritmo que determine qual o menor valor existente no vetor do exercício número 1. 4) Faça um algoritmo que determine qual o maior valor existente no vetor do exercício número 1. 5) Faça um algoritmo que imprima quantos dos valores do exercício número 1 são maiores que a média desses valores. 6) Faça um algoritmo para ler 20 valores e que imprima os que são maiores que a média dos valores. 7) Faça um algoritmo que leia 18 números inteiros e calcule e imprima a soma dos mesmos. 8) Faça um programa que leia 4 números inteiros e apresente: • Média dos ímpares • Maior número par • Diferença entre o maior e o menor número 9) Faça um programa que leia um conteúdo com 100 números inteiros e apresente a media dos números. 10) Faça um programa que leia 2 conjuntos com 50 números inteiros e gere um terceiro conjunto com a media dos elementos de A e B. Apresente o C. 11) Faça um programa que leia um conjunto A com 30 números inteiros e que armazene em um conjunto B do mesmo tipo os elementos de A multiplicados por 3. Apresente o conjunto B. 12) Faça um programa que leia um conjunto A com 100 números inteiros e que gere um conjunto B com os elementos de A de acordo com a seguinte regra. Se o elemento de A for par, armazene em B multiplicando por 5. Se o elemento de A for impar, armazene em B somando 5. 13) Faça um programa que leia dois conjuntos A e B com 20 inteiros e troque os valores de A com B. 14) Faça um programa que leia dois conjuntos A e B com 15 números inteiros e gere um conjunto de 30 elementos, onde os 15 primeiros elementos são de A e o resto de B. Apresente o conjunto C. 15) Criar um programa que lê 20 números inteiros e depois os escreve na ordem inversa. A ideia aqui é mostrar no vídeo os elementos começando da última posição e vindo em direção a primeira posição. Profª: Kellen Nery 5 16) Criar um programa que a partir de um vetor A de n números inteiros, calcula a soma dos pares e a soma dos ímpares. A ideia aqui é semelhante a anterior, entretanto usam-se duas variáveis de somatória (somapar e somaimpar). Para cada elemento indexado, uma comparação é feita para determinar em qual das somatórias ele será acumulado. 17) Criar um programa que procura dentro de um vetor A de n inteiros o elemento mais próximo da média. Diga qual é a posição deste elemento. 18) Criar um programa que a partir de um vetornumérico A de tamanho n, eleva os valores de cada campo deste vetor ao índice de sua posição. Assim, A[1]←(A[1])1, A[2]←(A[2])2, A[3]←(A[3])3 e assim sucessivamente até que A[n]:=(A[n])n. A ideia aqui é percorrer o vetor com um comando “para” e para cada iteração usar um outro comando “para” para calcular uma potenciação. 19) Faça um algoritmo que leia Nome e notas ( total de 12 ) de N alunos de um colégio. Após a leitura faça: a) Imprima o Nome e a média dos alunos aprovados ( Média >= 7.0 ). b) Imprima o Nome e a média dos alunos em Recuperação ( 5.0 >= Média < 7.0 ). c) Imprima o Nome e a média dos alunos reprovados ( Média < 5.0 ). d) Imprima o percentual de alunos aprovados. e) Imprima o percentual de alunos reprovados. 20) Um teste composto por 10 questões foi proposto numa classe de n alunos. Cada questão admite as alternativas identificadas pelas letras A, B, C, D e E. Para cada aluno tem-se o registro contendo o seu nome e as suas respostas. Sendo dado o gabarito das questões faça um algoritmo que: a) Escreva uma relação contendo o nome e o número de acertos de cada aluno; b) Determine quantos alunos acertaram as questões 1 e 2 e tiveram 7 acertos; c) Escreva o nome do aluno, que obteve a melhor nota e pior nota; 21) Faça um algoritmo que leia 10 valores numéricos inteiros. Após a leitura emita um relatório com cada valor diferente e o número de vezes que o mesmo apareceu no vetor. 22) Dado uma ralação de N nomes, faça um algoritmo que verifique se uma determinada pessoa está neste vetor. O Nome da pessoa a ser pesquisada deverá ser lido, bem como os nomes a serem colocados no vetor. 23) Faça um algoritmo que leia N letras e armazene cada uma em uma posição de memória. Coloque no vetor, após a última letra lida, o caracter “$”, indicando final dos caracteres 24) Faça um algoritmo que: a) Leia um vetor A e um vetor B com 10 elementos cada, do tipo caracter. b) Intercale estes vetores A e B, formando outro vetor C da seguinte forma. C[1] ← A[1] C[2] ← B[1] C[3] ← A[2] C[4] ← B[2] Profª: Kellen Nery 6 25) Dado um vetor X de n elementos faça um algoritmo que: a) Crie outro vetor Y contendo os elementos de x que estão na faixa entre 10 e 40; b) Crie outro vetor W contendo os números que estão nas posições pares; c) Pesquise a existência de um determinado elemento Y no vetor X; d) Escreva o menor e maior elemento do vetor X; 26) Em uma cidade do interior, sabe-se que, de janeiro a abril de 1976 (121 dias), não ocorreu temperatura inferior a 15o C nem superior a 40o C. As temperatura verificadas em cada dia estão disponíveis em uma unidade de entrada de dados. Fazer um algoritmo que calcule e escreva: a) a menor temperatura ocorrida; b) a maior temperatura ocorrida; c) a temperatura média d) o número de dias nos quais a temperatura foi inferior a média à temperatura média. 27) Fazer um algoritmo que: a) leia o valor de n (n <= 1000) e os n valores de um variável indexada A de valores inteiros ordenados de forma crescente; b) determine e escreva, para cada número que se repete no conjunto, a quantidade de vezes em que ele aparece repetido; c) elimine os elementos repetidos, formando um novo conjunto; d) escreva o conjunto obtido no item c; 28) Uma grande firma deseja saber quais os três empregados mais recentes. Fazer um algoritmo para ler um número indeterminado de informações (máximo de 300) contendo o número do empregado e o número de meses de trabalho deste empregado e escrever os três mais recentes. Observações: A última informação contém os dois números iguais a zero. Não existem dois empregados admitidos no mesmo mês. Exemplo: EMPREGADOS 224 1731 2210 4631 … 526 1 2 3 4 300 MESES 17 3 9 2 … 10 1 2 3 4 300 Empregado mais recente: 4631. 29) Fazer um programa que: a) leia o valor de M (M<=30) e os valores de uma variável indexada A; b) leia o valor de N (N<=20) e os valores de uma variável indexada B; c) determine o conjunto C = A ∪ B (união de A com B), onde C não deverá conter elementos repetidos (A e B não contém elementos repetidos); d) escreva os elementos contidos em A, B e C; Profª: Kellen Nery 7 30) Intercalação é o processo utilizado para construir uma tabela ordenada, de tamanho n +m, a partir de duas tabelas já ordenadas de tamanhos n e m. Por exemplo, a partir das tabelas: A= 1 3 6 7 e B= 2 4 5 construímos a tabela C= 1 2 3 4 5 6 7 Fazer um algoritmo que: a) leia NA, número de elementos do conjunto A (NA<=100); b) leia, em seguida, os elementos do conjunto A; c) leia, logo após o valor de NB, número de elementos do conjunto B (NB<=100); d) leia, finalmente, os elementos do conjunto B; e) crie e imprima um conjunto C, ordenado, de tamanho NA+NB, a partir dos conjuntos originais A e B. Observação: Considerar os elementos de A e B como inteiros. 31) Para cada nota de compra , tem-se o Nome do produto comprado, o valor e o imposto. Faça um algoritmo que escreva Nome, valor e imposto de cada produto. Bem como o valor total bruto, o imposto total cobrado e o valor total líquido de todas as notas. Considere 500 notas 32) Um armazém trabalha com 100 mercadorias diferentes identificadas pelos números inteiros de 1 a 100. O dono do armazém anota a quantidade de cada mercadoria vendida durante o mês. Ele tem uma tabela que indica para cada mercadoria o preço de venda. Escreva o algoritmo para calcular o faturamento mensal de armazém, isto é: A tabela de preço e quantidade é fornecida em dois conjuntos, sendo que um conjunto contém a quantidade vendida e o outro o preço de cada mercadoria. Profª: Kellen Nery 8 Variáveis Vetoriais Multidimensionais São variáveis homogêneas que possuem duas ou mais dimensões, ou se preferir, seus campos podem ser acessados por mais de 1 índice. Podemos imaginar como sendo tabelas de dados distribuídas no espaço. Conforme a dimensão, fica difícil a sua representativa gráfica. Sua sintaxe é definida abaixo: var <nome>: vetor[<interv1>,<interv2>,....,<intervn>] de <tipo> Onde <intervi> corresponde ao intervalo discreto da dimensão i, comumente composto de valores indicando o início e o fim da sequência de elementos discretos que compõe o intervalo. A sintaxe da especificação do intervalo é: <inicio>..<fim> onde <início> e <fim> podem ser constantes ou variáveis contendo normalmente valores inteiros ou caracteres. Outros tipos menos comuns também são permitidos. Um exemplo de vetor Tetra-Dimensional capaz de armazenar valores reais é declarado abaixo, mas a sua representação gráfica é complicada. Exemplo 1: var tetra: vetor[1..10,1..20,1..15,1..5] de real Já no caso de variável vetorial bidimensional, também chamada de matriz, sua representação pode ser vista no exemplo a seguir: Exemplo2: var A: vetor[1..6,1..5] de inteiro Neste exemplo, o primeiro intervalo da dimensão é normalmente chamado de linha e o segundo de coluna, por questões de simplicidade de entendimento, já que estamos acostumados com esta representação tradicional da matemática escolar. No entanto, não existe esta obrigatoriedade e nada impede o programador de entender que o segundo intervalo seja a linha e o primeiro a coluna. O importante neste caso é padronizar o uso dentro do programa. Para todos os efeitos, melhor o entendimento tradicional. Profª: Kellen Nery 9 Os campos de uma variável multidimensional podem ser acessados pela combinação de seus índices, também chamada de coordenada. O exemplo da figura anterior deixa em destaque dois campos da variável A, posicionados nas coordenadas (3,2)e (5,4). Exemplo 3: Programa que preenche uma matriz mxn com elementos nulos. programa matriz_nula var m, n, lin, col: inteiro Max: vetor[1..200,1..200] de inteiro início leia(m,n); {m linhas e n colunas} para lin←←←←1 até m faça para col←←←←1 to n do Max[lin,col] ←←←←0 fimpara fimpara fim Este exemplo mostra a forma mais comum de percorrer uma matriz mxn, usando dois comandos “para” para indexar todas as linhas e colunas da matriz. Note que o “para” mais externo é o responsável pela indexação das linhas e o mais interno das colunas. Assim, conforme feito neste exemplo, para cada linha o algoritmo percorre os elementos de todas as colunas e atribui a ele o valor zero. Outra observação se faz necessária, note que a matriz Max foi declarada com 40.000 campos inteiros. A declaração reserva espaço de memória para os campos, mas o uso destes não é obrigatório. No programa, o que determina o tamanho válido da matriz é o controle que fazemos dela. Neste caso, usamos m e n para delimitar os campos válidos. Normalmente devemos reservar espaço suficiente para as situações de uso máximo, mas todo cuidado é pouco. Neste exemplo, 40.000 valores inteiros são 80.000 bytes, ou seja, aproximadamente 80K bytes. Imaginem agora se o tipo básico dos campos da matriz fosse real. Então teríamos uma reserva de 240K bytes, bem mais do que a memória disponível nos primeiros computadores. Este uso deve ser controlado, reservando o mínimo possível de memória, a fim de facilitarmos o trabalho o sistema operacional e permitir uma execução mais rápida do programa gerado. Profª: Kellen Nery 10 Exercícios 1) Crie um algoritmo que receba uma matriz 3x3 e depois exiba uma determinada linha da matriz indicada pelo usuário (linha válida da matriz). 2) Faça um algoritmo que leia uma matriz 3x4 de inteiros e em seguida troque a primeira linha com a última linha. Ao final a matriz alterada deve ser exibida. 3) Elabore um algoritmo que preencha uma matriz 5x5 de inteiros e depois faça: a) a troca entre a segunda e a quinta linha; b) a troca entre a primeira e a quarta coluna; c) a exibição de como ficou a matriz. 4) Elabore um algoritmo que seja capaz de ler números inteiros para uma matriz 3x3 e depois gire a matriz em 90° no sentido anti-horário, conforme exemplo abaixo: 5) Com base no exercício anterior, escreva outro algoritmo que gire a matriz 3x3 em 90º no sentido horário. 6) Elabore um algoritmo que leia uma matriz 4x4 e indique se ela é uma matriz triangular superior. Matriz triangular superior é uma matriz quadrada onde todos os elementos abaixo da diagonal principal são nulos (com valor zero). Veja um exemplo: Dica: os elementos abaixo da diagonal principal possuem o índice da linha maior que o índice da coluna. 7) Escreva um algoritmo que leia duas matrizes reais de dimensão 3 x 5, calcule e imprima a soma de cada elemento das matrizes, em uma nova matriz. 8) Dada uma matriz MAT de 4 x 5 elementos, faça um algoritmo para somar os elementos de cada linha gerando o vetor SOMALINHA. Em seguida, somar os elementos do vetor SOMALINHA na variável TOTAL que deve ser impressa no final: Exemplo: Profª: Kellen Nery 11 9) Escrever um algoritmo para armazenar valores inteiros em uma matriz (5,6). A seguir, calcular a média dos valores pares contidos na matriz e escrever seu conteúdo. 10) Escreva um algoritmo que lê uma matriz M(5,5) e calcula as somas: a) da linha 4 de M. b) da coluna 2 de M. c) da diagonal principal. d) da diagonal secundária. e) de todos os elementos da matriz. f) Escreva estas somas e a matriz. Exemplo: 11) Escrever um algoritmo que lê uma matriz M(5,5) e cria 2 vetores SL(5), SC(5) que contenham respectivamente as somas das linhas e das colunas de M. Escrever a matriz e os vetores criados. 12) Escrever um algoritmo que lê duas matrizes N1(4,6) e N2(4,6) e cria: a) Uma matriz M1 que seja a soma de N1 e N2 b) Uma matriz M2 que seja a diferença de N1 com N2 Escrever as matrizes lidas e calculadas. 13) Escreva um algoritmo para um programa que leia uma matriz quadrada 20 x 20 de elementos reais, divida cada elemento da linha da matriz pelo elemento da diagonal principal desta linha e imprima a matriz assim modificada. Profª: Kellen Nery 12 Exemplo: � � 9 1012 � 1520 8 � ⇒ � 1 4.5 56 1 55 2 1� 14) A matriz dada a seguir contém, em cada linha, as cinco notas de provas obtidas por um aluno durante o período letivo. O índice das linhas corresponde ao número do aluno. Assim, por exemplo, o aluno número 3 obteve as notas, 8,9 – 3,8 –8,7 – 6,0 – 6,5 A turma contém 30 alunos As notas são lidas a partir de um arquivo de entrada, sendo que cada linha da matriz contém as cinco notas de provas obtidas por alunos. Faça um algoritmo que calcule a média de cada aluno e a média geral da turma e que imprima o resultado da seguinte forma. Profª: Kellen Nery 13 SUBALGORITMOS Você pode reduzir a complexidade de um algoritmo, sabendo utilizar o raciocínio lógico para dividir um problema grande em diversos problemas menores. Dessa forma, a complexidade é reduzida, favorecendo a compreensão. E é nesse contexto que entram os subalgoritmos, que são trechos de programas que podem ser utilizados dentro de um programa maior, sempre que necessário ou conveniente. Você conhecerá os conceitos acerca de subalgoritmos, classificando-os em funções e procedimentos. Você irá conhecer também os conceitos, sintaxe e aplicações das funções e procedimentos. Veremos como criar, declarar e em que parte do algoritmo eles devem ficar posicionados. Você aprenderá, também, como fazer a chamada de funções e procedimentos dentro do algoritmo principal e os conceitos de escopo de variáveis, definindo variáveis globais e locais e a comunicação entre as funções e procedimentos e o algoritmo através dessas variáveis. os conhecimentos que você adquiriu até hoje, você sabe que é capaz de construir algoritmos que podem resolver problemas de diversos tipos. Além da diversidade de tipos de problemas, nos algoritmos, poderemos nos deparar com diversas situações diferentes dentro de um mesmo problema. E quanto maior essa diversidade, podemos dizer que maior é a complexidade do algoritmo. Para reduzir essa complexidade, é interessante utilizarmos a nossa habilidade de raciocínio lógico para decompor os problemas grandes e complexos em diversos problemas menores e mais simples. Dessa forma, fica mais fácil manter o foco em cada ‘subproblema’ por vez, aumentando a compreensão. Em algoritmos, essa decomposição é possível quando utilizamos os subalgoritmos. Observação: Um subalgoritmo é um trecho de programa que contém início e fim, executa um determinado conjunto de instruções e possui um identificador, por meio do qual pode ser chamado em qualquer parte do algoritmo, como se fosse um comando. Imagine que um determinado algoritmo precisa realizar um mesmo conjunto de ações repetidas vezes ao longo de sua execução. Ao invés de escrevermos esse conjunto de ações várias vezes ao longo do algoritmo, criamos um subalgoritmo e o algoritmo principal o ‘chama’ sempre que precisar dele. Por exemplo: ao preencher um formulário com dados de diversas pessoas, o usuário digita, em dado momento, o ano de nascimento da pessoa e, automaticamente, é preenchido o campo seguinte, com a idade da pessoa. Em um programa que não utiliza subalgoritmos, a expressão ‘idade <- ano_atual – ano_nascimento’ é calculada cada vez que novos dados são inseridos. Se utilizarmos um subalgoritmo que realize esse cálculo, apenas chamamos o subalgoritmono momento necessário. Ao terminar a execução do subalgoritmo chamado, o fluxo de execução natural do algoritmo principal prossegue. Dessa forma, quando um algoritmo é muito complexo, a estratégia é dividi-lo em um algoritmo principal e diversos (tantos quantos forem necessários) subalgoritmos. Se, ainda assim, algum nível de complexidade for mantido, é possível os subalgoritmos chamarem outros subalgoritmos. Profª: Kellen Nery 14 A utilização de subalgoritmos facilita o trabalho do programador, pois, além de melhorar a compreensão e reduzir a complexidade, permite que se detectem e corrijam eventuais falhas com maior precisão e agilidade e favorece, também, a reutilização de subalgoritmos que foram implementados em outros programas. Dessa forma, reduzimos, além da complexidade, o tempo gasto para escrever o programa. Elementos de um subalgoritmo Os elementos de um subalgoritmo são o corpo e o cabeçalho. No corpo, são definidas as instruções, ou seja, as ações que o subalgoritmo vai executar cada vez que for chamado dentro do algoritmo principal. No cabeçalho, definimos o nome, os parâmetros, as variáveis locais e o tipo. Veja a descrição de cada um desses elementos a seguir. a. Nome – é o identificador pelo qual o subalgoritmo será chamado no algoritmo principal. b. Parâmetros – são os dados que permitem as relações entre o subalgoritmo e o algoritmo. Ou seja, são os dados que o subalgoritmo precisa receber para executar suas instruções e os dados que ele retorna quando termina de executar. Por exemplo, para realizar uma soma, os parâmetros recebidos são os números que serão somados. Ao efetuar a soma, retornamos o resultado dessa soma. c. Variáveis locais – são as variáveis declaradas no subalgoritmo e que só podem ser utilizadas dentro dele. d. Tipo – os subalgoritmos podem ser de dois tipos: funções ou procedimentos. A diferença entre ambos é que uma função retorna sempre a um único valor. Um procedimento não retorna valores, mas os recebe e modifica. Escopo de variáveis As variáveis que criamos no início de um algoritmo podem ser utilizadas em qualquer lugar dentro do algoritmo. Se desejarmos utilizar tais variáveis dentro de um subalgoritmo, por exemplo, podemos fazer isso sem problemas. Essas variáveis são as variáveis globais. Ao criarmos um subalgoritmo, porém, criamos variáveis específicas para utilizarmos em seu interior. Tais variáveis são inicializadas no momento em que o subalgoritmo está sendo executado e são válidas somente em seu interior. Elas não são visualizadas fora dos limites do subalgoritmo. São as variáveis locais. A essa visibilidade das variáveis (se ela é local ou global), damos o nome de escopo de variáveis. Trata-se da abrangência de uma variável, ou seja, em que limites do algoritmo ela é visível e pode ser utilizada. Veja, na Figura 1, como podemos ilustrar a hierarquia da visibilidade das variáveis. Profª: Kellen Nery 15 Figura 1 Veja que as variáveis A e B estão declaradas no algoritmo principal. Logo, elas são variáveis globais que podem ser utilizadas em qualquer subalgoritmo do conjunto que vemos na Figura 1. Porém, declaramos a variável A novamente, em outro contexto, no subalgoritmo 1. Essa nova variável A, nesse caso, não é a mesma que foi criada no algoritmo principal. Trata-se de uma variável local do subalgoritmo 1 e que pode ser utilizada no subalgoritmo 1.1 (ou em qualquer subalgoritmo interno ao subalgoritmo 1). A variável X é, também, local ao subalgoritmo 1 e pode ser utilizada no subalgoritmo 1.1. É declarada, no subalgoritmo 2.1 outra variável X, que é local naquele subalgoritmo (ela não tem relação alguma com a variável X do subalgoritmo 1). A variável M é local ao subalgoritmo 2 e pode ser utilizada no subalgoritmo 2.1. a variável W é local ao subalgoritmo 1.1 e somente neste subalgoritmo pode ser visualizada. Observação: Uma variável local pode ter o mesmo nome de uma variável global. Porém, uma vez declaradas em contextos diferentes, elas são distintas. Além de melhorar o desempenho do algoritmo, essa divisão entre variáveis locais e globais serve para definir os parâmetros de um subalgoritmo. Ou seja, elas estabelecem a comunicação entre o subalgoritmo e o algoritmo principal, que o chamou. As variáveis globais do algoritmo servem como dados de entrada para o subalgoritmo e as variáveis locais do subalgoritmo armazenam os dados recebidos para, com eles, efetuar os cálculos necessários. No caso das funções, como veremos adiante, a variável (local) de retorno (através do comando retorne) serve como dado de saída da função para o algoritmo principal e uma variável global recebe e armazena essa informação. Ao acessar essa variável global, temos acesso ao valor de retorno da função. Observação: A maneira com que tratamos as variáveis dentro do algoritmo pode afetar de forma direta o desempenho do programa, pois uma variável local é liberada (um espaço na memória é liberado) assim que o subalgoritmo que a utiliza termina de executar. Dessa forma, se uma variável vai ser utilizada somente no interior de um subalgoritmo, não há necessidade de declará-la como variável global. Profª: Kellen Nery 16 Você pode utilizar variáveis globais nos subalgoritmos que você criar. Porém, é recomendável que você utilize variáveis locais, pois isso permite que o subalgoritmo seja executado sem interferir em outros subalgoritmos que possam estar utilizando as mesmas variáveis. Funções As funções, em algoritmos, seguem o mesmo princípio das funções matemáticas que aprendemos na escola. Quando dizemos que f(x)=x+1, temos duas variáveis (x e f(x)) e, com base no valor de uma delas, encontramos o valor da outra. Você viu, há pouco, que um subalgoritmo tem, como elementos, dentre outros, os parâmetros, que são os dados que ele recebe para poder executar suas instruções (as variáveis globais). Dessa forma, em uma função soma, teríamos como parâmetros os números a serem somados (no caso da função matemática acima, o x, que é informado pelo usuário) e como valor de retorno o resultado da soma entre os números (nesse mesmo caso, o f(x), que é a variável local onde fica armazenado o valor de retorno). Observação: Uma função é um subalgoritmo que é chamado dentro do algoritmo através da citação de seu nome (identificador) e deve retornar um único valor. As funções, assim como as variáveis, devem ser declaradas antes de serem inicializadas. Essa declaração deve estar posicionada no espaço após a declaração das variáveis e antes do início da execução do algoritmo. Assim: Profª: Kellen Nery 17 Veja o algoritmo abaixo, que utiliza uma função que soma dois números: Observe que, após a declaração das variáveis globais do algoritmo (os números a e b a serem somados e a variável soma, para armazenar o resultado), criamos a função. O nome da função é fsoma. Os parâmetros são os números inteiros que serão armazenados nas variáveis a1 eb1(variáveis locais de fsoma). O tipo de retorno da função é inteiro. Outra variável local é a variável resultado, onde será armazenado o resultado da soma entre a1 e b1. No algoritmo principal, são recebidos dois números inteiros, que são armazenados nas variáveisa e b. Chamamos, então, em uma expressão de atribuição (nesse caso), a função fsoma, que armazenará em a1 e b1 os valores de a e b, digitados, e retornará o valor encontrado na soma, que está armazenado na variável resultado. Esse valor é, então, armazenado na variável soma(por atribuição) e exibido, em seguida. Execute o algoritmo no VisuAlg. É importante salientar alguns pontos, descritos a seguir. a. Os parâmetros da função são separados por vírgula (comona declaração de variáveis), se forem do mesmo tipo. Se forem de tipos diferentes, devemos separá-los por ponto- e-vírgula (;). b. O tipo de retorno da função, bem como todas as suas variáveis locais, pode ser qualquer um entre os tipos de dados básicos que conhecemos: inteiro, real, lógico, literal ou caractere. Porém, o VisuAlg não suporta variáveis compostas (vetores e matrizes) como parâmetros de subalgoritmos. c. O comando retorne é utilizado para informar o valor de retorno da função ao algoritmo, no momento em que a função é chamada. d. A função é chamada sempre em uma expressão, em que o valor armazenado na variável de retorno da função é atribuído a uma variável do algoritmo. e. Sempre que chamar a função é imprescindível que os parâmetros passados (no caso do nosso exemplo, os valores das variáveis globais a e b) devem, obrigatoriamente, estar entre parêntesis, na mesma ordem, ser do mesmo tipo e em igual quantidade aos parâmetros da função (variáveis locais a1 e b1). Profª: Kellen Nery 18 Procedimentos Um procedimento é um subalgoritmo, assim como a função. A principal diferença entre ambos é que a função retorna um valor, enquanto o procedimento não retorna, mas modifica os valores recebidos. Um procedimento é um subalgoritmo que é chamado dentro do algoritmo através da citação de seu nome (identificador) e deve alterar os valores dos parâmetros recebidos. Você viu, na aula anterior, que uma função retorna um único valor, enquanto um procedimento não retorna, mas modifica os valores. Existem, porém outras diferenças importantes entre os dois: Funções Procedimentos As funções retornam o seu valor de forma explícita, por meio do comando retorne. Os procedimentos não retornam valor. Não existe comando retorne. As chamadas às funções ocorrem sempre em expressões ou instruções de atribuição. Os procedimentos são chamados em comandos isolados, com as instruções de entrada e saída de dados (leia e escreva), e nunca em expressões ou atribuições. Os procedimentos devem ser criados e declarados na mesma posição que as funções: após a declaração de variáveis dos algoritmos e antes do início da execução do mesmo. Veja: Algoritmo “<nome do algoritmo>” Var <declaração de variáveis do algoritmo> <declaração do procedimento> Inicio <corpo do algoritmo> fimalgoritmo A sintaxe da criação de um procedimento é a seguinte: //cabeçalho, com o nome e os parâmetros procedimento <identificador> (var <lista de parâmetros>:<tipo dos parâmetros>) //inicio da execução do procedimento Inicio <instruções> fimprocedimento Veja o algoritmo abaixo, que utiliza um procedimento que calcula a área de um triângulo: Profª: Kellen Nery 19 Veja que o procedimento é criado após a declaração das variáveis globais do algoritmo. No momento da declaração do procedimento, seus parâmetros (variáveis locais) são informados entre parêntesis, precedidos da palavra chave var. Isso ocorre porque os procedimentos, como vimos há pouco, modifica valores por meio dos parâmetros, diferente das funções, que utilizam a instrução retorne. Sabemos que os parâmetros permitem a comunicação entre o subalgoritmo e o algoritmo que o chama. Dessa forma, o procedimento recebe os valores através das variáveis globais (no caso, altura ebase) e os armazena em suas variáveis locais (h e b). Após realizar o cálculo da área, o valor resultante é passado, por meio da variável local ar, e armazenado na variável global area. Por isso, ao chamarmos o procedimento no algoritmo principal, devemos fornecer os parâmetros (variáveis globais do algoritmo), entre parêntesis, na mesma ordem, quantidade e tipo que os parâmetros (variáveis locais) do procedimento. Passagem de parâmetros Sabemos que, em funções e procedimentos, deve haver uma comunicação entre o subalgoritmo e o algoritmo que o chama, através das variáveis globais do algoritmo e as variáveis locais do subalgoritmo. A essa comunicação, damos o nome de passagem de parâmetros. Os tipos de parâmetros que utilizamos nesse processo são dois, veja-os a seguir. 1. Parâmetros formais – são aquelas variáveis locais que declaramos entre parêntesis, nos cabeçalhos dos subalgoritmos. São utilizados para realizar os cálculos dentro do subalgoritmo. 2. Parâmetros reais – são os valores que substituem os parâmetros formais no momento da chamada de um subalgoritmo. Profª: Kellen Nery 20 Por exemplo, veja o cabeçalho da função fsoma, a seguir. Funcao fsoma (a1, b1 : inteiro) : inteiro As variáveis a1 e b1 são os parâmetros formais da função. Veja, agora, o seguinte trecho do algoritmo que chama essa função: leia (a) leia (b) soma <- fsoma (a,b) Os valores armazenados nas variáveis globais a e b são os parâmetros reais. Note que poderíamos, simplesmente, chamar a função, passando os valores diretamente: soma <- fsoma (3,5). Nesse caso, os números 3 e 5 seriam os parâmetros reais. No processo de passagem de parâmetros, são passados dados de entrada do algoritmo para o subalgoritmo e dados de saída no sentido oposto. Veja esse processo ilustrado na Figura 2. Figura 2 Na Figura 2, podemos ver uma função, no módulo da esquerda, que calcula uma soma entre dois números. No módulo da direita, temos o corpo do algoritmo que chama essa função. O algoritmo passa os dados de entrada (números armazenados nas variáveis a e b, que são os parâmetros reais) para a função, que os armazena em suas variáveis locais a1 e b1 (parâmetros formais). O cálculo é efetuado e o valor encontrado é armazenado na variável local resultado. Através do comando retorne, esse valor é passado como dado de saída para o algoritmo (no momento da chamada da função), que o armazena na variável global soma para, então, ser exibido. Em um procedimento, essa passagem de parâmetros é feita de uma forma um pouco diferente. Veja a Figura 3. Profª: Kellen Nery 21 Figura 3 No procedimento, a comunicação de saída não é feita de forma explícita como na função. Veja que, ao contrário do que é feito na função, a palavra reservada var é utilizada nos parâmetros do procedimento. Veja, também, que, na chamada ao procedimento, todos os dados são passados como parâmetros, ao passo que na função, são passados apenas os dados de entrada (os números armazenados em a e b). Por que será que isso ocorre? Porque os parâmetros, na função da Figura 2, estão sendo passados por valor e, no procedimento da Figura 3, os parâmetros estão sendo passados por referência. Passagem de parâmetros por valor Quando um parâmetro é passado por valor, no momento da chamada do subalgoritmo, o valor do parâmetro real é ‘copiado’ para o parâmetro formal. Dessa forma, não há alteração no valor do parâmetro real, sejam quais forem os cálculos realizados no subalgoritmo. Na passagem de parâmetros por valor, são criadas as variáveis (é reservado um espaço na memória) locais como parâmetros formais para armazenar uma cópia do valor dos parâmetros reais. Passagem de parâmetros por referência No mecanismo de passagem de parâmetros por referência, não há reserva de espaço extra na memória para os parâmetros formais. Nesse caso, no momento da chamada ao subalgoritmo, os parâmetros reais e formais correspondentes compartilham o mesmo espaço em memória. Desse modo, as modificações feitas nos parâmetros formais dos subalgoritmos afetam os parâmetros reais. Para diferenciar a passagem de parâmetros por valor da passagem por referência, utilizamos, neste segundo método, a palavra reservada var antes dos parâmetros, no cabeçalho do subalgoritmo. É o que você viu na Figura 2. Profª: Kellen Nery 22Exemplo Passagem de Parâmetro Valor x Referência Saída do programa: N1 = 0 N2 = 1 No programa acima a variável N2 que é representada por Y (e tem a passagem por referencia), é afetado seu valor real e sendo assim tem se como resultado o valor 1. A variável N1 (como o calculo ficou retido dentro do procedimento) não foi alterada em nada.
Compartilhar