eng06842 - prof. jacson...

84
UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO DE CIÊNCIAS AGRÁRIAS DEPARTAMENTO DE ENGENHARIA RURAL ENG06842 PROGRAMAÇÃO I PARTE 2 Prof. Geraldo Regis Mauri CCA-UFES Agosto - 2009

Upload: hoangkiet

Post on 03-Dec-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTOCENTRO DE CIÊNCIAS AGRÁRIASDEPARTAMENTO DE ENGENHARIA RURAL

ENG06842

PROGRAMAÇÃO I

PARTE 2

Prof. Geraldo Regis Mauri

CCA-UFESAgosto - 2009

ENG06842 – Programação I

Sumário

7.Linguagens de programação e execução de programas ........................................................... 3 7.1.Introdução ............................................................................................................................. 3 7.2.Tradutores: compiladores e interpretadores .......................................................................... 5 7.3.Compilador PASCAL ........................................................................................................... 6 7.4.Exercícios ............................................................................................................................ 14 8.A Linguagem Pascal .............................................................................................................. 16 8.1.Introdução ........................................................................................................................... 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.Funções pré-definidas ......................................................................................................... 22 8.7.Tipos definidos pelo usuário ............................................................................................... 29 8.8.Exercícios ............................................................................................................................ 31 9.Estruturas de dados ................................................................................................................ 33 9.1.Introdução ........................................................................................................................... 33 9.2.Variáveis compostas homogêneas ...................................................................................... 33 9.3.Variáveis compostas heterogêneas ..................................................................................... 39 9.4.Algoritmos de classificação e busca ................................................................................... 46 9.5.Exercícios ............................................................................................................................ 48 10.Modularização ...................................................................................................................... 51 10.1.Introdução ......................................................................................................................... 51 10.2.Procedimentos ................................................................................................................... 52 10.3.Funções ............................................................................................................................. 53 10.4.Escopo de variáveis ........................................................................................................... 56 10.5.Parâmetros ......................................................................................................................... 56 10.6.Recursividade .................................................................................................................... 60 10.7.Exercícios .......................................................................................................................... 60 11.Armazenamento de dados .................................................................................................... 67 11.1.Arquivos ............................................................................................................................ 67 11.2.Exercícios .......................................................................................................................... 76 Referências ................................................................................................................................ 78 Apêndice A – Mensagens de erro do Turbo Pascal .................................................................. 79 Apêndice B – Tabela de códigos ASCII ................................................................................... 82

2

ENG06842 – Programação I

7. Linguagens de programação e execução de programas

7.1. Introdução

A linguagem de programação é o meio pelo qual se pode indicar os

“passos” que devem ser realizados pelo computador para resolver

problemas. Utilizando as linguagens de programação, 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 operações

devem ser transcritas para uma linguagem que a máquina consiga

compreender. Na realidade, os computadores só podem executar

algoritmos expressos em linguagem de máquina, que se constitui de um

conjunto de instruções capazes de ativar diretamente os dispositivos

eletrônicos do computador.

Características da Linguagem de Máquina:

• diferente para cada tipo de computador, dependendo de sua

arquitetura;

• extremamente rudimentar, onde até as operações mais simples têm

que ser expressas em termos de registros, acumuladores e outros

dispositivos de máquina;

• totalmente expressa em forma numérica - sistema de numeração

binário (0s e 1s) ou hexadecimal.

Conseqüentemente, é uma linguagem de difícil aprendizado e pouco

expressiva para as pessoas. Para tornar a atividade de programação mais

acessível, foram desenvolvidas outras linguagens, denominadas de

“Linguagens de Programação”, que funcionam como uma forma

alternativa de se comunicar com o computador.

3

ENG06842 – Programação I

As linguagens de programação são compostas por um grupo de elementos

e regras que permitem a construção das instruções utilizadas para

resolver os problemas computacionais. Com elas, pode-se construir

programas que devem ser, posteriormente, transformados em instruções

em Linguagem de Máquina. Para realizar a transformação, cada linguagem

de programação possui um programa-suporte denominado,

genericamente, de tradutor.

Linguagem de Programação de Baixo Nível: Conhecida como Linguagem

Assembler ou Linguagem de Montagem, ou ainda, Linguagem Simbólica.

Utiliza números binários, hexadecimais, alguns símbolos e letras para

compor os programas. Está muito próxima da Linguagem de Máquina,

onde cada instrução simbólica corresponde, praticamente, a uma

instrução de máquina. Para transformar o programa escrito em Linguagem

Assembler em código de máquina executável, é utilizado um programa-

suporte denominado de MONTADOR.

Linguagens de Programação de Alto Nível: São linguagens de

programação que utilizam notações matemáticas e grupos de palavras

para representar as instruções de máquina, tornando o processo de

programação mais próximo do entendimento humano. Muitas destas

linguagens foram desenvolvidas para atender os problemas de áreas de

aplicação específicas, como, por exemplo, linguagens para aplicações

comerciais, científicas, administrativas, de ensino, etc. A primeira

linguagem de alto nível foi desenvolvida em 1957 - denominada de

FORTRAN (Formula Translator) - e destina-se a aplicações científicas e de

engenharia.

Principais vantagens das linguagens de Alto Nível:

• facilidade de entendimento e uso;

• independência de máquina (é praticamente a mesma, não

importando o computador utilizado).

4

ENG06842 – Programação I

Para transformar os programas escritos com Linguagens de Alto Nível em

códigos de máquina, é usado um programa-suporte denominado

TRADUTOR (Compilador ou Interpretador).

7.2. Tradutores: compiladores e interpretadores

Para executar um programa escrito numa linguagem de alto nível é

preciso primeiro traduzir o código-fonte para código-objeto. O processo de

tradução pode dar-se em tempo de execução caso a linguagem use um

interpretador (traduz e executa instrução a instrução), ou todas as

instruções podem ser traduzidas antes que se inicie a execução do

programa, o que ocorre no caso de linguagens que usam tradutores do

tipo compilador.

Código-fonte: não é executável diretamente pelo processador - permite

apenas que o programador consiga definir o programa em uma forma

legível aos humanos.

Código-objeto: é o código produzido pelo compilador; é uma forma

intermediária, similar a linguagem de máquina do computador. Apesar de

estar representado em binário, não é executável diretamente pelo

processador, pois normalmente, o código-objeto referencia partes de

programa que não estão necessariamente definidas no mesmo arquivo

que o gerou, por exemplo, arquivos de bibliotecas de sub-rotinas.

Editores de ligação (ou linkeditores ) : Um programa que reúne módulos

compilados e arquivos de dados para criar um programa executável. Os

linkeditores têm também outras funções, como a criação de bibliotecas.

Compilador: No sentido mais geral, qualquer programa que transforme um

conjunto de símbolos em outro obedecendo a uma série de regras

sintáticas e semânticas; no sentido mais comum, um programa que traduz

5

ENG06842 – Programação I

todo o código-fonte de programas escritos numa linguagem de alto nível

em código-objeto antes da execução do programa. Ou seja, traduz o

programa escrito em linguagem de alto nível (código-fonte) para um

programa equivalente escrito em linguagem de máquina (código-objeto).

Interpretador: traduz e envia para execução, instrução por instrução e o

programa permanece na forma fonte.

7.3. Compilador PASCAL

O Turbo Pascal é um programa que contém, além do compilador PASCAL,

um ambiente completo de programação, com editor de programa,

depurador de erros, sistema de ajuda, etc.

Existem diversos compiladores para a linguagem Pascal, porém para esse

curso, será utilizado como padrão o compilador Borland Turbo Pascal 7.0,

pois este é um programa gratuito e de simples utilização. Algumas dicas

para aquisição e instalação deste programa são apresentadas no Erro:

Origem da referência não 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.

6

ENG06842 – Programação I

Após 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 compilação. Senão houver erros, o programa

rodará normalmente. Caso contrário, o processo de compilação será

interrompido e o compilador indicará o erro e a sua posição. Os programas

podem conter três tipos de erros:

Erro de sintaxe: ocorre quando se viola uma regra da linguagem. Ao

encontrar um destes erros, o Turbo Pascal interrompe a compilação do

programa, dá uma mensagem com o número e a descrição do erro, e

deixa o cursor piscando no item do programa que permitiu a detecção do

erro. Deve-se observar que este item pode não estar errado, mas apenas

permitiu detectar o erro. O Turbo Pascal não executa um programa

enquanto houver erros de sintaxe.

Erro de semântica: é um erro que o programa detecta durante a sua

execução, interrompendo-a; por exemplo, quando o programa é levado a

ler um arquivo inexistente, a tirar a raiz quadrada de um número negativo,

a dividir por zero, etc. Ocorrendo um erro de semântica, o Turbo Pascal

interrompe a execução do programa e mostra a descrição do erro, com o

cursor piscando no início da linha em que ele foi detectado.

7

ENG06842 – Programação I

Erro de lógica: aparece em programas, sintática e semanticamente

corretos, que, apesar disso, não produzem os resultados desejados. São

devidos a instruções corretas, para o computador, mas que não são

apropriadas para a solução lógica do problema que motivou o programa. A

correção dos erros de lógica é muitas vezes trabalhosa e demorada. Para

ajudar a depuração de erros de lógica, o Turbo Pascal oferece diversos

recursos que permitem ver e acompanhar o que ocorre durante a

execução de um programa.

Erros de sintaxe e semântica não são preocupantes, pois o próprio

computador os localiza e os identifica. Uma lista com os principais erros

apresentados no Turbo Pascal são descritos no Apêndice A – Mensagens

de erro do Turbo Pascal.

Para compilar um programa, deve-se utilizar a opção COMPILE (compilar)

do Menu COMPILE ou pressione Alt+F9. Caso seja detectado algum erro

(de sintaxe), este será exibido na tela, caso contrário, 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 opção RUN (executar) do

Menu RUN ou pressione Ctrl+F9. Ao terminar a execução, o Pascal volta

para a janela de edição. Para ver os resultados do programa, basta

