Vous êtes sur la page 1sur 84

UNIVERSIDADE FEDERAL DO ESPRITO SANTO CENTRO DE CINCIAS AGRRIAS DEPARTAMENTO DE ENGENHARIA RURAL

ENG06842
PROGRAMAO I

PARTE 2

Prof. Geraldo Regis Mauri

CCA-UFES Agosto - 2009

ENG06842 Programao I

Sumrio

7.Linguagens de programao e execuo de programas...........................................................3 7.1.Introduo............................................................................................................................. 3 7.2.Tradutores: compiladores e interpretadores..........................................................................5 7.3.Compilador PASCAL........................................................................................................... 6 7.4.Exerccios............................................................................................................................14 8.A Linguagem Pascal.............................................................................................................. 16 8.1.Introduo........................................................................................................................... 16 8.2.Tipos de dados simples....................................................................................................... 16 8.3.Mapeamento Portugol x Pascal...........................................................................................18 8.4.Unidades pr-definidas....................................................................................................... 21 8.5.Palavras reservadas............................................................................................................. 22 8.6.Funes pr-definidas......................................................................................................... 22 8.7.Tipos definidos pelo usurio...............................................................................................29 8.8.Exerccios............................................................................................................................31 9.Estruturas de dados................................................................................................................ 33 9.1.Introduo........................................................................................................................... 33 9.2.Variveis compostas homogneas...................................................................................... 33 9.3.Variveis compostas heterogneas..................................................................................... 39 9.4.Algoritmos de classificao e busca................................................................................... 46 9.5.Exerccios............................................................................................................................48 10.Modularizao......................................................................................................................51 10.1.Introduo......................................................................................................................... 51 10.2.Procedimentos...................................................................................................................52 10.3.Funes............................................................................................................................. 53 10.4.Escopo de variveis...........................................................................................................56 10.5.Parmetros.........................................................................................................................56 10.6.Recursividade....................................................................................................................60 10.7.Exerccios..........................................................................................................................60 11.Armazenamento de dados....................................................................................................67 11.1.Arquivos............................................................................................................................67 11.2.Exerccios..........................................................................................................................76 Referncias................................................................................................................................78 Apndice A Mensagens de erro do Turbo Pascal.................................................................. 79 Apndice B Tabela de cdigos ASCII...................................................................................82

ENG06842 Programao I

7. Linguagens de programao e execuo de programas


7.1. Introduo

A linguagem de programao o meio pelo qual se pode indicar os passos que devem ser realizados pelo computador para resolver problemas. Utilizando as linguagens de programao, pode-se colocar os algoritmos numa forma que o computador possa interpret-los, ou seja, na forma de programas computacionais. Para que o computador execute o algoritmo proposto, as operaes devem ser transcritas para uma linguagem que a mquina consiga compreender. Na realidade, os computadores s podem executar algoritmos expressos em linguagem de mquina, que se constitui de um conjunto de instrues capazes de ativar diretamente os dispositivos eletrnicos do computador. Caractersticas da Linguagem de Mquina: diferente para cada tipo de computador, dependendo de sua arquitetura; extremamente rudimentar, onde at as operaes mais simples tm que ser expressas em termos de registros, acumuladores e outros dispositivos de mquina; totalmente expressa em forma numrica - sistema de numerao binrio (0s e 1s) ou hexadecimal. Conseqentemente, uma linguagem de difcil aprendizado e pouco expressiva para as pessoas. Para tornar a atividade de programao mais acessvel, foram desenvolvidas outras linguagens, denominadas de Linguagens de Programao, que funcionam como uma forma alternativa de se comunicar com o computador.

ENG06842 Programao I

As linguagens de programao so compostas por um grupo de elementos e regras que permitem a construo das instrues utilizadas para resolver os problemas computacionais. Com elas, pode-se construir programas que devem ser, posteriormente, transformados em instrues em Linguagem de Mquina. Para realizar a transformao, cada linguagem de programao possui um programa-suporte denominado, genericamente, de tradutor. Linguagem de Programao de Baixo Nvel: Conhecida como Linguagem

Assembler ou Linguagem de Montagem, ou ainda, Linguagem Simblica.


Utiliza nmeros binrios, hexadecimais, alguns smbolos e letras para compor os programas. Est muito prxima da Linguagem de Mquina, onde cada instruo simblica corresponde, praticamente, a uma instruo de mquina. Para transformar o programa escrito em Linguagem

Assembler em cdigo de mquina executvel, utilizado um programasuporte denominado de MONTADOR. Linguagens de Programao de Alto Nvel: So linguagens de

programao que utilizam notaes matemticas e grupos de palavras para representar as instrues de mquina, tornando o processo de programao mais prximo do entendimento humano. Muitas destas linguagens foram desenvolvidas para atender os problemas de reas de aplicao especficas, como, por exemplo, linguagens para aplicaes comerciais, cientficas, administrativas, de ensino, etc. A primeira linguagem de alto nvel foi desenvolvida em 1957 - denominada de FORTRAN (Formula Translator) - e destina-se a aplicaes cientficas e de engenharia. Principais vantagens das linguagens de Alto Nvel: facilidade de entendimento e uso; independncia de mquina ( praticamente a mesma, no

importando o computador utilizado).

ENG06842 Programao I

Para transformar os programas escritos com Linguagens de Alto Nvel em cdigos de mquina, usado um programa-suporte denominado TRADUTOR (Compilador ou Interpretador).
7.2. Tradutores: compiladores e interpretadores

Para executar um programa escrito numa linguagem de alto nvel preciso primeiro traduzir o cdigo-fonte para cdigo-objeto. O processo de traduo pode dar-se em tempo de execuo caso a linguagem use um

interpretador (traduz e executa instruo a instruo) , ou todas as


instrues podem ser traduzidas antes que se inicie a execuo do programa, o que ocorre no caso de linguagens que usam tradutores do tipo compilador.

Cdigo-fonte: no executvel diretamente pelo processador - permite apenas que o programador consiga definir o programa em uma forma legvel aos humanos. Cdigo-objeto: o cdigo produzido pelo compilador; uma forma intermediria, similar a linguagem de mquina do computador. Apesar de estar representado em binrio, no executvel diretamente pelo processador, pois normalmente, o cdigo-objeto referencia partes de programa que no esto necessariamente definidas no mesmo arquivo que o gerou, por exemplo, arquivos de bibliotecas de sub-rotinas. Editores de ligao (ou linkeditores): Um programa que rene mdulos compilados e arquivos de dados para criar um programa executvel. Os

linkeditores tm tambm outras funes, como a criao de bibliotecas.


Compilador: No sentido mais geral, qualquer programa que transforme um conjunto de smbolos em outro obedecendo a uma srie de regras sintticas e semnticas; no sentido mais comum, um programa que traduz

ENG06842 Programao I

todo o cdigo-fonte de programas escritos numa linguagem de alto nvel em cdigo-objeto antes da execuo do programa. Ou seja, traduz o programa escrito em linguagem de alto nvel (cdigo-fonte) para um programa equivalente escrito em linguagem de mquina (cdigo-objeto).

Interpretador: traduz e envia para execuo, instruo por instruo e o programa permanece na forma fonte.

7.3. Compilador PASCAL

O Turbo Pascal um programa que contm, alm do compilador PASCAL, um ambiente completo de programao, com editor de programa, depurador de erros, sistema de ajuda, etc. Existem diversos compiladores para a linguagem Pascal, porm para esse curso, ser utilizado como padro o compilador Borland Turbo Pascal 7.0, pois este um programa gratuito e de simples utilizao. Algumas dicas para aquisio e instalao deste programa so apresentadas no Erro: Origem da referncia no encontrada. O ambiente de desenvolvimento do Turbo Pascal (ver figura abaixo) composto de um editor de texto, um compilador, um programa ligador (linkeditor) e um depurador (debugger), harmonicamente integrados.

ENG06842 Programao I

Aps editar um arquivo, natural compil-lo e rod-lo, para ver os resultados do programa. Durante esse processo, o Turbo Pascal ir procurar erros em tempo de compilao. Seno houver erros, o programa rodar normalmente. Caso contrrio, o processo de compilao ser interrompido e o compilador indicar o erro e a sua posio. Os programas podem conter trs tipos de erros: Erro de sintaxe: ocorre quando se viola uma regra da linguagem. Ao encontrar um destes erros, o Turbo Pascal interrompe a compilao do programa, d uma mensagem com o nmero e a descrio do erro, e deixa o cursor piscando no item do programa que permitiu a deteco do erro. Deve-se observar que este item pode no estar errado, mas apenas permitiu detectar o erro. O Turbo Pascal no executa um programa enquanto houver erros de sintaxe. Erro de semntica: um erro que o programa detecta durante a sua execuo, interrompendo-a; por exemplo, quando o programa levado a ler um arquivo inexistente, a tirar a raiz quadrada de um nmero negativo, a dividir por zero, etc. Ocorrendo um erro de semntica, o Turbo Pascal interrompe a execuo do programa e mostra a descrio do erro, com o cursor piscando no incio da linha em que ele foi detectado.

ENG06842 Programao I

Erro de lgica: aparece em programas, sinttica e semanticamente corretos, que, apesar disso, no produzem os resultados desejados. So devidos a instrues corretas, para o computador, mas que no so apropriadas para a soluo lgica do problema que motivou o programa. A correo dos erros de lgica muitas vezes trabalhosa e demorada. Para ajudar a depurao de erros de lgica, o Turbo Pascal oferece diversos recursos que permitem ver e acompanhar o que ocorre durante a execuo de um programa. Erros de sintaxe e semntica no so preocupantes, pois o prprio computador os localiza e os identifica. Uma lista com os principais erros apresentados no Turbo Pascal so descritos no Apndice A Mensagens de erro do Turbo Pascal. Para compilar um programa, deve-se utilizar a opo COMPILE (compilar) do Menu COMPILE ou pressione Alt+F9. Caso seja detectado algum erro (de sintaxe), este ser exibido na tela, caso contrrio, ser exibida uma mensagem dizendo que o programa foi compilado com sucesso. A partir da, basta pressionar qualquer tecla para fechar essa mensagem e executar o programa. Para executar um programa, deve-se utilizar a opo RUN (executar) do Menu RUN ou pressione Ctrl+F9. Ao terminar a execuo, o Pascal volta para a janela de edio. Para ver os resultados do programa, basta pressionar Alt+F5. O Turbo Pascal 7.0 tambm oferece alguns recursos para depurao do programa. Um desses recursos a utilizao de break points (pontos de parada). Para sua utilizao, basta clicar com o boto direito do mouse sobre a linha onde a execuo do programa dever parar, e selecionar a opo Toogle breakpoint (ou pressionar Ctrl+F8). A linha ficar vermelha, e quando o programa for executado, assim que seu fluxo de execuo chegar nessa linha, ser possvel acompanhar passo-a-passo o restante da execuo do programa. Para isso, basta pressionar a tecla F8, que cada instruo subseqente ser executada uma a uma. Para verificar o 8

ENG06842 Programao I

contedo das variveis presentes na instruo atual, basta pressionar Ctrl+F4, ou clicar com o boto direito e selecionar a opo

Evaluate/Modify.
A seguir so descritos os menus do Turbo Pascal 7.0. File esta opo possibilita executar operaes de controle com arquivos. o New criar um novo programa. o Open abrir um programa existente. o Save salvar um programa em disco. o Save as salvar um programa em disco com outro nome. o Save all salvar todos os programas modificados. o Change dir mudar o diretrio de trabalho. o Print imprimir o programa da janela ativa. o Print setup configurar o uso de outra impressora. o DOS shell sair temporariamente para o sistema operacional (DOS). o Exit finalizar a execuo do Turbo Pascal. Edit esta opo possibilita executar operaes do editor do programa, sendo possvel remover, movimentar e copiar textos que estejam selecionados. o Undo desfazer uma operao com texto. o Redo refazer uma operao com texto.

ENG06842 Programao I

