Anda di halaman 1dari 16

Notas de Aula de o de Computadores Algoritmos e Programac a

F L AVIO K EIDI M IYAZAWA com a colaborac a o de T OMASZ KOWALTOWSKI

Instituto de Computac a o - UNICAMP

Vers ao 2000.1

Estas notas de aula n ao devem ser usadas como u nica fonte de estudo. O aluno deve ler outros livros dispon veis na literatura. Nenhuma parte destas notas pode ser reproduzida, qualquer que seja a forma ou o meio, sem a permiss ao dos autores. Os autores concedem a permiss ao expl cita para a utilizac a o e reproduc a o deste material no contexto do ensino de disciplinas regulares dos cursos de graduac a o sob a responsabilidade do Instituto de Computac a o da UNICAMP.

c Copyright 2000

Instituto de Computac a o UNICAMP Caixa Postal 6176 13083970 CampinasSP fkm,tomasz @ic.unicamp.br

ii

es 7 Procedimentos e Func o
A linguagem pascal permite que possamos declarar trechos de c odigo fora do programa principal e associados a um odulos ou identicador que podem ser executadas sempre que invocados. Chamaremos estes trechos de c odigo por m rotinas. Os principais motivos para se usar rotinas s ao: 1. Evitar codicac a o: trocar certos trechos de programas que se repetem por chamadas de apenas uma rotina que ser a codicada apenas uma vez. 2. Modularizar o programa, dividindo-o em m odulos (rotinas) l ogicamente coerentes, cada uma com func a o bem denida. Isto facilita a organizac a o do programa, bem como o entendimento dele. Na linguagem pascal, podemos declarar dois tipos de rotinas, que s ao os procedimentos e as func o es.