pressionar Alt+F5.

O Turbo Pascal 7.0 também oferece alguns recursos para depuração do

programa. Um desses recursos é a utilização de break points (pontos de

parada). Para sua utilização, basta clicar com o botão direito do mouse

sobre a linha onde a execução do programa deverá parar, e selecionar a

opção Toogle breakpoint (ou pressionar Ctrl+F8). A linha ficará vermelha,

e quando o programa for executado, assim que seu fluxo de execução

chegar nessa linha, será possível acompanhar passo-a-passo o restante da

execução do programa. Para isso, basta pressionar a tecla F8, que cada

instrução subseqüente será executada uma a uma. Para verificar o

8

ENG06842 – Programação I

conteúdo das variáveis presentes na instrução atual, basta pressionar

Ctrl+F4, ou clicar com o botão direito e selecionar a opção

Evaluate/Modify.

A seguir são descritos os menus do Turbo Pascal 7.0.

File – esta opção possibilita executar operações 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 diretório 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 execução do Turbo Pascal.

Edit – esta opção possibilita executar operações do editor do

programa, sendo possível remover, movimentar e copiar textos que

estejam selecionados.

o Undo – desfazer uma operação com texto.

o Redo – refazer uma operação com texto.

9

ENG06842 – Programação I

o Cut – remover um texto previamente selecionado, enviando-o

para área de transferência.

o Copy – copiar um texto selecionado do editor para uma área

de transferência.

o Paste – copiar um texto da área de transferência para o editor.

o Clear – remover o texto selecionado sem transferi-lo para a

área de transferência.

o Show Clipboard – apresentar o conteúdo existente na área de

transferência.

Search – esta opção possibilita executar operações de busca, troca e

deslocamento dentro de um programa.

o Find – localizar uma seqüência de caracteres em um

programa.

o Replace – substituir uma seqüência 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 – mostrar o último erro de

compilação, quando ocorrer.

o Find error – posicionar-se na última posição de erro

encontrada pelo compilador.

o Find procedure – localizar uma sub-rotina dentro do programa

no momento de depuração de um programa.

Run – esta opção possibilita colocar em execução o programa da

janela ativa.

10

ENG06842 – Programação I

o Run – compilar e executar o programa.

o Step over – rodar o programa passo a passo com exceção 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 posição em que está o

cursor.

o Program reset – interromper a execução de um programa

durante sua depuração.

o Parameters – efetuar a passagem de parâmetros.

Compile – esta opção 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 memória ou disco.

o Primary file – determinar numa lista de arquivos qual será o

arquivo principal que será carregado primeiro no processo de

compilação.

o Clear primary file – limpar o arquivo anteriormente

configurado como o arquivo primário.

o Information – obter informações a respeito da última

compilação executada.

11

ENG06842 – Programação I

Debug – esta opção possibilita depurar o programa para facilitar a

localização de erros lógicos.

o Breakpoint – colocar ou retirar um ponto de parada (exame)

na depuração de um programa.

o Call stack – apresentar uma janela com a seqüência 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

variáveis do programa.

o Output – abrir uma janela para apresentar as telas de saída do

programa em execução ou depuração.

o User Screen – exibir na sua totalidade a tela do usuário.

o Evaluate/modify – permite efetuar a avaliação de expressões,

constantes ou variáveis.

o Add watch – possibilidade de incluir expressões na tela de

vigia.

o Add breakpoint – permite a inclusão de um ponto de parada

quando for executado o programa.

Tools – esta opção possibilita a utilização de ferramentas

configuradas pelo usuário.

o Messagens – abrir uma janela para a apresentação de

mensagens.

o Go to next – visualizar a próxima mensagem da janela de

mensagens.

12

ENG06842 – Programação I

o Go to previous – visualizar a mensagem anterior da janela de

mensagens.

o Grep – efetuar a busca de seqüências de caracteres em

programas gravados através do utilitário GREP.EXE.

Options – esta opção permite configurar a forma de trabalho do

ambiente do Turbo Pascal.

o Compiler – alterar o estado das diretivas de compilação.

o Memory sizes – definir o tamanho de memória.

o Linker – a possibilidade de usar ou não o recurso de link.

o Debugger – estabelecer critérios de depuração.

o Directories – determinar os diretórios de trabalho.

o Browser – especifica configurações globais do visualizador.

o Tools – efetuar a manutenção do menu de ferramentas.

o Environment – efetuar mudanças no ambiente de trabalho

(Preferências, Editor, Mouse, Inicialização e Cores) do Turbo

Pascal conforme necessidade do usuário.

o Open – a abertura do arquivo de configuração.

o Save – gravar o arquivo de configuração.

o Save as – gravar o arquivo de configuração com outro nome.

Window – esta opção 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 – Programação 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

máximo ou para o tamanho preestabelecido.

o Next – selecionar a próxima 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 opção 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 função F1 ou Ctrl+F1 para visualizar

explicações de instruções que estejam marcadas com o

posicionamento do cursor sobre elas.

o Contents – apresenta o sumário.

o Index – apresenta todas as instruções em ordem alfabética.

o Error messages – apresenta uma lista de erros de execução e

de compilação.

o About – informações sobre o Turbo Pascal 7.0.

7.4. Exercícios

1. Defina, com suas palavras, os seguintes termos:

a) programa

b) linguagem de programação

14

ENG06842 – Programação I

c) tradutor

2. Qual a diferença entre linguagem de baixo nível e linguagem de alto

nível?

3. Qual a diferença entre código-fonte e código-objeto?

4. Explique a diferença entre compilador e interpretador.

5. Diferencie com suas palavras os três tipos de erros encontrados em

programas.

15

ENG06842 – Programação I

8. A Linguagem Pascal

8.1. Introdução

A linguagem de programação PASCAL foi criada para ser uma ferramenta

educacional, isto no início da década de 70 pelo Prof. Niklaus Wirth da

Universidade de Zurique. Foi batizada pelo seu idealizador em

homenagem ao grande matemático Blaise Pascal, inventor de uma das

primeiras máquinas lógicas conhecidas. Foi baseada em algumas

linguagens estruturadas existentes na época, ALGOL e PLI.

O próprio Niklaus Wirth diz que esta linguagem foi criada

simultaneamente para ensinar programação estruturada e para ser

utilizada em sua fábrica de software.

A linguagem é extremamente bem estruturada e muito adequada para

ensino de linguagens de programação. É 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 propósito inicial, o PASCAL começou a ser utilizado por

programadores de outras linguagens, tornando-se, para surpresa do

próprio Niklaus, um produto comercial.

Comercialmente, a linguagem foi sucedida pela criação da linguagem

Object Pascal, atualmente utilizada nas IDEs Borland Delphi, Kylix e

Lazarus. Academicamente, seus sucessores são as linguagens

subseqüentes de Niklaus Wirth: Modula-2 e Oberon.

8.2. Tipos de dados simples

integer - Envolve os números inteiros. A partir da versão 5.0 do Turbo

Pascal passaram a existir também outros tipos de números inteiros:

shortint, byte, word e longint.

16

ENG06842 – Programação I

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

Tipo Valor mínimo Valor máximo Bytes ocupados

shortint -128 127 1byte 0 255 1integer -32768 32767 2word 0 65535 2longint -2147483648 2147483647 4

real - abrange os números reais. A partir da versão 5.0 passaram a existir

também outros tipos de números reais: single, double, extended e comp.

Exemplos: 4.5, -32.0, .5, 7.8E3, 21E+3, -315E-3.

TipoValor

mínimoValor

máximoBytes

ocupados

Dígitos significativo

sreal +-2.9 x 10-39 -+1.7 x 1038 6 11-12single +-1.5 x 10-45 +-3.4 x 1038 4 7-8double +-5.0 x 10-324 +-1.7 x 10308 8 15-16extended +-3.4 x 10-

4932+-1.1 x 104932 10 19-20

comp -263 + 1 263 - 1 8 19-20

boolean - representa um valor lógico (booleano). Utiliza apenas duas

constantes lógicas: true (verdadeiro) e false (falso).

char - representa um único caractere, escrito entre apóstrofos ( ‘ ’ ). A

maioria dos computadores utiliza a tabela de códigos ASCII (ver Apêndice

B – Tabela de códigos ASCII) para representar todos os caracteres

disponíveis. Qualquer caractere poderá ser representado pelo seu código

ASCII em decimal, precedido por #, ou em hexadecimal, precedidos por #

e $.

Exemplos: ‘A’, ‘B’, ‘a’, ‘1’, ‘@’, ‘ ’, #65 (é o caractere A).

17

ENG06842 – Programação I

string - formado por um conjunto de elementos do tipo char. O tamanho

máximo é de 255 caracteres. Também pode apresentar um tamanho pré-

definido: string[5], por exemplo (máximo de 5 caracteres).

Exemplos: ‘CPU’, ‘Processamento de Dados’, ‘123’.

8.3. Mapeamento Portugol x Pascal

A passagem de um código em Portugol para a linguagem Pascal é

praticamente direta, como se fosse uma simples tradução de português

para inglês. Entretanto, algumas estruturas devem ser cuidadosamente

observadas. A seguir são apresentadas as principais regras para realizar o

mapeamento de Portugol para Pascal.

PORTUGOL PASCAL

algoritmo CALCULA_MEDIA;var

P1, P2, P3, P4, MEDIA: real;in icio

leia (P1);leia (P2);leia (P3);leia (P4);MEDIA (P1 + P2 + P3 + p4) /

4;escreva (MEDIA);se MEDIA ≥ 7,0 então escreva (APROVADO);senão escreva (REPROVADO);fim-se;

fim.

program CALCULA_MEDIA;var

P1, P2, P3, P4, MEDIA: real;begin

read (P1);read (P2);read (P3);read (P4);MEDIA := (P1 + P2 + P3 + p4) /

4;write (MEDIA);if MEDIA ≥ 7,0 then write (‘APROVADO’)else write (‘REPROVADO’);