o Cut remover um texto previamente selecionado, enviando-o para rea de transferncia. o Copy copiar um texto selecionado do editor para uma rea de transferncia. o Paste copiar um texto da rea de transferncia para o editor. o Clear remover o texto selecionado sem transferi-lo para a rea de transferncia. o Show Clipboard apresentar o contedo existente na rea de transferncia. Search esta opo possibilita executar operaes de busca, troca e deslocamento dentro de um programa. o Find localizar uma seqncia de caracteres programa. o Replace substituir uma seqncia de caracteres por outra. o Search again repetir a ltima busca. o Go to line number posicionar-se em uma determinada linha do programa. o Show last compiler error compilao, quando ocorrer. o Find error posicionar-se na ltima posio de erro mostrar o ltimo erro de em um

encontrada pelo compilador. o Find procedure localizar uma sub-rotina dentro do programa no momento de depurao de um programa. Run esta opo possibilita colocar em execuo o programa da janela ativa.

10

ENG06842 Programao I

o Run compilar e executar o programa. o Step over rodar o programa passo a passo com exceo das sub-rotinas existentes. o Trace into rodar o programa passo a passo inclusive as suas sub-rotinas. o Go to cursor rodar o programa at a posio em que est o cursor. o Program reset interromper a execuo de um programa durante sua depurao. o Parameters efetuar a passagem de parmetros. Compile esta opo possibilita compilar o programa. o Compile compilar o programa da janela ativa. o Make recompilar apenas os programas alterados. o Build recompilar todos os programas. o Destination determinar se o programa ser compilado somente em memria ou disco. o Primary file determinar numa lista de arquivos qual ser o arquivo principal que ser carregado primeiro no processo de compilao. o Clear primary file limpar o arquivo anteriormente

configurado como o arquivo primrio. o Information obter informaes a respeito da ltima

compilao executada.

11

ENG06842 Programao I

Debug esta opo possibilita depurar o programa para facilitar a localizao de erros lgicos. o Breakpoint colocar ou retirar um ponto de parada (exame) na depurao de um programa. o Call stack apresentar uma janela com a seqncia de chamadas efetuadas de sub-rotinas. o Register visualizar a janela de registradores da CPU. o Watch abrir a janela de acompanhamento de valores nas variveis do programa. o Output abrir uma janela para apresentar as telas de sada do programa em execuo ou depurao. o User Screen exibir na sua totalidade a tela do usurio. o Evaluate/modify permite efetuar a avaliao de expresses, constantes ou variveis. o Add watch possibilidade de incluir expresses na tela de vigia. o Add breakpoint permite a incluso de um ponto de parada quando for executado o programa. Tools esta opo possibilita a utilizao de ferramentas

configuradas pelo usurio. o Messagens abrir uma janela para a apresentao de mensagens. o Go to next visualizar a prxima mensagem da janela de mensagens.

12

ENG06842 Programao I

o Go to previous visualizar a mensagem anterior da janela de mensagens. o Grep efetuar a busca de seqncias de caracteres em programas gravados atravs do utilitrio GREP.EXE. Options esta opo permite configurar a forma de trabalho do ambiente do Turbo Pascal. o Compiler alterar o estado das diretivas de compilao. o Memory sizes definir o tamanho de memria. o Linker a possibilidade de usar ou no o recurso de link. o Debugger estabelecer critrios de depurao. o Directories determinar os diretrios de trabalho. o Browser especifica configuraes globais do visualizador. o Tools efetuar a manuteno do menu de ferramentas. o Environment efetuar mudanas no ambiente de trabalho (Preferncias, Editor, Mouse, Inicializao e Cores) do Turbo Pascal conforme necessidade do usurio. o Open a abertura do arquivo de configurao. o Save gravar o arquivo de configurao. o Save as gravar o arquivo de configurao com outro nome. Window esta opo possibilita o controle das janelas que estejam abertas. o Tile ordenar as janelas lado a lado. o Cascade ordenar as janelas em cascata.

13

ENG06842 Programao I

o Close all fechar todas as janelas. o Refresh display redesenhar a janela ativa. o Size/Move movimentar ou alterar o tamanho de uma janela. o Zoom alterar o tamanho de uma janela para o tamanho mximo ou para o tamanho preestabelecido. o Next selecionar a prxima janela como ativa. o Previous selecionar a janela anterior como ativa. o Close fechar a janela ativa. o List apresentar a listagem das janelas que estejam abertas. Help esta opo permite executar o modo de ajuda do Turbo Pascal. O modo de ajuda poder ser executado de qualquer parte do programa com a tecla de funo F1 ou Ctrl+F1 para visualizar explicaes de instrues que estejam marcadas com o posicionamento do cursor sobre elas. o Contents apresenta o sumrio. o Index apresenta todas as instrues em ordem alfabtica. o Error messages apresenta uma lista de erros de execuo e de compilao. o About informaes sobre o Turbo Pascal 7.0.
7.4. Exerccios

1. Defina, com suas palavras, os seguintes termos: a) programa b) linguagem de programao

14

ENG06842 Programao I

c) tradutor 2. Qual a diferena entre linguagem de baixo nvel e linguagem de alto nvel? 3. Qual a diferena entre cdigo-fonte e cdigo-objeto? 4. Explique a diferena entre compilador e interpretador. 5. Diferencie com suas palavras os trs tipos de erros encontrados em programas.

15

ENG06842 Programao I

8. A Linguagem Pascal

8.1. Introduo

A linguagem de programao PASCAL foi criada para ser uma ferramenta educacional, isto no incio da dcada de 70 pelo Prof. Niklaus Wirth da Universidade primeiras de Zurique. lgicas Foi batizada pelo Foi seu idealizador em em homenagem ao grande matemtico Blaise Pascal, inventor de uma das mquinas conhecidas. baseada algumas linguagens estruturadas existentes na poca, ALGOL e PLI. O prprio Niklaus Wirth diz que esta linguagem foi criada

simultaneamente para ensinar programao estruturada e para ser utilizada em sua fbrica de software. A linguagem extremamente bem estruturada e muito adequada para ensino de linguagens de programao. provavelmente uma das linguagens mais bem resolvidas entre as linguagens estruturadas, e certamente um dos exemplos de como uma linguagem especificada por uma pessoa pode ser bem melhor do que uma linguagem especificada por um comit. Apesar de seu propsito inicial, o PASCAL comeou a ser utilizado por programadores de outras linguagens, tornando-se, para surpresa do prprio Niklaus, um produto comercial. Comercialmente, a linguagem foi sucedida pela criao da linguagem Object Pascal, atualmente utilizada nas IDEs Borland Delphi, Kylix e Lazarus. Academicamente, seus sucessores so as linguagens subseqentes de Niklaus Wirth: Modula-2 e Oberon.
8.2. Tipos de dados simples

integer - Envolve os nmeros inteiros. A partir da verso 5.0 do Turbo Pascal passaram a existir tambm outros tipos de nmeros inteiros: shortint, byte, word e longint.

16

ENG06842 Programao I

Exemplos: -45, 1, 138, 0, -2.

Tipo shortint byte integer word longint

Valor mnimo -128 0 -32768 0 -2147483648

Valor mximo 127 255 32767 65535 2147483647

Bytes ocupados 1 1 2 2 4

real - abrange os nmeros reais. A partir da verso 5.0 passaram a existir tambm outros tipos de nmeros reais: single, double, extended e comp. Exemplos: 4.5, -32.0, .5, 7.8E3, 21E+3, -315E-3. Valor mnimo +-2.9 x 10-39 +-1.5 x 10-45 +-5.0 x 10-324 +-3.4 x 104932

Tipo real single double extended comp

Valor mximo -+1.7 x 1038 +-3.4 x 1038 +-1.7 x 10308 +-1.1 x 104932 263 - 1

Bytes ocupados 6 4 8 10 8

Dgitos significativo s 11-12 7-8 15-16 19-20 19-20

-263 + 1

boolean - representa um valor lgico (booleano). Utiliza apenas duas constantes lgicas: true (verdadeiro) e false (falso). char - representa um nico caractere, escrito entre apstrofos ( ). A maioria dos computadores utiliza a tabela de cdigos ASCII (ver Apndice B Tabela de cdigos ASCII) para representar todos os caracteres disponveis. Qualquer caractere poder ser representado pelo seu cdigo ASCII em decimal, precedido por #, ou em hexadecimal, precedidos por # e $. Exemplos: A, B, a, 1, @, , #65 ( o caractere A).

17

ENG06842 Programao I

string - formado por um conjunto de elementos do tipo char. O tamanho mximo de 255 caracteres. Tambm pode apresentar um tamanho prdefinido: string[5], por exemplo (mximo de 5 caracteres). Exemplos: CPU, Processamento de Dados, 123.
8.3. Mapeamento Portugol x Pascal

A passagem de um cdigo em Portugol para a linguagem Pascal praticamente direta, como se fosse uma simples traduo de portugus para ingls. Entretanto, algumas estruturas devem ser cuidadosamente observadas. A seguir so apresentadas as principais regras para realizar o mapeamento de Portugol para Pascal. PORTUGOL PASCAL

algoritmo CALCULA_MEDIA; program CALCULA_MEDIA; var var P1, P2, P3, P4, MEDIA: real; P1, P2, P3, P4, MEDIA: real; inicio begin leia (P1); read (P1); leia (P2); read (P2); leia (P3); read (P3); leia (P4); read (P4); MEDIA := (P1 + P2 + P3 + p4) / MEDIA (P1 + P2 + P3 + p4) / 4; 4; write (MEDIA); escreva (MEDIA); if MEDIA 7,0 then se MEDIA 7,0 ento write (APROVADO) escreva (APROVADO); else seno write (REPROVADO); escreva (REPROVADO); end. fim-se; fim. No exemplo acima, nota-se claramente que feita um traduo portugus-ingls do algoritmo. Entretanto, deve-se observar as equivalncias definidas na tabela abaixo: PORTUGOL algoritmo inicio fim leia escreva PASCAL program begin end read write 18

ENG06842 Programao I

:= se if ento then seno else caso case enquanto ... faa while ... do repita ... at repeat ... until para ... at ... faa for ... to ... do Como pode ser observado no exemplo anterior, a palavra fim-se no usada em Pascal, pois deve-se entender que apenas uma instruo ser executada aps o if e o else. Caso seja necessria a execuo de mais de uma instruo dentro do if, por exemplo, deve-se definir um bloco (conjunto de comandos delimitados pelas palavras begin e end) atravs dos comandos begin e end. Exemplos: if condio1 then begin comando 1; if condio2 then comando 2; end else comando 3; Obs.: O comando anterior ao else nunca terminar com ;. No caso acima o end anterior ao else no termina com ;. Exemplos: if condio then begin comando 1; comando 2; ... end else begin comando 3; comando 4; ... end;

if condio then comando 1 else comando 2;

19

ENG06842 Programao I

Resumindo ento, utiliza-se a definio de blocos apenas nos casos onde mais de uma instruo dever ser executada. Esse conceito de blocos tambm usado nas estruturas de repetio. Os comandos read e write podem ser substitudos pelos comandos readln e writeln, respectivamente. Esses novos comandos saltam uma linha aps sua execuo. Ex: writeln(teste); Esse comando escreve teste e pula para a linha abaixo na tela. No comando write, pode-se definir o formato de sada das variveis numricas (casas decimais, com arredondamento), pois no seu modo padro, os valores aparecero em notao cientfica. Ex: Seja a varivel a = 2.36780984. write(a); write(a:3:2); { Ser mostrado o valor: 2.3678098400E+00 } { Ser mostrado o valor: 2.37 }