7.1 Procedimentos
Um procedimento e sempre declarado em uma a rea de declarac o es, podendo ser tanto na a rea de declarac o es do programa principal como nas a reas de declarac o es de outras rotinas. Neste u ltimo caso, a visibilidade deste procedimento segue as regras de escopo (veja sec a o 7.4). A forma geral de um procedimento segue o seguinte formato: procedure Identicador ametros); Procedimento(Lista de Par Declarac o o es Area de Declarac es begin a o do Procedimento Comandos Corpo de Execuc end; O procedimento tem o mesmo formato do programa principal, sendo que o corpo do procedimento est a delimitado por begin e end, este u ltimo terminado com um ponto e v rgula (Na rotina principal, o end e terminado com um ponto nal). Al em disso, a lista de par ametros e opcional. Na a rea de declarac o es, e poss vel denir constantes, tipos, declarar vari aveis, func o es e outros procedimentos, importante observar que os objetos da mesma forma como declarados na a rea de declarac o es da rotina principal. E declarados na a rea de declarac o es de uma rotina, s ao v alidos apenas no escopo desta rotina, e n ao s ao v alidos fora dela. Exemplo 7.1 Um determinado programa imprime o seguinte cabec alho diversas vezes no meio de sua execuc a o: Aluno: Fulano de Tal Data: 01/01/01 Programa: Exemplo de Procedimento Desta maneira, e alho sempre que necess ario. O pseudo melhor construir um procedimento que escreve este cabec programa seguinte declara este procedimento e faz algumas chamadas no meio de sua execuc a o.

65

program Exemplo; procedure Cabecalho; begin writeln(Aluno: Fulano de Tal.); writeln(Data: 01/01/01.); writeln(Programa: Exemplo de Procedimento.); end; begin . . . Cabecalho; . . . Cabecalho; . . . Cabecalho; . . .

(*) (*) (*)

end. O cabec alho ser a impresso nas chamadas da rotina Cabecalho, linhas comentadas com (*).

7.2 Passagem de Par ametros


Como estrat egia de programac a o, e desej avel que cada rotina n ao fac a uso de dados externos, pelo menos de forma direta, e toda a comunicac a o com o resto do programa seja feito atrav es de par ametros ou se for o caso, como retorno de func a o. No programa seguinte, descrevemos um procedimento chamado ImprimeMaximoDeTres com tr es par ametros reais: x, y e z. Os par ametros declarados neste procedimento s ao declarados com passagem de valor. Isto signica que o procedimento ImprimeMaximoDeTres e chamado com tr es par ametros: ImprimeMaximoDeTres(Express ao 1, Express ao 2, Express ao 3); onde Express ao 1, Express ao 2 e Express ao 3 s ao express oes num ericas que ser ao primeiro avaliadas para valores num ericos e s o ent ao transferidas para o procedimento. Internamente ao procedimento estes valores s ao acessados pelos par ametros , e . program Maximos; var a,b,c : Real; i,n : Integer; procedure ImprimeMaximoDeTres(x,y,z : Real); var t : Real; begin t : x; if t y then t : y; if t z then t : z; writeln( O maiore entre ,x,,,y,,,z, e ,t); end; MaximoDeTres begin Write(Entre com tr es n umeros: ); Readln(a,b,c); ImprimeMaximoDeTres(a,b,c); end.

66

Os par ametros s ao declarados da seguinte forma:

 
. . .   onde

ListaDePar ametrosDoTipo1 ListaDePar ametrosDoTipo2 . . . ListaDePar ametrosDoTipoK

Tipo1; Tipo2; . . . TipoK;



indica que a palavra var pode ou n ao ser colocada antes da lista de par ametros de um tipo.

As palavras Tipo1, Tipo2,..., TipoK s ao palavras que identicam o tipo do par ametro. Assim o seguinte cabec alho de procedimento e inv alido. procedure Imprime(msg : string[50]); Uma construc a o correta seria primeiro denir um tipo associado a string[50] e s o ent ao usar este tipo na declarac a o de msg. I.e., type TipoMSG = string[50]; procedure Imprime(msg : TipoMSG); A inserc a o da palavra var antes da declarac a o de uma lista de par ametros indica que estes par ametros s ao declarados com Passagem por Refer encia e a aus encia da palavra var indica que a lista de par ametros seguinte e feita com Passagem por Valor. A seguir, descrevemos os dois tipos de passagem de par ametros.

Passagem por Valor Nesta forma, a express ao correspond ente ao par ametro e avaliada e apenas seu valor e passado para o vari avel correspondente ao par ametro dentro da rotina. Passagem por Refer encia Nesta forma, o par ametro que vai ser passado na chamada da rotina deve ser necessariamente uma va Isto porque n ao e o valor da vari avel que e passada no par ametro, mas sim a sua refer encia. Qualquer alterac a o de valor no par ametro correspondente reetir a em mudanc as na vari avel correspondente, externa ao procedimento. Exemplo 7.2 No exemplo da gura 22 apresentamos um programa com uma rotina chamada Conta, contendo dois par ametros, um por valor e outro por refer encia. Na linha (7), o comando de escrita imprime os valores de  "! ( 1) Program exemplo; ( 2) var : integer; :real; ( 3) Procedure Conta( : integer; var # : real); ( 4) begin %$&')(021 ( 5) #3$&543(6#1 ( 6) ( 7) writeln(O valor de  = , , e o valor de # = , # ); ( 8) end; ( 9) begin (10) 7$&98@!A1 (11) %$&'4"!ABC!A1 (12) Conta DEGFHIP1 (13) writeln(O valor de = , , e o valor de = , ); (14) end. Figura 22: Par ametros por valor ( : integer) e por refer encia (var # : real). e #Q R"!ABC! . Na linha (13), depois da chamada da rotina Conta, s ao impressos os valores de ST8@! e UR"!ABC! , j a ametro correspondente a e que a passagem do par ametro correspondente a e por valor e a passagem do par por refer encia ( tem o mesmo valor antes da chamada, e tem o valor atualizado pela rotina Conta).

67

Exemplo 7.3 A seguir, apresentamos alguns exemplos do cabec alho correspondente a declarac a o de rotinas com par ametros:

V Procedure Conta(WXF`Y :integer;var aFH :integer;var bFc# :real); Neste exemplo, os par ametros correspondentes a W e Y s ao declarac o ametros com passagem por valor; es de par e , ,  e # s ao declarac o ametros com passagem por refer encia. es de par V type MeuTipoString = string[50];
Procedure processa string(var nome1:MeuTipoString; nome2:MeuTipoString;var nome3:MeuTipoString; var  :integer; # :real); Neste exemplo, os par ametros correspondentes a nome1, nome3 e  s ao declarac o ametros com passa es de par gem por refer encia; e nome2 e # s ao declarac o ametros com passagem por valor. es de par Exemplo 7.4 O programa para ordenar tr es n umeros, descrito na p agina 41, usa a estrat egia de trocar os valores de vari aveis. Note que naquele programa, a troca de valores e es pontos do programa. Assim, nada melhor que feita em tr fazer um procedimento para isso. O seguinte programa descreve esta alterac a o no programa ordena3. Note que os dois par ametros da rotina trocaReal devem ser necessariamente declarados como par ametros passados por refer encia. program ordena3; procedure TrocaReal(var A, B : real); var d%egf : real; begin d%ehfi$&'p ; pq$&sr ; rU$&5d%ehf ; end;

Troca os valores das duas vari aveis

var tu8"FHtavFHta4 : real; begin write(Entre com o primeiro n umero: ); readln(n1); write(Entre com o segundo n umero: ); readln(n2); write(Entre com o terceiro n umero: ); readln(n3); if DEtu8wxtayI then TrocaReal DEtu8"FHtayI ; if DEtu8wxta4yI then TrocaReal DEtu8"FHta4yI ; Neste ponto, tu8 cont em o menor dos tr es valores E D a t  x a t y 4 I E D a t v  H F a t y 4 I if then TrocaReal ; Neste ponto, tu8 cont em o menor dos tr es valores e ta e menor ou igual a ta4 . writeln DEtu8"FHtavFHta4yI ; end. Note que este programa cou mais enxuto e mais f acil de entender. Exemplo 7.5 Um certo programa precisa ter, em v arios pontos do seu c odigo, leituras de n umeros inteiros positivos e em cada um destes lugares, e ario se fazer a validac a umero lido. Uma maneira de se validar o n umero necess o do n a ser lido e a agina 33, em um procedimento que l e uma usar uma estrutura de repetic o, como no exemplo 4.5 da p vari avel inteira e j a faz sua validac a ao precisaremos repetir o c odigo para cada leitura. o. Desta maneira n

68

program ProgramaValidacao; type messagetype string[50]; procedure LeInteiroPositivo(var m : integer; msg:messagetype); begin write(msg); readln(m); while (m 0) do begin writeln(ERRO: N umero inv alido. ); write(msg); readln(m); end; end; var n1,n2,n3:integer; begin LeInteiroPositivo(n1,Entre com o primeiro n umero inteiro positivo: ); LeInteiroPositivo(n2,Entre com o segundo n umero inteiro positivo: ); LeInteiroPositivo(n3,Entre com o terceiro n umero inteiro positivo: ); writeln(Os tr es n umeros positivos foram: ,n1,,,n2,,,n3); end. o sobre a passagem de estruturas grandes como par Considerac a ametros Muitas vezes, quando temos passagem de estruturas grandes (como vetores e matrizes) como par ametros por valor, e prefer vel recodicar a rotina para que esta seja feita como par ametro por refer encia. O motivo disto e justamente o fato destas estruturas serem duplicadas na passagem por valor. Na passagem de par ametros por refer encia apenas a refer encia do objeto e transferida, gastando uma quantidade de mem oria constante para isso. Naturalmente esta codicac a o n ao deve mudar os valores da estrutura, caso contr ario estas se manter ao ap os o t ermino da rotina. Exemplo 7.6 Considere os dois procedimentos seguintes, nas guras 23 e 24, para imprimir o maior valor em um o a destas vetor de t elementos. Note que nenhuma das duas rotinas faz alterac es no vetor. A u nica diferenc duas implementac o ametro por valor (gura 23) e por refer encia (gura 24). Assim, es e a passagem do par a implementac a ao fac a nenhuma o da gura 24 e mais eciente que a da gura 23, caso o compilador em uso n otimizac a ametro. o para mudar o tipo da passagem de par type TipoVetorReal array[1..1000] of real; procedure ImpMaximo(V : TipoVetorReal; n : integer); var M : real; i:integer; begin if (n 0) then begin M : V[1]; for i: 2 to n do if (V[i] M) then M: V[i]; end end. Figura 23: type TipoVetorReal array[1..1000] of real; procedure ImpMaximo(var V : TipoVetorReal; n : integer); var M : real; i:integer; begin if (n 0) then begin M : V[1]; for i: 2 to n do if (V[i] M) then M: V[i]; end end. Figura 24:

69

es 7.3 Func o
A linguagem Pascal tamb em permite desenvolver novas func o es al em das j a existentes. Func o es s ao rotinas parecidas com procedimentos, com a diferenc a que func o es retornam um valor. Uma func a o e declarada com o seguinte cabec alho: function Identicador(Lista de Par ametros): Tipo da Func a o; O valor a ser retornado pela func a o e calculado dentro do corpo da func a o e para retorn a-lo, e usado um identicador com o mesmo nome da func a o. O tipo de valor retornado e do tipo Tipo da Func a o que deve ser uma palavra identicadora do tipo. Assim, uma func a o n ao deve ser declarada como no exemplo a seguir function Maiuscula(str: MeuTipoString):string[50]; Neste caso, string[50] n ao e apenas uma palavra. Assim, uma poss vel declarac a o seria: function Maiuscula(str: MeuTipoString):MeuTipoString; Exemplo 7.7 No programa a seguir, temos a declarac a a o de uma func o chamada Cubo, que dado um valor real (como par ametro), a func a o devolve o cubo deste valor. program exemplo; var  : real; function Cubo(x:real): real; begin Cubo $&5(6(u ; end; begin write(Entre com o valor de a: ); readln(a); write(O cubo de ,a, e ,Cubo(a)); end. Exemplo 7.8 No programa a seguir, apresentamos um programa com a declarac a a o de uma func o que devolve o maior valor entre dois valores, dados como par ametros. program exemplo; var  , # , : real; function Maximo(x,y: real): real; begin if ( ) then Maximo $& else Maximo $& ; end; begin write(Entre com o valor de a: ); readln(a); write(Entre com o valor de b: ); readln(b); )$&'bDbFc#@I ; write(O m aximo entre ,a, e ,b, e : ,c); end.

70

Exemplo 7.9 Fac a um programa contendo uma func a umero passado como par ametro o que calcula o fatorial de um n inteiro. program ProgramaFatorial; function fatorial(n:integer):integer; var F,i:integer; begin F : 1; for i: 2 to n do F: F ( i; fatorial : F; end; var n:integer; begin write(Entre com um n umero: ); readln(n); writeln(O fatorial de ,n, e igual a ,fatorial(n)); end. Exemplo 7.10 Implemente o algoritmo de Euclides para calcular o m aximo divisor comum de dois n umeros. program ProgramaMDC; function mdc(a,b : integer):integer; var aux,maior,menor : integer; begin maior : a; menor : b; while (menor 0) do begin aux : menor; menor : maior mod menor; maior : aux; end; mdc : maior; end; var a,b:integer; begin write(Entre com dois numeros positivos: ); readln(a,b); writeln(O mdc dos dois e ,mdc(a,b)); end. Exemplo 7.11 Descreva uma func a umero e egia do programa Primo2 o para testar se um n primo usando a estrat apresentada na p agina 49. function Primo(n :integer ):boolean; var i,Max : integer; begin if (n 2) then Primo : true else if (n mod 2 0) or (n 3 1) then Primo: False else begin Primo : True; i: 3; Max : trunc(sqrt(n)); while (i Max) and (n mod i 0) do i : i 2; if (i Max) and (n mod i 0) then Primo : false end end

71

7.4 Escopo
Todos os objetos declarados em um programa (subprogramas, vari aveis, constantes, tipos, etc) possuem um escopo de atuac a o. Por escopo de um objeto, entendemos como as regi oes de um programa onde o objeto e v alido. Primeiramente, vamos denir alguns termos: o texto que indica o tipo da rotina (se programa principal, procedimento ou func Cabec alho de uma Rotina E a o), seu nome e seus par ametros. o da Rotina Area Area de Declarac a onde se declaram as vari aveis, tipos, procedimentos e func o es da rotina. Corpo de uma Rotina Deniremos o Corpo de uma Rotina (pode ser o Programa Principal, um Procedimento ou uma Func a o) como o trecho da rotina contendo as instruc o es a serem executadas. Na gura a seguir, temos alguns exemplos de rotinas.
Program teste; Procedure Rotina1; Function f1(i:integer):integer;

don6poqHrtsygXsyuHvwpox"k

dn0pqHrtsygHsyuXvwpox"k

don6poqXrtsygHsyuHvwpx"k

Begin

dAeGfhg&ijfvk

Begin

dveGf@g&ilfAk

Begin

dAeGf@gmijfAk

End.

End;

End;

Note tamb em que na a rea de declarac a o de uma rotina podemos declarar novas rotinas. Na gura 25, temos uma estrutura de um programa com v arias rotinas, declaradas uma dentro da a rea de declarac o es da outra. Se em algum lugar e feito alguma refer encia a um objeto do programa, este j a deve ter sido declarado em alguma posic a o acima desta refer encia. Os objetos declarados em uma rotina R s ao vis veis no corpo de R e em todas as subrotinas dentro da a rea de declarac o es de R. Por visualizar, queremos dizer que podemos usar a vari avel/procedimento/func a o no local de visualizac a o. Se dois objetos t em o mesmo nome, a refer encia atrav es deste nome e feita para o objeto que estiver na a rea de declarac o es vis vel mais interna. Exemplo: considere duas rotinas, R e R1, onde R1 est a declarado na a rea de declarac o es de R (R1 est a contido em R). Um identicador declarado dentro de R1 pode ser declarado com o mesmo nome de um outro identicador em R (externo a R1). Neste caso, a vari avel declarada em R n ao ser a visualizada em R1. Na gura 25 apresentamos o esboc o de um programa com diversos n veis de encaixamento de rotinas. A seguir, descrevemos quais objetos podem ser visualizados em cada regi ao: 1. 2. 3. 4. 5. Na regi ao 1, podemos visualizar os objetos: Na regi ao 2, podemos visualizar os objetos: Na regi ao 3, podemos visualizar os objetos: Na regi ao 4, podemos visualizar os objetos: Na regi ao 5, podemos visualizar os objetos: C, B, A (primeiro A), Rotina1 e Rotina2. o1, Rotina1 e Rotina2. D, B, A (segundo A), Func a o1, Rotina1 e Rotina2. A (primeiro A), B, Func a E, A (primeiro A) e Rotina3 e Rotina1. A (primeiro A) e Rotina1 e Rotina3.

Exemplo 7.12 O programa seguinte apresenta um procedimento que encontra as raizes reais de uma equac a o do segundo grau. O procedimento se chama Equacao, tem tr es par ametros e chama uma func a o particular chamado CalculaDelta. Por ser particular a este procedimento, a func a o o CalculaDelta pode estar dentro da a rea de declarac es 72

Program escopo; var A: integer; {Primeiro A} Procedure rotina1; var B: integer; Procedure rotina2; var C: integer; begin {Regio 1} end; Function funcao1(x:integer): real; var A: integer; {Segundo A} D: real; begin {Regio 2} end; begin {Regio 3} end; Procedure rotina3; var E: integer; begin {Regio 4} end. begin {Regio 5} end.

Figura 25: Exemplo de objetos com escopos diferentes. de Equacao. program EquacaoSegundoGrau; var a ext, b ext, c ext : real; o procedure Equacao(a,b,c: real); imprime as soluc es reais de a ( x ( x b ( x c 0 var x1, x2,delta : real; Vari aveis locais ao procedimento. function CalculaDelta(c1,c2,c3: real): real; begin CalculaDelta : sqr(c2) y 4 ( c1 ( c3; end; begin delta: CalculaDelta(a,b,c); if (delta 3 0) then begin x1: ( y b sqrt(delta)) / (2 ( a); x2: ( y b y sqrt(delta)) / (2 ( a); writeln(O valor de x1 = ,x1, e o valor de x2 = ,x2); end else writeln(n ao e possivel calcular raizes reais para esta equac ao); end; begin writeln(Encontrar raizes reais de equac ao na forma: a*x*x + b*x+c = 0); write(Entre com o valor de a (diferente de zero), b e c: ); readln(a ext,b ext,c ext); Equacao(a ext,b ext,c ext); end.

73

Exemplo 7.13 O seguinte programa apresenta um procedimento para ordenac a egia do algoritmo o usando a estrat SelectionSort, descrita com duas subrotinas encaixadas. program SelectionSort; 100; const MAX type TipoVetorReal array[1..MAX] of real; TipoMsg string[100]; procedure LeVetorReal(var v : TipoVetorReal; n:integer;msg:TipoMsg); var i : integer; begin writeln(msg); esimo elemento: ); readln(V[i]); end for i: 1 to n do begin writeln(Entre com o ,i,- end; LeVetorReal procedure ImprimeVetorReal(var v : TipoVetorReal; n:integer;msg:TipoMsg); var i : integer; begin writeln(msg); for i: 1 to n do begin writeln(V[i]); end end; ImprimeVetorReal procedure SelectionSort(var v : TipoVetorReal; n:integer); var m,imax : integer; procedure TrocaReal(var a,b : real); var aux : real; b: aux; end; begin aux : a; a: b; function IndMaximo(var v : TipoVetorReal; n : integer) : integer; var i, Ind : integer; begin if (n 0) then Ind : 0 else begin Ind : 1; O maior elemento comec a com o primeiro elemento do vetor for i: 2 to n do if v[Ind] v[i] then Ind: i; end; IndMaximo : Ind; end; begin for m: n downto 2 do begin imax : IndMaximo(v,m); TrocaReal(v[m],v[imax]); end ; end; SelectionSort var i, n, Ind : integer; V : TipoVetorReal; begin write(Entre com a quantidade de elementos a ler: ); readln(n); LeVetorReal(v,n,Leitura do vetor a ordenar ); SelectionSort(v,n); ImprimeVetorReal(v,n,Vetor ordenado ); end.

74

o de Programas 7.5 Cuidados na Modularizac a


A modularizac a o dos programas pode levar ao desenvolvimento de programas mais indepententes e mais f aceis de se entender. Mas h a casos onde devemos tomar algum cuidado, se quisermos evitar processamentos desnecess arios. Dois casos onde podemos ter processamento desnecess ario s ao: 1. Rotinas distintas fazendo os mesmos c alculos, i.e., alguns dados v ao ser recalculados. 2. Chamadas de uma mesma rotina v arias vezes, onde uma chamada pode ter feito c alculos j a realizados pela chamada anterior. Muitas vezes priorizamos a independ encia e funcionalidade das rotinas e toleramos que algumas computac o es sejam duplicados. Isto e razo avel quando estas duplicac o es n ao s ao cr ticas no tempo de processamento total. Quando o tempo de processamento deve ser priorizado, devemos reconsiderar o programa e evitar estas computac o es desnecess arias. O seguinte exemplo mostra duas vers oes de um programa para calcular a exponencial D{z@|}I . Exemplo 7.14 A exponencial D{z~|}I pode ser calculada pela seguinte s erie:

z | bu

a b @@ 8"  v 4 v

O programa seguinte mostra uma implementac a a o o da func o exponencial, usando duas outras func es, uma para calcular o fatorial, e outra para calcular a pot encia. O programa p ara quando a diferenc a entre o valor da s erie calculado at e uma interac a a o com o valor calculado na interac o anterior e menor que 0,00001. program exprog1; var y : real; function fatorial(n : integer):integer; var i,f : integer; begin i: 1; f: 1; f: f ( i; i: i 1; end; while (i n) do begin fatorial: f; end; function potencia(x : real; n:integer):real; var i : integer; p : real; begin p: 1; for i: 1 to n do p: p ( x; potencia : p; end; function expo1(x : real):real; var termo,ex,exant: real; i:integer; begin ex : 0; termo: 1; i : 0; repeat exant : ex; termo : potencia(x,i)/fatorial(i); ex : ex termo; inc(i); until abs(ex y exant) 0.0001; expo1 : ex; end; begin write(Entre com um n umero real: ); readln(y); writeln(O valor de e elevado a ,y, e igual a ,expo1(y)); end. 75

O programa exprog1 e acil de entender, uma vez que cada termo da s erie e aves da func a f facilmente calculado atr o fatorial e da func a encia. Mas note que ao se calcular um termo gen e rico desta s e rie, em uma interac a o, digamos o pot  ,o o termo |o o a foram computados os valores de es anteriores, j programa calcula o valor , sendo que em interac , ,..., . Cada um destes c a lculos poderia ter aproveitado o c a lculo da pot encia feita na interac a o anterior. O mesmo acontece com o fatorial, , que poderia ter aproveitado o c alculo de D{y8oIP feito na interac a o anterior.  Portanto, o termo calculado em uma interac a o e igual ao termo anterior, | Xv , multiplicado por | . O seguinte pro grama apresenta a vers ao modicada, sem repetic a o de processamento. program exprog2; var y : real; function expo2(x : real):real; var termo,ex,exant : real; i:integer; begin termo: 1; i : 1; ex : 0; repeat exant : ex; ex : ex termo; termo : termo ( x/i; inc(i); until abs(ex y exant) 0.0001; expo2 : ex; end; begin write(Entre com um n umero real: ); readln(y); writeln(O valor de e elevado a ,y, e igual a ,expo2(y)); end. Exerc cio 7.1 O valor do seno DEhI pode ser dado pela seguinte s erie:

H~ 2DEhIuy b b y@@ 4v
Implemente uma func a o chamada seno DEgI , para calcular o valor do seno de . Note que DEtyIP e igual a tDEts8oIl}DEtxyI . OBS.: A func a aximo um loop. I.e, n ao se pode usar loops encaixados. o deve usar no m Exerc cio 7.2 O valor do co-seno de pode ser calculado pela serie

e igual a

(b e

b c yj@@ DEhIu8y 2 y yxB@B@B v


Descreva uma func a alho: function coseno(x:real):real; o com o cabec e que devolve o valor do coseno de calculado com os 100 primeiros termos dada pela s erie acima. OBS.: A func a aximo um loop. I.e, n ao se pode usar loops encaixados. o deve usar no m

7.6 Exerc cios


1. Fac a tr es vers oes da func a o fatorial: function fatorial(t :integer):integer; usando as estruturas de repetic a o: for, while e repeat. 2. Os n umeros de bonacci t FHt F@B@B@B s ao denidos da seguinte forma:

t th

!AF 8"F th th F
76

W6vB

Fac a um programa contendo uma func a o function bonacci(t :integer):integer; que retorna o t - esimo n umero de bonacci. 3. Fac a um procedimento com um par ametro inteiro t e que ao ser chamado, o procedimento imprime uma gura da seguinte forma: ....*.... ...***... ..*****.. .*******. ********* .*******. ..*****.. ...***... ....*.... No caso, o procedimento foi chamado com par ametro 5. A quantidade de linhas impressas e ty8 . y 7@@ , sendo que o valor y y 4. O valor de tamb em pode ser calculado usando a s e rie H` ` H H calculado como 4)" . Fac a uma func a o para calcular o valor de usando esta s erie e parando de e a o e a interac a o anterior for menor que 0,0001. quando a diferenc a do valor de calculado em uma interac 5. Escreva um programa contendo uma func a o function binario(t :integer):TipoString; que retorna um tipo chamado TipoString, declarado como type TipoString = string[50]; aria. string contendo o n umero t na base bin 6. Fac a duas func o es que tem um par ametro inteiro e retornam verdadeiro se o par ametro for primo e falso caso contr ario, uma func a o usando o m etodo ing enuo apresentado na p agina 48 e o m etodo otimizado apresentado na p a gina 49. Verique quanto tempo estas duas func o es gastam se usadas para contar todos os primos no intervalo  8@!!!AF !!! . Experimente para outros intervalos maiores. 7. Implemente conjuntos atrav es de vetores e fac a os seguintes procedimentos: (a) Procedimento chamado conjunto, com dois par ametros, um vetor e um inteiro positivo t! , indicando a quantidade de elementos no vetor. O procedimento deve remover os elementos duplicados do vetor e atualizar o valor de t . (b) Procedimento chamado Intersecao com seis par ametros, com o seguinte cabec alho: procedure intersecao(var :tipovetor;t :integer; var :tipovetor;t :integer; var :tipovetor; var t :integer); O vetor ( ) cont em t (t ) elementos. O vetor receber a a intersec a o dos elementos de e e t deve retornar com a quantidade de elementos em (vamos supor que cada vetor cont em elementos distintos). Voc e deve usar a seguinte estrat egia para gerar a intersec a o de e : (1) Ordene o vetor . (2) Para cada elemento de , fac a uma busca bin aria do elemento no vetor . (2.1) Se o elemento se encontrar no vetor, insira o elemento no vetor . (c) Procedimento chamado Uniao com seis par ametros, com o seguinte cabec alho: procedure uniao(var :tipovetor;t :integer; var :tipovetor;t :integer; var :tipovetor; var t :integer); O vetor ( ) cont em t (t ) elementos. O vetor receber a a uni ao dos elementos de e e t deve retornar com a quantidade de elementos em (vamos supor que cada vetor cont em elementos distintos). Voc e deve usar a seguinte estrat egia para gerar a uni ao de e : (1) Copie o vetor no vetor (atualizando t ). (2) Para cada elemento de , fac a uma busca bin aria do elemento no vetor . (2.1) Se o elemento n ao se encontrar no vetor, insira o elemento no vetor .

77

8. Tem-se um conjunto de dados contendo a altura e o sexo (M ou F) de 50 pessoas. Fazer um algoritmo que calcule e escreva: (a) A maior e a menor altura do grupo. (b) A m edia de altura das mulheres. (c) O n umero de homens. 9. Descreva uma func a o que tenha como par ametros uma raz ao, , um valor inicial, , e um n umero t e devolva a soma dos t primeiros elementos de uma progress ao aritm etica comec ando com e com raz ao . 10. Descreva um procedimento, com par ametro inteiro positivo t e dois outros par ametros # e que devem retornar valores ao tais que # seja o menor valor inteiro tal inteiros positivos. Os valores a serem retornados em # e s que # t . 11. Fac a uma func a o booleana com par ametro t e que retorna verdadeiro se t e primo, falso caso contr ario. 12. Fac a uma func a o que tenha como par ametro uma temperatura em graus Fahrenheit e retorne a temperatura em y RwDy4yIHI . graus Celsius. Obs.: D 13. O imposto que um trabalhador paga depende da sua faixa salarial. Existem at e faixas salariais, cada uma com uma correspondente taxa. Exemplo de um sistema com at e 4 faixas salariais: (a) Para sal arios entre 0 e 100 reais, e livre de imposto. (b) Para sal arios maiores que 100 e at e 500 reais, e 10 % de imposto. (c) Para sal arios maiores que 500 e at e 2000 reais, e 20 % de imposto. (d) Para sal arios maiores que 2000 e 30 % de imposto. ue ncia de sal arios e imprima para cada um, o Fac a um programa que leia estas faixas salariais e leia uma seq imposto a pagar. O programa deve parar quando for dado um sal ario de valor negativo. 14. Fac a um programa de lot erica, que l e o nome de t jogadores e os n umeros que eles apostaram (um n umero entre 0 e 100). Use a func a o RANDOM(N) para sortear um n umero. Se houver ganhador, imprima o nome dele e o n umero que ele apostou, caso contr ario, avise que ningu em ganhou.

78

Anda mungkin juga menyukai