end.

No exemplo acima, nota-se claramente que é feita um tradução

português-inglês do algoritmo. Entretanto, deve-se observar as

equivalências definidas na tabela abaixo:

PORTUGOL PASCALalgoritmo program

inicio beginfim endleia read

escreva write

18

ENG06842 – Programação I

:=se if

então thensenão elsecaso case

enquanto ... faça while ... dorepita ... até repeat ... until

para ... até ... faça for ... to ... doComo pode ser observado no exemplo anterior, a palavra fim-se não é

usada em Pascal, pois deve-se entender que apenas uma instrução será

executada após o if e o else. Caso seja necessária a execução de mais de

uma instrução dentro do if, por exemplo, deve-se definir um “bloco”

(conjunto de comandos delimitados pelas palavras begin e end) através

dos comandos begin e end. Exemplos:

if condição1 then begin

comando 1; if condição2 then

comando 2;end

else comando 3;

Obs.: O comando anterior ao “else” nunca terminará com “;”. No caso

acima o “end” anterior ao “else” não termina com “;”.

Exemplos:

if condição then

comando 1

else

comando 2;

if condição then begin

comando 1; comando 2;...

endelse

begincomando 3; comando 4;...

end;

19

ENG06842 – Programação I

Resumindo então, utiliza-se a definição de blocos apenas nos casos onde

mais de uma instrução deverá ser executada. Esse conceito de blocos

também é usado nas estruturas de repetição.

Os comandos read e write podem ser substituídos pelos comandos readln

e writeln, respectivamente. Esses novos comandos saltam uma linha após

sua execução. Ex: writeln(‘teste’); Esse comando escreve teste e pula para

a linha abaixo na tela.

No comando write, pode-se definir o formato de saída das variáveis

numéricas (casas decimais, com arredondamento), pois no seu modo

padrão, os valores aparecerão em notação científica. Ex: Seja a variável a

= 2.36780984.

write(a); { Será mostrado o valor: 2.3678098400E+00 }

write(a:3:2); { Será mostrado o valor: 2.37 }

No caso do comando for (para), o contador é atualizado, por padrão, de 1

em 1. Entretanto, esse comando pode ser usado com TO, onde a variável

de controle assume valores crescentes e com DOWNTO, onde a variável

assume valores decrescentes. Exemplos:

for identificador := valor1 to/downto valor2 do { escolher entre to e

downto }

comando ; { ou bloco de comandos, usando begin e end

}

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);...

20

ENG06842 – Programação I

8.4. Unidades pré-definidas

O Turbo Pascal possui diversas unidades predefinidas: system, printer, crt,

dos, overlay e graph são as principais. Os identificadores usados nestas

unidades geralmente são formados por palavras compostas em inglês que

lembram seu significado.

Uma unidade (unit) nada mais é que um conjunto de procedimentos e

funções que trabalham sob um mesmo objetivo. É uma coleção de

declarações de constantes, tipos, variáveis, funções e procedimentos,

compilada separadamente. Algumas destas declarações são de uso

interno da unidade, enquanto outras são visíveis, isto é, podem ser usadas

por programas ou outras unidades.

Por exemplo, a unit graph possui comandos para criação de desenhos,

figuras, barras, entre outros; a unit crt possui os procedimentos básicos

de entrada e saída de dados e comandos de controle do monitor. Dessa

forma, para utilizar uma função criada dentro de uma unidade, deve-se

declarar o uso dessa unidade no início do código-fonte (após a definição

do nome do programa). Ex: uses crt; A cláusula uses permite que uma

unidade faça uso de outras unidades. Para usar uma ou mais unidades,

um programa deve conter a cláusula uses antes das declarações de

variáveis. A seguir são apresentadas algumas das principais unidades

disponíveis no Pascal.

system – é a única unidade que não necessita estar na cláusula uses dos

programas ou das outras unidades que a utilizarem. Ex.: tipos de

constantes e variáveis; comentários; expressões aritméticas, lógicas e

literais; funções numéricas predefinidas; funções literais predefinidas;

comandos de entrada e saída; comandos de estrutura condicional e de

repetição.

printer – define um arquivo lst do tipo texto, associado à impressora do

computador, permitindo a sua utilização com os comandos write(lst, ...) e

writeln (lst, ...).

21

ENG06842 – Programação I

crt – oferece diversos recursos para utilizar o vídeo no modo texto, o

teclado e o som do computador. Essa unidade é usada em praticamente

todos os programas escritos em Pascal.

dos – contém constantes, tipos, variáveis, funções e procedimentos

relacionados com o sistema operacional. Ex.: obter data e hora; espaço no

disco rígido; espaço livre no disco rígido, etc.

graph – permite utilizar o vídeo em modo gráfico, define um grande

número de constantes, tipos, variáveis, funções e procedimentos.

8.5. Palavras reservadas

São palavras que fazem parte da estrutura da linguagem e têm

significados pré-determinados. Elas não podem ser redefinidas e não

podem ser utilizadas como identificadores. A tabela a seguir apresenta as

palavras reservada da linguagem Pascal.

absolute end inline procedure typeand external interface program unitarray file interrupt record untilbegin for label repeat usescase forward mod set varconst function nil shl whilediv goto not shr withdo if of string xordownto implementati

onor then

else in packed to

8.6. Funções pré-definidas

A seguir, são apresentadas algumas funções matemáticas pré-definidas na

linguagem Pascal.

Função Finalidade Tipo do argumento

Tipo do resultado

abs(X) valor absoluto integer, real o mesmo do argumento

frac(X) parte fracionária real realtrunc(X) parte inteira real integerround(X) valor

arredondadoreal integer

22

ENG06842 – Programação I

sqr(X) eleva ao quadrado

integer, real o mesmo do argumento

sqrt(X) raiz quadrada integer, real realln(X) logaritmo

naturalreal real

exp(X) exponencial real real

Como não existe em Pascal um operador nem uma função específica para

a operação de potenciação, pode-se consegui-la utilizando as funções

ln(X) e exp(X). Para calcular o valor de XN é suficiente usar:

exp(ln(X)*N)

Exemplos:

Expressão Resultadoabs(-2.5) 2.5

abs(8) 8frac(5.234) 0.234trunc(2.78) 2round(2.78) 3

sqr(2) 4sqr(1.5) 2.25sqrt(4) 2

sqrt(2.25) 1.5exp(ln(2)*3) 8

A seguir, são apresentadas outras funções interessantes disponíveis na

linguagem Pascal.

val(atr,num,code): a função val tentará converter a string informada na

variável atr em um valor numérico (que será armazenado na variável

num), seja real ou integer. Caso não seja possível, a variável inteira code

retornará a posição 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 função str converterá o valor numérico informado em

uma string. Exemplo: str(val_idade,str_idade);

23

ENG06842 – Programação I

keypressed: a função keypressed retornará true caso haja alguma

informação no buffer do teclado, ou seja, caso alguma tecla seja

pressionada. Caso contrário retornará false. Exemplo:

repeat until keypressed; {dará uma pausa no programa até que se pressione

alguma tecla}

readkey: a função readkey pára a execução do programa até que alguma

tecla seja pressionada. É muito utilizada como última instrução de um

programa, pois assim o usuário 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 função odd retornará true se o valor informado for ímpar

(inteiro). Caso contrário retornará false. Exemplo: if odd(num) then

write(‘é ímpar’);

inc(num,val): a função inc irá incrementar o número informado em 1

(um), caso o segundo parâmetro não 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 função dec irá decrementar o número informado em 1

(um), caso o segundo parâmetro não 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 função ord retornará o código ASCII (em decimal) da variável

car (do tipo char). Exemplo: write(ord(‘a’),ord(‘A’)); {mostrará 97 65, os

respectivos códigos ASCII}

24

ENG06842 – Programação I

upcase(char): a função upcase retornará o caractere informado em

formato maiúsculo. Caso o caractere informado não seja alfabético, o

mesmo será retornado como foi informado. Exemplo: write(upcase(‘a’));

{mostrará A}

Obs.: para converter um caractere em maiúsculo basta diminuir 32 de

seu código ASCII. Exemplo:

write(letra); {‘a’}

dec(letra,32);

write(letra); {‘A’}

chr(code): a função chr retornará o caractere correspondente ao código

ASCII informado. Exemplo: write(chr(97)); {mostrará ‘a’}

insert(str,str_destino,pos_inicio): a função insert irá inserir a string str

na string str_destino a partir da posição pos_inicio. Somente a variável

str_destino será alterada. Exemplo:

msg := ‘O Brasil foi penta!’;

adic := ‘não’#32;

insert(adic,msg,10);

write(msg); {‘O Brasil não foi penta!’}

delete(str,pos_inicio,quant): a função delete irá eliminar uma string

interna a outra string. O primeiro parâmetro é a string, o segundo é a

posição inicial, e o terceiro e último a quantidade de caracteres a remover.

Somente o primeiro parâmetro será alterado. Exemplo:

msg := ‘O Brasil não foi penta!’;

delete(msg,10,4);

write(msg); {‘O Brasil foi penta!’}

concat(str1,str2,...,strN): a função concat retornará a concatenação

(união) de todas as strings informadas como parâmetros. O resultado da

25

ENG06842 – Programação I

concatenação não pode ultrapassar os 255 caracteres permitidos. Utilize o

operador “+” ao invés de concat, pois “+” é mais veloz. Exemplo:

msg1:= ‘Linguagem’;

msg2:=#32;

msg3:= ‘Pascal’;

write(concat(msg1,msg2,msg3)); {‘Linguagem Pascal’}

É mais rápido usar: write(msg1 + msg2 + msg3);

copy(str,pos_inicio,quant): a função copy retornará uma substring a

partir de uma string original. A string original é o primeiro parâmetro, a

posição inicial de cópia é 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 função length retornará o comprimento da string, ou seja,

seu número de caracteres. Exemplo:

msg := ‘A Linguagem Pascal’;

write(length(msg)); {18}