No caso do comando for (para), o contador atualizado, por padro, de 1 em 1. Entretanto, esse comando pode ser usado com TO, onde a varivel de controle assume valores crescentes e com DOWNTO, onde a varivel assume valores decrescentes. Exemplos: for identificador := valor1 to/downto valor2 do downto } comando ; } Exemplo: fatorial de N (inteiro maior que 1). readln(N); fat := 1; for I := N downto 1 do fat := fat * I; writeln(O fatorial de , N:5, , fat:5); ... { ou bloco de comandos, usando begin e end { escolher entre to e

20

ENG06842 Programao I

8.4. Unidades pr-definidas

O Turbo Pascal possui diversas unidades predefinidas: system, printer, crt, dos, overlay e graph so as principais. Os identificadores usados nestas unidades geralmente so formados por palavras compostas em ingls que lembram seu significado. Uma unidade (unit) nada mais que um conjunto de procedimentos e funes que trabalham sob um mesmo objetivo. uma coleo de declaraes de constantes, tipos, variveis, funes e procedimentos, compilada separadamente. Algumas destas declaraes so de uso interno da unidade, enquanto outras so visveis, isto , podem ser usadas por programas ou outras unidades. Por exemplo, a unit graph possui comandos para criao de desenhos, figuras, barras, entre outros; a unit crt possui os procedimentos bsicos de entrada e sada de dados e comandos de controle do monitor. Dessa forma, para utilizar uma funo criada dentro de uma unidade, deve-se declarar o uso dessa unidade no incio do cdigo-fonte (aps a definio do nome do programa). Ex: uses crt; A clusula uses permite que uma unidade faa uso de outras unidades. Para usar uma ou mais unidades, um programa deve conter a clusula uses antes das declaraes de variveis. A seguir so apresentadas algumas das principais unidades disponveis no Pascal. system a nica unidade que no necessita estar na clusula uses dos programas ou das outras unidades que a utilizarem. Ex.: tipos de constantes e variveis; comentrios; expresses aritmticas, lgicas e literais; funes numricas predefinidas; funes literais predefinidas; comandos de entrada e sada; comandos de estrutura condicional e de repetio. printer define um arquivo lst do tipo texto, associado impressora do computador, permitindo a sua utilizao com os comandos write(lst, ...) e writeln (lst, ...).

21

ENG06842 Programao I

crt oferece diversos recursos para utilizar o vdeo no modo texto, o teclado e o som do computador. Essa unidade usada em praticamente todos os programas escritos em Pascal. dos contm constantes, tipos, variveis, funes e procedimentos relacionados com o sistema operacional. Ex.: obter data e hora; espao no disco rgido; espao livre no disco rgido, etc. graph permite utilizar o vdeo em modo grfico, define um grande nmero de constantes, tipos, variveis, funes e procedimentos.
8.5. Palavras reservadas

So palavras que fazem parte da estrutura da linguagem e tm significados pr-determinados. Elas no podem ser redefinidas e no podem ser utilizadas como identificadores. A tabela a seguir apresenta as palavras reservada da linguagem Pascal. absolute and array begin case const div do downto else end external file for forward function goto if implementati on in inline interface interrupt label mod nil not of or packed procedure program record repeat set shl shr string then to type unit until uses var while with xor

8.6. Funes pr-definidas

A seguir, so apresentadas algumas funes matemticas pr-definidas na linguagem Pascal. Funo abs(X) frac(X) trunc(X) round(X) Finalidade valor absoluto parte fracionria parte inteira valor arredondado Tipo do argumento integer, real real real real Tipo do resultado
o mesmo do argumento

real integer integer

22

ENG06842 Programao I

sqr(X) sqrt(X) ln(X) exp(X)

eleva ao quadrado raiz quadrada logaritmo natural exponencial

integer, real integer, real real real

o mesmo do argumento

real real real

Como no existe em Pascal um operador nem uma funo especfica para a operao de potenciao, pode-se consegui-la utilizando as funes ln(X) e exp(X). Para calcular o valor de XN suficiente usar: exp(ln(X)*N) Exemplos: Expresso abs(-2.5) abs(8) frac(5.234) trunc(2.78) round(2.78) sqr(2) sqr(1.5) sqrt(4) sqrt(2.25) exp(ln(2)*3) Resultado 2.5 8 0.234 2 3 4 2.25 2 1.5 8

A seguir, so apresentadas outras funes interessantes disponveis na linguagem Pascal. val(atr,num,code): a funo val tentar converter a string informada na varivel atr em um valor numrico (que ser armazenado na varivel num), seja real ou integer. Caso no seja possvel, a varivel inteira code retornar a posio de erro encontrada. Exemplo: val(str_idade,val_idade,code); { se str_idade tiver 12a, code ter 3, ou seja, erro
}

val(str_idade,val_idade,code); { se str_idade tiver 12, code ter 0, ou seja, sem


erros }

str(num,str): a funo str converter o valor numrico informado em uma string. Exemplo: str(val_idade,str_idade); 23

ENG06842 Programao I

keypressed: a funo keypressed retornar true caso haja alguma informao no buffer do teclado, ou seja, caso alguma tecla seja pressionada. Caso contrrio retornar false. Exemplo: repeat until keypressed; {dar uma pausa no programa at que se pressione
alguma tecla}

readkey: a funo readkey pra a execuo do programa at que alguma tecla seja pressionada. muito utilizada como ltima instruo de um programa, pois assim o usurio pode ler o que est escrito na tela com calma, e quando terminar, pressiona uma tecla e o programa encerrado. Exemplo: readkey; odd(num): a funo odd retornar true se o valor informado for mpar (inteiro). Caso contrrio retornar false. Exemplo: if odd(num) then write( mpar); inc(num,val): a funo inc ir incrementar o nmero informado em 1 (um), caso o segundo parmetro no seja informado. Se o mesmo for informado, o incremento ser de seu valor. Exemplos: inc(x); {o mesmo que x := x+1;} inc(y,5); {o mesmo que y:=y+5;} dec(num,val): a funo dec ir decrementar o nmero informado em 1 (um), caso o segundo parmetro no seja informado. Se o mesmo for informado, o decremento ser de seu valor. Exemplos: dec(x); {o mesmo que x:=x-1;} dec(y,5); {o mesmo que y:=y-5;} ord(car): a funo ord retornar o cdigo ASCII (em decimal) da varivel car (do tipo char). Exemplo: write(ord(a),ord(A)); {mostrar 97 65, os
respectivos cdigos ASCII}

24

ENG06842 Programao I

upcase(char): a funo upcase retornar o caractere informado em formato maisculo. Caso o caractere informado no seja alfabtico, o mesmo ser retornado como foi informado. Exemplo: write(upcase(a)); {mostrar A} Obs.: para converter um caractere em maisculo basta diminuir 32 de seu cdigo ASCII. Exemplo: write(letra); dec(letra,32); write(letra); chr(code): a funo chr retornar o caractere correspondente ao cdigo ASCII informado. Exemplo: write(chr(97)); {mostrar a} insert(str,str_destino,pos_inicio): a funo insert ir inserir a string str na string str_destino a partir da posio pos_inicio. Somente a varivel str_destino ser alterada. Exemplo: msg := O Brasil foi penta!; adic := no#32; insert(adic,msg,10); write(msg); {O Brasil no foi penta!} delete(str,pos_inicio,quant): a funo delete ir eliminar uma string interna a outra string. O primeiro parmetro a string, o segundo a posio inicial, e o terceiro e ltimo a quantidade de caracteres a remover. Somente o primeiro parmetro ser alterado. Exemplo: msg := O Brasil no foi penta!; delete(msg,10,4); write(msg); {O Brasil foi penta!} concat(str1,str2,...,strN): a funo concat retornar a concatenao (unio) de todas as strings informadas como parmetros. O resultado da 25 {A} {a}

ENG06842 Programao I

concatenao no pode ultrapassar os 255 caracteres permitidos. Utilize o operador + ao invs de concat, pois + mais veloz. Exemplo: msg1:= Linguagem; msg2:=#32; msg3:= Pascal; write(concat(msg1,msg2,msg3)); {Linguagem Pascal} mais rpido usar: write(msg1 + msg2 + msg3); copy(str,pos_inicio,quant): a funo copy retornar uma substring a partir de uma string original. A string original o primeiro parmetro, a posio inicial de cpia o segundo e a quantidade de caracteres a serem copiados o terceiro. Exemplo: msg := A Linguagem Pascal; write(copy(msg,13,6)); {Pascal} length(str): a funo length retornar o comprimento da string, ou seja, seu nmero de caracteres. Exemplo: msg := A Linguagem Pascal; write(length(msg)); {18} clrscr: a funo clrscr limpar toda a tela; Exemplo: clrscr; textbackground(c): altera a cor de fundo da tela. O parmetro c pode variar de 0 a 7, e tambm pode-se usar o nome da cor em ingls. Para alterar a cor de toda a tela deve-se usar o comando clrscr em seguida. Exemplo: textbackground(1); clrscr; { toda a tela ficar azul }

textcolor(c): altera a cor do texto. O parmetro c pode variar de 0 a 15, e tambm pode-se usar o nome da cor em ingls.. Exemplo: textcolor(10);

26

ENG06842 Programao I

clreol: a funo clreol limpar parte da tela, apenas da posio do cursor at o final da mesma linha. Exemplo: clreol; delline: a funo delline limpar toda a linha onde estiver o cursor, sem mov-lo. Exemplo: delline; insline: a funo insline ir inserir uma linha onde estiver o cursor, sem mov-lo. Todos os dados que estiverem abaixo da posio do cursor sero deslocados para baixo. Caso se queira inserir mais de uma linha, basta colocar essa funo dentro de um lao (loop). Exemplo: for x := 1 to 10 do insline; {ir inserir10 linhas a partir da posio do cursor}

sound(freq): a funo sound ir ativar o auto-falante do micro, bastando apenas informar no parmetro a freqncia do som desejado. Normalmente utiliza-se esse procedimento com os procedimentos delay e nosound, j que sound sozinho ir ativar o som e o mesmo ficar tocando o tempo todo. Exemplo: sound(200); nosound: a funo nosound ir desligar o som do auto-falante do micro. Exemplo: nosound; delay(ms): O procedimento delay ir dar uma pausa na execuo do programa, s que diferentemente dos procedimentos j citados, essa pausa se dar por um tempo informado no parmetro em milisegundos (10-3s). Exemplo: sound(240); delay(1000); nosound; random(num): a funo random retornar um valor randmico {equivale a 1s}

(aleatrio) a partir do nmero informado. Esse nmero randmico ser um nmero qualquer na faixa de 0 <= a < num. Caso no seja informado um nmero, o valor randmico estar na faixa 0 <= a < 1. Normalmente esta funo utilizada com o procedimento randomize. Exemplo: 27

ENG06842 Programao I

random(300); {atravs de frmulas internas, ser gerado um nmero entre 0 e


300}

randomize: a funo randomize ir fazer apenas um pequeno diferencial no uso da funo random. Toda vez que se utiliza random, o valor inicial das frmulas o mesmo. Portanto, os valores randmicos sempre sero os mesmos. Para que isto no acontea, basta utilizar o procedimento randomize, o mesmo ir fazer com que o valor inicial das frmulas de randomizao seja baseado na hora do sistema, o que sabemos que muda constantemente. Exemplo: randomize; repeat write(random(500)); delay(50); until keypressed; exit: a funo exit ir fazer com que a execuo do programa saia do procedimento atual e v para o seu chamador. Caso o procedimento atual seja o programa principal, exit terminar a execuo do programa. Exemplo: if tecla = #27 then exit; { Pressionou ESC, fim }

Exemplo: Um programa para ler um nmero e mostrar se igual a zero, positivo ou negativo. O fundo de tela deve estar em azul e as letras em amarelo. program teste; uses crt; var num: real; begin textbackground (blue); clrscr;

28

ENG06842 Programao I

textcolor (yellow); write (Digite um numero: ); readln (num); if num = 0 then writeln (Igual a zero.) else if num > 0 then writeln (Numero positivo.) else writeln (Numero negativo.); readkey; end.
8.7. Tipos definidos pelo usurio

Os tipos byte, integer, real, boolean, char, etc so pr-definidos em Pascal e constituem conjunto de valores inteiros, reais, lgicos, caractere, etc. O Pascal permite a criao de novos tipos. Um novo tipo criado atravs de uma definio que determina um conjunto de valores associados a um identificador. Uma vez definido, o tipo passa a ser referenciado pelo seu identificador. O novo tipo criado pelo usurio tambm denominado tipo enumerado. Os identificadores que criamos para um tipo enumerado no representam mais nenhum valor, exceto seus prprios. Os tipos enumerados constituem ferramentas extremamente teis na criao de programas limpos e auto-documentados, podendo ser referenciados em qualquer parte do programa. Um tipo enumerado uma seqncia ordenada de identificadores definidos pelo usurio, que forma um tipo ordinal. A palavra reservada para criao de tipos enumerados type. Exemplo: type semana = (segunda, tera, quarta, quinta, sexta, sbado, domingo);

29

ENG06842 Programao I

Uma das mais importantes caractersticas de um tipo enumerado a ordem na qual os valores so ordenados. Alm de estabelecer os prprios identificadores, a declarao do mesmo define a ordem dos identificadores no tipo. Diversas operaes so vlidas usando os tipos enumerados. Exemplo: program cores; uses crt; type cores = (preto, azul, vermelho, amarelo, verde, rosa, branco, roxo, lilas); var uma_cor: cores; begin clrscr; uma_cor := roxo; tipo} uma_cor := succ(uma_cor); uma_cor := pred(uma_cor); antecessor} uma_cor := succ(azul); uma_cor := preto; writeln(ord(uma_cor)); uma_cor := preto; writeln(ord(uma_cor)); {escrever 0, a ordem do preto} for uma_cor := preto to rosa do writeln(ord(uma_cor)); {escrever as posies, do preto ao rosa} end. As variveis de tipos enumerados no podem ser lidas ou escritas. No vlida nenhuma operao aritmtica com os elementos de um tipo enumerado, como somar 1, diminuir 2 ou somar duas constantes ou mais constantes do tipo. {escrever 2, a ordem do vermelho} {receber vermelho, sucessor de azul} if succ(uma_cor)>=lilas then {receber lils, o sucessor} {receber roxo novamente, o {atribuir um identificador a varivel de

30

ENG06842 Programao I

Pode-se usar as constantes dos tipos enumerados para servir de ndice de vetores/matrizes e tambm no lao (loop) for. A ordem do primeiro elemento do tipo tem valor 0. Um tipo pode ser definido como uma parte de um dado tipo escalar. Esta parte ou faixa define o domnio de um tipo escalar que est associado a um novo tipo, que chamado de tipo escalar. A definio de uma faixa (subrange) indica quais os valores mnimo e mximo que podem ser assumidos. A descrio de uma faixa se faz com a indicao dos seus limites separados por dois pontos (..), onde o limite inferior deve ser menor que o limite superior. Exemplo: program dias; uses crt; type semana = (seg, ter, qua, qui, sex, sab, dom); {tipo enumerado} coluna = 1..80; {tipo escalar associado: byte} maius = A..Z; {tipo escalar associado: char} d_util = seg..sex; {tipo escalar associado: semana} num = -128..130; {tipo escalar associado: integer} var letra: maius; dia: d_util; begin clrscr; for letra := J to P do write(letra:2); for dia := seg to sex do case dia of seg: writeln(Segunda); ter: writeln(Tera); qua: writeln(Quarta); qui: writeln(Quinta); other writeln(Sexta); end; readkey; end.
8.8. Exerccios

1. Transforme os algoritmos elaborados nas questes 24 e 25 do Captulo 4 para a linguagem Pascal. Execute esses algoritmos no computador.

31

ENG06842 Programao I

2. Transforme os algoritmos elaborados nas questes 1, 2, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30 e 31 do Captulo 5 para a linguagem Pascal. Execute esses algoritmos no computador. 3. Transforme os algoritmos apresentados ou elaborados nas questes 1, 2 e 3 do Captulo 6 para a linguagem Pascal. Execute esses algoritmos no computador.

32

ENG06842 Programao I

9. Estruturas de dados
9.1. Introduo

Os tipos estruturados so compostos por mltiplos elementos relacionados entre si. Cada grupo de elementos est relacionado a um identificador. Os elementos do grupo podem estar tambm relacionados a identificadores individuais, representando vrios locais de memria que guardam vrios valores, e que podem ser acessados em conjunto ou individualmente.
9.2. Variveis compostas homogneas

Correspondem a posies de memria, identificadas por um mesmo nome, individualizadas por ndices e cujo contedo de mesmo tipo. O conjunto de 10 notas dos alunos de uma disciplina pode constituir uma varivel composta. A este conjunto, associa-se o identificador NOTA, que passar a identificar no uma nica posio de memria, mas 10. A referncia ao contedo do n-simo elemento do conjunto ser indicada pela notao NOTA[n] onde n um nmero inteiro ou uma varivel numrica contendo um valor inteiro. Exemplo: Supondo que a varivel composta NOTA contivesse os seguintes valores: 6 0
1

7 0
2

9 0
3

6 0
4

5 5
5

9 1
6

10 0
7

4 7
8

7 4
9

8 6
10

NOTA[3] estaria referenciando o terceiro elemento do conjunto cujo contedo 90. Vetores (array): definem conjuntos de dados homogneos (todos os elementos so do mesmo tipo). Cada elemento ocupa uma posio definida no conjunto e pode ser referenciado atravs dela. Esses conjuntos

33

ENG06842 Programao I

necessitam de apenas um ndice para enderear seus elementos. So conhecidos como Variveis Compostas Unidimensionais. Declarao de vetores: <identificador>: array [tipo_ndice] of tipo_elemento; tipo_ndice: um tipo simples ordenado (inteiro, caractere, booleano, enumerado). formado por: [li..ls] , onde li: limite inferior e ls: limite superior. Este tipo pode ser utilizado tanto na declarao de variveis como tambm na definio de novos tipos. Ex1: var lista: array [1..100] of real; { o identificador do vetor lista e ele poder conter 100 elementos do tipo real } Ex2: type indice = 1..100; { tipo definido pelo usurio - tipo subrange } var lista: array [indice] of real; Ex3: type max = 300; vetor = array[1..max] of string[20]; var endereco: vetor; { a varivel endereo est associada ao tipo vetor } Ex4: var dados: array[A..Z] of integer; Definio de Vetores como constantes: sintaxe geral: 34

ENG06842 Programao I

<identificador_constante>: tipo_array = (lista de valores); Ex1: const vetconst: array [1..3] of integer = (0, 1, 2); Ex2: type vetsemana = array [1..7] of string [3]; const dias_semana: vetsemana = (DOM, SEG, TER, QUA, QUI, SEX, SAB); Obs: Os valores das constantes array de tipo char podem ser especificados ou como valores de caracteres simples ou como um string. Ex: const digito: array [0..9] of char = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9); ou const digito: array [0..9] of char = 0123456789; A manipulao de vetores nos programas Pascal pode ser expressa com uma constante, varivel ou expresso, devendo ser do tipo correto (correspondente definio do array) e estar dentro do intervalo prdefinido. Ex: lista[5] lista[i], onde i uma varivel inteira com valores variando de 1 a 100. lista[i+j], onde i e j so variveis inteiras cuja soma no ultrapassa 100. Os elementos do ARRAY podem ser usados em expresses, instrues de atribuio, instrues read e write, etc. Exemplo: program exVetor; type vetorNotas = array [1..40] of real;

35

ENG06842 Programao I

var nota: vetorNotas; i: integer; begin i := 1; media := 0; repeat begin write (Digite a nota :); read(nota[i]); media:= media + nota[i]; i:= succ(i); +1} end; until i > 40; writeln (Notas dos alunos ); for i:= 1 to 40 do writeln (nota[i]); writeln (Media da turma:, media/40:5:2); end. Matrizes (vetores multidimensionais): tambm definem conjuntos de dados homogneos (todos os elementos so do mesmo tipo), entretanto, esses conjuntos necessitam de mais de um ndice para enderear seus elementos. So conhecidos como Variveis Compostas Multidimensionais (matrizes). Exemplo de matriz bidimensional:
1 1 2 3 2 3

