Correspondem a posies de memria, identificadas por um mesmo nome,
individualizadas por ndices cujo contedo de mesmo tipo. O conjunto de 10 notas dos alunos de uma disciplina pode constituir uma varivel composta. ! este conjunto associa"se um identificador NOTA #ue passar a identificar n$o uma nica posi$o de memria, mas 10. ! refer%ncia ao contedo do n"simo elemento do conjunto ser indicada pela nota$o NOTA [i], onde i um nmero inteiro ou uma varivel numrica contendo um valor inteiro. &upondo"se #ue em um dado instante a varivel composta NOTA contivesse os se'uintes valores( NOTA 60 70 90 60 55 91 100 47 74 86 i 1 2 3 4 5 6 7 8 9 10 NOTA[3] est referenciando o ) o elemento do conjunto cujo contedo *0. 1.1VARVES COMPOSTAS UNDMENSONAS Conjunto de dados referenciados por um mesmo nome e #ue necessitam de somente um ndice para #ue seus elementos sejam endereados. &inta+e 01( declare lista de identificadores [li:ls]:t onde( declare ( uma palavra c,ave- lista de identificadores( nomes associados .s variveis #ue se deseja declarar li( limite inferior do intervalo de varia$o dos ndices- ls: limite superior do intervalo- t: tipo dos componentes /#ual#uer um dos tipos primitivos, ou ainda um outro tipo #ue pode ser construdo, o #ual veremos adiante0. 1+.( declare NOTA[1:10] real- &inta+e 02/3ascal0( Prof a Sirlei Lourdes Bach Pg. 1 var A : array 1 [T1] of T2 onde( A o novo identificador de tipo, T1 denota o tipo do ndice e T2 o tipo das componentes do vetor. 1+s.( var x: array [1..20] of real y: array [TDias] of real 4e acordo com estas declaraes, a varivel + consiste em 20 componentes de tipo real com valores de ndice 1, 2,..., 20 e y tem sete componentes definido em TDias 2 com valores de ndices Seg, Ter, Qua, Qui, Sex, Sab, Dom. Exerccio 1) Fazer um algoritmo que armazene a nota de 20 alunos e as mostre uma a uma na tela. incio declare NOTA[1:20] real; declare NOME[1:20] caracter; inteiro: i; para i:= 1 at 20 faa leia (NOME[i]); leia (NOTA[i]); fim para; para i := 1 at 20 faa escreva (Nome =, NOME[i]); escreva (Nota =, NOTA[i]); fim para; fim. Exerccio 2) Fazer um algoritmo que calcule de 20 alunos a mdia aritmtica de 2 notas armazenando-as. Mostrar em conjunto as mdias e os nomes dos alunos. Exerccio 3) Fazer o algoritmo anterior mostrando na tela somente a mdia do aluno desejado. Mostrar quanto alunos obtiveram mdia >= 80. Exerccio 4) Fazer uma varivel de 100 elementos numricos e verificar se existem elementos iguais a 30. Se sim, escrever as posies em que esto armazenados. Exerccio 5) Dados x valores, armazenar em vetor somente os nmeros correspondentes aos pares. Mostr-los na tela. Exerccio 6) Dados os tipos (a=alimentos), (b= limpeza), (c= frutas e verduras). Fazer um algoritmo onde sejam digitados o tipo, o cdigo e a quantidade em estoque. Separ-los em vetores diferenciados por tipo e permitir que seja mostrado na tela todo o contedo do vetor desejado e no final totalizar: 1 arra5 6 vetor 2 tipo TDias = ( Seg, Ter, Qua, Qui, Sex, Sab, Dom ); Prof a Sirlei Lourdes Bach Pg. 2 quantidade total de produtos computados e; o nmero de itens do vetor. Exerccio 7) Dados 2 vetores A e B que armazenam nmeros inteiros, ambos ordenados de maneira crescente, gerar um vetor C com os nmeros maiores a partir da comparao de A com B. Gerar um vetor D com os nmeros menores e mostr-los (C e D) na tela. Exerccio 8) Dados vetores onde so armazenados dados de X alunos, cdigo, nome e mdia final. nformar cdigo, nome e mdia do melhor e do pior aluno. Nos casos de empate mostrar todos os alunos coincidentes. Exerccio 9) Dado 2 vetores V1 e V2 com 10 nmeros cada. Gerar um vetor V3 com a intercalao de V1 e V2. Exerccio 10) Dado o vetor LSARB, ANARAP, LEVACSAC. Gerar um novo vetor sendo que a primeira posio original ser a posio final do novo vetor. Exerccio 11) Dados 2 vetores A e B com 10 nmeros cada. Gerar um vetor C somente com os itens comuns de A e B. Mostr-lo na tela. Prof a Sirlei Lourdes Bach Pg. 3 1.2VARVES COMPOSTAS MULTDMENSONAS &$o as variveis #ue necessitam mais de um ndice para individualiza$o de seus elementos. !s variveis multidimensionais podem ser 7idimensionais, onde o primeiro elemento representa a lin,a e o se'undo a coluna, ou tridimensionais, onde o elemento representa a p'ina /face0. &inta+e 01/3ortu'ol0( declare LETRAS [1:3, 1:6] caracter- (Ex: 3 = linhas; 6 = colunas declare CUBO [1:5, 1:3, 1:6] caracter- (Ex: ! = "#ginas; 3 = linhas, 6 = colunas &inta+e 02/3ascal0( var LETRAS: array [1..3,1..6] of char; var CUBO : array [1..5,1..3,1..6] of char; Exerccio 12) Dada uma matriz (4 x 4), fazer um algoritmo que multiplique os elementos da diagonal principal por um elemento qualquer. Os elementos da matriz devem ser lidos e mostrados no final. inicio declare MATRIZ[1:4, 1:4] real; real: escalar; inteiro: i, j; leia i, j; para i := 1 at 4 faa para j := 1 at 4 faa leia MATRIZ [i,j]; se (i = j) entao MATRIZ[i,j] := ESCALAR * MATRIZ[i,j]; fimpara; para i := 1 at 4 faa para j := 1 at 4 faa escreva MATRIZ [i,j]; fimpara; fim. Exerccio 13) Dada uma matriz (4 x 5), fazer um algoritmo para calcular a soma de todos os seus elementos. Exerccio 14) Dada uma matriz (4 x 4), obter uma nova matriz, onde as linhas sejam as colunas e vice-versa. Exerccio 15) Dada uma matriz (5 x 5), aps introduzir seus elementos, gerar um vetor com a diagonal principal, mostrando-o na tela. Prof a Sirlei Lourdes Bach Pg. 4 Exerccio 16) Dada uma matriz (5 x 5), gerar uma matriz resultante onde a 1 a coluna contenha os elementos da diagonal principal e a 2 a coluna os elementos da diagonal secundria. Exerccio 17) Dada uma matriz (4 x 5), calcular a soma dos elementos de cada linha armazenando em um vetor. Exerccio 18) Fazer um algoritmo que dada uma matriz tridimensional (4 x 3) com 3 faces armazene valores numricos inteiros entre 0 e 20. Mostrar na tela quantas vezes um determinado valor (entre 0 e 20) est armazenado repetidamente. Exerccio 19) Dadas duas faces de uma matriz tridimensional (3 x 3), fazer um algoritmo em que as linhas da face 2 sejam as colunas da face 1, e as colunas da face 1 sejam as linhas da face 2. Exerccio 20) Dada uma matriz (6 x 2) onde a primeira coluna um cdigo identificador e a 2 a coluna contm informao do estado civil. Fazer um algoritmo que aps introduzido valores para a matriz sejam lidos nome e cdigo de pessoas. Atravs deste cdigo informar o estado civil, ou mensagem de erro quando no h cdigo. Exerccio 21) Dada a tabela de seguros de uma empresa: Faixa Valor do salrio % desco!o 1 at 2.000,00 2 2 2000,01 a 8.000,00 ) ) 8000,01 a 9.000,00 : 8 9.000,01 a *.000,00 9 : mais de *.000,00 10 Sabe-se que ser lido matrcula e salrio de cada funcionrio. Fazer um programa em que x funcionrios calcule: a) Para cada funcionrio, o valor do desconto; b) O valor total descontado; c) O nmero de funcionrios na faixa 1. Prof a Sirlei Lourdes Bach Pg. 5 " TIPOS #E #A#OS #EFINI#OS PE$O %S%RIO 2.1TPOS DE DADOS ENUMERADOS O tipo enumerado um escalar ordenado onde os valores #ue as variveis deste tipo podem assumir s$o descritos atravs de uma lista de valores. Cada valor um identificador o #ual tratado como uma constante. ! 'rande vanta'em #ue o pro'ramador atri7ui nome aos valores, facilitando a pro'rama$o e a depura$o. ! defini$o de um tipo enumerado feita colocando"se entre par%nteses os identificadores #ue as variveis podem assumir, separados por vr'ulas, como mostrado a se'uir( declare Dias:(Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado); ;esse caso, os valores t%m a se'uinte ordem ( Domingo < Segunda < Terca < Quarta < Quinta < Sexta < Sabado Ex.: incio declare Dias :(Domingo,Segunda,Terca,Quarta,Quinta,Sexta,Sabado); TotalHoras, HorasDeTrabalho : inteiro; . . . TotalHoras := 0; para Dias := Segunda at Sabado faa leia (HorasDeTrabalho); TotalHoras := TotalHoras + HorasDeTrabalho; fim para; . . . fim. Outros exemplos: declare Meses :(Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez); Renda : (Alta, Mdia, Baixa); Ocupao: (Mdico, Professor, Outra); Cor: (Preto, Marrom, Azul, Verde, Vermelho, Amarelo, Branco); Prof a Sirlei Lourdes Bach Pg. 6 2.2TPO SUBNTERVALO (SUBRANGE) < lin'ua'ens #ue admitem tam7m um tipo denominado su7intervalo /su7ran'e0, #ue representa um su7conjunto de valores de tipos escalares ordenados. =ma varivel do tipo su7intervalo declarada da se'uinte forma ( declare NumDiadoMes : 1..31; LetrasMaiusculas : A..Z; DiaDoAno : 1..365; 1m suma, o tipo"do"dado pode ser um dos tipos predefinidos ou um tipo definido pelo usurio, como e+emplos( declare Soma, Total, Salario : real; Idade, Contador : inteiro; Ms : 1..12; Dias : (SEG,TER,QUA,QUI,SEX,SAB,DOM); 2.3DECLARAO DE TPOS (TPO/TYPE ) =ma declara$o de tipo, permite #ue se associe um identificador . descri$o de um tipo. =ma vez declarado, tal identificador pode ser usado da mesma forma #ue o nome de um tipo predefinido. Si!axe& tipo ident = descrio-do-tipo; [ident = descrio-do-tipo;] ... Onde: ident = o nome que passar a identificar o tipo definido. Descrio-do-tipo = a descrio de um tipo vlido. Exe'(lo: tipo TDias = (Dom,Seg,Ter,Qua,Qui,Sex,Sab); TMeses= (Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez); TMaiusculas = (`A'..'Z'); TContador = (1..MAXINT); TDigito = (0..9); TAno = (1900..2000); Prof a Sirlei Lourdes Bach Pg. 7 TRange = (min..max); declare Dias : TDias; Meses : TMeses; I, J : TContador; Digito : Tdigito; Intervalo : Trange; ... fim. 2.4 USO DE NDCES COM CONTEDO SEMNTCO Como vimos, os ndices de um vetor servem para acessar individualmente seus elementos. >re#?entemente, esses ndices t%m um si'nificado intrnseco. 3or e+emplo, se desejssemos contar as letras e+istentes em um te+to, poderamos declarar o contador da se'uinte maneira( tipo Faixa = 1..26; declare Contador : vetor[ Faixa ] inteiro; ficando subentendido que Contador[1] o contador da letra a, Contador[2] o contador da letra b e assim sucessivamente. No entanto, o entendimento ficaria mais claro se usssemos como ndice no um nmero inteiro para indicar a letra, mas a prpria letra, isto , Contador[a] para indicar o contador da letra a, Contador[b] para para indicar o contador da letra b, etc. sto possvel uma vez que o ndice de um vetor pode ser qualquer escalar ordenado (caracter, inteiro, lgico, enumerado, subintervalo) . Assim, a declarao anterior ficaria melhor da seguinte forma : tipo Letras = a..z; declare Contador : vetor[Letras] inteiro; EXEMPLO Vejamos um exemplo completo usando o recurso de ndices com contedo semntico. Exerccio 22) Programa para ler as vendas efetuadas durante uma semana por uma equipe de vendedores. A seguir imprimir o valor das vendas indicando quais os dias que tiveram vendas abaixo e acima da mdia. incio tipo TDias = ( Seg, Ter, Qua, Qui, Sex, Sab, Dom ); declare Prof a Sirlei Lourdes Bach Pg. 8 Vendas : vetor[ TDias ] real; Dia : TDias; Total, Media : real; { Leitura das vendas da semana } para Dia := Seg at Dom faa leia(Vendas[ Dia ]); fimpara; { Clculo da Mdia } Total := 0; para Dia := Seg at Dom faa Total := Total + Vendas[ Dia ]; fimpara; Media := Total / 7; escreva( Vendas Dirias Comparadas com a Mdia ); escreva(SEG TER QUA QUI SEX SAB DOM); para Dia := Seg at Dom faa escreva( Vendas[ Dia ]); fimpara; para Dia := Seg at Dom faa se (Vendas[Dia] > Media) ento escreva(acima) seno se (Vendas[Dia] < Media) ento escreva(abaixo) seno escreva (mdia); fimpara; fim. Exerccio 23) O que ser impresso pelo algoritmo abaixo? Considere que existem os cartes de dados com os valores. incio tipo semana = (seg, ter, qua, qui, sex, sab, dom); tipo dia til = seg: sex; tipo fimdesemana = sab; dom; tipo f = vetor[diatil] lgico; f: ausente; semana: DIA, DIAUX; fimdesemana: FOLGA; diatil: TRABALHO; leia (DIA); leia (AUSENTE[DIA]); se AUSENTE[DIA] ento escreva (`FALTOU', DIA); seno para DIAUX := sab at dom faa escreva (`TER FOLGA NO', DIAUX); fimpara; fim se; escolha DIA: caso: dom: escreva (`DOMINGO'); Prof a Sirlei Lourdes Bach Pg. 9 caso: seg: ter: qua: qui: sex: TRABALHO := DIA; caso: sab: escreva (`FOLGA'); seno escreva (`ERRO'); fim escolha; escreva (TRABALHO); fim. Prof a Sirlei Lourdes Bach Pg. 10 ) ESTR%T%RA #E #A#OS HETEROGNEAS @ sa7emos #ue um conjunto ,omo'%neo de dados composto por variveis do mesmo tipo primitivo- porm, se tivssemos um conjunto em #ue os elementos n$o s$o do mesmo tipo, teramos ent$o um conjunto ,etero'%neo de dados. Aeremos a'ora o tipo de dados regis$ro como um a'lomerado ,etero'%neo de dados, onde as componentes podem ser de tipos diferentes, ou seja, poderemos utilizar as diversas estruturas de dados j vistas com7inadas na estrutura de um re'istro. De%ini&'o( Be'istro um tipo de dado estruturado cujos elementos constituintes n$o precisam ser de mesmo tipo. !ssim, podemos tanto nos referir coletivamente a um conjunto de elementos #ue diferem entre si no tipo, #uanto a um elemento especfico do conjunto, denominado cam"o (o regis$ro. 1+emplificando( ;uma dada aplica$o pode"se ter os se'uintes dados de funcionrios de uma empresa /fi'. ).1 e ).20. 1m cada uma destas fi'uras, os dados est$o lo'icamente relacionados enter si, pois constituem as informaes cadastrais do mesmo indivduo. Cada conjunto de informaes do funcionrio pode ser referencivel por um mesmo nome, por e+emplo, >CC<!. Dais estruturas s$o con,ecidas como re'istros e aos elementos do re'istro d"se o nome de componentes ou campos. >i'. ).1 >i'. ).2 O conceito de re'istro visa facilitar o a'rupamento de variveis #ue n$o s$o do mesmo tipo, mas #ue 'uardam estreita rela$o l'ica. Be'istros correspondem a conjuntos de posies de memria con,ecidas por um mesmo nome e individualizados por identificadores associados a cada conjunto de Prof a Sirlei Lourdes Bach Pg. 11 posies. ;a varivel composta ,omo'%nea a individualiza$o de um elemento feita atravs de ndices, j no re'istro, cada componente /ou campo0 individualizado pela e+plicita$o de seu identificador. 3.1 DECLARAO DO TPO REGSTRO Criam"se estruturas de dados a'rupados na forma de re'istros atravs da se'uinte declara$o( Sintaxe 01 (genrica): declare lista-de-identificadores registro (campos) onde( lis$a)(e)i(en$i%ica(ores( s$o os nomes de est$o sendo associados aos re'istros #ue se deseja declarar- cam"os*com"onen$es( s$o declaraes eEou identificadores de variveis compostas, separados por vr'ula. regis$ro( uma palavra"c,ave. Sintaxe 02 (construindo tipos): ! declara$o do tipo re'istro, consiste da palavra reservada registro , se'uida de uma lista de campos, e terminando com a palavra reservada fimregistro , de acordo com a sinta+e a7ai+o( Sintaxe: tipo nome-do-tipo = registro tipo1 : campo1; tipo2 : campo2; ... tipoN : campoN; fim registro; nome-do-tipo : lista de variveis; Onde: ) nome-do-tipo um identificador do tipo registro construdo; ) campo consiste no nome associado a cada campo do registro; e ) tipo o tipo de dados do campo, podendo ser qualquer um dos tipos bsicos ou tipo anteriormente definido. Exemplo 1: Prof a Sirlei Lourdes Bach Pg. 12 tipo TReg = registro caracter : NOME ; real : SALRIO; inteiro : IDADE; lgico : SEXO; fim registro; TReg: REG; Dal especifica$o corresponde a defini$o de um modelo /TReg0 de um re'istro /a'lomerado ,etero'%neo de dados0 e a cria$o de uma rea de memria denominada B1F, #ue contm #uatro su7divises de tipos diferentes. Exemplo 02: tipo TNotas = vetor [1..3] de real; tipo Reg_Aluno = registro caracter : nome; inteiro : matrcula; Tnotas : notas; fimregistro; Reg_Aluno : PiorAluno, MelhorAluno; 3.2MANPULAO DE REGSTROS 3.2.1 Referncia aos Campos Os nomes dos campos de um re'istro s$o semel,antes aos ndices de um vetor. 1les permitem acessar individualmente cada informa$o. 3ara tal, colocamos o identificador da varivel do tipo registro ao #ual o campo pertence, se'uida de um ponto e finalmente o identificador do campo. Sintaxe identificador_do_registro.identificador_do_campo Exemplo( &upondo"se #ue o re'istro >CC<!, num dado instante, contivesse os valores da fi'ura ).2( >CC<!.;OG1, estaria se referenciando ao contedo do campo ;OG1 do re'istro >CC<!., isto , >ulano de Dal. >CC<!.1&D!4OHCCACI, estaria se referenciando ao contedo do campo Prof a Sirlei Lourdes Bach Pg. 13 1&D!4OHCCACI do re'istro >CC<!., isto , &olteiro. Exemplo incio tipo TNotas = vetor[1..3] de real; tipo Reg_Aluno = registro caracter : Nome; inteiro : Matricula; Totas : Notas; fimregistro; Reg!Al"no : Aluno1, Aluno2; inteiro : i; ... { Leitura dos campos de Aluno1 } leia( Aluno1.Nome, Aluno1.Matricula ); para i := 1 to 3 do leia( Aluno1.Notas[i] ); { Exibio dos campos de Aluno2 } escreva( Aluno2.Nome ); escreva ( Aluno2.Matricula ); para i := 1 to 3 do escreva( Aluno2.Notas[i] ); ... 3.3ATRBUO DE CAMPOS E REGSTROS { Atribuio campo a campo } Aluno1.Nome := Aluno2.Nome; Aluno1.Matricula := Aluno2.Matricula; para i := 1 at 3 faca Aluno1.Notas[i] := Aluno2.Notas[i]; { Atribuio do registro inteiro } Aluno1 := Aluno2; 3.4VETORES DE REGSTROS Guitas vezes encontramos um pro7lema no #ual temos #ue tra7al,ar com um conjunto de re'istros de mesmo tipo. 3ara tais pro7lemas, podemos utilizar uma estrutura de dados #ue com7ina vetores e registros. 3or e+emplo, supon,amos #ue temos uma classe com :0 alunos onde cada aluno representado pelo re'istro Reg_Aluno assim, podemos criar um vetor de :0 Prof a Sirlei Lourdes Bach Pg. 14 elementos, onde cada elemento do tipo Be'H!luno. Exemplos tipo TNotas = vetor[1..3] de real; tipo Reg_Aluno = registro caracter : Nome; inteiro : Matricula; Totas : Notas; fimregistro; VetClasse = vetor[ 1..50 ] de Reg_Aluno; delare: VetClasse : Classe; inteiro : i, j; Os registros dos 50 alunos poderiam ser lidos da seguinte forma: para i := 1 at 50 faa leia(Classe[i].Nome, Classe[i].Matricula ); para j := 1 at 3 faa leia(Classe[i].Notas[j] ); fimpara; Os registros dos 50 alunos poderiam ser exibidos da seguinte forma: para i := 1 at 50 faa escreva Classe[i].Nome, Classe[i].Matricula ); para j := 1 at 3 faa leia( Notas[j] ); fimpara; fimpara; ;as estruturas compostas ,omo'%neas /vetores e matrizes0 utilizamos tipos de dados primitivos como sendo os elementos dessas estruturas. !'ora utilizaremos como componente dessa estrutura n$o apenas um tipo primitivo, mas tam7m tipos construdos. &upondo #ue #uisssemos manter um re'istro de informaes relativas a passa'ens rodovirias de todos lu'ares de um Jni7us, utilizaramos um re'istro referente a cada poltrona /3!&&!F1G0, e para a'rupar todos eles utilizaramos um conjunto desses re'istros. Como possumos 88 lu'ares num Jni7us, numerados se#?encialmente de 1 at 88, podemos, para uni"los, criar um vetor no #ual cada posi$o um elemento de tipo construdo re'istro /3!&&!F1G0. Prof a Sirlei Lourdes Bach Pg. 15 ;mero( 00001 >umante(HHHHHHHHHHHHHH 4e(HHHHHHHHHHHHHHHHH 3ara(HHHHHHHHHHHHHHHHHH 4ata( HHHHHEHHHHEHHHHH <orrio( HHHHHHH( HHHHHH 3oltrona( HHHHHHHHHHHH 4istKncia( HHHHHHHHHHHHHLm Como possumos um vetor composto por re'istros, n$o podemos declarar esse vetor sem antes ter declarado seus elementos- devemos ent$o declarar primeiro o tipo construdo re'istro e depois o vetor. 1+emplos( a) tipo REGPASSAGEM = registro inteiro: NMERO; caractere : ORIGEM, DESTINO; caractere : DATA, HORRIO; inteiro : POLTRONA; real : DISTNCIA; lgico : FUMANTE; fimregistro; tipo VETPASSAGEM = vetor [1..44] de REGPASSAGEM; VETPASSAGEM : NIBUS; 70 4eclare um conjunto de re'istro #ue comporte as informaes de esto#ue de :00 produtos. tipo MATDIAS = matriz [1..4, 1..6] de inteiro; tipo REGPRODUTO = registro caractere: NOME; inteiro: CDIGO; real: PRECO; MATDIAS: BAIXA; fimregistro; tipo VETESTOQUE = VETOR [1..500] de REGPRODUTO; VETESTOQUE: PRODUTO; Prof a Sirlei Lourdes Bach Pg. 16 1 2 ) M M 88 3.5 MANPULAO !o acessar as informaes contidas em um conjunto de re'istros, procedemos utilizando o modo de acesso caracterstico de cada estrutura. 1+emplo( a0 &e #uisssemos sa7er a 7ai+a do dcimo produto, da terceira semana do m%s e do #uarto dia da semana, escreveramos( PRODUTO[10].BAIXA[3,4] 70 1la7ore o trec,o de um al'oritmo #ue imprima o total de movimenta$o do esto#ue para cada um dos :00 produtos( ... para n := 1 at 500 faa ACM := 0; para i:=1 at 4 faa para j:=1 at 6 faa ACM := ACM + PRODUTO[n].BAIXA[i,j]; fimpara; fimpara; escreva (PRODUTO[n].NOME, ACM); fimpara; 3.6EXEMPLO DO USO DE REGSTROS EST%#O #E CASO Pro*le'a Uma empresa deseja avaliar o desempenho de sua equipe de vendedores para otimizar a produo. Para isto, deseja que seja elaborado um programa com as seguintes especificaes. E!rada Para cada vendedor ser fornecido seu nome, a quantidade de tens vendidos no ms e a quantidade de tens devolvidos pelos clientes. Sa+da Como resultado dever ser impresso para cada vendedor alm dos dados lidos, a venda lquida (vendas menos devolues) e a diferena entre a venda lquida e a mdia das vendas lquidas. Sol,-.o As informaes sobre cada vendedor sero definidas com um registro do seguinte tipo: Prof a Sirlei Lourdes Bach Pg. 17 tipo Reg_Vendedor = registro caracter : Nome; inteiro : Vendas, Devolucoes, Liquido, Comparacao; fimregistro; Os dados como consistem de uma lista de vendedores, ser$o definidos como um vetor de re'istros Be'HAendedor. declare Vendedores : vetor [ 1.. NumVendedores ] de Reg_Vendedor; O pro'rama consiste 7asicamente das se'uintes partes( 1.Ler os dados 2.Calcular a venda lquida de cada vendedor 3.Calcular a mdia das vendas lquidas 4.Calcular a diferena da venda lquida de cada vendedor com a mdia 5.mprimir os resultados {Algoritmo que l as vendas e as devolues de um grupo de vendedores e imprime uma tabela mostrando para cada vendedor os dados lidos, a venda lquida e a comparao de sua venda lquida com a mdia das vendas.} incio constante NumVendedores = 20; tipo Reg_Vendedor = registro Nome : string(30); Vendas, Devolucoes, Liquido, Comparacao : inteiro; fim!registro; declare Vendedor : vetor [ 1..NumVendedores ] de Reg_Vendedor; Media, Soma, i : inteiro; { Leitura dos Dados } para I := 1 at NumVendedores faa com Vendedores[ i ] faa leia( Nome, Vendas, Devolucoes ); { Calculo das Vendas Liquidas e da Media das Vendas } Soma := 0; para i := 1 at NumVendedores faa com Vendedores[i] faa
Liquido := Vendas - Devolucoes; Soma := Soma + Liquido; fimcom; Media := Soma / NumVendedores; Prof a Sirlei Lourdes Bach Pg. 18 { Comparacao das vendas de cada vendedor com a media } para i := 1 at NumVendedores faa Vendedores[I].Comparacao := Vendedores[i].Liquido - Media; { Impresso dos Resultados } escreva(Resumo das Vendas); escreva(Nome Vendas Devol Liquido DifMedia ); para i := 1 at NumVendedores faa com Vendedores[i] faa escreva(Nome, Vendas, Devolucoes, Liquido, comparacao); #$. Exerccio 24) Declarar um registro CAD que tem a seguinte forma: ;OG1 1;41B1NO C3> &1OO <D ;!&CCG1;DO D1G413 onde endereo um re'istro contendo o nome da rua, nmero e cdi'o de endereamento postal. <D um vetor numrico de tr%s elemento e D1G413 uma varivel l'ica. Exerccio 25) Acesse o campo CEP do registro declarado no exerccio anterior. Exerccio 26) Dada a tabela a seguir: Cdi'o ;ome 1 0001 !I>!C!D1 2 000) !IGOO!BC>1 ) 000P !;!IC&D! 8 000Q !;DBO3RIOFO : 0010 SOGS1CBO P 0012 C!B3C;D1CBO 9 0018 GODOBC&D! ... .... ... 100 01** A1;414OB Escrever um algoritmo que, dados 100 CDGOS DE PROFSSO (fornecidos em 100 linhas) emita o NOME das profisses correspondentes. A tabela acima tambm deve ser lida. Exerccio 27) Em certo municpio, vrios proprietrios de imveis esto em atraso com o pagamento do imposto predial. Desenvolver um algoritmo que calcule e escreva o valor da multa a ser paga por esses proprietrios considerando Prof a Sirlei Lourdes Bach Pg. 19 que: os dados de cada imvel( identifica$o /caracter0, valor do imposto e nmero de meses em atraso- as multas devem ser calculadas a partir do valor do imposto e de acordo com a se'uinte ta7ela- Aalor do imposto T por m%s em atraso at BU :0,00 1 de BU :1,00 a BU 1Q0,00 2 de BU 1Q1,00 a BU :00,00 8 de :01,00 a BU 1.200,00 9 acima de BU 1.200,00 10 o ltimo re'istro lido, #ue n$o deve ser considerado, contm a identifica$o do imvel i'ual a vazio- na sada dever$o ser impressos( a identifica$o do imvel, valor do imposto, meses em atraso e a multa a ser pa'a. Prof a Sirlei Lourdes Bach Pg. 20 / AR0%IVOS =m ar#uivo um conjunto de re'istros , no #ual cada re'istro n$o ocupa uma posi$o fi+a dentro da estrutura, n$o possuindo portanto taman,o preesta7elecido. Os re'istros, como sa7emos s$o formados por unidades de informaes denominadas campos. =tilizaremos como e+emplo 7sico um ar#uivo de uma 7i7lioteca, na #ual todos os livros s$o catalo'ados por meio de um re'istro, compondo em seu conjunto um ar#uivo correspondente ao acervo da 7i7lioteca. Aejamos a fic,a de catalo'a$o de livros especificada( Cdi'o do livro(HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH Dtulo( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH !utor( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH !ssunto( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 1ditora( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH!no(HHHHHHHHHHHHHHHHHH ;esta fic,a, encontramos os dados referentes a um livro( Cdi'o, Dtulo, !utor, etc., #ue formam uma estrutura de dados denominada re'istro. Cdigo Ttulo Autor Assunto Editora Ano 12) +++ 5555 zzzz LLL 1**0 3erce7emos #ue a rela$o l'ica e+istente entre as informaes #ue refere a mesma o7ra- assim, se armazenssemos todas as fic,as de controle, formaramos o ar#uivo utilizado pela 7i7lioteca. !r#uivo de >ic,as Catalo'rficas 3odemos comparar este ar#uivo de fic,as com o ar#uivo, mvel de ao, #ue Prof a Sirlei Lourdes Bach Pg. 21 Cdi'o do livro( :8* Cdi'o do livro( 9:1 Cdi'o do livro( 8)P Cdi'o do livro( 12) Dtulo( +++ !utor( 555 !ssunto( zzz 1ditora( LLL !no( 1**0 possumos em uma 7i7lioteca. ;otamos tam7m #ue, como numa 7i7lioteca, as informaes do ar#uivo podem ser manipuladas por #ual#uer um dos funcionrios, independente da se#?%ncia de passos #ue cada um, em particular, utilize. Conclumos ent$o #ue um ar#uivo pode ser manipulado por al'oritmos diferentes. 4.1DECLARAO Aisto #ue um ar#uivo um conjunto de re'istros, precisamos definir o re'istro #ue compe o ar#uivo primeiro, para somente ent$o definir o ar#uivo. &e'undo nosso e+emplo, na 7i7lioteca cada livro representado por uma fic,a e esta implementada por um re'istro. tipo LIVRO = registro inteiro: CDIGO, ANO; caractere: TITULO, AUTOR, ASSUNTO, EDITORA; fimregistro; 3odemos ent$o definir o ar#uivo, se'undo a sinta+e a7ai+o( tipo IDENTIFICADOR = arquivo composto de <tipo>; IDENTIFICADOR : lista de variveis; Onde( IDENTIFICADOR V representa o nome do tipo ar#uivo- <tipo> V nome do tipo re'istro previamente definido- lista de variveis V variveis #ue ser$o do tipo ar#uivo definido- Prof a Sirlei Lourdes Bach Pg. 22 Completando toda a declara$o necessria para utilizarmos o ar#uivo, teramos( tipo LIVRO = registro inteiro: CDIGO, ANO; caractere: TITULO, AUTOR, ASSUNTO, EDITORA; fimregistro; tipo ARQLIVRO = arquivo composto de LIVRO; LIVRO: FICHA; ARQLIVRO: ACERVO; Onde( " LIVRO o identificador do tipo re'istro #ue formar o ar#uivo- " ARQLIVRO o identificador do tipo associado ao ar#uivo, formado pelos tipos de re'istro ICABO- " FICHA a varivel do tipo re'istro LIVRO- " ACERVO a varivel de ar#uivo ARQLIVRO. 4.1.1 Manipulao Feneralizando, podemos admitir #ue todo ar#uivo possui maneira semel,antes de ser manipulado, independentemente de como foi conce7ido. 1+emplificando, frente a um ar#uivo de livros de uma 7i7lioteca, voc% poderia Der apenas dois tipos de atitudes diferentes( a0 ;o caso de ser um leitor, voc% procura a informa$o da localiza$o de certo livro atravs das fic,as #ue re'istram o acervo. 70 Como funcionrio da 7i7lioteca, voc% intenciona acrescentar al'uma informa$o a respeito de al'um livro. Conclumos #ue podemos consultar eEou acrescentar al'uma informa$o ao ar#uivo. Demos, ent$o, al'oritmos 7sicos envolvidos nestas duas circunstKncias. Prof a Sirlei Lourdes Bach Pg. 23 !7rir a 'aveta do ar#uivo !c,ar fic,a procurada Copiar informaes da fic,a >ec,ar 'aveta do ar#uivo !c,ar posi$o de inser$o Fuardar fic,a nova >ec,ar 'aveta do ar#uivo !7rir a 'aveta do ar#uivo 1 2 ) 8 4.1.2 Abrindo um Arquivo ;$o se pode o7ter al'uma informa$o contida numa 'aveta sem antes a7ri"la. 1m nossos al'oritmos, isto ser feito atravs do se'uinte comando( abra (ARQUIVO); +n(e( !BW=CAO V representa o identificador da varivel de ar#uivo previamente definida. ;o nosso e+emplo( abra (ACERVO); !ps a e+ecu$o do comando de a7ertura, a fic,a #ue est . disposi$o ser sempre a primeira #ue foi nele armazenada. 4.1.3 Fechando um Arquivo ;$o devemos manter uma 'aveta a7erta depois de us"la, pois isso dei+aria seu contedo e+posto por a'entes e+ternos #ue poderiam danificar sua inte'ridade. 3or isso, convm sempre fec,ar os ar#uivos aps sua utiliza$o. feche (ARQUIVO); !BW=CAO V representa o identificador da varivel de ar#uivo previamente definida. ;o nosso e+emplo( feche (ACERVO); 4.1.4 Copiando um Registro ;um ar#uivo, n$o se devem retirar informaes, pois se assim fosse este se tornaria vazio rapidamente. 4evemos enfatizar #ue, via de re'ra, um ar#uivo n$o deve ser ,consumi(o- e sim consul$a(o, e, para tal, precisamos copiar o contedo #ue nos interessa em al'um lu'ar. =tilizamos para tal( Prof a Sirlei Lourdes Bach Pg. 24 copie (ARQUIVO, REGISTRO); - ARQUIVO V representa o identificador da varivel de ar#uivo previamente definida. - REGISTRO V representa o identificador de um re'istro de formato i'ual .#uele #ue compe o ar#uivo- ;o nosso e+emplo( copie (ACERVO, AUX); Wuem copia, copia de um lu'ar para outro lu'ar diferente. ;este comando copiam"se as informaes da posi$o corrente do ar#uivo para o re'istro especificado no comando, o #ual possui um formato id%ntico ao do re'istro #ue compe o ar#uivo. Bessaltamos #ue todos os campos do re'istro s$o copiados para os respectivos campos do re'istro esta7elecido no comando. 4.1.5Guardando um Registro 3ara 'uardarmos um re'istro no ar#uivo, faz"se necessrio #ue este possua estrutura$o de campos id%ntica . dos re'istros j armazenados, e ao mesmo tempo esteja completamente preenc,ido. 3ara efetuar esta opera$o, temos o comando( guarde (ARQUIVO, REGISTRO); " ARQUIVO V representa o identificador da varivel de ar#uivo previamente definida- " REGISTRO V representa o identificador de um re'istro de formato i'ual .#uele #ue compe o ar#uivo. 1+emplo( guarde (ACERVO, AUX); Wuem 'uarda, 'uarda al'uma coisa em al'um lu'ar- neste comando 'uarda"se sempre al'uma informa$o de dado re'istro para a posi$o atual do ar#uivo. 4.1.6Concepo Sequencial Wuando criamos um ar#uivo, utilizamos determinado padr$o de comportamento #ue esta7elece o modo pelo #ual os re'istros s$o armazenados no ar#uivo, isto , o al'oritmos esta7elece a estrutura$o do ar#uivo. Caso a 'rava$o dos Prof a Sirlei Lourdes Bach Pg. 25 re'istros /#ue n$o est$o em ordem0 no ar#uivo seja feita de forma contnua, um aps o outro, teremos esta7elecido uma circunstKncia de se#?%ncia no armazenamento dos re'istros, o7tendo um ar#uivo cuja concep$o dita se!"encial# ;estas circunstKncias, discorremos #ue a localiza$o de #ual#uer um dos re'istros #ue foi armazenado indeterminada, ou seja, para acessar um re'istro especfico precisamos o7edecer a sua ordem de 'rava$o, o #ue implica percorrer todos os re'istros #ue o antecedem. Como e+emplo de um ar#uivo de concep$o se#?encial, podemos utilizar uma lista particular de telefones, na #ual o usurio armazenou nomes e telefones das pessoas . medida #ue as con,eceu. &upondo #ue o usurio ten,a con,ecimento de mais uma pessoa, precisa portanto armazenar mais um telefone em sua lista. Como esta lista j possui al'uns nomes, #ue devido .s circunstKncias foram 'ravados um aps o outro, s possvel armazenar um telefone aps o ltimo re'istro /nome X telefone0 armazenado, o #ue nos leva ent$o a ter de desco7rir onde est o ltimo re'istro. 3ara tal, ser necessrio percorrer todos os re'istros do ar#uivo, a partir do primeiro, at encontrar o fim do ar#uivo, o #ue pode ser feito com o au+lio do comando( avance (ARQUIVO); 1ste comando posiciona o ar#uivo na posi$o consecutiva, ou seja, no pr+imo re'istro. &e utilizado repetidas vezes permite percorrer o ar#uivo passando por uma srie consecutiva de re'istros. 1 tam7m com o au+lio de( fda (ARQUIVO); 1sta instru$o retorna verdadeiro #uando a posi$o corrente o >im 4o !r#uivo, e falso em caso contrrio. O al'oritmo da a'enda telefJnica, para 'uardar um novo telefone, utilizando estes comandos, ficaria( inicio tipo PESSOA = registro caractere: NOME; inteiro: FONE; fimregistro; tipo PESSOAL = arquivo composto de PESSOA; PESSOA : AUX; PESSOAL: AGENDA; abra (AGENDA); repita avance (AGENDA); ate fda (AGENDA); Prof a Sirlei Lourdes Bach Pg. 26 leia (AUX.NOME, AUX.FONE) guarde (AGENDA, AUX); feche (AGENDA); fim. O7servamos #ue( " sempre #ue o comando !7ra e+ecutado, deparamo"nos com o primeiro conjunto de informaes armazenada, ou seja, a posi$o corrente do ar#uivo o primeiro re'istro- " somente podemos 'uardar o re'istro #uando este estiver completamente preenc,ido, o #ue neste caso foi 'arantido com um comando de leitura so7re am7os os campos- " o comando Fuarde armazenar todas as informaes contidas no re'istro /re'istro completo0 na posi$o corrente do ar#uivo, a #ual foi premeditadamante selecionada como a ltima posi$o do mesmo. &upondo, a'ora, #ue nosso usurio precise desco7rir o telefone de al'um previamente armazenado, novamente, por descon,ecer a posi$o no ar#uivo da informa$o procurada, teremos de vascul,ar o ar#uivo a partir do incio, em 7usca do re'istro #ue contm o nome da pessoa procurada, para desco7rir seu respectivo telefone. Dodavia, se todos os re'istros do ar#uivo tiverem sido c,ecados e, c,e'ando"se ao fim do ar#uivo, n$o foi possvel encontrar o nome procurado, conclumos #ue este n$o e+iste, ou seja, n$o foi re'istrado anteriormente. incio tipo PESSOA = REGISTRO caractere: NOME; inteiro: FONE; fimregistro; tipo PESSOAL = arquivo composto de PESSOA ; PESSOA: AUX; PESSOAL:AGENDA; caractere: NOMEPROCURADO; abra (AGENDA); leia (NOMEPROCURADO); repita copie (AGENDA, AUX); avance (AGENDA); at (AUX.NOME = NOMEPROCURADO) ou (fda (AGENDA)); se (AUX.NOME = NOMEPROCURADO) ento escreva (AUX.FONE); seno escreva (Telefone no registrado!!); fimse; feche (AGENDA); fim. Prof a Sirlei Lourdes Bach Pg. 27 O7servamos #ue( n$o possvel apenas avanar os re'istros, visto #ue precisamos verificar se o contedo de cada um deles o contedo esperado, por isso copia"se para um re'istro au+iliar cada um dos re'istros armazendos- mesmo precisando apenas do nome armazenado no ar#uivo para verificar o sucesso da pes#uisa, atravs do comando copie preenc,emos todo o re'istro au+iliar. &e al'um con,ecido j cadastrado na a'enda mudasse de telefone, teramos de localizar seu re'istro correspondente no ar#uivo, copiar o seu contedo num re'istro au+iliar e, em se'uida, alterar o campo fone de modo a atri7uir"l,e o novo nmero. Dendo num re'istro au+iliar as informaes atualizadas, 7asta 'rav"lo na mesma posi$o em #ue se encontrava antes, isto , 'ravar o re'istro atualizado /au+iliar0 Mpor cimaY do anti'o. incio tipo PESSOA = registro caracter : NOME; inteiro : FONE; fim registro; tipo PESSOAL = arquivo composto de PESSOA; PESSOA : AUX; PESSOAL : AGENDA; caracter : NOMEPROCURADO; inteiro : NOVOFONE; abra(AGENDA); leia(NOMEPROCURADO); copie(AGENDA, AUX); enquanto (AUX.NOME <> NOMEPROCURADO) e (no fda(AGENDA)) faa avance(AGENDA); copie(AGENDA, AUX); fim enquanto; se (AUX.NOME = NOMEPROCURADO) ento escreva AUX.NOME, possui fone, AUX.FONE; escreva Novo telefone:; leia(NOVOFONE); AUX.FONE NOVOFONE; guarde(AGENDA, AUX); seno escreva Telefone no registrado; fim se; Prof a Sirlei Lourdes Bach Pg. 28 feche(AGENDA); fim. O7servamos #ue( deve"se ter cuidado de n$o avanar a posi$o corrente depois de ter encontrado o re'istro, pois precisamos, aps a atualiza$o, re'rav"lo na mesma posi$o- til mostrar ao usurio #uais eram as informaes anteriores, visto #ue outra pessoa ou ele mesmo pode ter atualizado o telefone anteriormente. 4.1.7 CONCEPO DRETA !o criar um ar#uivo, podemos utilizar um al'oritmo #ue e+presse um padr$o de comportamento r'ido, com o o7jetivo de estruturar o ar#uivo para facilitar sua manipula$o. ! circunstKncia de armazenamento #ue perfaz esse al'oritmo a da localiza$o do re'istro dentro do ar#uivo ficar diretamente relacionada a uma informa$o constituinte deste, ou seja, atravs de um dos campos do re'istro podemos determinar o lu'ar onde este est 'uardado, podendo acess"lo de modo instantKneo, o7temos, ent$o, nestas circunstKncia, um ar#uivo de concep$o direta /ou randJmica0. Wuando utilizamos um ar#uivo de concep$o randJmica, podemos acessar um re'istro especfico diretamente, sem nos preocuparmos com sus antecessores, utilizando neste acesso o mesmo campo #ue determinou sua posi$o no ar#uivo no instante da 'rava$o. O campo #ue determina a posi$o do re'istro no ar#uivo denominado c$ave, pois a informa$o capaz de acessar o re'istro. ! c,ave determinada no al'oritmo deve ser nica, pois nunca podemos armazenar dois re'istros diferentes em uma mesma localiza$o. 1m um ar#uivo de concep$o direta, ao contrrio de um de concep$o se#?encial, os re'istros n$o ficam localizados na ordem em #ue s$o 'ravados, o #ue leva a entender #ue cada re'istro possui um lu'ar MreservadoY para ser 'uardado, lu'ar este indicado atravs da c,ave. 3ara e+emplificar um ar#uivo de concep$o direta, ima'inemos a situa$o de um professor #ue deseja armazenar informaes referentes a uma de suas turmas, como o nome do aluno e suas #uatro notas /7imestrais0. 3ara tal, ele utiliza como c,ave o Prof a Sirlei Lourdes Bach Pg. 29 cdi'o de c,amada do aluno, informa$o #ue tam7m faz parte inte'rante do re'istro e nica, ou seja, cada aluno possui seu nmero, n$o ,avendo possi7ilidade de nmeros i'uais. Z medida #ue o professor possui a nota de um aluno, precisa cadastr"la no ar#uivo, 'uardar suas informaes no lu'ar MreservadoY para esse re'istro. ! posi$o recon,ecida pela c,ave de acesso /cdi'o do aluno0 e, para #ue a posi$o corrente do ar#uivo passe a ser a indicada pela c,ave, utilizamos o comando( posicione (ARQUIVO, CHAVE); Onde( !BW=CAO( representa o identificador da varivel de ar#uivo previamente definida- C<!A1( um inteiro /constante ou varivel0 #ue indica a posi$o corrente desejada. Construindo o al'oritmo para fazer o cadastramento dos alunos, o7temos( incio tipo ALUNO = registro caractere : NOME; inteiro : NUMERO; real : N1, N2, N3, N4; fim registro; tipo SALA = arquivo composto de ALUNO; ALUNO : AUX; SALA : DIARIO; abra(DIARIO); repita leia(AUX.NUMERO, AUX.N1, AUX.NOME); se AUX.NUMERO > 0 ento AUX.N2 0; AUX.N3 0; AUX.N4 0; posicione(DIARIO, AUX.NUMERO); guarde(DIARIO, AUX); fim se; Prof a Sirlei Lourdes Bach Pg. 30 at AUX.NUMERO = 0; feche(DIARIO); fim. Onde podemos o7servar #ue( precisamos atri7uir ;1, ;2, ;) o valor 0 para #ue todos os campos a serem armazenados estejam preenc,idos- o comando posicione determina #ue a localiza$o no ar#uivo seja a determinada pelo nmero de c,amada, #ue a c,ave de acesso utilizada pelo professor. 3ara sa7er a nota de al'um aluno j cadastrado, 7astar ao professor procurar diretamente o conjunto de dados desse aluno no ar#uivo, ou seja, acessar o re'istro de forma instantKnea atravs de sua c,ave. incio tipo ALUNO = registro caractere : NOME; inteiro : NUMERO; real : N1, N2, N3, N4; fim registro; tipo SALA = arquivo composto de ALUNO; ALUNO : AUX; SALA : DIARIO; inteiro : NUMEROALUNO; abra(DIARIO); leia(NUMEROALUNO); posicione(DIARIO, NUMEROALUNO); copie(DIARIO, AUX); escreva AUX.NOME, possui nota, AUX.N1; feche(DIARIO); fim. O7servamos #ue( aps a e+ecu$o do comando posicione, o re'istro #ue est apto a ser manipulado o indicado pela c,ave ;=G1BO!I=;O fornecida anteriormente- utilizamos tam7m na sada de dados o nome do aluno, possi7ilidade 'erada por#ue #uando se copia um re'istro ocorre a passa'em de todos os campos. Outra possi7ilidade de utiliza$o de notas de aluno a altera$o de al'uma nota ou inclus$o de uma nova nota, realizada so7re os re'istros anteriormente 'ravados( Prof a Sirlei Lourdes Bach Pg. 31 incio tipo ALUNO = registro caractere : NOME; inteiro : NUMERO; real : N1, N2, N3, N4; fim registro; tipo SALA = arquivo composto de ALUNO; ALUNO : AUX; SALA : DIARIO; inteiro : NUMEROALUNO, QUALNOTA; real : NOTA; abra(DIARIO); leia(NUMEROALUNO, QUALNOTA); posicione(DIARIO, NUMEROALUNO); copie(DIARIO, AUX);
escolha QUALNOTA caso 1: NOTA AUX.N1; caso 2: NOTA AUX.N2; caso 3: NOTA AUX.N3; caso 4: NOTA AUX.N4; fim escolha escreva AUX.NOME, possui nota, QUALNOTA, =, NOTA; escreva Nova nota: ; leia(NOTA); escolha QUALNOTA caso 1: AUX.N1 NOTA; caso 2: AUX.N2 NOTA; caso 3: AUX.N3 NOTA; caso 4: AUX.N4 NOTA; fim escolha guarde (DIARIO, AUX); feche(DIARIO); fim. O7servamos #ue( ocorreu a li7erdade de escol,a em rela$o a #ual nota seria alteradaEcadastrada, o #ue levou . utiliza$o de duas selees de mltipla escol,a, no instante da leitura do re'istro e no instante da 'rava$o. Prof a Sirlei Lourdes Bach Pg. 32 4.2 ESTUDO DE CONCEPES Aimos #ue, dependendo das circunstKncias de cria$o, um ar#uivo pode ser conce7ido direta ou se#?encialmente, o #ue n$o o7ri'a necessariamente #ue ele seja sempre manipulado como foi conce7ido- em outras palavras, um ar#uivo conce7ido randomicamente pode ser acessado se#?encialmente, so7 certas condies especiais, assim como um ar#uivo conce7ido se#?encialmente pode ser acessado diretamente se for necessrio. 4.2.1 ARQUVO DRETO ACESSADO SEQENCALMENTE =m ar#uivo conce7ido randomicamente passou por um certo planejamento, #ue antecedeu sua cria$o, onde foi definida a c,ave de acesso do ar#uivo. Caso esse planejamento ten,a sido inade#uado, pode permitir #ue surja a necessidade de se o7ter informa$o do ar#uivo a partir de um campo n$o"c,ave. ;esta circunstKncia n$o possvel acessar diretamente o re'istro procurado, pois n$o se sa7e sua posi$o. !ssim, teremos de forar uma 7usca se#?encial no ar#uivo de concep$o randJmica. Como e+emplo, ima'inemos uma faculdade #ue foi inau'urada em 1*Q0 e #ue utiliza como c,ave o Be'istro Feral /da Carteira de Cdentidade0 de seus alunos num re'istro( BF(HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;mero de Gatrcula( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;ome( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH Curso( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;acionalidade( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;aturalidade( HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 4ata de ;ascimento( HHHHEHHHHEHHHHHHHH &e o ar#uivo foi corretamente conce7ido, permitir o acesso atravs de um posicionamento como o au+lio da c,ave BF. 3orm, a coordena$o dessa entidade somente identifica seus alunos atravs de seus respectivos nmeros de matrcula e, nesta circunstKncia, caso #ueira o7ter informaes so7re al'um aluno a partir de seu nmero de matrcula, ter de fazer uma 7usca se#?encial no ar#uivo conce7ido randomicamente. Prof a Sirlei Lourdes Bach Pg. 33 incio tipo ALUNO = registro caracter: NOME, CURSO, NAC, NAT; inteiro: RG, MAT, DATANASC; fim registro tipo FACULDADE = arquivo composto de ALUNO; ALUNO: AUX; FACULDADE: FLOG; inteiro: MATPROCURADA; abra(FLOG); leia(MATPROCURADA); copie(FLOG, AUX); enquanto (AUX.MAT <> MATPROCURADA) e (no fda(FLOG)) faa avance(FLOG); copie(FLOG, AUX); fim enquanto; se AUX.MAT = MATPROCURADA ento escreva AUX.MAT, AUX.NOME; seno escreva Aluno no registrado; fim se; feche(FLOG); fim. Com o decorrer do tempo, pode tornar"se mais usual o acesso a este ar#uivo via nmero de matrcula, #uando cairia em desuso o seu acesso direto do modo como fora planejado. ;essa ocasi$o, seria mel,or MconverterY o ar#uivo conce7ido da forma anti'a para outro conce7ido randomicamente atravs da c,ave nmero de matrcula. ;essa faculdade, os cdi'os de matrcula s$o estruturados de modo #ue dos sete d'itos desse cdi'o os #uatro primeiros representem o ano de matrcula /1*Q0, 1**0, 1**:, 20000 e os tr%s restantes, um nmero se#?encial para as *00 matrculas de cada ano. &e fJssemos armazenar o primeiro aluno matriculado, ele seria re'istrado na posi$o 1.*Q0.001 do ar#uivo, fazendo"se necessrio dei+ar inutilizadas as 1.*Q0.000 primeiras posies. 3odemos otimizar este espao de armazenamento, su7traindo 1.*Q0.000 do nmero de matrcula, como vemos em parte do al'oritmo de Mconvers$oY. Prof a Sirlei Lourdes Bach Pg. 34 incio tipo ALUNO = registro caracter: NOME, CURSO, NAC, NAT; inteiro: RG, MAT, DATANASC; fim registro tipo FACULDADE = arquivo composto de ALUNO; ALUNO: AUX; FACULDADE: FLOG, NOVO; inteiro: POS; abra(FLOG); abra(NOVO); repita copie(FLOG, AUX); POS AUX.MAT - 1980000; posicione(NOVO, POS); guarde(NOVO, AUX); avance(FLOG); at fda(FLOG); feche(FLOG); feche(NOVO); fim. 8.4.2 ARQUVO SEQENCAL ACESSADO RANDOMCAMENTE: ARQUVO NDEXADO =m ar#uivo conce7ido se#?encialmente foi preenc,ido na mesma se#?%ncia em #ue as informaes foram sur'indo. Csto por defini$o, condena"o a 'ravar ou ler informaes se#?encialmente, o #ue se tornaria inconveniente se este ar#uivo crescesse muito e se a #uantidade de acessos fosse muito fre#?ente. 3orm, essa situa$o pode ser contornada atravs de um ar#uivo conce7ido se#?encialmente /ou n$o0 de menor porte /o #ue facilita a 7usca se#?encial0, #ue possui ar#uivada em cada re'istro a posi$o onde encontrar cada re'istro ori'inal, ou seja, como uma enciclopdia /n$o"alfa7tica0 #ue possui um volume de ndices, no #ual est$o relacionados em ordem alfa7tica os assuntos e lo'o ao lado o volume e a p'ina de onde encontr"los, Macessando"os randomicamenteY. 4essa forma, o novo ar#uivo criado denominado ar#uivo de ndices, e o Prof a Sirlei Lourdes Bach Pg. 35 ar#uivo ori'inal /conce7ido se#?encialmente0 c,amado de ar#uivo inde+ado, #ue atravs do ndice fornecido pelo ar#uivo de ndices pode ser acessado diretamente. Como e+emplo, tomemos a situa$o de uma empresa fundada em 1*Q:, #ue re'istra seus funcionrios . medida #ue s$o contratados, tendo portanto, a circunstKncia de concep$o de ar#uivo se#?encial possuindo o se'uinte re'istro( ;ome( HHHHHHHHHHHHHHHHHHHHHHHHHH ; o Carteira 3rofissional( HHHHHHHHHHHH 1ndereo( HHHHHHHHHHHHHHHHHHHHHHHHHHH C3>( HHHHHHHHHHHHHHHHHHHHHHH Delefone( HHHHHHHHHHHHHHH Sairro( HHHHHHHHHHHHHHHHHH C13( HHHHHHHHHHH 4ata de !dmiss$o( HHHHHHHHHHHHHHHHH 4ata de 4emiss$o( HHHHHHHHHHHHHHH 1stado Civil( HHHHHHHHHHHHHHHHHHHHH ; o de 4ependentes( HHHHHHHHHHHHHHH &alrio"Sase( HHHHHHHHHHHHHHHHHHHH Car'o( HHHHHHHHHHHHHHHHHHHHHHHHHH O cdi'o do funcionrio estruturado, sendo #ue, dos cinco d'itos #ue o compem, os dois primeiros representam o ano de admiss$o, os dois se'uintes o setor e um ltimo um se#?encial do setor, #ue n$o fazia parte do ar#uivo anti'o. 3retende"se utilizar um ar#uivo inde+ado #ue utilize como c,ave o cdi'o do funcionrio su7trado de Q:.000- assim, o funcionrio Q:.001 est armazenado na posi$o 1, o Q:.002 na posi$o 2, e assim por diante. Cdi'o 3osi$o ;ome 1ndereo ..... Car'o 1 Q:001 2 1 OO[ DBF= ... 1BC=\ 2 Q:002 ) 2 <@= 4II4 ... \=\=@ ) Q:00) m ) ]@= IOCO ... >4&\D 8 Q:008 1 8 @=< 41>& ... =\DO3 : Q:00: 8 : >&[ &[W! ... 3IG^G
n ttttt : m ]>] >@&4 ... \D1FC 1+emplificando uma utiliza$o, vejamos um al'oritmo de consulta ao ar#uivo inde+ado( incio tipo REGFUNC = registro caracter: NOME, CARGO, END, BR, DA, DD; inteiro: CPF, TEL, CEP, ND, CP; real: SAL; lgico: SLRO; fim registro; tipo REGCOD = registro Prof a Sirlei Lourdes Bach Pg. 36 inteiro: POSICAO; fim registro; tipo FUNCIONARIO = arquivo composto de REGFUNC; tipo CODIGO = arquivo composto de REGCOD; FUNCIONARIO: CADFUNC; CODIGO: ARQCOD; REGFUNC: AUX1; REGCOD: AUX2; caracter: CODPROCURADO; abra(CADFUNC); abra(ARQCOD); leia(CODPROCURADO); se CODPROCURADO < 85000 ento escreva Cdigo Invlido; seno posicione(ARQCOD, CODPROCURADO-85000); copie(ARQCOD, AUX2); posicione(CADFUNC, AUX2.POSICAO); copie(CADFUNC, AUX1); escreva AUX1.NOME, AUX1.CARGO; fim se; feche(CADFUNC); feche(ARQCOD); fim. 4.3ARQUVOS NA LNGUAGEM PASCAL 1m 3ascal estruturas de dados manipuladas fora do am7iente do pro'rama s$o con,ecidas como ar#uivos. Considera"se como am7iente do pro'rama a memria principal, onde nem sempre possvel ou conveniente manter certas estruturas de dados. =m ar#uivo, armazenado num dispositivo de memria secundria, como discos e dis#uetes, pode ser lido ou escrito por um pro'rama atravs de re'istros. !ntes de se declarar ar#uivos em um pro'rama, deve ser declarar primeiramento o seu tipo. !s formas das declaraes a se'uinte( type identificador-do-tipo = file of tipo; lista-de-identificadores : identificador-do-arquivo; Prof a Sirlei Lourdes Bach Pg. 37 t%pe uma palavra-chave; identificador-de-tipo o identificador associado ao novo tipo; file of so palavras reservadas; tipo o tipo a que pertencem os registros do arquivo; lista-de-identificadores so nomes associados aos arquivos. 1+emplo( !proveitando a declara$o do tipo cadastro acima, a7ai+o se'uem e+emplos de sua utiliza$o com ar#uivos. type endereco = record rua : string[40]; numero : integer; CEP : real; end; type cadastro = record nome : string[30]; ender : endereco; CPF: real; Sexo : char; nascimento : real; rg : real; end; arqcad = file of cadastro; var arquivo : arqcad; ou tambm pode ser direto arquivo2 : file of cadastro; 4.3.1Operaes com Arquivos (Pascal) !s operaes 7sicas realizadas so7re um ar#uivo s$o a7ertura, leitura, escrita e fec,amento. ! a%ertura de ar#uivos corresponde . a$o de se associar o ar#uivo declarado no pro'rama com o ar#uivo fsico. O primeiro re'istro do ar#uivo fica disponvel para leitura atravs do se'uinte comando( reset(nome-do-arquivo); Caso o ar#uivo j e+ista, para comear a escrever novamente no ar#uivo, i'norando"se os re'istros anteriores, utiliza"se o se'uinte comando( Prof a Sirlei Lourdes Bach Pg. 38 re&rite(nome-do-arquivo); O nome"do"ar#uivo o identificador do ar#uivo no pro'rama. 3ara se fazer uma associa$o desta identifica$o interna com a identifica$o e+terna, usa"se o comando assign, cuja forma ( assign(nome-do-arquivo,'nome-externo'); nome"e+terno o nome pelo #ual o ar#uivo con,ecido e+ternamente ao pro'rama. O comando assign deve anteceder a a7ertura do ar#uivo e nunca deve ser utilizado #uando o ar#uivo j estiver sendo manipulado. O fec,amento do ar#uivo desvincula o ar#uivo do pro'rama, atualizando as informaes do ar#uivo no am7iente do sistema operacional. 3ara se fec,ar um ar#uivo, usa"se o comando( close(nome-do-arquivo); 3ara ler um ar#uivo, ou seja ler o seu contedo, utilizado o se'uinte comando( read(nome-do-arquivo,registro); 1sse comando l% o contedo do re'istro corrente do ar#uivo associado . nome"do"ar#uivo e armazena"o em na varivel re'istro, #ue deve ser do mesmo tipo do ar#uivo. !ps a e+ecu$o desse comando, o re'istro corrente lido, e o pr+imo passa a ser o re'istro corrente. 3ara escrever em um ar#uivo, utilizado o se'uinte comando( &rite(nome-do-arquivo,registro); 1sse comando, #uando e+ecutado, 'rava no re'istro corrente do ar#uivo associado . nome"do"ar#uivo o contedo da varivel re'istro. =sando somente os comandos read e &rite, os re'istros est$o acessveis somente se#uencialmente, ou seja, um re'istro ser acessado somente aps todos os seus anterioes sejam acessados. _ possvel acessar um re'istro #ual#uer do ar#uivo diretamente, desde #ue se sai7a a sua posi$o fsica no ar#uivo. 1sse tipo de acesso conse'uido pelo comando( see'(nome-do-arquivo,n); Prof a Sirlei Lourdes Bach Pg. 39 Com esse comando possvel acessar o n"simo re'istro do ar#uivo associado . nome"do"ar#uivo, caso n seja menor #ue o nmero de re'istros do ar#uivo. O primeiro re'istro o de nmero 0 /zero0. 3ara se o7ter o nmero de re'istros de um ar#uivo, utiliza"se o comando( filesi(e(nome-do-arquivo); Com a utiliza$o dos comandos see' e filesi(e temos um outro tipo de or'aniza$o ou acesso aos ar#uivos( a or'aniza$o direta. ;este caso temos #ue escol,er uma c,ave para inde+ar os re'istros, ou seja, essa c,ave ser utilizada para indicar em #ue posi$o no ar#uivo um re'istro ser armazenado. 1+emplo( program sequencial; t%pe endereco = record rua : string[40]; numero : integer; CEP : real; end; cadastro = record nome : string[30]; ender : endereco; CPF: real; Sexo : char; nascimento : real; rg : real; end; arqcad = file of cadastro; var arq_in, arq_out : arqcad; reg: cadastro; )egin assign(arq_out,'sample.dat'); {associando nome interno com nome externo} rewrite(arq_out); {abrindo arquivo para gravao} write('Nome: '); readln(reg.nome); &*ile (reg.nome <> 'fim') do )egin write('Rua: '); readln(reg.ender.rua); write('Numero: '); readln(reg.ender.numero); write('CEP: '); readln(reg.ender.CEP); write('CPF: '); readln(reg.CPF); write('Sexo(M/F): '); readln(reg.Sexo); write('Data de Nascimento(dd/mm/aaaa): '); readln(reg.nascimento); write('RG: '); readln(reg.rg); Prof a Sirlei Lourdes Bach Pg. 40 write(arq_out,reg); {grava registro aps o ltimo registro do arquivo} readln(reg.nome); end; close(arq_out); assign(arq_in,'sample.dat'); {associando nome interno com nome externo} reset(arq_in); {abrindo arquivo para leitura} read(arq_in,reg); &*ile (not EOF(arq_in)) do )egin write(reg.ender,rua,' '); write(reg.ender.numero,' '); write(reg.ender.CEP,' '); write(reg.CPF,' '); write(reg.Sexo,' '); write(reg.nascimento,' '); writeln(reg.rg,' '); end; writeln('O nmero de registros do arquivo : ',filesi(e(arq_in)); end. O pro'rama a se'uir e+emplifica a utiliza$o dos comando see'. ;este caso assumimos #ue as c,aves est$o no intervalo entre 1 e 100. program acesso_direto; t%pe endereco = record rua : string[40]; numero : integer; CEP : real; end; cadastro = record chave : integer; nome : string[30]; ender : endereco; CPF: real; Sexo : char; nascimento : real; rg : real; end; arqcad = file of cadastro; tammax = 100; var arq_out : arqcad; reg : cadastro; )egin assign(arq_out,'sample.dat'); {associando nome interno com nome externo} rewrite(arq_out); {abrindo arquivo para gravao} write('Chave: '); readln(reg.chave); &*ile (reg.chave <> 0) do )egin if (reg.chave >= 1) and (reg.chave <= 100) t*en Prof a Sirlei Lourdes Bach Pg. 41 )egin write('Nome: '); readln(reg.nome); write('Rua: '); readln(reg.ender.rua); write('Numero: '); readln(reg.ender.numero); write('CEP: '); readln(reg.ender.CEP); write('CPF: '); readln(reg.CPF); write('Sexo(M/F): '); readln(reg.Sexo); write('Data de Nascimento(dd/mm/aaaa): '); readln(reg.nascimento); write('RG: '); readln(reg.rg); seek(arq_out,chave-1); write(arq_out,reg); { grava registro aps o ltimo registro do arquivo} end else )egin writeln('Chave deve estar no intervalo [1,100].'); end; write('Chave: '); readln(reg.chave); end; close(arq_out); end. Exerccio 28) Fazer um programa para ler registros com os campos nome, endereo, telefone, e-mail, salrio, e armazen-los em um arquivo. Observao: o ultimo registro possui o campo nome igual a "fim". Exerccio 29) Fazer um programa para ler os dados do arquivo criado no exerccio anterior e guardar em um outro arquivo (tipo texto) o nome e o salrio de cada um e o valor total dos salrios. Exerccio 30) Cadastrar n funcionrios de uma empresa e, depois disso, verificar se os n funcionrios foram cadastrados. Necessrio para o cadastramento: nome, cdigo e endereo. Exerccio 31) Fazer um procedimento, que utilize o arquivo de funcionrios criado no exerccio anterior, que imprima a segunda metade do arquivo. Exerccio 32) Usando registro(Record, consequentemente Arquivo), faca um programa que : a) Armazene a seguinte informao do usurio EM UM ARRAY: - cdigo (inteiro) - nome (comprimento 30) Prof a Sirlei Lourdes Bach Pg. 42 - idade (inteiro) - sexo (M= masculino, F= Feminino) - endereo (comprimento 50) - telefone (comprimento 10) b) mprima toda as informaes dos usurios existentes no array c) mprimir toda a informao da pessoa que possui a menor idade d) Ordene o array pelo campo cdigo Prof a Sirlei Lourdes Bach Pg. 43 1 T2CNICAS #E PROGRAMA34O 5.1 ALGORTMOS COM QUALDADE 5.1.1 Regras para uma boa programao .lgori$mos (e/em ser %ei$os "ara serem li(os "or seres humanos( Den,a em mente #ue seus al'oritmos dever$o ser lidos por outras pessoas /e por voc% mesmo0 de tal forma #ue possam ser corri'idos, rece7er manuten$o e ser modificados. Escre/a os comen$#rios no momen$o em 0ue es$i/er escre/en(o o algori$mo( =m al'oritmo n$o documentado um dos piores erros #ue um pro'ramador pode cometer e sinal de amadorismo. Como o o7jetivo de se escrever comentrios facilitar o entendimento do al'oritmo, eles dever ser t$o 7em conce7idos #uanto o prprio al'oritmo. 1 a mel,or maneira de se conse'uir isso escrev%"lo nos momentos de maior intimidade com os detal,es, ou seja, durante a resolu$o do pro7lema. +s comen$#rios (e/er'o acrescen$ar alguma coisa; n'o a"enas "ara %rasear os coman(os( O conjunto de comandos nos diz o #ue est sendo feito- os comentrios dever$o dizer "or 0u1. 2se comen$#rios no "r3logo( Dodo al'oritmo ou procedimento dever ter comentrios no seu prlo'o para e+plicar o #ue ele faz e fornecer instrues para seu uso. !l'uns destes comentrios seriam( a0 =ma descri$o do #ue faz o al'oritmo- 70 Como utiliz"lo- c0 1+plica$o do si'nificado das variveis mais importantes- d0 1struturas de dados utilizadas- Prof a Sirlei Lourdes Bach Pg. 44 e0 Os nomes de #uais#uer mtodos especiais utilizados, juntamente com refer%ncias nas #uais mais informaes possam ser encontradas- f0 !utor- e '0 4ata de escrita. 2$ili4e es"a&os em branco "ara melhorar a legibili(a(e( 1spaos em 7ranco, inclusive lin,as em 7ranco, s$o valiosssimos para mel,orar a apar%ncia de um al'oritmo. 3or e+emplo( a0 4ei+ar uma lin,a em 7ranco entre as declaraes e o corpo do al'oritmo- 70 4ei+ar uma lin,a em 7ranco antes e outra depois de um comentrio- c0 &eparar 'rupos de comandos #ue e+ecutam funes l'icas distintas por uma ou mais lin,as em 7ranco- d0 =tilizar 7rancos para indicar preced%ncia de operadores. !o invs de M! X S ` CY mais a'radvel a forma M! X S`CY. Escolha nomes re"resen$a$i/os "ara suas /ari#/eis( Os nomes das variveis dever$o identificar, o mel,or possvel, as #uantidades #ue elas representam. 3or e+emplo, O \ X ^ muito menos claro #ue 3B1NO C=&DO X I=CBO. =ma sele$o ade#uada de nomes de variveis o princpio mais importante da le'i7ilidade de al'oritmos. 2m coman(o "or linha 5 su%icien$e( ! utiliza$o de vrios comandos por lin,a prejudicial por vrias razes, dentre as #uais destacam"se( a0 O al'oritmo fica mais ile'vel- 70 O al'oritmo fica mais difcil de ser depurado. 1+emplo( A 14.2; I 1; enquanto I < 10 faa X X + 1; K I * K; I I + 1; fim enquanto; O mesmo e+emplo com cada comando em uma lin,a( A 14.2; Prof a Sirlei Lourdes Bach Pg. 45 I 1; enquanto I < 10 faa X X + 1; K I * K; I I + 1; fim enquanto; Caso desejssemos incluir um novo comando dentro do en0uan$o, no primeiro caso ser necessrios rescrever toda a lin,a. 2$ili4e "ar1n$eses "ara aumen$ar a legibili(a(e e "re/enir)se con$ra erros( 1+emplo( Com poucos par%nteses Com par%nteses e+tras ! ` S ` CE/4 ` 1 ` >0 ! ` SEC ` 4E1 ` > ! `` S `` C !ESECE4 O a \ ou W ! X S b C /! ` S ` C0 E /4 ` 1 ` >0 ///! ` S0E/C0 ` 40E10 ` > /! `` S0 `` C //!ES0EC0E4 /O a \0 ou W /! X S0 b C 2$ili4e ,in(en$a&'o- "ara mos$rar a es$ru$ura l3gica (o algori$mo( ! indenta$o n$o deve ser feita de forma catica, mas se'undo certos padres esta7elecidos. 6embre)se: $o(a /e4 0ue %or %ei$a uma mo(i%ica&'o no algori$mo, os comen$#rios associa(os (e/em ser al$era(os, e n'o a"enas os coman(os( !ntes n$o comentar do #ue dei+ar um comentrio errado. 1+emplos de trec,os de al'oritmos mal escritos e a anlise das re'ras de pro'rama$o violadas ser$o apresentados a se'uir. 1m al'uns casos, o al'oritmo e#uivalente, com #ualidade ser apresentado. SOMA 0; {Atribui o valor 0 varivel SOMA} I 1; {Atribui o valor 1 varivel I} enquanto I < 18 faa {Enquanto I no ultrapassar o valor SOMA SOMA + I; {18, ser atribudo o valor da ex- I I + 1; {presso SOMA + I varivel SOMA e o {valor de I ser incrementado de 1 Prof a Sirlei Lourdes Bach Pg. 46 fim enquanto escreva (SOMA); {imprime o valor de SOMA} O al'oritmo acima fere principalmente a re'ra n o ). 1le deveria ser escrito para ser considerado Mde #ualidadeY da se'uinte maneira( incio {faz a soma dos nmeros inteiros de 1 a 18} {Autor: EU - data: 01/01/2000} inteiro : SOMA, { o somatrio} I; {nmero inteiro gerado} SOMA 0; I 0; enquanto (I < 18) faa {gera os nmeros inteiros e calcula} SOMA SOMA + I; {o somatrio} I I + 1; fim enquanto; fim. 5.1.2 METODOLOGA DE DESENVOLVMENTO DE ALGORTMOS =ma das dificuldades naturais de um iniciante em pro'rama$o comear a desenvolver um al'oritmo para resolver um dado pro7lema. Os passos se'uintes, se se'uidos, podem au+iliar nesta tarefa( 3asso 1( leia cuidadosamente a especifica$o do pro7lema at o final. /fazer anotaes0 ENTENDEU falso; VEZES 0; 3asso 2( enquanto no ENTENDEU faa se VEZES <= 4 ento leia a especificao at o final; VEZES VEZES + 1; seno pergunte ao professor ou a quem especificou o problema at entender; ENTENDEU verdadeiro; fim se; fim enquanto; Prof a Sirlei Lourdes Bach Pg. 47 3asso )( Ievantar e analisar todas as sadas e+i'idas na especifica$o do pro7lema. /impresses0 3asso 8( Ievantar e analisar todas as entradas citadas na especifica$o do pro7lema. /leituras0 3asso :( Aerificar se necessrio 'erar valores internamente ao al'oritmo e levantar as variveis necessrias e os valores iniciais de cada uma. /comentar0 3asso P( Ievantar e analisar todas as transformaes necessrias para, dadas as entradas e valores 'erados internamente, produzir as sadas especificadas. /comentar0 3asso 9( Destar cada passo do al'oritmo, verificando se as transformaes intermedirias e+ecutadas est$o conduzindo aos o7jetivos desejados. =tilizar, sempre #ue possvel valores de teste #ue permitam prever os resultados a "riori. /comentar0 3asso Q( >azer uma reavalia$o 'eral, ela7orando o al'oritmo atravs da inte'ra$o das partes. /rever comentrios0 Z medida #ue o leitor v ad#uirindo maior amadurecimento na confec$o de al'oritmos, vrios dos passos descritos v$o sendo feitos automaticamente. Becomenda" se #ue no incio do aprendizado e #uando se tratar de pro7lemas mais comple+os, os passos sejam se'uidos formalmente. 5.2 O DESENVOLVMENTO TOP-DOWN !ntes de escrever um pro'rama, de fato sempre necessrio um processo de raciocnio, #ue leva de uma anlise do pro7lema dado, passando por um al'oritmo em termos 'erais at um al'oritmo detal,ado, #ue consiste em uma se#?%ncia de passos simples #ue podem ser diretamente e+pressados em termos de comandos numa lin'ua'em de pro'rama$o. ;a pro'rama$o estruturada as diferentes fases deste processo de concep$o Prof a Sirlei Lourdes Bach Pg. 48 de um pro'rama s$o fi+adas e+plicitamente por escrito, e n$o s V como uso comum V o produto final( o pro'rama na forma em #ue ser su7metido . m#uina. O7temos no final n$o somente um pro'rama /na lin'ua'em #ue foi escol,ida para a codifica$o0, mas tam7m uma documenta$o de todo o processo de solu$o do pro7lema. 3ara as estruturas de dados usamos i'ualmente representaes a7stratas de acordo com as necessidades do pro7lema, #ue v$o sendo refinadas at c,e'ar . representa$o implementvel na lin'ua'em de pro'rama$o. Csso permite desenvolver passo a passo o al'oritmo"solu$o e as estruturas de dados em termos das cate'orias relevantes ao pro7lema, e n$o das peculiaridades de uma lin'ua'em de pro'rama$o. Cada nova fase desse desenvolvimento Mde cima para 7ai+oY o7tida por MrefinamentoY da fase anterior, at c,e'ar a um nvel de detal,amento #ue permita implementar o al'oritmo diretamente na lin'ua'em de pro'rama$o. 5.3 PROGRAMAO MODULAR !t o momento as estruturas de controle /se#?%ncia, sele$o e repeti$o0 de um al'oritmo definia"o como um 7loco l'ico /incio e fim0. Z medida #ue os pro7lemas a serem solucionados se tornam mais comple+os, ou seja, apresentam uma variedade maior de situaes diferentes a serem resolvidas, temos, ent$o, uma srie de pe#uenos pro7lemas, cujas respectivas solues inte'rar$o o conjunto de aes definitivo. Wuando tal conjunto de aes construdo, podemos nos deparar literalmente com um amontoado de aes #ue afetam a le'i7ilidade por#ue n$o ficam claras e concisas as pe#uenas partes l'icas #ue solucionam cada pe#ueno pro7lema, o #ue dificulta a assimila$o desta constru$o por outras pessoa, alm de invia7ilizar uma perfeita coes$o interna do al'oritmo. Godulariza$o a tcnica #ue com7ate tais circunstKncias e e+plicita as pe#uenas solues. 5.3.1 MDULOS Gdulos s$o 7locos l'icos de um al'oritmo #ue visam aumentar a funcionalidade das partes do conjunto solu$o. Prof a Sirlei Lourdes Bach Pg. 49 5.3.2 BLOCOS =m 7loco consiste em um conjunto de declaraes e comandos delimitados pelas palavras incio e fim. 5.3.3 DECLARAO 3ara modularizar um al'oritmo necessitamos de uma sinta+e para e+pressar esta nova estrutura compreendida por mdulos. 1sta sinta+e ser vista mais tarde, uma vez #ue o mdulo pode assumir mais de uma forma. ;este momento importante sa7er #ue ao mdulo atri7udo um nome /Cdentificador0. 4e certo modo, precisamos uniformizar determinado conjunto de aes afins #ue o7edeam a mesma estrutura$o de um al'oritmo com o7jetivo de representar um 7loco l'ico em especial. OS&( a0 Wuando construmos um mdulo estamos construindo um al'oritmo em instKncia menor, ou seja, um pe#ueno conjunto solu$o praticamente independente. 70 1ste su7"al'oritmo pode inclusive utilizar outros mdulos. c0 Com o empre'o de su7"al'oritmos utilizados especificamente para resolver pro7lemas pe#uenos, aumentou"se o 'rau de clareza, facilitando a compreens$o de cada parte isoladamente, assim como o relacionamento entre elas. 5.3.4 MANPULAO ! ativa$o de um mdulo ocorre #uando um determinado ponto do al'oritmo contm o identificador #ue foi usado na defini$o do mdulo, o #ue con,ecido por Mc,amadaY ou Mativa$oY do mdulo #ue por sua vez representa a e+ecu$o das aes deste na#uele trec,o do al'oritmo. 5.3.5 ESCOPO DE VARVES Dodas as variveis utilizadas no al'oritmo e #ue encontram"se declaradas no seu incio, tornam"se possveis de aplica$o por #ual#uer mdulo inte'rante. 1stas variveis s$o denominadas 'lo7ais. 1m al'uns casos uma determinada varivel Prof a Sirlei Lourdes Bach Pg. 50 utilizada apenas por um mdulo especfico, o #ue n$o justifica uma defini$o 'lo7al, pois somente se fazem necessrios o con,ecimento e a utiliza$o dessa varivel dentro dos limites desse 7loco l'ico. 1sta situa$o ocorre #uando a varivel declarada internamente ao mdulo e denominada varivel local. OS&( a0 =ma varivel declarada dentro de um 7loco s con,ecida dentro deste 7loco- 70 &e uma varivel O declarada em um 7loco j foi declarada como 'lo7al e com o mesmo nome declarada num 7loco mais interno, a varivel vlida no 7loco mais interno ser a declarada neste 7loco. 5.3.6 PROCEDMENTOS =m procedimento uma ferramenta de pro'rama$o #ue serve 7asicamente a dois o7jetivos( 1vitar #ue uma certa se#?%ncia de comandos #ue ocorra em vrios locais de um al'oritmo ten,a de ser escrita repetidamente nestes locais- 4ividir a estrutura de um al'oritmo em partes fec,adas e lo'icamente coerentes. !l'oritmos contm muitas vezes 'rupos de comandos i'uais e repetidos em vrias partes de seu corpo. Os procedimentos permitem economia de tempo, de escrita e redu$o no taman,o de al'oritmos. 1m al'uns casos, os trec,os de comandos repetidos s$o id%nticos, porm utilizam operandos diferentes. ;estes casos, a utiliza$o de procedimentos permitem, tam7m, uma nica escrita dos comandos #ue ao serem e+ecutados, utilizam os parKmetros ou operandos ade#uados a cada ocorr%ncia. Sem mais importante #ue esta primeira utilidade do uso de procedimentos, o seu uso na modulariza$o de al'oritmos torna"se uma ferramenta indispensvel na ela7ora$o de al'oritmos mais comple+os e de maior taman,o. ! divis$o de estruturas de al'oritmos em partes l'icas uma tcnica indispensvel em pro'rama$o estruturada. ! divis$o de al'oritmos em procedimentos, alm de facilitar a ela7ora$o do al'oritmo permite uma mel,or documenta$o e verifica$o de sua corre$o. Cada mdulo implementado como um procedimento deve conter sua prpria documenta$o e pode ser verificado independentemente. Prof a Sirlei Lourdes Bach Pg. 51 !dicionalmente a modulariza$o por procedimentos pode facilitar muito o tra7al,o de e#uipes de pro'ramadores no sentido #ue um al'oritmo pode ser dividido em partes, testado e catalo'ado separadamente. 5.3.7 ESTRUTURAO DOS MDULOS DE UM ALGORTMO =ma su7rotina /procedimento0 nada mais #ue um al'oritmo ,ierar#uicamente su7ordinado a um outro al'oritmo comumente c,amado de mdulo principal. 4a mesma forma, um procedimento pode conter outros procedimentos anin,ados. 5.3.8 TPOS BSCOS DE SUBROTNAS 1+istem dois tipos 7sicos de su7rotinas( a0 3rocedimentos- 70 >unes. )R*+,-./,01*S Os procedimentos s$o utilizadas #uando um conjunto de comandos repete"se ao lon'o do al'oritmo. 1nt$o, para n$o escrevermos vrias vezes o mesmo 7loco de comandos, usamos os procedimentos. &inta+e( procedimento IDENTIFICADOR (parmetros); Comandos; fim procedimento IDENTIFICADOR; Prof a Sirlei Lourdes Bach Pg. 52 ! S 4 C Onde( " C41;DC>CC!4OB o nome de refer%ncia do procedimento- " parKmetros a lista de variveis #ue ser$o passadas ao procedimento para serem manipuladas no seu interior. ;a defini$o dos parKmetros tam7m devem ser declarados seus tipos. ;em toda procedimento utiliza"se de parKmetros, portanto um item opcional.
1+emplo( procedimento LINHA (inteiro: COMPRIMENTO); inteiro : I;
para I 1 at COMPRIMENTO faa escreva -; fim para; fim procedimento LINHA; 23045,S !s funes constituem um tipo especial de su7rotina, 7astante semel,ante ao procedimento, porm tem a caracterstica especial de retornar ao al'oritmo c,amador um valor associado ao nome da fun$o. 1sta caracterstica permite uma analo'ia com o conceito de fun$o na matemtica. ! utiliza$o de outras funes no al'oritmo como por e+emplo, seno, tan'ente ou #ual#uer outra fun$o MespecialY, pode ser feito declarando"se um procedimento fun$o. ! declara$o de uma fun$o tam7m semel,ante a de um procedimento. 4ifere somente na especifica$o do tipo da mesma, ou seja, do tipo de valor #ue ser retornado. !pesar de terem sido citadas apenas funes numricas, elas podem ser l'icas ou literais. Sin$axe( funo tipo de retorno: IDENTIFICADOR (parmetros); comandos; fim funo IDENTIFICADOR; Onde( Prof a Sirlei Lourdes Bach Pg. 53 " tipo de retorno o tipo de dado #ue a fun$o retornar /inteiro, real, l'ico, caracter0- " C41;DC>CC!4OB o nome de refer%ncia da fun$o- " parKmetros a lista de variveis #ue ser$o passadas . fun$o para serem manipuladas no seu interior. ;a defini$o dos parKmetros tam7m devem ser declarados seus tipos. ;em toda fun$o utiliza"se de parKmetros, portanto um item opcional. 1+emplo( funo lgico: E_PAR (inteiro : N); se (N mod 2 = 0) ento E_PAR verdadeiro seno E_PAR falso; fim se;
fim funo E_PAR; 5.3.9 PASSAGEM DE PARMETROS ! transfer%ncia de informaes de e para su7rotinas utilizando"se variveis 'lo7ais n$o constitui uma 7oa disciplina de pro'rama$o. 1stas transfer%ncias precisam ser mais formalizadas e documentadas a 7em da le'itimidade, documenta$o e or'aniza$o do pro'rama ela7orado. 1m al'oritmos, a transfer%ncia de informaes de e para su7rotinas pode ser feita com a utiliza$o de parKmetros. 1sta utiliza$o formaliza a comunica$o entre mdulos. !lm disso, permite #ue um mdulo seja utilizado com operandos diferentes, dependendo do #ue se deseja do mesmo. 3arKmetros de defini$o s$o o7jetos utilizados dentro dos su7rotinas #ue em cada ativa$o representam o7jetos de nvel mais e+terno. ! forma de se utilizar parKmetros em su7rotinas foi apresentada anteriormente. ! c,amada de uma su7rotina aparece numa e+press$o e tem a se'uinte forma( NOME DA SUBROTINA(Lista de parmetros de chamada); Prof a Sirlei Lourdes Bach Pg. 54 1+emplo( incio real : A, B, C; subrotina EXEMPLO (real: VALOR_1, VALOR_2, VALOR_3); real : MAIOR_VALOR;
MAIOR_VALOR VALOR_1; se (VALOR_2 > MAIOR_VALOR) ento MAIOR_VALOR VALOR_2; fim se;
se (VALOR_3 > MAIOR_VALOR) ento MAIOR_VALOR VALOR_3; fim se; escreva O maior valor : , MAIOR_VALOR; fim subrotina EXEMPLO; {corpo do programa principal} leia Digite 3 nmeros:; A, B, C; EXEMPLO (A, B, C); fim. 5.3.10 PASSAGEM DE PARMETROS POR VALOR ;a passa'em de parKmetros por valor /ou por cpia0 o parKmetro real calculado e uma cpia de seu valor fornecida ao parKmetro formal, no ato da invoca$o da su7rotina. ! e+ecu$o da su7rotina prosse'ue normalmente e todas as modificaes feitas no parKmetro formal n$o afetam o parKmetro real, pois tra7al,a"se apenas com uma cpia do mesmo. 1+emplo( incio inteiro : X; subrotina PROC (inteiro: Y); Y Y + 1; escreva Durante = , Y; fim subrotina PROC; X 1; escreva Antes = , X; Prof a Sirlei Lourdes Bach Pg. 55 PROC (X); escreva Depois = , X; fim. O al'oritmo anterior fornece o se'uinte resultado( !ntes 6 1- 4urante 6 2- 4epois 6 1- 1ste tipo de a$o possvel por#ue, neste mecanismo de passa'em de parKmetros, feita uma reserva de espao em memria para os parKmetros formais, para #ue neles seja armazenada uma cpia dos parKmetros reais. 5.3.11 PASSAGEM DE PARMETROS POR REFERNCA ;este mecanismo de passa'em de parKmetros n$o feita uma reserva de espao em memria para os parKmetros formais. Wuando uma su7rotina com parKmetros passados por refer%ncia c,amada, o espao de memria ocupado pelos parKmetros reais compartil,ado pelos parKmetros formais correspondentes. !ssim, as eventuais modificaes feitas nos parKmetros formais tam7m afetam os parKmetros reais correspondentes. =ma mesma su7rotina pode utilizar diferentes mecanismos de passa'em de parKmetros, para parKmetros distintos. 3ara diferenciar uns dos outros, convencionou"se colocar o prefi+o var antes da defini$o dos parKmetros formais passados por refer%ncia. &e por e+emplo um procedimento tem o se'uinte ca7eal,o( subrotina PROC (inteiro: X, Y; real: var Z; real: J) 1nt$o( " O e \ s$o parKmetros formais do tipo inteiro e s$o passados por valor- " ^ um parKmetro formal real passado por refer%ncia- " @ um parKmetro formal real passado por valor. Prof a Sirlei Lourdes Bach Pg. 56 O e+emplo do item anterior, alterado para #ue o parKmetro \ da su7rotina seja passado por refer%ncia, torna"se( incio inteiro : X; subrotina PROC (inteiro: var Y); Y Y + 1; escreva Durante = , Y; fim subrotina PROC; X 1; escreva Antes = , X; PROC (X); escreva Depois = , X; fim. O resultado do al'oritmo modificado ( !ntes 6 1- 4urante 6 2- 4epois 6 2- 5.4PROCEDMENTOS E FUNES EM PASCAL ! lin'ua'em 3ascal oferece facilidades necessrias no tocante a modulariza$o de pro'ramas, por meio de procedimentos e funes, #ue permitem a confec$o de pro'ramas modulares e 7em estruturados. ! idia principal do conceito de modulariza$o, informalmente falando, dividir o pro'rama em su7"pro'ramas, o #ue torna o tra7al,o de desenvolvimento e manuten$o menos des'astante. 1m 3ascal o conceito de modulariza$o implementado por meio de su7"rotinas. =m mdulo em 3ascal definido como sendo uma procedure ou uma function. 1sses mdulos podem ter variveis prprias ou utilizar as variveis declaradas no pro'rama principal. 1 possvel a declara$o de variveis com o mesmo identificador em mdulos diferentes no mesmo nvel ou em mdulos anin,ados /um mdulo dentro do outro0. Conforme o conte+to em est inserido, uma varivel pode ser considerada uma varivel local ou um varivel 'lo7al. 3or e+emplo( as variveis declaradas em um mdulo ! s$o considereadas locais . !, porm s$o consideradas variveis 'lo7ais aos su7"mdulos contidos em !. 4essa forma, todas as variveis declaradas no pro'rama principal s$o Prof a Sirlei Lourdes Bach Pg. 57 consideradas 'lo7ais as procedimentos. Aariveis locais com o mesmo identificador declaradas em mdulos diferentes e no mesmo nvel s$o invisveis umas para o outras, ou seja, n$o causam conflito. Wuando os mdulos est$o anin,ados, as variveis declaradas em cada mdulo, podem ser vistas eEou utilizadas pelos respectivos su7"mdulos. 3orm, n$o ser$o utilizadas se forem declaradas variveis com o mesmo identificador em seus su7" mdulos, onde valer somente as variveis locais. Ou seja, se forem declaradas variveis locais em um mdulo ! com o mesmo identificador #ue as variveis 'lo7ais . !, valer as variveis locais. Csso define as re'ras de escopo das variveis, ou seja, at onde as variveis podem ser utilizadas eEou visveis . outros mdulos. ;o caso de e+istirem variveis locais e 'lo7ais com o mesmo nome, alteraes feitas nas variveis locais n$o afetam as 'lo7ais. @ no caso onde um varivel 'lo7al modificada, o pr+imo instru$o #ue acess"la ir encontrar o valor dessa ltima atualiza$o. 1+emplo( program A; { declarao de variveis } var m, n : real; proced"re B; { declarao de variveis } var i, j : integer; )egin { corpo do procedimento B } end; proced"re C; { declarao de variveis } var i, j : integer; k, l : real; proced"re D; { declarao de variveis } var k, l : integer; )egin { corpo do procedimento D } end; )egin { corpo do procedimento C } end; )egin { corpo do programa principal } end. !s variveis i e j declaradas nos procedimentos A e B s$o invisveis entre si, portanto n$o causam conflito. !s variveis k e l s$o vlidas como inteiros em C. !pesar de serem 'lo7ais, s$o Prof a Sirlei Lourdes Bach Pg. 58 invisveis a D, pois foram redeclaradas como tipo real. _ como se k e l fossem declaradas com outros identicadores. !s variveis i e j declaradas em C s$o 'lo7ais a D, assim como as variveis m e n s$o 'lo7ais . todos os procedimentos. 5.4.1 Mdulos (procedimentos) Convencionamos a#ui #ue mdulos do 3ascal como procedimentos do 3ascal. 3rocedimento um trec,o do pro'rama #ue possui seus o7jetos /varives, ar#uivos, etc.0 e comandos prprios e #ue para ser e+ecutado deve ser ativado por um pro'rama principal ou por outro procedimento. ! cria$o de um procedimento em 3ascal feita atravs de sua declara$o em um pro'rama, ou seja, o procedimento um o7jeto da lin'ua'em #ue deve ser declarado, como os demais o7jetos, no incio do pro'rama ou de outro procedimento. =m prodecimento em 3ascal pode, por sua vez, conter outros procedimentos, #ue s ser$o con,ecidos dentro do mesmo. ! declara$o de um procedimento em 3ascal constituda de um ca7eal,o e de um corpo. O ca7eal,o identifica o procedimento atravs de um nome, e o corpo contm as declaraes dos o7jetos locais, alm de comandos e estruturas do procedimento. ! ativa$o de um procedimento, atendidas .s condies de escopo, feita atravs da refer%ncia ao seu nome em al'um ponto do pro'rama. 1m 3ascal e+istem dois tipos de procedimentos( procedure e function. ;$o confunda procedimento com a tradu$o de procedure, pois esta ltima uma palavra reservada do 3ascal, #ue define um tipo de procedimento. proced"re O o7jetivo de se declarar uma procedure associ"la a um identificador para #ue a mesma possa ser ativada por um comando do pro'rama. ! sua declara$o feita da se'uinte forma( proced"re nome; declarao dos objetos locais proced"re +#,- comandos da proced"re #$; ! c,amada ou ativa$o de uma procedure feita referenciando"se o seu Prof a Sirlei Lourdes Bach Pg. 59 nome no local do pro'rama onde a mesma deve ser ativada, ou seja, onde a sua e+ecu$o deve ser iniciada. !o terminar a e+ecu$o dos comandos de um procedure, a se#?%ncia do pro'rama retorna sempre . instru$o se'uinte #ue provocou a sua c,amada. ! nvel de e+ecu$o, a c,amada de uma procedure valeria como se fosse feita uma cpia dos comandos do procedimento no local do pro'rama onde foi ativada, ajustando"se os o7jetos locais para atender as re'ras de escopo. 1+emplo( program procedimentos; var {declarao das variveis do programa principal } proced"re entrada_de_dados; var { declarao das variveis do procedimento entrad_de_dados } )egin { comandos do procedimento entrada_de_dados } end; proced"re processa_dados; var { declarao das variveis do procedimento processa_dados } )egin { comandos do procedimento processa_dados } end; proced"re imprime_resultados; var { declarao das variveis do procedimento imprime_resultados } )egin { comandos do procedimento imprime_resultados } end; )egin {corpo programa principal } entrada_de_dados; processa_dados; imprime_resultados; end. 1ste e+emplo ilustra como procedimentos podem facilitar o entendimento do pro'rama. ;este caso, o corpo do pro'rama principal se contitui apenas de tr%s c,amadas . procedimentos. f"nction !s functions s$o como procedimentos. ;o entanto, s$o distintas pela Prof a Sirlei Lourdes Bach Pg. 60 caracterstica de retornar um valor. Csso caracteriza o fato de uma function ser ativada na avalia$o de e+presses, como as funes matemticas. Como vimos, a lin'ua'em 3ascal possui al'umas funes pr"definidas, o #ue faz com #ue o pro'ramador n$o ten,a #ue implement"las. ! declara$o de uma function tem como o7jetivo associ"la a um identificador para #ue possa se ativada em uma e+press$o do pro'rama. ! declara$o de uma function feita da se'uinte forma( f"nction nome: t declararao dos objetos locais f"nction +#,- comandos da f"nction . . . nome := X; #$; t tipo #ue a fun$o ir retornar. O o valor do mesmo tipo t #ue ser retornado pela fun$o. Aemos a#ui #ue o corpo da fun$o precisa necessariamente conter um comando de atri7ui$o no #ual o nome da function aparece . es#uerda do sinal de atri7ui$o. ! ativa$o de uma function feita posicionando"se o nome da mesma em uma e+press$o de mesmo tipo. 1+emplo( program exemplo_function; {program que calcula o fatorial de N com a utilizao de uma funo} var N : integer; f"nction fatorial : integer; var i, acumul : integer; )egin acumul := 1; i := 1; &*ile (i <= N) do )egin acumul := acumul * i; i := i + 1; end; fatorial := acumul; end; )egin write('Digite o valor de N: '); readln(N); writeln('O valor do Fatorial de ',N , ' = ', fatorial); end.
Prof a Sirlei Lourdes Bach Pg. 61 5.4.2 Parmetros de procedimentos Aimos #ue as procedures e functions utilizam o7jetos /variveis, ar#uivos, etc0 locais /declarados em seu corpo0 e o7jetos 'lo7ais /declarados nos nveis mais e+ternos0. Aariveis 'lo7ais servem para implementar um mecanismo de trasmiss$o de informaes de um nvel mais e+terno para um nvel mais interno, como o e+emplo do fatorial acima. !nalo'amente, o mesmo mecanismo pode ser usado inversamente para transmitir informaes de dentro para fora dos procedimentos, ou seja, #uando se altera o contedo de uma varivel 'lo7al dentro de um procedimento, a pr+ima instru$o aps o trmino do procedimento ter disponvel o valor da ltima atualiza$o dentro do procedimento. ! utiliza$o de variveis 'lo7ais, no entanto, n$o constitui uma 7oa prtica de pro'rama$o, visto #ue podem amarrar os procedimentos /tornando"os dependentes0 e #ue7rar a #uest$o de modularidade. 1m um procedimento, as suas variveis locais tem vida somente durante a sua e+ecu$o. ou seja, s$o criadas e alocadas #uando no momento da ativa$o, e li7eradas #uando de seu trmino. !lm do mais, essas variveis n$o podem ser acessadas pelos nveis e+ternos ao procedimento. 1nt$o, para transmiss$o de informaes de dentro para fora dos procedimentos a lin'ua'em 3ascal utiliza o mecanismo de parKmetros. 3or meio dos parKmetros faz"se a comunica$o de fora para dentro e de dentro para fora de um procedimento, o #ue torna o mdulos indepententes e reusveis em outros pro'ramas. Os parKmetros s$o o7jetos utilizados dentro do procedimento e representam os o7jetos do nvel mais e+terno /parKmetros de defini$o0. 3ara declarar procedures e functions #ue utilizam parKmetros 7asta acrescentar ao ca7eal,o a lista de parKmetros a ser utilizada, #ue dever estar entre par%nteses. Csso feito da se'uinte forma( proced"re nome(lista-de-parametros); f"nction nome(lista-de-parametros); lista"de"parametros da forma( parKmetro1 ( tipo, parKmetro2 ( tipo, ..., parKmetron( tipo. ! ativa$o de um procedimento se faz por meio de uma ref%ncia a seu nome se'uido pela lista de parKmetros envolvida por par%nteses. 1sses parKmetros s$o con,ecidos por parKmetros de c,amada, e podem ser constantes, variveis ou e+presses dos mdulos e+ternos cujos valores ser$o transmitidos para os parKmetros de defini$o Prof a Sirlei Lourdes Bach Pg. 62 do procedimento e aps a sua e+ecu$o rece7er$o de volta, ou n$o, os valores contidos no parKmetros de defini$o. 4ependendo de como s$o declarados os parKmetros de defini$o no procedimento, determinado se os parKmetros de c,amada conter$o ou n$o os valores contidos nos parKmetros de defini$o. Csso define o modo de passa'em dos parKmetros( passa'em por refer%ncia e passa'em por valor. Wuando se declara um parKmetro como sendo de refer%ncia, as atri7uies . ele s$o refletidas no parKmetro de c,amada correspondente, aps a e+ecu$o do procedimento o parKmetro de c,amada conter o mesmo valor #ue o parKmetro de defini$o correspondente. 3ara especificar se um parKmetro ter passa'em por refer%ncia, a sua declara$o dever ser precedida pela palavra"c,ave var. Caso a declara$o n$o seja precedida por var, ent$o o parKmetro possui passa'em por valor. ;este caso, os parKmetros de defini$o conter$o os mesmos valores de seus parKmetros de c,amada correspondente no momento da ativa$o, mas alteraes nos parKmetros de defini$o n$o ser$o refletidas nos parKmetros de c,amada correspondente. 3ode"se dizer tam7m #ue um parKmetro com passa'em por refer%ncia um parKmetro de entrada e sada, en#uanto #ue um parKmetro com passa'em por valor um parKmetro de entrada. 1+emplo( program exemplo_function_2; {program que calcula o fatorial de N com a utilizao de uma funo com passagem de parmetros } var N : integer; f"nction fatorial(fat : integer): integer; var i, acumul : integer; )egin acumul := 1; i := 1; &*ile (i <= fat) do )egin acumul := acumul * i; i := i + 1; end; fatorial := acumul; end; )egin write('Digite o valor de N: '); readln(N); writeln('O valor do Fatorial de ',N , ' = ', fatorial(N)); end. program exemplo_procedure_2; {programa que utiliza uma procedure para ler os valores em uma matriz N x M e uma procedure que imprime os valores de uma matriz M x N} Prof a Sirlei Lourdes Bach Pg. 63 const M = 10; N = 10; t%pe matriz = arra%[1..M,1..N] of integer; var a : matriz; numlin, numcol : integer; proced"re le_matriz(var mat : matriz; lin, col : integer); var i, j : integer; )egin for i:= 1 to lin do for j := 1 to col do read(mat[i,j]); end; proced"re imprime_matriz(mat : matriz; lin, col : integer); var i, j : integer; )egin for i:= 1 to lin do )egin for j := 1 to col do write(mat[i,j]:10,' '); writeln; end; end; )egin { programa principal } write('Entre com o nmero de linhas da matriz (<',M, '): '); readln(num_lin); write('Entre com o nmero de colunas da matriz (<',N, '): '); readln(num_col); le_matriz(a,num_lin,num_col); imprime_matriz(a,num_lin, num_col); end. ,xerc6cios: Exerccio 33) Escreva um procedimento que, ao analisar se um nmero recebido via parmetro est no intervalo [5, 250], retorne o valor verdadeiro e falso em caso contrrio. Exerccio 34) Escreva um procedimento que receba como parmetro um caracter. Ao analisar este caracter a funo dever retornar um valor numrico: 0 se for um dgito; 1 se for letra maiscula; 2 se for letra minscula; 3 nos demais casos. Exerccio 35) mplemente uma funo que retorne o resto de uma diviso inteira (mod), sem utilizar os operadores mod e div. Prof a Sirlei Lourdes Bach Pg. 64 Exerccio 36) mplemente uma funo que retorne o quociente de uma diviso inteira (div), sem utilizar os operadores mod e div. Exerccio 37) Escreva um algoritmo para calcular o mximo divisor comum de dois nmeros dados como parmetros. Sabe-se que para MDC (mximo divisor comum) de dois nmero x e y temos: MDC (x, y) = MDC (x y, y), se x > y MDC (x, y) = MDC (y, x) MDC (x, x) = x Exemplo: MDC(12, 4) = MDC (8, 4) = MDC (4, 4) = 4 Exerccio 38) Faa um subprograma para verificar se um ano bissexto ou no. Utilize a regra: Um ano bissexto divisvel por 4, mas no por 100, ou ento se divisvel por 400. Exemplo: 1988 bissexto pois divisvel por 4 e no por 100; 2000 bissexto porque divisvel por 400. Exerccio 39) Faa uma funo que recebe um nmero inteiro por parmetro e retorna verdadeiro se ele for par e falso se for mpar. Exerccio 40) Faa um programa que tem duas variveis globais inicializadas com 0: nmero e seu precentual (21% do valor do nmero). Faa um programa que l este nmero, envia como parmetros o nmero e seu percentual, e atravs de um procedimento calcula este novo percentual, e retorna alterado este percentual ao programa principal para depois imprimi-lo. 5.5 O MTODO DOS REFNAMENTOS SUCESSVOS O /todo dos Refinamentos Sucessivos uma sistemtica de a7orda'em til no projeto detal,ado e na implementa$o de softcares. O projeto detal,ado a etapa onde , a especifica$o de cada um dos mdulos dos su7sistemas e a implementa$o a etapa onde os diversos mdulos s$o codificados numa lin'ua'em de pro'rama$o. ! idia 7sica do mtodo a se'uinte( partindo"se de uma dado pro7lemas, para o #ual se deseja encontrar um al'oritmo de solu$o, deve"se procurar su7dividi"lo em pro7lemas menores /su7pro7lemas0 e de solu$o mais simples. !l'uns destes ter$o solu$o imediata e outros n$o. Os su7pro7lemas para os #uais n$o for possvel encontrar uma solu$o direta devem ser novamente su7divididos. !ssim, o processo repetido at #ue se consi'a encontrar um al'oritmo para solucionar cada um dos su7pro7lemas. 1nt$o, o al'oritmo de solu$o do pro7lema ori'inal ser composto pela justaposi$o dos al'oritmos usados para solucionar cada um dos su7pro7lemas em #ue o pro7lema ori'inal foi decomposto. Prof a Sirlei Lourdes Bach Pg. 65 1ste mtodo dito top7do&n /de cima para 7ai+o0, pois incentiva uma a7orda'em 'radativa do pro7lema. ! cada passo do refinamento aumenta a #uantidade de detal,es tratados. O mtodo 7astante til na tomada de decises relacionadas . modularidade dos sistemas. !nalisando"se a 'ranularidade /taman,o0 de cada uma das solues adotadas para cada um dos su7pro7lemas componentes do pro7lema ori'inal pode"se decidir se estas ser$o implementadas so7 a forma de su7al'oritmos /funes ou su7rotinas0 ou como simples conjuntos de comandos /comandos compostos0. !inda, o mtodo 7astante eficaz na identifica$o de refinamentos do pro7lema #ue podem fazer uso do mesmo al'oritmo de solu$o. !ssim, pode"se reduzir o taman,o do sistema, evitando a replica$o de cdi'o. ;outro sentido, o mtodo tam7m incentiva a reutiliza$o de cdi'o j e+istente, especialmente o contido em 7i7liotecas de pro'ramas, o #ue poupa tempo no desenvolvimento. 4e acordo com o nvel de detal,es tratados num ciclo de refinamento pode"se su7dividir o mtodo em Anlise 1op7-o&n e )rograma89o ,struturada. 5.5.1 ANLSE TOP-DOWN Consiste nas primeiras fases do processo de refinamento da solu$o de um pro7lema, onde se c,e'a at o nvel dos su7al'oritmos e comandos compostos. ;esta fase s$o definidos os trec,os do al'oritmo #ue se constituir$o em su7al'oritmos estan#ues e a#ueles #ue ser$o implementados so7 a forma de comandos compostos. Dam7m ao trmino desta fase j se pode definir #uais pores do cdi'o ser$o desempen,adas por su7al'oritmos j e+istentes em 7i7liotecas. !o final deste processo o es#ueleto do al'oritmo principal da solu$o j est delineado. 5.5.2 PROGRAMAO ESTRUTURADA ! fase de 3ro'rama$o 1struturada do Gtodo dos Befinamentos &ucessivos consiste no detal,amento do cdi'o /instrues0 contido em cada um dos su7al'oritmos e comandos compostos constituintes do al'oritmo da solu$o do pro7lema proposto. ! pro'rama$o estruturada consiste em uma e+tens$o da anlise top"docn, onde d"se prosse'uimento ao processo de refinamento das unidades 7sicas, a#ui Prof a Sirlei Lourdes Bach Pg. 66 denominadas %locos. Cada 7loco contm somente uma entrada e uma sada. Os refinamentos transformam um 7loco em outros menores, utilizando"se apenas de tr%s re'ras 7sicas( a0 &e#?%ncia( atravs da #ual um 7loco A #ue7rado numa se#?%ncia de dois ou mais 7locos mais simples, : e +. 70 &e"condi$o"ent$o"S"sen$o"C( onde e+ecuta"se um ou outro de dois 7locos menores : e +, em fun$o do resultado do teste de uma condi$o. c0 1n#uanto"condi$o"faa"S, onde : e+ecutado en#uanto a condi89o for verdadeira.
3rova"se matematicamente #ue estas tr%s re'ras s$o suficientes para escrever Prof a Sirlei Lourdes Bach Pg. 67 : + A Condi$o : + Aerdadeiro >also Condi$o : Aerdadeiro >also #ual#uer pro'rama. !s estruturas )ara e Repita podem ser consideradas variaes da constru$o ,n!uanto, j #ue esta pode ser usada para simular /reproduzir0 o efeito das primeiras. O refinamento sucessivo de 7locos termina #uando cada 7loco corresponder a um nico comando da lin'ua'em. ;esta fase do processo a modulariza$o advm do fato de #ue cada 7loco somente intera'e com o e+terior atravs de suas nicas entrada e sada, podendo ser analisado e refinado fora do conte+to dos demais sem nen,uma dificuldade. 4entre outras coisas, esta propriedade facilita tremendamente a localiza$o de erros cometidos durante a pro'rama$o. 5.5.3 VANTAGENS E DESVANTAGENS DO MTODO !s principais vanta'ens do mtodo dos refinamentos sucessivos podem ser sumarizadas no( estmulo . a7orda'em 'radativa de pro7lemas, pro'redindo o processo da menor para a maior #uantidade de detal,es- e estmulo . modulariza$o, facilitando a identifica$o de su7al'oritmos estan#ues, incentivando a reutiliza$o de pores de cdi'o j prontas e facilitando o processo de detec$o de eventuais erros de pro'rama$o. Como conse#?%ncia t%m"se, ainda, a o7ten$o de pro'ramas claros e fceis de entender, uma mel,oria de produtividade e redu$o dos custos de produ$o de softcare. 3or outro lado, o mtodo descrito deficiente no sentido em #ue sua aplica$o restrita .s fases de projeto detal,ado e implementa$o do ciclo de vida de um softcare. !ssim, para as demais fases do ciclo, em especial a !nlise e 4efini$o da ar#uitetura do sistema, onde os erros s$o mais importantes e caros, o analista v%"se o7ri'ado a utilizar outras tcnicas. 5.5.4 EXERCCO RESOLVDO Prof a Sirlei Lourdes Bach Pg. 68 3ara uma mel,or visualiza$o da proposta do mtodo de refinamentos sucessivos, ele ser usado a se'uir para escrever um al'oritmo para calcular a matriz + mxn resultante da soma de duas matrizes A mxn e : mxn de nmeros reais dadas. ;um primeiro nvel de detal,amento, o pro7lema pode ser su7dividido nos se'uintes passos( Ier as dimenses das matrizes /m e n0- Ier os elementos das matrizes ! e S- Calcular os elementos da matriz C 6 ! X S- 1screver o resultado /matriz C0. 1+pressando esta su7divis$o do pro7lema ori'inal numa forma 'rfica, a#ui denominada de 4ia'rama de Befinamentos, tem"se( O pro7lema de o7ten$o das dimenses das matrizes pode ser su7dividido em( O7ter o nmero de lin,as das matrizes /m0, e O7ter o nmero de colunas das matrizes /n0. 3ode"se tam7m #ue7rar a #uest$o da leitura das matrizes ! e S em duas outras( Ier os elementos da matriz A mxn , e Ier os elementos da matriz : mxn . 3ortanto, aps esta se'unda fase de refinamento o dia'rama torna"se( Prof a Sirlei Lourdes Bach Pg. 69 Calcular C 6 ! X S O7ter m e n O7ter ! e S >azer C 6 ! X S 1screver C
;este ponto o7serva"se #ue o nvel de detal,amento o7tido no dia'rama suficiente para dar a fase de anlise top"docn do mtodo por encerrada. 4e fato, com o con,ecimento ad#uirido nos captulos anteriores j se pode ela7orar al'oritmos para resolver cada um dos su7pro7lemas em #ue o pro7lema ori'inal foi su7dividido. 3or e+emplo, as tarefas ;er A e ;er : podem ser realizadas por um nico su7al'oritmo /su7rotina0 capaz de ler matrizes m n. O clculo de + < A = : pode ser realizado por outra su7rotina para somar matrizes. !inda, uma terceira su7rotina pode ser usada para escrever o resultado do clculo /,screver +0. >inalmente, os al'oritmos para os su7pro7lemas ;er m e ;er n, devido . sua simplicidade, podem constituir apenas um conjunto de comando colocado no incio do al'oritmo principal. ;ote #ue as informaes disponveis at o momento s$o suficiente para #ue o corpo do al'oritmo principal seja escrito. ;ote, tam7m, #ue neste ponto j foram tomadas todas as decises relativas . defini$o dos trec,os do al'oritmo #ue ser$o implementadas so7 a forma de su7al'oritmos e dos trec,os #ue se constituir$o em comandos compostos. Prof a Sirlei Lourdes Bach Pg. 70 Calcular C 6 ! X S O7ter m e n O7ter ! e S >azer C 6 ! X S 1screver C Ier m Ier n Ier ! Ier S