clrscr: a função clrscr limpará toda a tela; Exemplo: clrscr;

textbackground(c): altera a cor de fundo da tela. O parâmetro c pode

variar de 0 a 7, e também pode-se usar o nome da cor em inglês. 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 parâmetro c pode variar de 0 a 15, e

também pode-se usar o nome da cor em inglês.. Exemplo: textcolor(10);

26

ENG06842 – Programação I

clreol: a função clreol limpará parte da tela, apenas da posição do cursor

até o final da mesma linha. Exemplo: clreol;

delline: a função delline limpará toda a linha onde estiver o cursor, sem

movê-lo. Exemplo: delline;

insline: a função insline irá inserir uma linha onde estiver o cursor, sem

movê-lo. Todos os dados que estiverem abaixo da posição do cursor serão

deslocados para baixo. Caso se queira inserir mais de uma linha, basta

colocar essa função dentro de um laço (loop). Exemplo:

for x := 1 to 10 do

insline; {irá inserir10 linhas a partir da posição do cursor}

sound(freq): a função sound irá ativar o auto-falante do micro, bastando

apenas informar no parâmetro a freqüência 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 função nosound irá desligar o som do auto-falante do micro.

Exemplo: nosound;

delay(ms): O procedimento delay irá dar uma pausa na execução do

programa, só que diferentemente dos procedimentos já citados, essa

pausa se dará por um tempo informado no parâmetro em milisegundos

(10-3s). Exemplo:

sound(240);

delay(1000); {equivale a 1s}

nosound;

random(num): a função random retornará um valor randômico

(aleatório) a partir do número informado. Esse número randômico será um

número qualquer na faixa de 0 <= a < num. Caso não seja informado um

número, o valor randômico estará na faixa 0 <= a < 1. Normalmente esta

função é utilizada com o procedimento randomize. Exemplo:

27

ENG06842 – Programação I

random(300); {através de fórmulas internas, será gerado um número entre 0 e

300}

randomize: a função randomize irá fazer apenas um pequeno diferencial

no uso da função random. Toda vez que se utiliza random, o valor inicial

das fórmulas é o mesmo. Portanto, os valores randômicos sempre serão os

mesmos. Para que isto não aconteça, basta utilizar o procedimento

randomize, o mesmo irá fazer com que o valor inicial das fórmulas de

randomização seja baseado na hora do sistema, o que sabemos que muda

constantemente. Exemplo:

randomize;

repeat

write(random(500));

delay(50);

until keypressed;

exit: a função exit irá fazer com que a execução do programa saia do

procedimento atual e vá para o seu chamador. Caso o procedimento atual

seja o programa principal, exit terminará a execução do programa.

Exemplo:

if tecla = #27 then

exit; { Pressionou ESC, fim }

Exemplo: Um programa para ler um número 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 – Programação 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 usuário

Os tipos byte, integer, real, boolean, char, etc são pré-definidos em Pascal

e constituem conjunto de valores inteiros, reais, lógicos, caractere, etc. O

Pascal permite a criação de novos tipos. Um novo tipo é criado através de

uma definição 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 usuário também é denominado tipo enumerado.

Os identificadores que criamos para um tipo enumerado não representam

mais nenhum valor, exceto seus próprios. Os tipos enumerados

constituem ferramentas extremamente úteis na criação de programas

limpos e auto-documentados, podendo ser referenciados em qualquer

parte do programa.

Um tipo enumerado é uma seqüência ordenada de identificadores

definidos pelo usuário, que forma um tipo ordinal. A palavra reservada

para criação de tipos enumerados é type. Exemplo:

type semana = (segunda, terça, quarta, quinta, sexta, sábado, domingo);

29

ENG06842 – Programação I

Uma das mais importantes características de um tipo enumerado é a

ordem na qual os valores são ordenados. Além de estabelecer os próprios

identificadores, a declaração do mesmo define a ordem dos

identificadores no tipo.

Diversas operações são válidas 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; {atribuir um identificador a variável de

tipo}

uma_cor := succ(uma_cor); {receber lilás, o sucessor}

uma_cor := pred(uma_cor); {receber roxo novamente, o

antecessor}

uma_cor := succ(azul); {receber vermelho, sucessor de azul}

if succ(uma_cor)>=lilas then

uma_cor := preto;

writeln(ord(uma_cor)); {escrever 2, a ordem do vermelho}

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 posições, do preto ao

rosa}

end.

As variáveis de tipos enumerados não podem ser lidas ou escritas.

Não é válida nenhuma operação aritmética com os elementos de um tipo

enumerado, como somar 1, diminuir 2 ou somar duas constantes ou mais

constantes do tipo.

30

ENG06842 – Programação I

Pode-se usar as constantes dos tipos enumerados para servir de índice de

vetores/matrizes e também no laço (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 domínio de um tipo escalar que está associado a

um novo tipo, que é chamado de tipo escalar. A definição de uma faixa

(subrange) indica quais os valores mínimo e máximo que podem ser

assumidos. A descrição de uma faixa se faz com a indicação 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}

varletra: maius;dia: d_util;

beginclrscr;for letra := ‘J’ to ‘P’ do

write(letra:2);for dia := seg to sex do

case dia ofseg: writeln(‘Segunda’);ter: writeln(‘Terça’);qua: writeln(‘Quarta’);qui: writeln(‘Quinta’);other

writeln(‘Sexta’);end;

readkey;end.

8.8. Exercícios

1. Transforme os algoritmos elaborados nas questões 24 e 25 do Capítulo

4 para a linguagem Pascal. Execute esses algoritmos no computador.

31

ENG06842 – Programação I

2. Transforme os algoritmos elaborados nas questões 1, 2, 5, 6, 10, 11,

12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30 e 31 do Capítulo 5 para

a linguagem Pascal. Execute esses algoritmos no computador.

3. Transforme os algoritmos apresentados ou elaborados nas questões 1,

2 e 3 do Capítulo 6 para a linguagem Pascal. Execute esses algoritmos

no computador.

32

ENG06842 – Programação I

9. Estruturas de dados

9.1. Introdução

Os tipos estruturados são compostos por múltiplos elementos relacionados

entre si. Cada grupo de elementos está relacionado a um identificador. Os

elementos do grupo podem estar também relacionados a identificadores

individuais, representando vários locais de memória que guardam vários

valores, e que podem ser acessados em conjunto ou individualmente.

9.2. Variáveis compostas homogêneas

Correspondem a posições de memória, identificadas por um mesmo nome,

individualizadas por índices e cujo conteúdo é de mesmo tipo.

O conjunto de 10 notas dos alunos de uma disciplina pode constituir uma

variável composta. A este conjunto, associa-se o identificador NOTA, que

passará a identificar não uma única posição de memória, mas 10.

A referência ao conteúdo do n-ésimo elemento do conjunto será indicada

pela notação NOTA[n] onde n é um número inteiro ou uma variável

numérica contendo um valor inteiro.

Exemplo: Supondo que a variável composta NOTA contivesse os seguintes

valores:

60

70

90

60

55

91

100

47

74

86

1 2 3 4 5 6 7 8 9 10

NOTA[3] estaria referenciando o terceiro elemento do conjunto cujo

conteúdo é 90.

Vetores (array): definem conjuntos de dados homogêneos (todos os

elementos são do mesmo tipo). Cada elemento ocupa uma posição

definida no conjunto e pode ser referenciado através dela. Esses conjuntos

33

ENG06842 – Programação I

necessitam de apenas um índice para endereçar seus elementos. São

conhecidos como Variáveis Compostas Unidimensionais.

Declaração 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 declaração de variáveis

como também na definição 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 usuário - tipo subrange }

var

lista: array [indice] of real;

Ex3:

type

max = 300;

vetor = array[1..max] of string[20];

var

endereco: vetor; { a variável endereço está associada ao tipo

vetor }

Ex4:

var

dados: array[‘A’..’Z’] of integer;

Definição de Vetores como constantes: sintaxe geral:

34

ENG06842 – Programação 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 manipulação de vetores nos programas Pascal pode ser expressa com

uma constante, variável ou expressão, devendo ser do tipo correto

(correspondente à definição do array) e estar dentro do intervalo pré-

definido. Ex: lista[5] lista[i], onde i é uma variável inteira com valores

variando de 1 a 100. lista[i+j], onde i e j são variáveis inteiras cuja soma

não ultrapassa 100. Os elementos do ARRAY podem ser usados em

expressões, instruções de atribuição, instruções read e write, etc.

Exemplo:

program exVetor;

type

vetorNotas = array [1..40] of real;

35

ENG06842 – Programação 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); { função que incrementa a variável ⇒ i := 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): também definem conjuntos de

dados homogêneos (todos os elementos são do mesmo tipo), entretanto,

esses conjuntos necessitam de mais de um índice para endereçar seus

elementos. São conhecidos como Variáveis Compostas Multidimensionais

(matrizes). Exemplo de matriz bidimensional:

1 2 31 1

047

94

2 67

98

74

3 16

21

32

Declaração de matrizes:

36

ENG06842 – Programação I

<identificador>: array [dim1,dim2,...] of tipo_elemento;

As dimensões são definidas como: dim1 = li1..ls1, dim2 = li2..ls2, etc.

Exemplo de declaração de uma matriz TRIDIMENSIONAL:

mat3D: array [1..10, 1..20, 1..40] of real;

A 1ª dimensão tem 10 elementos, a 2ª tem 20 elementos e a 3ª tem 40

elementos. Todos os elementos são números reais.

Matriz BIDIMENSIONAL:

mat2D: array [1..5,1..9] of char;

É uma matriz bidimensional com 5 elementos do tipo char na 1ª dimensão

e 9 na 2ª dimensão.

A manipulação de matrizes nos programas em Pascal pode ser expressa

com constantes, variáveis ou expressões, devendo ser do tipo correto

(correspondente à definição do array) e estar dentro do intervalo pré-

definido. Exemplo: mat3D[5,4,8], mat2D[i,9], onde i é uma variável inteira