{ funo que incrementa a varivel i := i

1 0 6 7 1 6

4 7 9 8 2 1

9 4 7 4 3 2

Declarao de matrizes:

36

ENG06842 Programao I

<identificador>: array [dim1,dim2,...] of tipo_elemento; As dimenses so definidas como: dim1 = li1..ls1, dim2 = li2..ls2, etc. Exemplo de declarao de uma matriz TRIDIMENSIONAL: mat3D: array [1..10, 1..20, 1..40] of real; A 1 dimenso tem 10 elementos, a 2 tem 20 elementos e a 3 tem 40 elementos. Todos os elementos so nmeros reais. Matriz BIDIMENSIONAL: mat2D: array [1..5,1..9] of char; uma matriz bidimensional com 5 elementos do tipo char na 1 dimenso e 9 na 2 dimenso. A manipulao de matrizes nos programas em Pascal pode ser expressa com constantes, variveis ou expresses, devendo ser do tipo correto (correspondente definio do array) e estar dentro do intervalo prdefinido. Exemplo: mat3D[5,4,8], mat2D[i,9], onde i uma varivel inteira com valores variando de 1 a 5. Os elementos da matriz podem ser usados em expresses, instrues de atribuio, instrues read e write, etc. Exemplo: program Matrizes; var matriz: array [1..20, 1..10] of integer; lin, col: integer; begin for lin := 1 to 20 do for col := 1 to 10 do read (matriz[lin,col]); ...

37

ENG06842 Programao I

Uma matriz tambm pode ser definida como uma constante, e nesse caso, essa matriz deve ser definida da seguinte forma: type apart = array[1..5,1..2] of string[3]; const num: apart = ((101,102), (103,104), (105,106), (107,108), (109,110)); { 1 linha ... write(num[3,2]); {106} write(num[1,1]); {101} Exemplo: program matriz; uses crt; const alunos: array[1..3,101..103] of string[10] = ((Cenira,Joana,Marcia), {primeira linha} (Lourdes,Ngyla,Luciana), {segunda linha} (Patrcia,Marcos,Anglica)); linha} var i,j: integer; begin clrscr; for i:=1 to 3 do for j:=101 to 103 do writeln(Aluno(a),I, da turma ,j,: ,alunos[i,,j]); {listar por linha} writeln; {terceira 2 linha 3 linha 4 linha 5 linha }

38

ENG06842 Programao I

for j:=101 to 103 do for i:=1 to 3 do writeln(Aluno(a),I, da turma ,j,: ,alunos[i,,j]); {listar por coluna} readkey; end. Cuidados ao utilizar arrays: Caso o seu limite seja ultrapassado, o programa pode travar e junto com ele o sistema. O Pascal s acusar erro se voc tentar atribuir a um vetor um dado qualquer com ndice fora da faixa escrita no programa. Mas isso no acontecer se a origem do ndice for alguma expresso. Os tipos array em Pascal so estticos, ou seja, o comprimento e as dimenses alocadas so fixas em tempo de compilao e no podem ser redefinidas durante a execuo do programa.
9.3. Variveis compostas heterogneas

O principal tipo de variveis compostas heterogneas o registro, que consiste em conjuntos de dados logicamente relacionados, mas de tipos diferentes (numricos, lgicos, literais, etc). Pode-se definir registros em Pascal na sesso type ou diretamente declarar variveis do tipo record. a) Declarao na sesso TYPE: type <nome_novo_tipo> = record campo 1: tipo 1; campo 2: tipo 2; campo n: tipo n; end;

39

ENG06842 Programao I

var <identificador_variavel>: <nome_novo_tipo>; Exemplo: type { Atencao para a indentacao dos campos do registro} nome: string[40]; idade: integer; funcao: string[30]; salario: real; end; var funcionarioUFES: funcionario; b) Declarao na sesso VAR: var <identificador_registro>: record campo 1: tipo 1; campo 2: tipo 2; campo n: tipo n; end; Exemplo: var funcionarioUFES: record nome: string[40]; idade: integer; funcao: string[30]; salario: real; end;

funcionario = record

40

ENG06842 Programao I