com valores variando de 1 a 5. Os elementos da matriz podem ser usados

em expressões, instruções de atribuição, instruções 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 – Programação I

Uma matriz também 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 2ª linha 3ª linha 4ª linha 5ª 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’,’Nágyla’,’Luciana’),

{segunda linha}

(‘Patrícia’,’Marcos’,’Angélica’)); {terceira

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;

38

ENG06842 – Programação 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 não

acontecerá se a origem do índice for alguma expressão.

Os tipos array em Pascal são estáticos, ou seja, o comprimento e as

dimensões alocadas são fixas em tempo de compilação e não

podem ser redefinidas durante a execução do programa.

9.3. Variáveis compostas heterogêneas

O principal tipo de variáveis compostas heterogêneas é o registro, que

consiste em conjuntos de dados logicamente relacionados, mas de tipos

diferentes (numéricos, lógicos, literais, etc).

Pode-se definir registros em Pascal na sessão type ou diretamente

declarar variáveis do tipo record.

a) Declaração na sessão TYPE:

type

<nome_novo_tipo> = record

campo 1: tipo 1;

campo 2: tipo 2;

campo n: tipo n;

end;

39

ENG06842 – Programação I

var

<identificador_variavel>: <nome_novo_tipo>;

Exemplo:

type { Atencao para a indentacao dos campos do registro}

funcionario = record

nome: string[40];

idade: integer;

funcao: string[30];

salario: real;

end;

var

funcionarioUFES: funcionario;

b) Declaração na sessão VAR:

var

<identificador_registro>: record

campo 1: tipo 1;

campo 2: tipo 2;

campo n: tipo n;

end;

Ex emplo :

var

funcionarioUFES: record

nome: string[40];

idade: integer;

funcao: string[30];

salario: real;

end;

40

ENG06842 – Programação I

Os campos dos registros podem ser por sua vez de tipos simples ou

estruturados (array, registros, etc.).

Ex emplo :

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 notação <identifRegistro>.<campo>. Ex:

write(‘Digite o nome do funcionario: ’);

readln(funcionarioUFES.nome); {acesso ao campo

nome }

write(‘Digite a funcao do funcionario: ’);

readln(funcionarioUFES.funcao); {acesso ao campo

funcao }

...

b) uso da estrutura with <identif_Registro> do. Ex:

with funcionarioUFES do

41

ENG06842 – Programação 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 { variável aluno do tipo registro }

matricula: string[6]; {definição dos campos do registro }

nome: string[15];

serie: integer;

turma: char; { cada campo tem um nome e

um tipo }

end;

begin

write('Numero de matricula: ');

readln(aluno.matricula);

write('Nome: ');

readln(aluno.nome); {acesso ao campo nome do

registro aluno}

write('Serie: ');

readln (aluno.serie);

write ('Turma: ');

readln (aluno.turma);

{ comando with indica o registro que será usado - não 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!’);

42

ENG06842 – Programação I

end.

Conjunto de registros: utilizado para armazenar n informações referentes

ao mesmo tipo de registro, como, por exemplo, informações de vários

funcionários ou vários alunos. Em Pascal, esse tipo de conjunto é definido

por um array unidimensional (vetor) de registros. A declaração é 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 manipulação 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 – Programação I

end;

Também 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 – Programação 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 { vet_prod[i] representa cada

elemento do vetor }

begin

write(‘identificação: ’);

readln(ident) ;

write(‘descrição: ’);

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

45

ENG06842 – Programação I

write(‘ ’, ident, ‘ ’, descr, ‘ ’, preco:6:2, ‘ ’, quant);

end.

9.4. Algoritmos de classificação e busca

Algoritmos de classificação : existem diversos métodos para classificar (ou

ordenar) uma estrutura de dados. Os mais conhecidos são o “Método da

Bolha”, o “Método da Seleção Direta” e o “Método Quick Sort”, porém o

mais comum desses é o Método da bolha (Bubble Sort).

Exemplo: Método da Bolha para ordenação 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 – Programação I

{ ***************** Ordenação 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 : também existem diversos métodos para procurar (ou

buscar) um valor dentro de uma estrutura de dados. Os mais conhecidos

são o “Busca Seqüencial” e o “Busca Binária”, porém o mais comum

desses é o Seqüencial.

Exemplo: Considere um vetor A com 50 elementos. Verificar se existe um

elemento igual a K no vetor. Se existir mostrar a posição em que se

encontra, senão imprimir “não 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 – Programação 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. Exercícios

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 posição em que se

encontra, senão imprimir “não encontrei K no vetor”.

3. Faça um programa para ler um conjunto de 10 inteiros e escreve-los na

ordem inversa à ordem de leitura.

4. Faça 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 números reais e

construa um conjunto B, onde os elementos de ordem (posição) par são

os elementos correspondentes de A divididos por 2, e os de ordem

(posição) ímpar correspondem aos elementos de A multiplicados por 3.

Ao final, mostre os dois conjuntos de números.

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; Saída: 12 de

junho de 1995.

48

ENG06842 – Programação I

7. Elabore um programa que utilize dois vetores V1 e V2, formados de

números reais com 20 posições cada um, e efetue neles as operações

indicadas no vetor OP, cujos elementos são caracteres que indicam as

quatro operações aritméticas básicas (+, -, *, /) . O resultado obtido das

operações 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 dimensões 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 (dimensões 10x10), incluindo os elementos da

própria diagonal.

10. Escreva um programa que leia duas matrizes reais A e B de

dimensões 3x5 e 5x3, respectivamente, calcule e imprima o produto

delas.

11. Dada uma matriz A de dimensões 5x4 formada de elementos

numéricos reais, calcule e mostre sua matriz transposta T.

12. Dada uma matriz B formada por números inteiros com 10 linhas por

15 colunas, determinar o elemento de maior valor algébrico. Mostre tal

elemento e sua posição na matriz (linha e coluna).

13. Faça um programa para ler 2 vetores a e b, de inteiros, e montar o

vetor soma = a + b.

14. Faça um programa para multiplicação de matrizes: leia a e b (4x4), crie

C = A*B, escreva C.

15. Loteria esportiva. Faça 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 prêmio. Ao final da

49

ENG06842 – Programação I

verificação, pergunte se o usuário quer entrar mais jogos. Ao final do

programa, informe quantos ganharam o prêmio.

50

ENG06842 – Programação I

10. Modularização

10.1. Introdução

Dentre as técnicas de programação estruturada, encontra-se a

modularização. Esta técnica consiste em decompor um programa em uma

série de subprogramas individuais. A modularização é um método

utilizado para facilitar a construção de grandes programas, através de sua

divisão em pequenas etapas (dividir para conquistar), que são os módulos

ou subprogramas. A primeira delas, por onde começa a execução do

trabalho, recebe o nome de programa principal, e as outras são os

subprogramas propriamente ditos, que são executados sempre que ocorre

uma chamada dos mesmos, o que é feito através da especificação de seus

nomes.

A modularização 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 não. Este módulo pode

ser usado várias vezes num mesmo programa que leia várias datas

diferentes e pode ser reaproveitado em novos programas que serão

escritos. Outras conseqüências positivas do uso de modularização é o

aumento de clareza e concisão do programa, pois o comprimento do

programa diminui com o uso de módulos. Em Pascal existem dois tipos de

módulos de programas: Procedimentos e Funções.

Vantagens da utilização de subprogramas:

Economia de código: escreve-se menos;

Desenvolvimento modularizado: pensa-se no algoritmo por partes;

Facilidade de depuração (correção/acompanhamento): é mais fácil

corrigir/detectar um erro apenas uma vez do que dez vezes;

Facilidade de alteração do código: se é preciso alterar, altera-se

apenas uma vez;

51

ENG06842 – Programação I

Generalidade de código com o uso de parâmetros: escreve-se

algoritmos para situações genéricas.

10.2. Procedimentos

Um subprograma do tipo PROCEDIMENTO é, na realidade, um programa

com vida própria, mas que, para ser processado, tem que ser solicitado

pelo programa principal que o contém, ou por outro subprograma, ou por

ele mesmo.

Declaração:

procedure nome;

declaração dos objetos (constantes, variáveis, etc.) locais ao

procedimento

begin

comandos do procedimento;

end;

Onde: nome é o identificador associado ao procedimento.

Exemplo: O programa abaixo calcula a média aritmética entre duas notas,

sem o uso de procedimentos.

program CALCULA_MEDIA; {sem o uso de procedimentos}

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}

52

ENG06842 – Programação I

writeln('Media = ',MEDIA,4:1)

end.

Agora, o mesmo programa, utilizando um procedimento.

program CALCULA_MEDIA; {usando procedimento}

var

NOTA1,NOTA2,MEDIA : real;

{ declaração 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; {ativação do procedimento

LER_NOTAS}

MEDIA := (NOTA1 + NOTA2) / 2; {calcula a media}

Writeln('Media = ',MEDIA,4:1) {escreve o resultado}

end.

10.3. Funções

As funções, embora bastante semelhantes aos procedimentos, têm a

característica especial de retornar ao programa que as chamou um valor

associado ao nome da função. Esta característica permite uma analogia

com o conceito de função da Matemática.

Declaração:

function nome: tipo;

53

ENG06842 – Programação I

declaração dos objetos locais à função

begin

comandos da função;

end;

Onde: nome é o identificador associado à função; e tipo é o tipo da função,

ou seja, o tipo do valor de retorno.

Exemplo: O programa abaixo calcula a média dos elementos de um vetor,

sem uso de procedimentos ou funções.

program SOMA_VETOR; {sem o uso de procedimentos ou funções}

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, porém utilizando um procedimento para ler os

valores do vetor e uma função para efetuar o cálculo da média.

program SOMA_VETOR; {usando uma função e um

procedimento}

54

ENG06842 – Programação I

const

N = 30;

var

VETOR: array[1..N] of integer;

{ declaração do procedimento }

procedure LER_DADOS;

var

I: integer;

begin

for I := 1 to N do

readln(VETOR[I]);

end;

{ declaração da função }

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; {ativa o procedimento LER_DADOS}

writeln(MEDIA); {escreve o resultado, chamando a função

MEDIA}

end.

55

ENG06842 – Programação I

10.4. Escopo de variáveis

Observe que, no exemplo anterior, foi declarada uma variável no

programa principal e outras nos subprogramas. Pode-se dizer que a

variável VETOR, que foi declarada no programa principal é uma variável

global aos subprogramas, enquanto que a variável I é dita variável local ao

procedimento LER_DADOS e as variáveis I e SOMA são locais à função

MEDIA. É importante ressaltar que a variável I do procedimento

LER_DADOS é diferente da variável I da função MEDIA, embora possuam o

mesmo identificador.

O uso de variáveis globais dentro de procedimentos e funções serve para

implementar um mecanismo de transmissão de informações de um nível

mais externo para um mais interno. As variáveis locais dos procedimentos

e funções são criadas e alocadas quando da sua ativação e

automaticamente liberadas quando do seu término.

A utilização de variáveis globais não constitui, no entanto, uma boa prática

de programação. Assim, todos os subprogramas devem apenas utilizar as

variáveis locais, conhecidas dentro dos mesmos, e a transmissão de

informações para dentro e fora dos subprogramas deve ser feita através

dos parâmetros de transmissão, que serão apresentados a seguir.

10.5. Parâmetros

Quando se deseja escrever um subprograma que seja o mais genérico

possível, deve-se usar a passagem de parâmetros. A passagem de

parâmetros formaliza a comunicação entre os módulos. Além disto,

permite que um módulo seja utilizado com operandos diferentes,

dependendo do que se deseja do mesmo. Dá-se a designação de

parâmetro real ou de chamada ao objeto utilizado na unidade

chamadora/ativadora, e de parâmetro formal ou de definição ao recebido

como parâmetro no subprograma. Dentre os modos de passagem de

parâmetros, destaca-se a passagem por valor e a passagem por

referência.

56

ENG06842 – Programação I

P assagem de parâmetros por valor : as alterações feitas nos parâmetros

formais, dentro do subprograma, não se refletem nos parâmetros reais. O

valor do parâmetro real é copiado no parâmetro formal, na chamada do

subprograma. Assim, quando a passagem é por valor, isto significa que o

parâmetro é de entrada.

P assagem de parâmetros por referência : toda alteração feita num

parâmetro formal corresponde a mesma alteração feita no seu parâmetro

real associado. Assim, quando a passagem é por referência, isto significa

que o parâmetro é de entrada-saída.

Na linguagem Pascal, a declaração dos procedimentos e funções com

parâmetros se diferencia da forma já apresentada apenas pela inclusão da

lista de parâmetros formais no cabeçalho. Esta deve vir entre parênteses

e cada parâmetro deve ter o seu tipo especificado. A forma geral é:

procedure nome (lista de parâmetros formais)

function nome (lista de parâmetros formais): tipo

A lista de parâmetros formais tem a seguinte forma:

parâmetro1: tipo; parâmetro2: tipo; ...; parâmetro n: tipo

Exemplos da lista de parâmetros:

procedure PROC (X, Y, Z: integer; K: real);

function FUNC (A, B: real; C: string): integer;

Na forma apresentada, a passagem dos parâmetros será por valor. Para se

utilizar a passagem por referência, deve-se acrescentar a palavra VAR

antes do nome do parâmetro.

Exemplo:

procedure PROC(A: integer; var B, C: integer);

57

ENG06842 – Programação I

Na chamada de procedimentos ou funções utilizando parâmetros,

devemos acrescentar após o nome do procedimento ou função uma lista

de parâmetros reais (de chamada), os quais devem ser do mesmo tipo e

quantidade dos parâmetros formais declarados. O exemplo a seguir

demonstra a diferença entre a passagem de parâmetros por referência e a

passagem de parâmetros 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); {será exibido o valor 0}

writeln(N2); (será exibido o valor 1}

end.

Exemplo: Escrever um procedimento chamado DOBRA que multiplique um

número inteiro (recebido como parâmetro) 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;

58

ENG06842 – Programação I

procedure DOBRA (var NUM: integer);

begin

NUM := NUM * 2

end;

begin

readln(X);

DOBRA(X);

writeln(X);

end.

Exemplo: Escrever uma função chamada MAIOR que receba dois números

inteiros e retorne o maior deles. Escrever um programa para ler dois

números inteiros e, utilizando a função MAIOR, calcular e exibir o maior

valor entre os números 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 – Programação I

Exemplo: Escreva um procedimento que receba uma string S e converta o

mesmo para letras maiúsculas.

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 função chama a si próprio.

Diz-se então que o procedimento ou função é recursivo. Por exemplo, o

fatorial de um número n pode ser definido recursivamente, ou seja:

=>−

=0 n se1

0 n se1)!(nn !n

Dessa forma, pode-se escrever uma função recursiva em Pascal que

traduz esta definição matemática:

function FAT(n: integer): integer;

begin

if n = 0 then

FAT := 1

else

FAT := N * FAT(N-1);

end;

10.7.Exercícios

1. Cite as principais vantagens da utilização de subprogramas.

60

ENG06842 – Programação I

2. Conceitue procedimento e função. Em que eles são semelhantes e em

que eles são diferentes?

3. Que tipo de informação deve ser incluído na declaração de um

procedimento? E na declaração de uma função? Se houver diferenças,

explique o motivo.

4. Qual a diferença entre variável global e variável local?

5. Como deve ser feita a transmissão de informações entre um

subprograma e o programa principal?

6. Qual a diferença entre parâmetro real e parâmetro formal?

7. Cite os modos de passagem de parâmetros, 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 função chamada CUBO que receba um valor do tipo real e

retorne a potência elevado a 3 do mesmo.

11. Escreva um procedimento chamado TROCA que receba duas variáveis

inteiras (X e Y) e troque o conteúdo entre elas;

12. Escreva uma função que receba uma string S e retorne o número de

espaços existentes na mesma.

13. Escreva uma função 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 parâmetro

um valor N inteiro e escreva a palavra POSITIVO se N for um número

61

ENG06842 – Programação 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 número inteiro e, usando o

procedimento SINAL (criado na questão 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 parâmetro) pela metade.

17. Escreva um programa que leia um vetor A de 30 elementos reais e,

usando o procedimento METADE (criado na questão anterior), divida

todos seus elementos pela metade.

18. Escreva uma função chamada MEDIA que retorne a média aritmética de

três valores reais (X, Y e Z) passados como parâmetros.

19. Escreva um programa que, para um número indeterminado de alunos,

faça para cada uma deles:

ler o nome e as três notas do aluno (a leitura do nome FIM indica o

fim dos dados - flag);

calcular a média do aluno (usando a função MEDIA criada na

questão anterior);

exibir o nome e a média do aluno.

20. Quantos números 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 – Programação 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 função POTENCIA que realize a operação de

potenciação e que contenha os seguintes parâmetros formais:

VALOR: número inteiro que se deseja elevar à potência.

POT: potência elevada

Ex: Na chamada da função POTENCIA(5,3), o resultado seria 125. Na

chamada da função POTENCIA(2,0), o resultado seria 1.

23. Escrever uma função DIGITO(N,K) que determine o valor do k-ésimo

dígito da direita para a esquerda de um número N inteiro. Ex:

DIGITO(379836,3) = 8 DIGITO(567,8) = 0.

24. Escreva uma função 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 – Programação I

26. Faça um programa que leia duas medidas de tempo (expressas em

horas, minutos e segundos) e, usando a função SEG e o procedimento

HMS, calcule e exiba a diferença (também em horas, minutos e

segundos) entre elas.

27. Escreva uma função chamada NOME_MES que receba um valor inteiro

N (de 1 a 12) e retorne uma string contendo o nome do mês

correspondente a N.

28. Escrever um procedimento para leitura de um valor inteiro entre 1 e

100. Se o usuário fornecer um valor fora desta faixa, deve-se repetir o

processo até que seja fornecido um valor válido.

29. Fazer um programa para ler duas matrizes e apresentar a soma. Utilize

subprogramas (procedimentos e/ou funções) 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 – Programação 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_presença), e determine quantos alunos foram aprovados

e quantos foram reprovados. Para aprovação é preciso ter média maior

ou igual a 6 e 75% de presença. A média é calculada pela expressão:

Media = (P1 + P2) * 70% + Nota_trabalhos * 30%. Use uma função

para calcular a média. Utilize pelo menos um procedimento ou função.

32. Fazer uma função para multiplicar 2 matrizes A (MxN) e B (NxK) e

retornar a matriz resultado (MxK).

33. Escreva uma função recursiva FIB(n) que receba o inteiro n e

devolva o n-ésimo terma da seqüência de Fibonacci, definida

recursivamente por:

65

ENG06842 – Programação I

<<≥+

=3 n 0 se1