Os campos dos registros podem ser por sua vez de tipos simples ou estruturados (array, registros, etc.). Exemplo: type estadosBrasil = (AC,AL,AM,AP,BA,CE,DF,ES,GO,MA,MG,MS,MT,PA,PB,PE, PI,PR,RJ,RN,RO,RR,RS,SC,SE,SP,TO); var cliente: record nome: string[50]; endereco: record rua: string [30]; numero: integer; complemento: string [40]; cep: string [10]; cidade: string[20]; estado: estadosBrasil; end; valoresUltimasCompras: array [1..10] of real; end; O acesso aos campos de um registro pode ocorrer de duas formas: a) uso da notao <identifRegistro>.<campo>. Ex: write(Digite o nome do funcionario: ); readln(funcionarioUFES.nome); nome } write(Digite a funcao do funcionario: ); readln(funcionarioUFES.funcao); funcao } ... b) uso da estrutura with <identif_Registro> do. Ex: with funcionarioUFES do 41 {acesso ao campo {acesso ao campo

ENG06842 Programao I

begin writeln(Dados do funcionario cadastrado); writeln(Nome: , nome); writeln(Idade: , idade); writeln(Funcao: , funcao); writeln(Salario: , salario:5:2); end; Exemplo: program exRegistro; var aluno : record matricula: string[6]; nome: string[15]; serie: integer; turma: char; um tipo } end; begin write('Numero de matricula: '); readln(aluno.matricula); write('Nome: '); readln(aluno.nome); registro aluno} write('Serie: '); readln (aluno.serie); write ('Turma: '); readln (aluno.turma); { comando with indica o registro que ser usado - no h necessidade de se colocar begin e end quando se tem apenas um comando na estrutura with } with aluno do write (O aluno , nome , estuda na , serie, serie!); {acesso ao campo nome do { cada campo tem um nome e { varivel aluno do tipo registro } {definio dos campos do registro }

42

ENG06842 Programao I

end. Conjunto de registros: utilizado para armazenar n informaes referentes ao mesmo tipo de registro, como, por exemplo, informaes de vrios funcionrios ou vrios alunos. Em Pascal, esse tipo de conjunto definido por um array unidimensional (vetor) de registros. A declarao dada da seguinte forma: type <tipo_registro> = record campo 1: tipo 1; campo n: tipo n; end; var <identif_vetor>: array[n..m] of <tipo_registro>; Exemplo: type aluno = record matricula: string[6]; nome: string[15]; serie: integer; end; var vetAlunos: array [1..45] of aluno; A manipulao de conjuntos de registros dada da seguinte forma: <identif_vetor>[posicao].campo. Ex: for i:= 1 to 45 do begin readln(vetAlunos[i].matricula); readln(vetAlunos [i].nome); readln(vetAlunos [i].serie); 43

ENG06842 Programao I

end; Tambm pode-se usar a estrutura with. Ex: for i:=1 to 45 do with vetAlunos[i] do begin readln(matricula); readln(nome); readln(serie) end; Exemplo:

44

ENG06842 Programao I

program produtos; uses crt; type produto = record ident: string[3]; descr: string[10]; preco: real; quant: integer; end; var vet_prod: array [1..3] of produto; i: integer; begin clrscr; writeln (*** CADASTRO DE PRODUTOS ***); for i:=1 to 3 do with vet_prod[i] do elemento do vetor } begin write(identificao: ); readln(ident) ; write(descrio: ); readln(descr) ; write(preco: ); readln(preco) ; write(quantidade: ); readln(quant) end; writeln (***** Produtos no Estoque *****) ; writeln (---Identif.----Descricao----Preco----Quantidade---) ; for i:=1 to 3 do with vet_prod[i] do if quant > 0 then { vet_prod[i] representa cada

45

ENG06842 Programao I

write( , ident, , descr, , preco:6:2, , quant); end.


9.4. Algoritmos de classificao e busca

Algoritmos de classificao: existem diversos mtodos para classificar (ou ordenar) uma estrutura de dados. Os mais conhecidos so o Mtodo da Bolha, o Mtodo da Seleo Direta e o Mtodo Quick Sort, porm o mais comum desses o Mtodo da bolha (Bubble Sort). Exemplo: Mtodo da Bolha para ordenao de um vetor de nomes de objetos. program BubbleS; uses crt; const N=5; type letras = string[10]; vet_letras = array[1..N] of letras; var objetos: vet_letras; aux: letras; i, j, cont: integer; begin clrscr; write('>>> Exercicio - Ordenacao de Vetores com metodo da Bolha<<<'); write('Digite ',N,' nomes de objetos para compor o conjunto'); for i:=1 to N do begin write ('Digite o elemento objetos(',i,'): '); readln(objetos[i]); write(' '); end;

46

ENG06842 Programao I

{ ***************** Ordenao do Vetor ******************* } for i:= 2 to N do for j:= N downto i do if objetos[j] < objetos[j-1] then begin aux := objetos[j]; objetos[j] := objetos[j-1]; objetos[j-1] := aux end; { ********************* Saida Ordenada ****************** } writeln ('Vetor Ordenado: '); for i:=1 to N do writeln(objetos[i]); end. Algoritmos de busca: tambm existem diversos mtodos para procurar (ou buscar) um valor dentro de uma estrutura de dados. Os mais conhecidos so o Busca Seqencial e o Busca Binria, porm o mais comum desses o Seqencial. Exemplo: Considere um vetor A com 50 elementos. Verificar se existe um elemento igual a K no vetor. Se existir mostrar a posio em que se encontra, seno imprimir no encontrei K no vetor. program Procura_K; uses crt; const max = 10; { Indica o numero maximo de elementos do array num } var i, k: integer; achou: boolean; num: array[1..max] of integer; begin clrscr; writeln('Digite ',max,' numeros inteiros!'); for i:=1 to max do begin write('Digite o elemento (',i,'): '); readln(NUM[i]);

47

ENG06842 Programao I

end; write('Digite o numero que deseja procurar no conjunto: '); readln(k); achou := false; i:=1; while (not achou) and (i<=max) do if num[i]=k then achou := true else i := i+1; if achou then write('Achei o numero ',k,' na posicao (',i,') do vetor !!!') else write('Nao achei o numero ',k,' no vetor !!!'); end.
9.5. Exerccios

1. Elabore um programa que leia dois vetores inteiros de 20 elementos cada, depois some seus elementos, gerando um terceiro vetor. Ao final, mostre o novo vetor gerado. 2. Considere um vetor VET com 30 elementos. Verificar se existe um elemento igual a K no vetor. Se existir mostrar a posio em que se encontra, seno imprimir no encontrei K no vetor. 3. Faa um programa para ler um conjunto de 10 inteiros e escreve-los na ordem inversa ordem de leitura. 4. Faa um programa para ler um conjunto de 10 inteiros e escreve-los na ordem crescente. 5. Elabore um programa que leia um conjunto A com 50 nmeros reais e construa um conjunto B, onde os elementos de ordem (posio) par so os elementos correspondentes de A divididos por 2, e os de ordem (posio) mpar correspondem aos elementos de A multiplicados por 3. Ao final, mostre os dois conjuntos de nmeros. 6. Fazer um programa Pascal que, ao ser fornecida uma data no formato DD/MM/AA, mostre-a por extenso. Ex: Entrada: 12/06/95; Sada: 12 de junho de 1995.

48

ENG06842 Programao I

7. Elabore um programa que utilize dois vetores V1 e V2, formados de nmeros reais com 20 posies cada um, e efetue neles as operaes indicadas no vetor OP, cujos elementos so caracteres que indicam as quatro operaes aritmticas bsicas (+, -, *, /) . O resultado obtido das operaes devem ser colocados num vetor resultante VR e mostrado ao final do programa. 8. Escreva um programa que leia duas matrizes bidimensionais reais MAT1 e MAT2 de dimenses 3x5 cada, calcule e imprima a matriz soma MSOMA. 9. Calcule e imprima a soma dos elementos situados abaixo da diagonal principal da matriz A (dimenses 10x10), incluindo os elementos da prpria diagonal. 10. Escreva um programa que leia duas matrizes reais A e B de

dimenses 3x5 e 5x3, respectivamente, calcule e imprima o produto delas. 11. Dada uma matriz A de dimenses 5x4 formada de elementos

numricos reais, calcule e mostre sua matriz transposta T. 12. Dada uma matriz B formada por nmeros inteiros com 10 linhas por

15 colunas, determinar o elemento de maior valor algbrico. Mostre tal elemento e sua posio na matriz (linha e coluna). 13. Faa um programa para ler 2 vetores a e b, de inteiros, e montar o vetor soma = a + b. 14. Faa um programa para multiplicao de matrizes: leia a e b (4x4), crie C = A*B, escreva C. 15. Loteria esportiva. Faa um programa para ler um "gabarito" com os resultados dos jogos da loteria esportiva (coluna 1, coluna2, coluna do meio, 13 jogos), armazenando em um vetor. Depois leia um conjunto indeterminado de jogos e verifique se ganhou o prmio. Ao final da

49

ENG06842 Programao I

verificao, pergunte se o usurio quer entrar mais jogos. Ao final do programa, informe quantos ganharam o prmio.

50

ENG06842 Programao I

10. Modularizao

10.1. Introduo

Dentre

as

tcnicas

de

programao

estruturada,

encontra-se

modularizao. Esta tcnica consiste em decompor um programa em uma srie de subprogramas individuais. A modularizao um mtodo utilizado para facilitar a construo de grandes programas, atravs de sua diviso em pequenas etapas (dividir para conquistar), que so os mdulos ou subprogramas. A primeira delas, por onde comea a execuo do trabalho, recebe o nome de programa principal, e as outras so os subprogramas propriamente ditos, que so executados sempre que ocorre uma chamada dos mesmos, o que feito atravs da especificao de seus nomes. A modularizao permite o reuso de partes do programa num mesmo programa ou mesmo em novos programas, exemplo: imagine um trecho de programa que verifica se uma data valida ou no. Este mdulo pode ser usado vrias vezes num mesmo programa que leia vrias datas diferentes e pode ser reaproveitado em novos programas que sero escritos. Outras conseqncias positivas do uso de modularizao o aumento de clareza e conciso do programa, pois o comprimento do programa diminui com o uso de mdulos. Em Pascal existem dois tipos de mdulos de programas: Procedimentos e Funes. Vantagens da utilizao de subprogramas: Economia de cdigo: escreve-se menos; Desenvolvimento modularizado: pensa-se no algoritmo por partes; Facilidade de depurao (correo/acompanhamento): mais fcil corrigir/detectar um erro apenas uma vez do que dez vezes; Facilidade de alterao do cdigo: se preciso alterar, altera-se apenas uma vez; 51

ENG06842 Programao I

Generalidade de cdigo com o uso de parmetros: escreve-se algoritmos para situaes genricas.
10.2. Procedimentos

Um subprograma do tipo PROCEDIMENTO , na realidade, um programa com vida prpria, mas que, para ser processado, tem que ser solicitado pelo programa principal que o contm, ou por outro subprograma, ou por ele mesmo. Declarao: procedure nome; declarao dos objetos (constantes, variveis, etc.) locais ao procedimento begin comandos do procedimento; end; Onde: nome o identificador associado ao procedimento. Exemplo: O programa abaixo calcula a mdia aritmtica entre duas notas, sem o uso de procedimentos. program CALCULA_MEDIA; var NOTA1,NOTA2,MEDIA : real; begin {l as notas} write('Digite a primeira nota: '); readln(NOTA1); write('Digite a segunda nota: '); readln(NOTA2); {calcula a media} MEDIA := (NOTA1 + NOTA2) / 2; {escreve o resultado} {sem o uso de procedimentos}

52

ENG06842 Programao I

writeln('Media = ',MEDIA,4:1) end. Agora, o mesmo programa, utilizando um procedimento. program CALCULA_MEDIA; var NOTA1,NOTA2,MEDIA : real; { declarao do procedimento } procedure LER_NOTAS; begin write('Digite a primeira nota: '); readln(NOTA1); write('Digite a segunda nota: '); readln(NOTA2); end; { programa principal } begin LER_NOTAS; LER_NOTAS} MEDIA := (NOTA1 + NOTA2) / 2; Writeln('Media = ',MEDIA,4:1) end.
10.3. Funes

{usando procedimento}

{ativao

do

procedimento

{calcula a media} {escreve o resultado}

As funes, embora bastante semelhantes aos procedimentos, tm a caracterstica especial de retornar ao programa que as chamou um valor associado ao nome da funo. Esta caracterstica permite uma analogia com o conceito de funo da Matemtica. Declarao: function nome: tipo;

53

ENG06842 Programao I

declarao dos objetos locais funo begin comandos da funo; end; Onde: nome o identificador associado funo; e tipo o tipo da funo, ou seja, o tipo do valor de retorno. Exemplo: O programa abaixo calcula a mdia dos elementos de um vetor, sem uso de procedimentos ou funes. program SOMA_VETOR; const N = 30; var VETOR: array[1..N] of integer; I,SOMA,MEDIA: integer; begin {l os valores do vetor} for I:=1 to N do readln(VETOR[I]); {calcula a media} SOMA := 0; for I:=1 to N do SOMA := SOMA + VETOR[I]; MEDIA := SOMA div N; {escreve o resultado} writeln(MEDIA); end. Agora, o mesmo programa, porm utilizando um procedimento para ler os valores do vetor e uma funo para efetuar o clculo da mdia. program SOMA_VETOR; procedimento} {usando uma funo e um {sem o uso de procedimentos ou funes}

54

ENG06842 Programao I

const N = 30; var VETOR: array[1..N] of integer; { declarao do procedimento } procedure LER_DADOS; var I: integer; begin for I := 1 to N do readln(VETOR[I]); end; { declarao da funo } function MEDIA: integer; var I, SOMA: integer; begin SOMA := 0; for I := 1 to N do SOMA := SOMA + VETOR[I]; MEDIA := SOMA div N; end; { programa principal } begin LER_DADOS; writeln(MEDIA); MEDIA} end. {ativa o procedimento LER_DADOS} {escreve o resultado, chamando a funo

55

ENG06842 Programao I

10.4. Escopo de variveis

Observe que, no exemplo anterior, foi declarada uma varivel no programa principal e outras nos subprogramas. Pode-se dizer que a varivel VETOR, que foi declarada no programa principal uma varivel global aos subprogramas, enquanto que a varivel I dita varivel local ao procedimento LER_DADOS e as variveis I e SOMA so locais funo MEDIA. importante ressaltar que a varivel I do procedimento LER_DADOS diferente da varivel I da funo MEDIA, embora possuam o mesmo identificador. O uso de variveis globais dentro de procedimentos e funes serve para implementar um mecanismo de transmisso de informaes de um nvel mais externo para um mais interno. As variveis locais dos procedimentos e funes so criadas e alocadas quando da sua ativao e automaticamente liberadas quando do seu trmino. A utilizao de variveis globais no constitui, no entanto, uma boa prtica de programao. Assim, todos os subprogramas devem apenas utilizar as variveis locais, conhecidas dentro dos mesmos, e a transmisso de informaes para dentro e fora dos subprogramas deve ser feita atravs dos parmetros de transmisso, que sero apresentados a seguir.
10.5. Parmetros

Quando se deseja escrever um subprograma que seja o mais genrico possvel, deve-se usar a passagem de parmetros. A passagem de parmetros formaliza a comunicao entre os mdulos. Alm disto, permite que um mdulo seja utilizado com operandos diferentes, dependendo do que se deseja do mesmo. D-se a designao de parmetro real ou de chamada ao objeto utilizado na unidade chamadora/ativadora, e de parmetro formal ou de definio ao recebido como parmetro no subprograma. Dentre os modos de passagem de parmetros, destaca-se a passagem por valor e a passagem por referncia.

56

ENG06842 Programao I

Passagem de parmetros por valor : as alteraes feitas nos parmetros formais, dentro do subprograma, no se refletem nos parmetros reais. O valor do parmetro real copiado no parmetro formal, na chamada do subprograma. Assim, quando a passagem por valor, isto significa que o parmetro de entrada. Passagem de parmetros por referncia : toda alterao feita num parmetro formal corresponde a mesma alterao feita no seu parmetro real associado. Assim, quando a passagem por referncia, isto significa que o parmetro de entrada-sada. Na linguagem Pascal, a declarao dos procedimentos e funes com parmetros se diferencia da forma j apresentada apenas pela incluso da lista de parmetros formais no cabealho. Esta deve vir entre parnteses e cada parmetro deve ter o seu tipo especificado. A forma geral : procedure nome (lista de parmetros formais) function nome (lista de parmetros formais): tipo A lista de parmetros formais tem a seguinte forma: parmetro1: tipo; parmetro2: tipo; ...; parmetro n: tipo Exemplos da lista de parmetros: procedure PROC (X, Y, Z: integer; K: real); function FUNC (A, B: real; C: string): integer; Na forma apresentada, a passagem dos parmetros ser por valor. Para se utilizar a passagem por referncia, deve-se acrescentar a palavra VAR antes do nome do parmetro. Exemplo: procedure PROC(A: integer; var B, C: integer);

57

ENG06842 Programao I

Na chamada de procedimentos ou funes utilizando parmetros, devemos acrescentar aps o nome do procedimento ou funo uma lista de parmetros reais (de chamada), os quais devem ser do mesmo tipo e quantidade dos parmetros formais declarados. O exemplo a seguir demonstra a diferena entre a passagem de parmetros por referncia e a passagem de parmetros por valor. program EXEMPLO_PASSAGEM_PARAMETROS; var N1, N2 : integer; procedure PROC(X: integer; var Y: integer); begin X := 1; Y := 1; end; begin N1:=0; N2:=0; PROC(N1,N2); writeln(N1); writeln(N2); end. Exemplo: Escrever um procedimento chamado DOBRA que multiplique um nmero inteiro (recebido como parmetro) por 2. Escrever um programa para ler um valor inteiro e, utilizando o procedimento DOBRA, calcular e exibir o dobro do mesmo. program CALCULA_DOBRO; var X: integer; {ser exibido o valor 0} (ser exibido o valor 1}

58

ENG06842 Programao I

procedure DOBRA (var NUM: integer); begin NUM := NUM * 2 end; begin readln(X); DOBRA(X); writeln(X); end. Exemplo: Escrever uma funo chamada MAIOR que receba dois nmeros inteiros e retorne o maior deles. Escrever um programa para ler dois nmeros inteiros e, utilizando a funo MAIOR, calcular e exibir o maior valor entre os nmeros lidos. program CALCULA_MAIOR; var X, Y, M: integer; function MAIOR (NUM1, NUM2: integer): integer; begin if NUM1 > NUM2 then MAIOR := NUM1 else MAIOR := NUM2; end; begin readln(X,Y); M := MAIOR(X,Y); writeln(M); end.

59

ENG06842 Programao I

Exemplo: Escreva um procedimento que receba uma string S e converta o mesmo para letras maisculas. procedure MAIUSC (var S: string); var I, TAM: byte; begin TAM := length(S); for I := 1 to TAM do S[I] := upcase(S[I]); end;
10.6. Recursividade

Existem casos em que um procedimento ou funo chama a si prprio. Diz-se ento que o procedimento ou funo recursivo. Por exemplo, o fatorial de um nmero n pode ser definido recursivamente, ou seja:

n (n 1)! se n > 0 n != 1 se n = 0
Dessa forma, pode-se escrever uma funo recursiva em Pascal que traduz esta definio matemtica: function FAT(n: integer): integer; begin if n = 0 then FAT := 1 else FAT := N * FAT(N-1); end;
10.7. Exerccios

1. Cite as principais vantagens da utilizao de subprogramas.

60

ENG06842 Programao I

2. Conceitue procedimento e funo. Em que eles so semelhantes e em que eles so diferentes? 3. Que tipo de informao deve ser includo na declarao de um procedimento? E na declarao de uma funo? Se houver diferenas, explique o motivo. 4. Qual a diferena entre varivel global e varivel local? 5. Como deve ser feita a transmisso de informaes entre um subprograma e o programa principal? 6. Qual a diferena entre parmetro real e parmetro formal? 7. Cite os modos de passagem de parmetros, explicando como funciona cada um deles. 8. Escreva um procedimento que limpe a tela do micro e exiba o seu nome. 9. Escreva um procedimento que receba uma string S e um inteiro positivo N e exiba a string S por N vezes seguidas na tela. 10. Escreva uma funo chamada CUBO que receba um valor do tipo real e retorne a potncia elevado a 3 do mesmo. 11. Escreva um procedimento chamado TROCA que receba duas variveis inteiras (X e Y) e troque o contedo entre elas; 12. Escreva uma funo que receba uma string S e retorne o nmero de espaos existentes na mesma. 13. Escreva uma funo que receba uma string S e um valor inteiro N e retorne os N primeiros caracteres da string S. 14. Escreva um procedimento chamado SINAL que receba como parmetro um valor N inteiro e escreva a palavra POSITIVO se N for um nmero

61

ENG06842 Programao I

maior que zero, NEGATIVO se N for menor que zero, ou ZERO se N for igual a zero. 15. Escreva um programa que leia um nmero inteiro e, usando o procedimento SINAL (criado na questo anterior), mostre se ele maior, menor ou igual a zero. 16. Escreva um procedimento chamado METADE que divida um valor do tipo real (passado como parmetro) pela metade. 17. Escreva um programa que leia um vetor A de 30 elementos reais e, usando o procedimento METADE (criado na questo anterior), divida todos seus elementos pela metade. 18. Escreva uma funo chamada MEDIA que retorne a mdia aritmtica de trs valores reais (X, Y e Z) passados como parmetros. 19. Escreva um programa que, para um nmero indeterminado de alunos, faa para cada uma deles: ler o nome e as trs notas do aluno (a leitura do nome FIM indica o fim dos dados - flag); calcular a mdia do aluno (usando a funo MEDIA criada na questo anterior); exibir o nome e a mdia do aluno. 20. Quantos nmeros o programa abaixo imprimir na tela? program pares; var contador: integer; function NumeroPar(numero: integer): Boolean; begin NumeroPar := (numero mod 2) = 0; end; begin for contador := 1 to 100 do if (NumeroPar(contador)) then writeLn(contador);

62

ENG06842 Programao I

end. 21. O que o programa abaixo imprimir na tela? program Linhas; var contador: Integer; procedure ImprimeLinha(linha: integer); var contador: integer; begin for contador := 1 to linha do write(contador); writeLn; end; begin for contador := 1 to 10 do ImprimeLinha(contador); end. 22. Descreva uma funo POTENCIA que realize a operao de

potenciao e que contenha os seguintes parmetros formais: VALOR: nmero inteiro que se deseja elevar potncia. POT: potncia elevada Ex: Na chamada da funo POTENCIA(5,3), o resultado seria 125. Na chamada da funo POTENCIA(2,0), o resultado seria 1. 23. Escrever uma funo DIGITO(N,K) que determine o valor do k-simo dgito da direita para a esquerda de um nmero N inteiro. Ex: DIGITO(379836,3) = 8 DIGITO(567,8) = 0. 24. Escreva uma funo chamada SEG para receber uma medida de tempo expressa em Horas, Minutos e Segundos e retornar esta medida convertida apenas para segundos. 25. Escreva um procedimento chamado HMS para receber uma medida de tempo expressa apenas em segundos em retornar esta medida convertida para horas, minutos e segundos.

63

ENG06842 Programao I

26. Faa um programa que leia duas medidas de tempo (expressas em horas, minutos e segundos) e, usando a funo SEG e o procedimento HMS, calcule e exiba a diferena (tambm em horas, minutos e segundos) entre elas. 27. Escreva uma funo chamada NOME_MES que receba um valor inteiro N (de 1 a 12) e retorne uma string contendo o nome do ms correspondente a N. 28. Escrever um procedimento para leitura de um valor inteiro entre 1 e 100. Se o usurio fornecer um valor fora desta faixa, deve-se repetir o processo at que seja fornecido um valor vlido. 29. Fazer um programa para ler duas matrizes e apresentar a soma. Utilize subprogramas (procedimentos e/ou funes) para ler, somar e escrever as matrizes. 30. O que o programa abaixo faz? Quantas vezes o procedimento

AcertaPosicao ser executado? Quantas vezes o procedimento Troca ser executado? program Numeros; const LIMITE = 5; var contador: integer; numeros: array[1..LIMITE] of integer; procedure Troca(x, y: integer); var temporario: integer; begin temporario := numeros[x]; numeros[x] := numeros[y]; numeros[y] := temporario; end; procedure AcertaPosicao(posicao: integer); var indice: integer; begin for indice := posicao + 1 to LIMITE do

64

ENG06842 Programao I

if (numeros[indice] < numeros[posicao]) then Troca(posicaoindice); end; procedure LeNumeros; var indice: integer; begin writeln('Digite ', LIMITE, ' numeros: '); for indice := 1 to LIMITE do readln(numeros[indice]); end; procedure MostraNumeros; var indice: integer; begin write('O resultado e: '); for indice := 1 to LIMITE do write(numeros[indice]:6); writeln; end; begin LeNumeros; for contador := 1 to 4 do AcertaPosicao(contador); MostraNumeros; end. 31. Leia 50 valores do tipo (nome, P1, P2, Nota_trabalhos,

Percentual_de_presena), e determine quantos alunos foram aprovados e quantos foram reprovados. Para aprovao preciso ter mdia maior ou igual a 6 e 75% de presena. A mdia calculada pela expresso: Media = (P1 + P2) * 70% + Nota_trabalhos * 30%. Use uma funo para calcular a mdia. Utilize pelo menos um procedimento ou funo. 32. Fazer uma funo para multiplicar 2 matrizes A (MxN) e B (NxK) e retornar a matriz resultado (MxK). 33. Escreva uma funo recursiva FIB(n) que receba o inteiro n e o n-simo terma da seqncia de Fibonacci, definida

devolva

recursivamente por:

65

ENG06842 Programao I

FIB(n -1) + FIB(n - 2) se n 3 FIB(n) = 1 se 0 < n < 3

66

ENG06842 Programao I

11.

Armazenamento de dados

A manipulao de dados apresentada nos captulos anteriores estavam em memria, ou seja, aps a execuo dos programas os dados se perdiam. Para resolver esse problema, deve-se comear a trabalhar com discos (HDs, disquetes, etc.), onde os dados podero ser armazenados e manipulados por um ou vrios programas, pois ficaro armazenados em algum local dos discos existentes no computador. Geralmente, o armazenamento de dados realizado atravs de um banco de dados ou de um simples arquivo. A utilizao de bancos de dados baseada na utilizao de um Sistema Gerenciador de Banco de Dados (SGBD), que oferece recursos para uma adequada e eficiente manipulao dos dados. Entretanto, para utilizao de um SGBD, deve-se inicialmente compreender os conceitos para criao e utilizao de um banco de dados, e isso leva tempo. Normalmente, os bancos de dados so tratados em uma disciplina nica e exclusiva, cuja finalidade trabalhar diretamente nos seus principais conceitos. Dessa forma, ser tratado neste captulo apenas o armazenamento de dados via arquivos, cuja manipulao menos eficiente, porm significativamente mais simples.
11.1. Arquivos

Um arquivo de dados tem a propriedade de ser independente dos programas. separado de qualquer programa e pode ser acessado e usado por muitos programas diferentes. Na maioria dos casos, usa-se um nico programa para introduzir as informaes no arquivo de dados e grav-lo em disco. A partir deste momento, pode-se ler as informaes daquele arquivo de dados usando muitos programas diferentes, cada um executando uma atividade diferente com o arquivo. Suponha que voc tenha necessidade de criar um arquivo de dados, para guardar os nomes, endereos e telefones de seus amigos. Inicialmente, voc precisar de um programa para introduzir as informaes no arquivo

67

ENG06842 Programao I

e adicionar novos dados ao mesmo. Um outro programa poder ser criado para listar as informaes do arquivo. Outro permitir voc selecionar um nmero de telefone do arquivo usando o nome do amigo como critrio de seleo. Voc pode criar outro programa para mudar os endereos e os telefones. Outro para imprimir etiquetas contendo as informaes do arquivo. As possibilidades continuam... O arquivo de dados gravado no disco, separadamente dos programas, num lugar especfico, e pode ser acessado por muitos programas diferentes. Cada programa descrito acima, copia as informaes gravadas no disco para memria do computador e esses dados so manuseados em memria de acordo com as necessidades de cada programa. Alternativamente, o programa poder transferir as informaes da memria do computador para serem gravadas no disco. O Turbo Pascal admite trs tipos de arquivos: Arquivo typed (arquivo tipado): pode conter praticamente todos os tipos de dados, menos o tipo FILE. Isto quer dizer que pode-se criar um arquivo para guardar reais, arrays, records, mas no se pode criar um arquivo de arquivo. Cada elemento pertencente ao arquivo tipado pode ser acessado diretamente pelo nmero, isto , um registro pode ser acessado imediatamente sem que tenhamos que acessar todos os registros anteriores. Esse tipo de acesso denominado randmico ou direto. Um arquivo tipado um arquivo randmico. Arquivo text (arquivo texto): pertence a um tipo predefinido do Pascal denominado text. Os arquivos text so armazenados no disco como linhas de caracteres ASCII e s podem ser acessados de forma seqencial, isto , s podem ser lidos ou escritos do incio para o fim do arquivo. Um arquivo seqencial em disco est projetado para ser lido do incio ao fim, toda vez que for aberto. Em outras palavras,

68

ENG06842 Programao I

no existe uma forma de pular diretamente de um determinado registro para outro num ponto qualquer do arquivo. Por essa razo, os arquivos seqenciais so melhor usados em aplicativos que executam tarefas sobre todo um conjunto de dados ao invs de execut-las sobre um determinado registro. Arquivo untyped (sem tipo): pode ser associado a qualquer arquivo de disco, sendo que o tamanho do registro seja de 128 bytes. As operaes de entrada e sada usando um arquivo sem tipo transferem dados diretamente de um arquivo em disco para uma varivel de memria e vice-versa, sem passar pela memria temporria (buffer), o que, alm de economizar espao na memria, tambm torna a operao ligeiramente mais rpida. Seu uso muito limitado. Quando um arquivo aberto apenas para uma operao de remoo ou troca de nome, aconselhvel usar um arquivo sem tipo. Os procedimentos para manipulao de qualquer arquivo so: Definir uma varivel de arquivo e associar a varivel ao nome do arquivo no disco. Abrir o arquivo, para leitura ou para escrita ou para ambos. Ler os dados do arquivo ou gravar dados no mesmo. Fechar o arquivo quando o processo terminar. O Pascal usa a palavra reservada text como identificador padro de arquivos-texto. A sintaxe para definir variveis desse tipo : var arq_alunos: text; arq_func: text[512];

69

ENG06842 Programao I

Os arquivos-texto so definidos inicialmente com memria temporria de 128 bytes. Isto quer dizer que o Pascal trabalha com 128 bytes de informaes de cada vez. Esse tamanho de memria temporria adequado para a maioria das aplicaes. Entretanto, no caso de programas que utilizam repetidamente informaes guardadas em disquetes, como o caso de programas de banco de dados, pode ser conveniente aumentar a capacidade de memria temporria. Para estabelecer o tamanho da memria temporria, basta colocar o nmero de bytes desejado entre colchetes depois da palavra text, na declarao da varivel de arquivo (como no exemplo acima). Normalmente, se declara uma varivel de memria, do mesmo tipo de dados que vo ser gravados ou lidos no arquivo. essa varivel que guarda em memria os contedos dos registros que vo ser lidos do arquivo ou que vo ser gravados no arquivo. Todo o manuseio com os dados feito em memria. O arquivo de dados utilizado apenas para gravar ou ler informaes. Exemplo: type dados = record nome: string[30]; tel: string[10]; end; var arq_alunos: text; registro: dados; Para utilizar uma varivel de arquivo para acessar um arquivo-texto, devese associar a varivel a um determinado nome de arquivo em disco. Denomina-se esse processo como assinalamento. A funo predefinida que executa esta tarefa assign. Assign associa o nome da varivel de

70

ENG06842 Programao I

arquivo a um nome de arquivo em disco. Nunca deve ser usada em arquivos que j estejam em uso. Exemplo: assign(arq_alunos,alunos.dat); A partir desse comando, toda referncia a arq_alunos no programa ser dirigida ao arquivo no disco chamado alunos.dat. Caso um programa tenha mais de uma varivel de arquivo, teremos que assinalar individualmente cada varivel, isto , teremos tantos assign quanto forem as variveis de arquivo. Assinalar uma varivel a um arquivo criar um buffer especfico para aquela varivel. Um buffer uma parte da memria do computador, com determinada capacidade, que criada para atuar como intermedirio entre o programa e o arquivo de dados no disco. A informao que se encontra no disco, primeiro copiada para buffer, uma determinada quantidade de bytes de cada vez, estando, portanto, disponvel ao programa para manipulao. Do mesmo modo, as informaes, para serem gravadas em disco, so primeiramente acumuladas no buffer. Quando o buffer est cheio, as informaes so copiadas para o disco. Graas aos buffers, os dados so movimentados corretamente, para os arquivos especificados. O default (padro) de arquivos que podem ser abertos simultaneamente no Pascal 16. Exemplo: uses crt; type dados = record nome: string[30]; tel: string[10]; end; var 71

ENG06842 Programao I

arq_alunos: text; registro: dados; begin clrscr; assign(arq_alunos,alunso.dat); Um determinado arquivo-texto pode ser aberto para leitura ou gravao, mas no para ambas operaes ao mesmo tempo. O Pascal fornece trs funes diferentes para abertura de um arquivotexto: rewrite(var de arquivo): cria um novo arquivo e o abre para operaes de escrita. Aps a abertura, pode-se usar os comandos WRITE e WRITELN para escrever os dados e linhas de texto no arquivo. Caso o nome do arquivo j exista no disco, este procedimento destri o arquivo antigo e cria outro vazio e com o mesmo nome, isto significa que todos os dados do arquivo existente sero perdidos. append(var de arquivo): abre um arquivo-texto j existente, de modo que podemos adicionar novos registros no fim do arquivo. Ocorre um erro de I/O (entrada e sada) se o arquivo no existir no disco. Aps a abertura, pode-se usar as funes WRITE e WRITELN para escrever dados no arquivo. reset(var de arquivo): abre um arquivo j existente para leitura. Aps a abertura do arquivo, pode-se usar as funes READ e READLN para ler dados e linhas de texto do arquivo. Em contraste com a funo REWRITE que cria um arquivo novo destruindo o antigo, caso exista, os comandos APPEND e RESET assumem a existncia de um arquivo nomeado no disco. Se o arquivo no puder ser localizado, em ambos os casos, resultaro em erros de I/O em tempo de execuo.

72

ENG06842 Programao I

Exemplo: uses crt; type dados = record nome: string; tel: string; end; var registro: dados; arq_reg: text; begin clrscr; assign(arq_reg,alunos.dat); rewrite(arq_reg); write(Arquivo ALUNOS.DAT criado); readkey; close(arq_reg); end. Exemplo: uses crt; type dados = record nome: string; tel: string; end; var registro: dados; arq_reg: text; conf: char; begin clrscr;

73

ENG06842 Programao I

assign(arq_reg,alunos.dat); rewrite(arq_reg); write(Arquivo ALUNOS.DAT criado); readkey; repeat write(Entre com um nome: ); readln(registro.nome); write(Seu telefone: ); readln(registro.tel); write(Confirma gravao? <S/N>: ); conf := upcase(readkey); if conf = S then writeln(arq_reg,registro.nome,#32,registro.tel); until conf=N; close(arq_reg); end. Obs.: podem ser usados como caracteres delimitadores de campos: espao (#32) e tabulao (#9). Para fechar qualquer arquivo aberto, o Pascal dispe do comando CLOSE, como foi visto nos exemplos anteriores de programas. Se vrios arquivos foram abertos simultaneamente, teremos que fech-los individualmente, usando um comando close para cada um. O comando CLOSE fecha o arquivo externo em disco, mas no termina com o assinalamento feito pelo comando ASSIGN. Isto significa que o programa pode usar um comando REWRITE, RESET ou APPEND aps o comando CLOSE se necessrio. CLOSE um comando muito importante, pois usado para manter a integridade e exatido dos arquivos de dados. Relembre que o buffer atua como um intermedirio entre o programa e o arquivo em disco. Quando se executa uma operao de gravao, os dados so enviados

74

ENG06842 Programao I

primeiramente para o buffer. Quando o buffer est cheio, os dados so gravados em disco. Freqentemente essa operao chamada de atualizao de arquivos em disco. O que acontece quando o buffer s est parcialmente cheio e no existem mais dados para preench-lo. Se voc est esperando que o buffer semicheio simplesmente transfira seu contedo para o disco quando o programa termina a sua execuo, voc est enganado. Os dados de um buffer semi-cheio no so necessariamente gravados no arquivo. O comando CLOSE fora o buffer a transferir o seu contedo para o arquivo de disco, mesmo que o buffer no esteja cheio. Exemplo: uses crt; type dados = record nome: string; tel: string; end; var registro: dados; arq_reg: text; conf: char; begin clrscr; assign(arq_reg,alunos.dat); reset(arq_reg); with registro do begin repeat readln(arq_reg,nome,tel); write(nome, ,tel); {lendo do arquivo} {listando na tela}

75

ENG06842 Programao I

until eof(arq_reg); {repita at que o final do arquivo seja atingido} end; close(arq_reg); readkey; end. Quando o programa est lendo uma seqncia de valores de um arquivo texto, o comando READ reconhece os caracteres delimitadores usados durante o processo de gravao. O arquivo-texto foi projetado para conter s caracteres ASCII. Mesmo assim, os comandos READ e READLN podem ler apropriadamente valores de dados numricos ou strings. evidente que durante um processo de leitura, no se pode colocar valor de uma varivel string numa varivel numrica. J foi dito que um arquivo-texto um arquivo seqencial, por isso necessrio sabermos quando o fim de arquivo foi atingido. A quantidade de linhas gravadas pode ser controlada pelo programador, atravs de tcnicas, porm, o modo mais prtico para se descobrir o fim do arquivo usar a funo booleana EOF, como foi aplicado no exemplo acima. A funo EOF retorna true se o ponteiro estiver no final do arquivo. Caso contrrio, a funo retornar false, indicando que o fim do arquivo no foi atingido.
11.2. Exerccios

1. Dado um arquivo existente, com registros com os dados: nome, sexo, endereo e idade. Criar 2 arquivos, um s com os homens e outro s com as mulheres. 2. Criar um arquivo de alunos (nome, nro, p1, p2, media) para armazenar elementos (quantos o usurio quiser). Abrir o arquivo e atualiz-lo com as mdias dos alunos. A seguir, liste nome e mdia de cada aluno.

76

ENG06842 Programao I

3. Estoque de supermercado. Faa um programa para controlar o estoque de um supermercado. Para cada produto armazene (em arquivo): nome, estoque, preo, e estoque mnimo. Leia os dados para o estoque e guarde em um vetor. Depois percorra o vetor e escreva o nome e as demais informaes de todos os produtos que esto com estoque abaixo do estoque mnimo. 4. Folha de pagamentos. Monte um vetor para armazenar o nome, cargo, salrio bruto de cada funcionrio de uma empresa. Depois execute a folha de pagamentos da seguinte forma: para cada funcionrio, imprima nome, salrio bruto e salrio lquido (para salrios menores que 1000 o salrio lquido o prprio salrio bruto; para salrios maiores ou iguais a 1000 o salrio lquido cerca de 87% do salrio bruto).

77

ENG06842 Programao I

Referncias [1] COLLINS, W. J. Programao estruturada com estudos de casos em Pascal. McGraw-Hill. (1988) So Paulo. 1988. 712p. [2] FARRER, H. et al. Algoritmos estruturados. Livros Tcnicos e Cientficos. 3a ed. Rio de Janeiro. 1999. [3] FARRER, H. et al. Pascal estruturado. Livros Tcnicos e Cientficos. 3a ed. Rio de Janeiro. 1999. 278p. [4] FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de programao: a construo de algoritmos e estruturas de dados. Pearson Education do Brasil. 2a ed. So Paulo. 2000. [5] GUIMARES, A. M.; LAGES, N. A. C. Algoritmos e Estruturas de Dados. Rio de Janeiro, LTC, 1994. [6] MANZANO, J. A. N. G. Algoritmos: lgica para desenvolvimento de programao. Erica. 10a ed. So Paulo. 2000.

78

ENG06842 Programao I

Apndice A Mensagens de erro do Turbo Pascal A seguir so apresentados os principais possveis erros de compilao do Turbo Pascal 7.0.
ERRO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 DESCRIO Out of memory Identifier expected Unknown identifier Duplicate identifier Syntax error Error in real Constant Error in integer Constant String Constant exceeds line Too many nested files Unexpected end of file Line too long Type identifier expected Too many open files Invalid file name File not found Disk full Invalid file name Too many files Undefined type in pointer def Variable identifier expected Error in type Structure too large Set base type out of range File components may not be files or objects Invalid string length Type mismatch Invalid subrange base type Lower bound > than upper bound Ordinal type expected Integer Constant expected Constant expected Integer or real Constant expected Pointer type identifier expected Invalid function result type Label identifier expected Begin expected End expected Integer expression expected Ordinal expression expected Boolean expression expected Operand types do not match Error in expression Illegal assignment Field identifier expected Object file too large Undefined extern Invalid object file Record Code segment too large Data segment too large TRADUO No existe espao em memria Identificador esperado Identificador desconhecido Identificador j existente Erro de sintaxe Erro na constante real Erro na constante inteira Constante string excede a linha Muitos arquivos aninhados Fim de arquivo no esperado Linha muito longa Espera a identificao do tipo Muitos arquivos abertos simultaneamente Nome de arquivo invlido Arquivo no encontrado Disco cheio Diretiva de compilao invlida Excesso de arquivos Ponteiro nunca antes declarado Identificador de varivel esperado Erro de tipo Estrutura muito larga Faixa de valores invlida para a faixa Componentes do arquivo no devem ser arquivos ou objetos Tamanho de string invlido Tipos misturados / incompatvel Faixa de valores invlida Limite inferior > limite superior Tipo escalar esperado Constante inteira esperada Constante esperada Constante inteira ou real esperada Identificador de tipo ponteiro esperado Tipo de resultado da funo invlido Identificador Label esperado Begin esperado End esperado Expresso inteira esperada Expresso ordinal esperada Expresso booleana esperada Operando incompatvel com o operador Erro na expresso Associao ilegal Identificador de campo esperado Arquivo objeto muito grande Extern indefinido Objeto de registro de arquivo invlido Segmento de cdigo muito grande Segmento de dados muito grande

79

ENG06842 Programao I 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 Do expected Invalid public definition Invalid extern definition Too many extern definitions Of expected Interface expected Invalid relocatable reference Then expected To or Downto expected Undefined forward Too many procedures Invalid typecast Division by zero Invalid file type Cannot read or write vars of this type Pointer variable expected String variable expected String expression expected Circular unit reference Unit name mismatch Unit version mismatch Duplicate unit name Unit file format error Implementation expected Constant and case types dont match Record variable expected Constant out of range File variable expected Pointer expression expected Integer or real expression expected Label not within current block Label already defined Undefined label in stmt part Invalid @@ argument Unit expected ; expected : expected , expected ( expected ) expected = expected := expected [ or ( expected ] or ) expected . Expected .. expected Too many variables Invalid for control variable Integer variable expected Files and procedure types are not allowed here String length mismatch Do esperado Definio public invlida Definio extern invlida Excesso de definies extern Of esperado Interface esperada Referncia relocvel invlida Then esperado To ou Downto esperado Forward indefinido Excesso de procedures Tipo de resultado invlido Diviso por zero Tipo de arquivo invlido Variveis desse tipo no podem ser lidas / escritas Varivel do tipo ponteiro esperada Varivel do tipo String esperada Expresso string esperada Referncia circular da unit Nome da unit incompatvel Verso da unit incompatvel Nome da unit duplicada Erro no formato do arquivo unit Implementation esperado Constante e expresso do case incompatveis Varivel do tipo Record esperada Constante fora de faixa Varivel de arquivo esperada Expresso tipo ponteiro esperada Expresso inteira ou real esperada Label for a do bloco atual Label j foi definido Label no declarado Argumento @@ invlido Unit esperado ; esperado : esperado , esperado ( esperado ) esperado = esperado := esperado [ or ( esperado ] or ) esperado . Esperado .. esperado Variveis demais Varivel de controle loop for invlida Varivel do tipo integer esperada Arquivos e procedimentos no permitidos aqui Comprimento da string incompatvel

A seguir apresentada uma tabela com uma relao dos principais erros em tempo de execuo (run-time errors) do Turbo Pascal 7.0.

80

ENG06842 Programao I ERRO 1 2 3 4 5 6 12 15 16 17 18 100 101 102 103 104 105 106 150 151 152 154 156 157 158 159 160 161 162 200 201 202 203 204 205 207 208 209 210 211 213 214 215 216 DESCRIO Invalid function number File not found Path not found Too many open files File Access denied Invalid file handle Invalid file Access code Invalid drive number Cannot remove current directory Cannot rename across drives No h mais arquivos Disk read error Disk write error File not assigned File not open File not open for input File not open for output Invalid numeric format Disk is write-protect Erro interno do dispositivo DOS Drive not ready CRC error in data Disk seek error Unknown media type Sector not found Printer out of paper Device write fault Device read fault Hardware failure Division by zero Range check error Stack overflow error Heap overflow error Invalid pointer operation Floating point overflow Invalid floating point operation Overlay manager not installed Overlay file read error Object not initialized Call to abstract method Collection index out of range Collection overflow error Arithmetic overflow error General protection fault TRADUO Funo numrica invlida Arquivo no encontrado Caminho no encontrado Muitos arquivos abertos Acesso ao arquivo negado Arquivo handle invlido Cdigo de acesso de arquivo invlido Nmero do drive invlido Impossvel remover diretrio atual Impossvel renomear diretrio Erro de leitura do disco Erro de gravao do disco Arquivo no assinalado Arquivo no aberto Arquivo no est aberto para entrada Arquivo no est aberto para sada Formato numrico invlido Disco protegido Drive no pronto para leitura Erro de CRC nos dados Erro de pesquisa no disco Tipo de mdia desconhecida Setor no encontrado Impressora sem papel Falha no dispositivo de escrita Falha no dispositivo de leitura Falha no hardware Diviso por zero Erro de faixa Erro de estouro de pilha Erro de estouro de heap Operao de ponteiro invlida Estouro de ponto flutuante Operao de ponto flutuante invlida Gerenciador de overlay no instalado Erro na leitura de arquivo overlay Objeto no inicializado Chamada a um mtodo abstrato ndice de coleo fora da faixa Erro de estouro da coleo Erro de estouro aritmtico Falha de proteo geral

81

ENG06842 Programao I

Apndice B Tabela de cdigos ASCII ASCII (acrnimo para

American

Standard

Code

for

Information

Interchange) um conjunto de cdigos para o computador representar


nmeros, letras, pontuao e outros caracteres. uma padronizao da indstria de computadores, onde cada caractere manipulado na memria, discos, etc. O cdigo ASCII representa uma maneira de codificar caracteres na forma de valores inteiros. Neste cdigo, os caracteres so mapeados para valores numricos representveis por 8 bits. Este cdigo abrange 95 caracteres passveis de impresso e 33 caracteres especiais utilizados, entre outros, no controle de comunicao entre computadores ou um computador e seus perifricos. Os 33 caracteres de controle so os de cdigo 0 a 31 (NUL a US) e o de cdigo 127 (DEL). A tabela abaixo descreve o padro ASCII.
Cdigo 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Valor NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE D1 D2 D3 D4 NAK SYN ETB CAN Comentrio Caracter Nulo Comeo de cabealho de transmisso Comeo de texto Fim de texto Fim de transmisso Interroga Confirmao Sinal sonoro Volta um caracter Tabulao Horizontal Prxima linha Tabulao Vertical Prxima Pgina Incio da Linha Shift-out Shift-in Data link escape Controle de dispositivo Controle de dispositivo Controle de dispositivo Controle de dispositivo Negativa de Confirmao Synchronous idle Fim de transmisso de bloco Cancela

82

ENG06842 Programao I 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 EM SUB ESC FS GS RS US Espao ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N Fim de meio de transmisso Substitui Escape Separador de Arquivo Separador de Grupo Separador de registro Separador de Unidade

83

ENG06842 Programao I 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ DELETE

84

Vous aimerez peut-être aussi