3 n se2)-FIB(n1)-FIB(n FIB(n)

66

ENG06842 – Programação I

11. Armazenamento de dados

A manipulação de dados apresentada nos capítulos anteriores estavam

em memória, ou seja, após a execução dos programas os dados se

perdiam. Para resolver esse problema, deve-se começar a trabalhar com

discos (HDs, disquetes, etc.), onde os dados poderão ser armazenados e

manipulados por um ou vários programas, pois ficarão armazenados em

algum local dos discos existentes no computador.

Geralmente, o armazenamento de dados é realizado através de um banco

de dados ou de um simples arquivo. A utilização de bancos de dados é

baseada na utilização de um Sistema Gerenciador de Banco de Dados

(SGBD), que oferece recursos para uma adequada e eficiente manipulação

dos dados. Entretanto, para utilização de um SGBD, deve-se inicialmente

compreender os conceitos para criação e utilização de um banco de

dados, e isso leva tempo. Normalmente, os bancos de dados são tratados

em uma disciplina única e exclusiva, cuja finalidade é trabalhar

diretamente nos seus principais conceitos. Dessa forma, será tratado

neste capítulo apenas o armazenamento de dados via arquivos, cuja

manipulação é menos eficiente, porém 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 informações no arquivo de dados e

gravá-lo em disco. A partir deste momento, pode-se ler as informações

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, endereços e telefones de seus amigos. Inicialmente,

você precisará de um programa para introduzir as informações no arquivo

67

ENG06842 – Programação I

e adicionar novos dados ao mesmo. Um outro programa poderá ser criado

para listar as informações do arquivo.

Outro permitirá você selecionar um número de telefone do arquivo usando

o nome do amigo como critério de seleção. Você pode criar outro

programa para mudar os endereços e os telefones. Outro para imprimir

etiquetas contendo as informações do arquivo. As possibilidades

continuam...

O arquivo de dados é gravado no disco, separadamente dos programas,

num lugar específico, e pode ser acessado por muitos programas

diferentes. Cada programa descrito acima, copia as informações gravadas

no disco para memória do computador e esses dados são manuseados em

memória de acordo com as necessidades de cada programa.

Alternativamente, o programa poderá transferir as informações da

memória do computador para serem gravadas no disco.

O Turbo Pascal admite três 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 não se

pode criar um arquivo de arquivo. Cada elemento pertencente ao

arquivo tipado pode ser acessado diretamente pelo número, isto é,

um registro pode ser acessado imediatamente sem que tenhamos

que acessar todos os registros anteriores. Esse tipo de acesso é

denominado randômico ou direto. Um arquivo tipado é um arquivo

randômico.

Arquivo text (arquivo texto): pertence a um tipo predefinido do

Pascal denominado text. Os arquivos text são armazenados no disco

como linhas de caracteres ASCII e só podem ser acessados de forma

seqüencial, isto é, só podem ser lidos ou escritos do início para o fim

do arquivo. Um arquivo seqüencial em disco está projetado para ser

lido do início ao fim, toda vez que for aberto. Em outras palavras,

68

ENG06842 – Programação I

não existe uma forma de pular diretamente de um determinado

registro para outro num ponto qualquer do arquivo. Por essa razão,

os arquivos seqüenciais são melhor usados em aplicativos que

executam tarefas sobre todo um conjunto de dados ao invés 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 operações de entrada e saída usando um arquivo sem tipo

transferem dados diretamente de um arquivo em disco para uma

variável de memória e vice-versa, sem passar pela memória

temporária (buffer), o que, além de economizar espaço na memória,

também torna a operação ligeiramente mais rápida. Seu uso é muito

limitado. Quando um arquivo é aberto apenas para uma operação de

remoção ou troca de nome, é aconselhável usar um arquivo sem

tipo.

Os procedimentos para manipulação de qualquer arquivo são:

Definir uma variável de arquivo e associar a variável 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 padrão de

arquivos-texto. A sintaxe para definir variáveis desse tipo é:

var

arq_alunos: text;

arq_func: text[512];

69

ENG06842 – Programação I

Os arquivos-texto são definidos inicialmente com memória temporária de

128 bytes. Isto quer dizer que o Pascal trabalha com 128 bytes de

informações de cada vez.

Esse tamanho de memória temporária é adequado para a maioria das

aplicações. Entretanto, no caso de programas que utilizam repetidamente

informações guardadas em disquetes, como é o caso de programas de

banco de dados, pode ser conveniente aumentar a capacidade de

memória temporária. Para estabelecer o tamanho da memória temporária,

basta colocar o número de bytes desejado entre colchetes depois da

palavra text, na declaração da variável de arquivo (como no exemplo

acima).

Normalmente, se declara uma variável de memória, do mesmo tipo de

dados que vão ser gravados ou lidos no arquivo. É essa variável que

guarda em memória os conteúdos dos registros que vão ser lidos do

arquivo ou que vão ser gravados no arquivo. Todo o manuseio com os

dados é feito em memória. O arquivo de dados é utilizado apenas para

gravar ou ler informações.

Exemplo:

type

dados = record

nome: string[30];

tel: string[10];

end;

var

arq_alunos: text;

registro: dados;

Para utilizar uma variável de arquivo para acessar um arquivo-texto, deve-

se associar a variável a um determinado nome de arquivo em disco.

Denomina-se esse processo como assinalamento. A função predefinida

que executa esta tarefa é assign. Assign associa o nome da variável de

70

ENG06842 – Programação 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 referência a “arq_alunos” no programa será

dirigida ao arquivo no disco chamado “alunos.dat”.

Caso um programa tenha mais de uma variável de arquivo, teremos que

assinalar individualmente cada variável, isto é, teremos tantos assign

quanto forem as variáveis de arquivo.

Assinalar uma variável a um arquivo é criar um buffer específico para

aquela variável. Um buffer é uma parte da memória do computador, com

determinada capacidade, que é criada para atuar como intermediário

entre o programa e o arquivo de dados no disco. A informação que se

encontra no disco, primeiro é copiada para buffer, uma determinada

quantidade de bytes de cada vez, estando, portanto, disponível ao

programa para manipulação. Do mesmo modo, as informações, para

serem gravadas em disco, são primeiramente acumuladas no buffer.

Quando o buffer está cheio, as informações são copiadas para o disco.

Graças aos buffers, os dados são movimentados corretamente, para os

arquivos especificados. O default (padrão) 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 – Programação I

arq_alunos: text;

registro: dados;

begin

clrscr;

assign(arq_alunos,‘alunso.dat’);

Um determinado arquivo-texto pode ser aberto para leitura ou gravação,

mas não para ambas operações ao mesmo tempo.

O Pascal fornece três funções diferentes para abertura de um arquivo-

texto:

rewrite(var de arquivo): cria um novo arquivo e o abre para

operações de escrita. Após 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 destrói o arquivo antigo e cria outro vazio e com o

mesmo nome, isto significa que todos os dados do arquivo existente

serão 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 saída) se o arquivo não existir no

disco. Após a abertura, pode-se usar as funções WRITE e WRITELN

para escrever dados no arquivo.

reset(var de arquivo): abre um arquivo já existente para leitura.

Após a abertura do arquivo, pode-se usar as funções READ e

READLN para ler dados e linhas de texto do arquivo.

Em contraste com a função REWRITE que cria um arquivo novo destruindo

o antigo, caso exista, os comandos APPEND e RESET assumem a

existência de um arquivo nomeado no disco. Se o arquivo não puder ser

localizado, em ambos os casos, resultarão em erros de I/O em tempo de

execução.

72

ENG06842 – Programação 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 – Programação 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 gravação? <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:

espaço (#32) e tabulação (#9).

Para fechar qualquer arquivo aberto, o Pascal dispõe do comando CLOSE,

como foi visto nos exemplos anteriores de programas.

Se vários 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 não termina

com o assinalamento feito pelo comando ASSIGN. Isto significa que o

programa pode usar um comando REWRITE, RESET ou APPEND após o

comando CLOSE se necessário.

CLOSE é um comando muito importante, pois é usado para manter a

integridade e exatidão dos arquivos de dados. Relembre que o buffer atua

como um intermediário entre o programa e o arquivo em disco. Quando se

executa uma operação de gravação, os dados são enviados

74

ENG06842 – Programação I

primeiramente para o buffer. Quando o buffer está cheio, os dados são

gravados em disco. Freqüentemente essa operação é chamada de

atualização de arquivos em disco.

O que acontece quando o buffer só está parcialmente cheio e não existem

mais dados para preenchê-lo. Se você está esperando que o buffer semi-

cheio simplesmente transfira seu conteúdo para o disco quando o

programa termina a sua execução, você está enganado. Os dados de um

buffer semi-cheio não são necessariamente gravados no arquivo.

O comando CLOSE força o buffer a transferir o seu conteúdo para o

arquivo de disco, mesmo que o buffer não 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); {lendo do arquivo}

write(nome,‘ ’,tel); {listando na tela}

75

ENG06842 – Programação 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 seqüência de valores de um arquivo

texto, o comando READ reconhece os caracteres delimitadores usados

durante o processo de gravação.

O arquivo-texto foi projetado para conter só caracteres ASCII. Mesmo

assim, os comandos READ e READLN podem ler apropriadamente valores

de dados numéricos ou strings. É evidente que durante um processo de

leitura, não se pode colocar valor de uma variável string numa variável

numérica.

Já foi dito que um arquivo-texto é um arquivo seqüencial, por isso é

necessário sabermos quando o fim de arquivo foi atingido. A quantidade

de linhas gravadas pode ser controlada pelo programador, através de

técnicas, porém, o modo mais prático para se descobrir o fim do arquivo é

usar a função booleana EOF, como foi aplicado no exemplo acima.

A função EOF retorna true se o ponteiro estiver no final do arquivo. Caso

contrário, a função retornará false, indicando que o fim do arquivo não foi

atingido.

11.2. Exercícios

1. Dado um arquivo existente, com registros com os dados: nome, sexo,

endereço 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 usuário quiser). Abrir o arquivo e atualizá-lo com

as médias dos alunos. A seguir, liste nome e média de cada aluno.

76

ENG06842 – Programação I

3. Estoque de supermercado. Faça um programa para controlar o estoque

de um supermercado. Para cada produto armazene (em arquivo):

nome, estoque, preço, e estoque mínimo. Leia os dados para o estoque

e guarde em um vetor. Depois percorra o vetor e escreva o nome e as

demais informações de todos os produtos que estão com estoque

abaixo do estoque mínimo.

4. Folha de pagamentos. Monte um vetor para armazenar o nome, cargo,

salário bruto de cada funcionário de uma empresa. Depois execute a

folha de pagamentos da seguinte forma: para cada funcionário,

imprima nome, salário bruto e salário líquido (para salários menores

que 1000 o salário líquido é o próprio salário bruto; para salários

maiores ou iguais a 1000 o salário líquido é cerca de 87% do salário

bruto).

77

ENG06842 – Programação I

Referências

[1] COLLINS, W. J. Programação estruturada com estudos de casos

em Pascal. McGraw-Hill. (1988) São Paulo. 1988. 712p.

[2] FARRER, H. et al. Algoritmos estruturados. Livros Técnicos e

Científicos. 3a ed. Rio de Janeiro. 1999.

[3] FARRER, H. et al. Pascal estruturado. Livros Técnicos e Científicos. 3a

ed. Rio de Janeiro. 1999. 278p.

[4] FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de programação:

a construção de algoritmos e estruturas de dados. Pearson

Education do Brasil. 2a ed. São Paulo. 2000.

[5] GUIMARÃES, A. M.; LAGES, N. A. C. Algoritmos e Estruturas de

Dados. Rio de Janeiro, LTC, 1994.

[6] MANZANO, J. A. N. G. Algoritmos: lógica para desenvolvimento de

programação. Erica. 10a ed. São Paulo. 2000.

78

ENG06842 – Programação I

Apêndice A – Mensagens de erro do Turbo Pascal

A seguir são apresentados os principais “possíveis” erros de compilação

do Turbo Pascal 7.0.

ERRO DESCRIÇÃO TRADUÇÃO1 Out of memory Não existe espaço em memória2 Identifier expected Identificador esperado3 Unknown identifier Identificador desconhecido4 Duplicate identifier Identificador já existente5 Syntax error Erro de sintaxe6 Error in real Constant Erro na constante real7 Error in integer Constant Erro na constante inteira8 String Constant exceeds line Constante string excede a linha9 Too many nested files Muitos arquivos aninhados10 Unexpected end of file Fim de arquivo não esperado11 Line too long Linha muito longa12 Type identifier expected Espera a identificação do tipo13 Too many open files Muitos arquivos abertos simultaneamente14 Invalid file name Nome de arquivo inválido15 File not found Arquivo não encontrado16 Disk full Disco cheio17 Invalid file name Diretiva de compilação inválida18 Too many files Excesso de arquivos19 Undefined type in pointer def Ponteiro nunca antes declarado20 Variable identifier expected Identificador de variável esperado21 Error in type Erro de tipo22 Structure too large Estrutura muito larga23 Set base type out of range Faixa de valores inválida para a faixa

24File components may not be files or objects

Componentes do arquivo não devem ser arquivos ou objetos

25 Invalid string length Tamanho de string inválido26 Type mismatch Tipos misturados / incompatível27 Invalid subrange base type Faixa de valores inválida28 Lower bound > than upper bound Limite inferior > limite superior29 Ordinal type expected Tipo escalar esperado30 Integer Constant expected Constante inteira esperada31 Constant expected Constante esperada32 Integer or real Constant expected Constante inteira ou real esperada33 Pointer type identifier expected Identificador de tipo ponteiro esperado34 Invalid function result type Tipo de resultado da função inválido35 Label identifier expected Identificador Label esperado36 Begin expected Begin esperado37 End expected End esperado38 Integer expression expected Expressão inteira esperada39 Ordinal expression expected Expressão ordinal esperada40 Boolean expression expected Expressão booleana esperada41 Operand types do not match Operando incompatível com o operador42 Error in expression Erro na expressão43 Illegal assignment Associação ilegal44 Field identifier expected Identificador de campo esperado45 Object file too large Arquivo objeto muito grande46 Undefined extern Extern indefinido47 Invalid object file Record Objeto de registro de arquivo inválido48 Code segment too large Segmento de código muito grande49 Data segment too large Segmento de dados muito grande

79

ENG06842 – Programação I

50 Do expected Do esperado51 Invalid public definition Definição public inválida52 Invalid extern definition Definição extern inválida53 Too many extern definitions Excesso de definições extern54 Of expected Of esperado55 Interface expected Interface esperada56 Invalid relocatable reference Referência relocável inválida57 Then expected Then esperado58 To or Downto expected To ou Downto esperado59 Undefined forward Forward indefinido60 Too many procedures Excesso de procedures61 Invalid typecast Tipo de resultado inválido62 Division by zero Divisão por zero63 Invalid file type Tipo de arquivo inválido

64Cannot read or write vars of this type

Variáveis desse tipo não podem ser lidas / escritas

65 Pointer variable expected Variável do tipo ponteiro esperada66 String variable expected Variável do tipo String esperada67 String expression expected Expressão string esperada68 Circular unit reference Referência circular da unit69 Unit name mismatch Nome da unit incompatível70 Unit version mismatch Versão da unit incompatível71 Duplicate unit name Nome da unit duplicada72 Unit file format error Erro no formato do arquivo unit73 Implementation expected Implementation esperado

74Constant and case types don’t match

Constante e expressão do case incompatíveis

75 Record variable expected Variável do tipo Record esperada76 Constant out of range Constante fora de faixa77 File variable expected Variável de arquivo esperada78 Pointer expression expected Expressão tipo ponteiro esperada79 Integer or real expression expected Expressão inteira ou real esperada80 Label not within current block Label for a do bloco atual81 Label already defined Label já foi definido82 Undefined label in stmt part Label não declarado83 Invalid @@ argument Argumento @@ inválido84 Unit expected Unit esperado85 “;” expected “;” esperado86 “:” expected “:” esperado87 “,” expected “,” esperado88 “(“ expected “(” esperado89 “)” expected “)” esperado90 “=” expected “=” esperado91 “:=” expected “:=” esperado92 “[“ or “(“ expected “[” or “(” esperado93 “]” or “)” expected “]” or “)” esperado94 “.” Expected “.” Esperado95 “..” expected “..” esperado96 Too many variables Variáveis demais97 Invalid for control variable Variável de controle loop for inválida98 Integer variable expected Variável do tipo integer esperada

99Files and procedure types are not allowed here

Arquivos e procedimentos não permitidos aqui

100 String length mismatch Comprimento da string incompatível

A seguir é apresentada uma tabela com uma relação dos principais erros

em tempo de execução (run-time errors) do Turbo Pascal 7.0.

80

ENG06842 – Programação I

ERRO DESCRIÇÃO TRADUÇÃO1 Invalid function number Função numérica inválida2 File not found Arquivo não encontrado3 Path not found Caminho não encontrado4 Too many open files Muitos arquivos abertos5 File Access denied Acesso ao arquivo negado6 Invalid file handle Arquivo handle inválido

12 Invalid file Access code Código de acesso de arquivo inválido15 Invalid drive number Número do drive inválido

16Cannot remove current directory

Impossível remover diretório atual

17 Cannot rename across drives Impossível renomear diretório18 Não há mais arquivos

100 Disk read error Erro de leitura do disco101 Disk write error Erro de gravação do disco102 File not assigned Arquivo não assinalado103 File not open Arquivo não aberto104 File not open for input Arquivo não está aberto para entrada105 File not open for output Arquivo não está aberto para saída106 Invalid numeric format Formato numérico inválido150 Disk is write-protect Disco protegido151 Erro interno do dispositivo DOS152 Drive not ready Drive não pronto para leitura154 CRC error in data Erro de CRC nos dados156 Disk seek error Erro de pesquisa no disco157 Unknown media type Tipo de mídia desconhecida158 Sector not found Setor não encontrado159 Printer out of paper Impressora sem papel160 Device write fault Falha no dispositivo de escrita161 Device read fault Falha no dispositivo de leitura162 Hardware failure Falha no hardware200 Division by zero Divisão por zero201 Range check error Erro de faixa202 Stack overflow error Erro de estouro de pilha203 Heap overflow error Erro de estouro de heap204 Invalid pointer operation Operação de ponteiro inválida205 Floating point overflow Estouro de ponto flutuante207 Invalid floating point operation Operação de ponto flutuante inválida208 Overlay manager not installed Gerenciador de overlay não instalado209 Overlay file read error Erro na leitura de arquivo overlay210 Object not initialized Objeto não inicializado211 Call to abstract method Chamada a um método abstrato213 Collection index out of range Índice de coleção fora da faixa214 Collection overflow error Erro de estouro da coleção215 Arithmetic overflow error Erro de estouro aritmético216 General protection fault Falha de proteção geral

81

ENG06842 – Programação I

Apêndice B – Tabela de códigos ASCII

ASCII (acrônimo para American Standard Code for Information

Interchange) é um conjunto de códigos para o computador representar

números, letras, pontuação e outros caracteres. É uma padronização da

indústria de computadores, onde cada caractere é manipulado na

memória, discos, etc.

O código ASCII representa uma maneira de codificar caracteres na forma

de valores inteiros. Neste código, os caracteres são mapeados para

valores numéricos representáveis por 8 bits. Este código abrange 95

caracteres passíveis de impressão e 33 caracteres especiais utilizados,

entre outros, no controle de comunicação entre computadores ou um

computador e seus periféricos. Os 33 caracteres de controle são os de

código 0 a 31 (NUL a US) e o de código 127 (DEL).

A tabela abaixo descreve o padrão ASCII.

Código Valor Comentário0 NUL Caracter Nulo1 SOH Começo de cabeçalho de transmissão2 STX Começo de texto3 ETX Fim de texto4 EOT Fim de transmissão5 ENQ Interroga6 ACK Confirmação7 BEL Sinal sonoro8 BS Volta um caracter9 HT Tabulação Horizontal

10 LF Próxima linha11 VT Tabulação Vertical12 FF Próxima Página13 CR Início da Linha14 SO Shift-out15 SI Shift-in16 DLE Data link escape17 D1 Controle de dispositivo18 D2 Controle de dispositivo19 D3 Controle de dispositivo20 D4 Controle de dispositivo21 NAK Negativa de Confirmação22 SYN Synchronous idle23 ETB Fim de transmissão de bloco24 CAN Cancela

82

ENG06842 – Programação I

25 EM Fim de meio de transmissão26 SUB Substitui27 ESC Escape28 FS Separador de Arquivo29 GS Separador de Grupo30 RS Separador de registro31 US Separador de Unidade32 Espaço 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N

83

ENG06842 – Programação I

79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c

100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 DELETE

84