rodneycarneiro.com.brrodneycarneiro.com.br/apostilas/algoi/apostila algoritmo rodney.doc  · web...

103
Apostila de Algoritmo e Estrutura de Dados I APRESENTAÇÃO Um bom profissional de informática tipicamente é alguém com disposição para buscar soluções onde necessário, por sua própria iniciativa. Com base nessa premissa, muitos livros e cursos deixam a cargo do estudante grande parte da busca, com a melhor intenção de estimular essa iniciativa. Mas quando começamos algo, ignoramos até o que não sabemos; é comum não dispormos de pontos de partida, e procurá-los representa um custo às vezes alto demais. Nesse momento, obter orientação adequada pode fazer a diferença entre prosseguir ou desistir. O objetivo deste material é ser uma orientação para quem está iniciando o aprendizado da programação de computadores. Através de uma linguagem específica, facilitar o treinamento nas habilidades essenciais necessárias para qualquer linguagem de programação, de forma simples e prática. Bons profissionais de informática também sabem que somente dedicação e prática regulares podem conduzir ao amadurecimento e à competência. Por isto, mais de 300 exercícios e práticas conduzem o aprendiz a compreender e fixar os novos conhecimentos e também a conhecer valiosos recursos da linguagem e do ambiente de programação. A linguagem adotada é o Turbo Pascal 7.0 da Borland, uma versão para DOS. Uma razão básica para isso é reduzir a quantidade de informações necessárias para que o estudante obtenha resultados. De qualquer maneira, este não é um livro destinado a esgotar os recursos da linguagem. O objetivo não é formar especialistas, e sim apoiar a formação básica de 1

Upload: lycong

Post on 08-Nov-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Apostila de Algoritmo e Estrutura de Dados I

APRESENTAÇÃOUm bom profissional de informática tipicamente é alguém com disposição para buscar

soluções onde necessário, por sua própria iniciativa. Com base nessa premissa, muitos livros e

cursos deixam a cargo do estudante grande parte da busca, com a melhor intenção de estimular

essa iniciativa. Mas quando começamos algo, ignoramos até o que não sabemos; é comum não

dispormos de pontos de partida, e procurá-los representa um custo às vezes alto demais. Nesse

momento, obter orientação adequada pode fazer a diferença entre prosseguir ou desistir. O

objetivo deste material é ser uma orientação para quem está iniciando o aprendizado da

programação de computadores. Através de uma linguagem específica, facilitar o treinamento nas

habilidades essenciais necessárias para qualquer linguagem de programação, de forma simples e

prática.

Bons profissionais de informática também sabem que somente dedicação e prática

regulares podem conduzir ao amadurecimento e à competência. Por isto, mais de 300 exercícios e

práticas conduzem o aprendiz a compreender e fixar os novos conhecimentos e também a

conhecer valiosos recursos da linguagem e do ambiente de programação.

A linguagem adotada é o Turbo Pascal 7.0 da Borland, uma versão para DOS. Uma razão

básica para isso é reduzir a quantidade de informações necessárias para que o estudante obtenha

resultados. De qualquer maneira, este não é um livro destinado a esgotar os recursos da

linguagem. O objetivo não é formar especialistas, e sim apoiar a formação básica de

programadores, cuja prioridade maior consiste em desenvolver as habilidades centrais

mencionadas acima. Feito isso, o programador estará em condições de dominar outras linguagens

rapidamente.

1

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

1 - INTRODUÇÃO

Muitas pessoas gostam de falar ou julgar que possuem e sabem usar o raciocínio lógico,

porém, quando questionadas direta ou indiretamente, perde esta linha de raciocínio, pois este

depende de inúmeros fatores para completá-lo, tais como: calma, conhecimento, vivência,

versatilidade, experiência, criatividade, ponderação, responsabilidade, entre outros.

Para se usar a lógica é necessário ter domínio sobre o pensamento, bem como, saber

pensar, ou seja, possuir a “ARTE DE PENSAR”. Alguns definem o raciocínio lógico como um

conjunto de estudos que visa a determinar os processos intelectuais que são as condições gerais do

conhecimento verdadeiro. Outros preferem dizer que é a seqüência coerente, regular e necessária

de acontecimentos, de coisas ou fatos, ou até mesmo, que é à maneira do raciocínio particular que

cabe a um indivíduo ou a um grupo.

Para concluir todas estas definições, podemos dizer que lógica é a ciência que estuda as

leis e critérios de validade que regem o pensamento e a demonstração, ou seja, ciência dos

princípios formais do raciocínio.

1.1 - Necessidade de uso da Lógica

Usar a lógica é um fator a ser considerado por todos, principalmente profissionais de

informática (programadores, analistas de sistemas e suporte), pois seu dia-a-dia dentro das

organizações é solucionar problemas e atingir os objetivos apresentados por seus usuários com

eficiência e eficácia, utilizando recursos computacionais e/ou automatizados. Saber lidar com

problemas de ordem administrativa, de controle, de planejamento e de estratégia requer atenção e

bom desempenho de conhecimento de nosso raciocínio.

Porém, devemos lembrá-los que não ensinamos ninguém a pensar, pois todas as pessoas

normais possuem este “dom”, onde o nosso interesse e mostrar como desenvolver e aperfeiçoar

melhor esta técnica, lembrando que para isto, você deverá ser persistente e praticá-la

constantemente, chegando à exaustão sempre que julgar necessário.

1.2 - Raciocínio Matemático

As crianças aprendem facilmente como adicionar e subtrair valores. Suas dificuldades

começam no momento em que elas se deparam com problemas e necessitam identificar quais

operações trarão soluções para os mesmos.

2

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroVejamos alguns exercícios de Raciocínio Matemático, que ajudarão a “exercitar” nosso

cérebro. No final desta apostila, vocês encontrarão o gabarito, mas não olhem antes de tentar

resolvê-los. Todos serão corrigidos em sala de aula.

EXERCÍCIOS RACIOCÍNEO MATEMÁTICOS

1. Há três suspeitos de um crime: o cozinheiro, a governanta e o mordomo. Sabe-se que o

crime foi efetivamente cometido por um ou por mais de um deles, já que podem ter agido

individualmente ou não. Sabe-se, ainda que:

A) se o cozinheiro é inocente, então a governanta é culpada;

B) ou o mordomo é culpado ou a governanta é culpada, mas não os dois;

C) o mordomo não é inocente.

Logo:

(a) a governanta e o mordomo são os culpados

(b) o cozinheiro e o mordomo são os culpados

(c) somente a governanta é culpada

(d) somente o cozinheiro é inocente

(e) somente o mordomo é culpado.

2. Qual o número que completa a seqüência: 1, 3, 6, 10, ...

(a) 13

(b) 15

(c) 12

(d) 11

(e) 18

3. Um frasco contém um casal de melgas. As melgas reproduzem-se e o seu número

dobra todos os dias. Em 50 dias o frasco está cheio. Em que dia o frasco esteve meio

cheio ?

(a) 25

(b) 24

(c) 26

(d) 49

(e) 2

3

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro4. Qual o número que completa a seqüência: 1, 1, 2, 3, 5, ...

(a) 5

(b) 6

(c) 7

(d) 8

(e) 9

5. Num concurso de saltos, Maria foi, simultaneamente, a 13ª melhor e 13ª pior. Quantas

pessoas estavam em competição ?

(a) 13

(b) 25

(c) 26

(d) 27

(e) 28

6. Bruno é mais alto que Joaquim. Renato é mais baixo que o Bruno. Então, Joaquim é o

mais alto dos três.

( ) Verdadeiro

( ) Falso

7. O preço de um produto foi reduzido em 20% numa liquidação. Qual deverá ser a

percentagem de aumento do preço do mesmo produto para que ele volte a ter o preço

original ?

(a) 15%

(b) 20%

(c) 25%

(d) 30%

(e) 40%

Use a descrição abaixo para resolver os exercícios 8 e 9.Chapeuzinho Vermelho ao entrar na floresta, perdeu a noção dos dias da semana. A Raposa e

o Lobo Mau eram duas estranhas criaturas que freqüentavam a floresta. A Raposa mentia às

segundas, terças e quartas-feiras, e falava a verdade nos outros dias da semana. O Lobo Mau

mentia às quintas, sextas e sábados, mas falava a verdade nos outros dias da semana.

4

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

8. Um dia Chapeuzinho Vermelho encontrou a Raposa e o Lobo Mau descansando à sombra de

uma árvore. Eles disseram:

Raposa: “Ontem foi um dos meus dias de mentir”

Lobo Mau: “Ontem foi um dos meus dias de mentir”

A partir dessas afirmações, Chapeuzinho Vermelho descobriu qual era o dia da semana.

Qual era?

9. Em qual dia da semana é possível a Raposa fazer as seguintes afirmações?

Eu menti ontem.

Eu mentirei amanhã.

10. (ESAF) José quer ir ao cinema assistir ao filme “Fogo Contra Fogo”, mas não tem certeza

se o mesmo está sendo exibido. Seus amigos, Maria, Luis e Julio têm opiniões discordantes

sobre se o filme está ou não em cartaz. Se Maria estiver certa, então Julio está enganado.

Se Julio estiver enganado, então Luís está enganado. Se Luis estiver enganado, então o

filme não está sendo exibido. Ora, ou o filme “Fogo conta Fogo” está sendo exibido, ou José

não irá ao cinema. Verificou-se que Maria está certa. Logo,.

(a) O filme “Fogo contra Fogo” está sendo exibido

(b) Luis e Julio não estão enganados

(c) Julio está enganado, mas Luis não.

(d) Luis está enganado, mas Julio não.

(e) José não irá ao cinema.

1.3 - Uso da Lógica no Auxílio do Desenvolvimento de Programas

A técnica mais importante no projeto da lógica de programas é chamada de programação

estruturada, a qual consiste em uma metodologia de projeto, objetivando:

. Agilizar a codificação da escrita dos programas;

. Facilitar a depuração da leitura do mesmo;

. Permitir a verificação de possíveis falhas apresentadas pelos programas;

. Facilitar as alterações e atualizações dos programas.

E deve ser composta por quatro passos fundamentais:

5

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro. Escrever as instruções em seqüências ligadas entre si por estruturas seqüências,

repetitivas ou de selecionamento.

. Escrever instruções em grupos pequenos e combiná-las.

. Distribuir módulos do programa entre os diferentes programadores que trabalharão sob a

supervisão de um programador sênior, ou chefe de programação.

. Revisar o trabalho executado em reuniões regulares e previamente programadas, em que

compareçam apenas programadores de um mesmo nível.

6

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

2 – Definição de Algoritmo É a descrição, de forma lógica, dos passos a serem executados no cumprimento de

determinada tarefa.

"O algoritmo pode ser usado como uma ferramenta genérica para representar a solução de

tarefas independente do desejo de automatizá-las, mas em geral está associado ao

processamento eletrônico de dados, onde representa o rascunho para programas

(Software)."

"Serve como modelo para programas, pois sua linguagem é intermediária à linguagem

humana e às linguagens de programação, sendo então, uma boa ferramenta na validação da

lógica de tarefas a serem automatizadas."

"Um algoritmo é uma receita para um processo computacional e consiste de uma série de

operações primitivas, interconectadas devidamente, sobre um conjunto de objetos. Os

objetos manipulados por essas receitas são as variáveis."

O algoritmo pode ter vários níveis de abstrações de acordo com a necessidade de

representar ou encapsular detalhes inerentes às linguagens de programação. Ex:

Certamente um algoritmo feito com o objetivo de servir como modelo para uma

linguagem de III geração é diferente daquele para uma linguagem de IV geração. Mas isso

não impede que a ferramenta em si possa ser usada em ambos o caso.

Como qualquer modelo, um algoritmo é uma abstração da realidade. A abstração é o

processo de identificar as propriedades relevantes do fenômeno que esta sendo modelado.

Usando o modelo abstrato, podemos nos centrar unicamente nas propriedades relevantes

para nós, dependendo da finalidade da abstração, e ignorar as irrelevantes.

É a forma pela qual descrevemos soluções de problemas do nosso mundo, afim de, serem

implementadas utilizando os recursos do mundo computacional. Como este possuí

severas limitações em relação ao nosso mundo, exige que, sejam impostas algumas regras

básicas na forma de solucionar os problemas, para que, possamos utilizar os recursos de

hardware e software disponíveis. Pois, os algoritmos, apesar de servirem para representar

a solução de qualquer problema, no caso do Processamento de Dados, eles devem seguir

as regras básicas de programação para que sejam compatíveis com as linguagens de

programação.

2.1 - Estruturas de Algoritmo

7

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroNum algoritmo (e em particular num programa) devemos distinguir claramente dois

aspectos complementares: um aspecto estático e um aspecto dinâmico.

A formulação de um algoritmo geralmente consiste em um texto contendo comandos

(instruções) que devem ser executados numa ordem prescrita. Este texto é uma representação

concreta do algoritmo e tem um caráter evidentemente estático, atemporal, expandido somente no

espaço (da folha de papel).

Por outra parte este texto não nos interessa em si, mas pelos efeitos que pode evocar sua

execução no tempo, dado um conjunto de “valores iniciais”. Cada execução de um algoritmo é um

evento dinâmico, evoluindo no tempo.

Para melhor entendimento usaremos exemplos tomados principalmente do cotidiano, e

menos do meio de programação, ressaltando assim a generalidade do conceito de algoritmo.

Uma ação é um evento que ocorre num período de tempo finito, estabelecendo um efeito

intencionado e bem definido. Exemplos:

“Caminhar até a próxima esquina”

“Colocar um livro em cima de uma mesa”

“Descascar as batatas para o jantar”

“Trocar o pneu de um carro”

“Ir ao shopping”

Se estivermos interessados numa ação, é pelo efeito que ela produz. A intenção na

execução de uma ação é estabelecer esse efeito, que então naturalmente deve ser bem definido.

Ações de efeito imprevisível não nos interessam aqui. É fundamental ação que leve um período de

tempo finito para ser executada: isso implica que possamos falar do instante t0 em que a ação

começa e do instante t1 em que ela termina. Vamos supor que o efeito de uma ação pode ser

descrito comparando-se o “estado no instante t0” com o “estado no instante t1”.

Podemos considerar o estado (de um dado sistema de objetos) como o conjunto de

propriedades desses objetos que são relevantes para nós na situação considerada. Por exemplo:

a) batatas com casa ou descascadas;

b) o conjunto de valores das variáveis do programa num certo instante da execução.

Quando consideramos um evento como uma seqüência temporal de (sub) ações, cujo

efeito acumulado é igual ao efeito do evento total, falamos de um processo seqüencial, ou

simplesmente um processo.

Um mesmo evento pode geralmente ser considerado como uma ação primitiva ou como

um processo, dependendo se está interessado simplesmente no efeito total, ou seja, nos estados

antes e depois, ou se também estamos interessados em um ou vários estados intermediários.

8

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroPara descrever um evento, usaremos inicialmente a forma de relado de um observador. Por

exemplo, o evento “uma dona-de-casa descasca as batatas para o jantar” poderia ser descrito por

um observador como uma sucessão das seguintes sub-ações por parte da dona de casa.

“Trazer a cesta com batatas do porão”

“Pegar a panela no armário”

“Descascar as batatas”

“Colocar as batatas na panela com água”

“Acender o fogo”

“Guardar a cesta no porão”

2.2 - Propriedades de um algoritmo

Cada operação deve ser bem definida.

Deve ser perfeitamente claro o que deve ser feito.

Cada operação deve ser efetiva.

Cada passo deve ser tal que, pelo menos em princípio, uma pessoa munida apenas de papel

e lápis possa executá-lo em um tempo finito.

O algoritmo deve terminar após um número finito de passos.

Ex.: Não-Algoritmo -> Cálculo de todos os números primos.

Um algoritmo que apresenta todas as propriedades anteriores, salvo a de terminação é chamado de

procedimento computacional.

Ex.: Sistema operacional 

Para que um algoritmo seja implementado num computador ele deve ser codificado numa

linguagem de programação. 

Dado um algoritmo suficientemente preciso, a codificação como um programa de

computador é direto.

2.3 – Instruções Básicas

As Instruções são representadas pelo conjunto de palavras-chave (vocabulário) de uma

determinada linguagem de programação, que tem por finalidade comandar em um computador o

9

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiroseu funcionamento e a forma como os dados armazenados deverão ser tratados. Deve-se ainda

considerar que existem várias linguagens de programação, como:Pascal, C, Visual Basic, Delphi

entre outras, sendo que uma determinada instrução para se fazer uma tarefa em um computador

poderá ser escrita de forma diferente, dependendo da linguagem utilizada. Por exemplo, em

português se diz rua, em inglês se diz street e um castalhano se diz calle. São termos diferentes

para representar à mesma coisa.

2.3.1 - Linguagens de Programação

A produção de programas confiáveis e manuteníveis é um processo que independe da

linguagem usada. Até o código em Assembler pode ser escrito em uma forma bem inteligível,

contudo, uma linguagem com facilidades específicas para este fim auxilia muito. Para cada tipo de

aplicação existem linguagens que se aplicam melhor, na construção de softwares básicos são

usadas C, ASSEMBLER, PASCAL e em aplicativos comerciais as mais encontradas são COBOL,

CLIPPER, VISUAL BASIC, DELPHI.

O lay-out contribui igualmente para a legibilidade dos programas. A maioria das

linguagens aceitam formato livre na escrita do programa (exceto FORTRAN, ASSEMBLER...).

O uso de linhas em branco e parágrafos consistentes afeta sensivelmente a legibilidade elas

auxiliam a distinção entre as diversas estruturas que compõe o programa tais como: comentários,

declarações, conjuntos de instruções que executam uma função específica.

Bons compiladores possuem geralmente algumas características que auxiliam a construção

de programas tais como, indicação de local de erros, de início e fim de blocos, separação de

mensagens e código fonte, determinação exata de início e fim de procedure, listas de parâmetros

de cada procedure, tipos ou variáveis locais e globais da procedure.

Os editores de programa embutidos nas linguagens mais atuais permitem um bom

desenvolvimento e determinação automática de erros, idendação de comandos e outras

características desejáveis. Os chamados editores de contexto obedecem seqüência de comandos

relacionados com o texto que se deseja modificar.

2.3.2 - Principais linguagens e suas características

Com o surgimento de ambientes gráficos e evolução de sistemas operacionais, as linguagens também caminham para tornarem-se mais amigáveis e cada vez mais possuem recursos que permitem diminuir a carga de trabalho de programadores. Desde os tempos da linguagem de máquina até hoje muitas linguagens surgiram e caíram em desuso e outras evoluíram através dos tempos e são usadas até hoje, as mais conhecidas são:

10

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro BASIC(BEGINNERS ALL PURPOSE SYMBOLIC INSTRUCTION CODE): Sua

utilização ocorreu nos campos científico e comercial, em programas simples e pequenos.

Comandos FOR, IF para seleção. Houve uma falta total de padronização o que levou ao

problema de sua utilização quando havia qualquer troca de equipamento.

FORTRAN(FÓRMULA TRANSLATOR): Projetada para uso matemático e ensino de

programação. Uso de GOTO para repetições e IF para seleção e não permite recursividade.

COBOL(COMMON BUSINES ORIENTED LANGUAGE): Linguagem de alto nível

voltada para aplicações comerciais, foi durante anos a mais utilizada em indústria e

comércio. Possui GOTO e PERFORM para implementação de repetições e IF-THEN-

ELSE restrito para seleção. Variáveis e tipos devem ser declarados

PASCAL: Linguagem estruturada e com aplicação em ensino devido a simplicidade e

clareza dos programas, facilita uso de estruturas de dados como filas e pilhas. Possui

estruturas CASE, DO WHILE, REPEAT UNTIL, FOR, GOTO e IF-THEN-ELSE. As

variáveis devem ser explicitamente declaradas e o programador pode definir novos tipos.

PL/1(PROGRAMING LANGUAGE 1): Servia tanto para uso em sistemas científicos

quanto comerciais e foi desenvolvida por um grupo científico SHARE, comercial GUIDE

e pela International Business Machines Corporation. É uma linguagem padronizada,

poderosíssima, entretanto o aprendizado é lento e difícil.

C: Projetada para operar sobre o sistema operacional UNIX que possui funções de baixo

nível. Possui estruturas CASE,FOR, repetições com testes no início e no final e IF-THEN-

ELSE. Existe a possibilidade de abandonar a repetição através de BREAK.

CLIPPER: Originou-se do DBASE III e é voltada para gerência de arquivos e dados.

Possui estruturas CASE, FOR, WHILE, IF-THEN-ELSE. Os loops podem ser

interrompidos desviando o fluxo para o início ou final do laço.

DELPHI: Voltada para desenvolvimento em ambiente windows, tendo se originado do

antigo PASCAL. Permite programação orientada a objeto e através de eventos.

VISUAL BASIC: Evolução da antiga linguagem BASIC, destina-se ao desenvolvimento

também para ambiente windows. Possui estruturas de repetição e seleção. Em sua versão

mais recente permite desenvolvimento orientado a objeto.

Qual a melhor linguagem de programação ?

Na maioria dos casos a resposta a esta pergunta está relacionada com a aplicação que será

desenvolvida e principalmente com a capacidade do programador de obter resultados das

11

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneirolinguagens existentes. A tendência é que qualquer um que tenha domínio sobre uma linguagem

específica, considere aquela como sendo melhor para desenvolvimento, entretanto não basta

somente avaliar o próprio conhecimento, pois algumas linguagens fornecem vantagens

significativas e seu aprendizado gera benefícios ao programador.

2.4 - Regras Antes de Começar

1. Nunca copiar os algoritmos construídos por seus colegas;

2. Todo problema a ser resolvido será previamente entendido passado para um algoritmo,

para depois ser representado sua estruturação em código português estruturado.

3. Retirar do enunciado a relação das entradas de dados.

4. Retirar do enunciado a relação das saídas de dados.

5. Determinar o que dever ser feito para transformar as entradas determinadas nas saídas

especificadas. ( Métodos – P. Reverso – T. de decisão ).

6. Executar o algoritmo.

2.5 - Características de bons programas

Programas mal elaborados do ponto de vista do trabalho do programador tornam-se muito

mais custosos do que aqueles mal elaborados do ponto de vista do processamento da máquina.

Com a crescente utilização de sistemas aplicativos nas mais diversas áreas em ambientes

empresariais, algumas características são fundamentais em bons sistemas:

CONFIABILIDADE: Os usuários e demais pessoas envolvidas com os resultados

fornecidos pelos programas devem poder confiar nestes resultados. Destes resultados em

muitos casos dependem as decisões da empresa.

MANUTENIBILIDADE: A manutenção dos programas consome mais tempo do que o

seu desenvolvimento. Através de boas técnicas e metodologias pode-se reduzir muito este

tempo.

ECONOMICIDADE: Ferramentas e técnicas de programação devem contribuir para

redução de custos de desenvolvimento e principalmente manutenção dos programas.

PRODUTIVIDADE: Uma maior rapidez no desenvolvimento é conseguida com boas

metodologias, especificações bem definidas e ferramentas mais poderosas.

12

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro PORTABILIDADE: Com a evolução crescente das máquinas e ambientes de

processamento de dados, os programas devem suportar mudanças em máquinas ou

sistemas operacionais.

2.6 - Problemas mais freqüentes

Não dedicamos tempo para coletar dados sobre o processo de desenvolvimento. Assim

nossas estimativas continuam sendo chutes

A comunicação entre cliente e desenvolvedor freqüentemente é muito fraca. O cliente

derruba nosso esforço em uma frase bem simples. “Não é isso que eu queria”.

A qualidade dos programas geralmente é suspeita. Não sabemos muito sobre qualidade

relacionada com sistemas

Desenvolver sistemas é comunicar-se com um ente alienígena. Devemos aprender muito

sobre esta comunicação.

A falta de participação de usuários ou a falta de estímulo por parte dos desenvolvedores do

sistema dificulta a avaliação do resultado final.

Em muitas organizações falta apoio de gerentes e supervisores das áreas envolvidas no

processo.

13

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

3 – Conceitos Básicos3.1 - Variáveis

O computador possui uma área de armazenamento conhecida como memória. Todas as

informações existentes no computador estão ou na memória primária ( memória RAM ), ou na

memória secundária ( discos, fitas, CD-ROM etc ). Nós iremos trabalhar, neste curso, somente

com a memória primária, especificamente com as informações armazenadas na RAM ( memória

de acesso aleatório ).

A memória do computador pode ser entendida como uma seqüência finita de caixas, que

num dado momento, guardam algum tipo de informação, como número, uma letra, uma palavra,

uma frase etc, não importa, basta saber que lá sempre existe alguma informação.

O computador, para poder trabalhar como alguma destas informações, precisa saber onde,

na memória, o dado está localizado. Fisicamente, cada caixa, ou cada posição de memória, possui

um endereço, ou seja, um número, que indica onde cada informação está localizada. este número é

representado através da notação hexadecimal, tendo o tamanho de quatro, ou mais bytes. Abaixo

segue alguns exemplos:

Endereço Físico Informação3000: B712 ‘João’2000: 12EC 123453000: 0004 ‘H’

Como pode ser observado, o endereçamento das posições de memória através de números

hexadecimais é perfeitamente compreendido pela máquina, mas para nós humanos torna-se uma

tarefa complicada. Pensando nisto, as linguagens de computador facilitaram o manuseio, por parte

dos usuários, das posições de memória da máquina, permitindo que, ao invés de trabalhar

diretamente com os números hexadecimais, fosse possível dar nomes diferentes a cada posição de

memória. Tais nomes seriam de livre escolha do usuário. Com este recurso, os usuários ficaram

livres dos endereços físicos ( números hexadecimais ) e passaram a trabalhar com endereços

lógicos ( nomes dados pelos próprios usuários ). Desta forma, o Exemplo acima, poderia ser

alterado para ter o seguinte aspecto:

Endereço Físico InformaçãoNome ‘João’

número 12345letra ‘H’

14

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Como tínhamos falado, os endereços lógicos são como caixas, que num dado

instante guardam algum tipo de informação. Mas é importante saber que o conteúdo desta caixa

não é algo fixo, permanente, na verdade, uma caixa pode conter diversas informações, ou seja,

como no Exemplo acima, a caixa ( Endereço Lógico ) rotulada de “Nome” num dado momento

contém a informação “João”, mas em um outro momento, poderá conter uma outra informação,

por Exemplo “Pedro”. Com isto queremos dizer que o conteúdo de uma destas caixas ( endereço

lógico ) podem variar, isto é podem sofrer alterações em seu conteúdo. Tendo este conceito em

mente, a partir de agora iremos chamar de forma genérica, as caixas ou endereços lógicos, de

variáveis.

Desta forma podemos dizer que uma variável é uma posição de memória, representada por

um Nome simbólico (atribuído pelo usuário), a qual contém, num dado instante, uma informação.

3.1.1 - Formação de Variáveis

Uma variável é formada por uma letra ou então por uma letra seguida de letras ou dígitos,

em qualquer número. Não é permitido o uso de espaços em branco ou de qualquer outro caractere,

que não seja letra ou dígito, na formação de um identificador.

Na formação do nome da variável de um nome significativo, para que se possa ter idéia do

seu conteúdo sem abrí-la. Para definirmos uma variável, devemos observar o seguinte:

Pode ter qualquer comprimento, mas apenas os sessenta e três primeiros caracteres

são significativos;

Deve ter como primeiro caracter uma letra;

Após a primeira letra só pode conter letras, dígitos ou sublinha ( _ );

Não pode conter espaços;

Letras maiúsculas e minúsculas são indiferentes;

Não pode haver identificadores (constantes, variáveis, tipos, funções,

procedimentos, unidades, programas e campos de um registro) repetidos;

Não pode ser uma palavra reservada.

3.1.2 - Conteúdo de uma Variável

Dados - Elementos conhecidos de um problema

Informação - Um conjunto estruturado de dados, transmitido conhecimento

15

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro3.1.3 - Tipos de Variáveis

Considere a fórmula matemática simples do calculo do volume de uma esfera:

V R43

3

onde se encontram:

1- valores que podem ser classificados como:

a) valores constantes, invariantes em todas as aplicações da fórmula, no caso dos valores 4,

3 e aos denomina-se constantes;

b) valores a serem substituídos na fórmula, em cada aplicação; a representação destes

valores, usualmente é feita através de letras, que recebem o nome de variáveis e tornam a fórmula

genérica, possível de ser aplicada para resolver uma certa classe de problemas e não apenas um

problema específico.

2 - Operações a serem feitas sobre determinados operandos (Valores), para a obtenção da solução

do problema.

3.1.4 - Tipos de Dados

O Pascal exige que no momento que formos trabalhar com variáveis, indiquemos o tipo de

informação que uma variável pode conter, isto é, se uma dada posição de memória armazenará um

número ou uma letra etc. Para isto, a linguagem Pascal possui definido alguns tipos que deverão

ser usados quando formos trabalhar com variáveis. Alguns tipos são:

3.1.4.1 - Simples

INTEGER - Envolve os números inteiros. Na versão 5.0 do Turbo Pascal, existem

também outros tipos de números inteiros: SHORTINT, BYTE, WORD e LONGINT.

Tipo Valor mínimo Valor máximo Bytes ocupados

SHORTINT -128 127 1BYTE 0 255 1

INTEGER -32768 32767 2WORD 0 65535 2

LONGINT -2147483648 2147483647 4

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

16

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

REAL - abrange os números reais. Na versão 5.0, existem também outros tipos de

números reais: SINGLE, DOUBLE, EXTENDED e COMP.

Tipo Valor mínimo

Valor máximo

Bytes ocupados

Dígitos Significativos

REAL 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-

3241.7 x 10308 8 15-16

EXTENDED 3.4 x 10-4932

1.1 x 104932

10 19-20

COMP -263 + 1 263 - 1 8 19-20

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

CHAR - representa um único caracter, escrito entre apóstrofos ( ‘ ). A maioria dos

computadores utilizam a tabela de códigos ASCII para representar todos os caracteres disponíveis.

Exemplos:

'A', 'B', 'a', '1', '@', ' '

BOOLEAN - representa um valor lógico. Utiliza apenas duas constantes lógicas: TRUE

(verdadeiro) e FALSE (falso).

3.1.4.2 - Estruturados

STRING - formado por um conjunto de elementos do tipo CHAR. O tamanho máximo é

de 255 caracteres. Exemplos:

'ASPER', 'Processamento de Dados', '123’

Discutiremos com mais detalhes o tipo string em um capítulo especialmente dedicado a

este fim.

Os outros tipos de dados estruturados são: ARRAY, RECORD, FILE, SET e TEXT e

serão apresentados no decorrer da apostila.

17

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Tipo Record

Os tipos de dados que são mais comumente usados são :

1. WORD2. INTEGER3. REAL4. BYTE5. STRING6. CHAR 7. ARRAY8. BOOLEAN

Uma outra forma de definir uma variável em Pascal, é através do tipo RECORD. Esse tipo

é diferente das demais formas de definir variáveis, porque permite que uma variável armazene

valores de diversos tipos diferentes.

Exemplo: Imagine que fosse desejado armazenar informações de uma pessoa, tais como:

Nome, Idade, Altura, Sexo, Número de Dependentes, Profissão.

Na forma tradicional, seria necessário definir uma variável para cada tipo de informação,

ou seja:

var nome : string; idade : integer; altura : real; sexo : char; numdep : integer; profissão : string;

Utilizando o tipo RECORD, a definição seria a seguinte:

varpessoa : record

nome : STRING;idade : integer;altura : real;sexo : char;sumdep : integer;profissao : string;

end;

Ao definir uma variável como sendo do tipo RECORD, devemos definir, também quais

serão as partes componentes desta variável (Nome, Idade, Altura , Sexo, NumDep e Profissão),

junto com o seu tipo. Quando estamos trabalhando com RECORD, as partes componentes do

18

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiromesmo recebem um Nome próprio, o qual é conhecido como “campo “. Desta forma, uma

variável RECORD pode ter campos de qualquer tipo válido do Pascal, sendo permitido inclusive

que um RECORD seja definido dentro do outro, ou como parte de um ARRAY.

Continuando o Exemplo, caso desejarmos atribuir um valor a variável Pessoa, devemos

fazê-lo da seguinte forma:

Pascalpessoa.idade : = 45

O uso do “.” indica que esta variável possui campos, e que “Idade” é um deles. É

importante lembrar que as operações realizadas sobre uma variável RECORD, são as mesmas de

uma variável “comum”, a única diferença que devemos indicar o Nome da variável, seguido de

um ponto(.), seguido do Nome do campo.

É possível atribuir o conteúdo de uma variável RECORD para outra variável, de mesmo

tipo, da mesma forma que é feito como as outras variáveis do Pascal.

Exemplo: Caso duas variáveis, digamos A e B sejam definidas como sendo RECORDs, e

caso seja desejado passar o conteúdo, isto é os valores existentes nos campos, a variável A para a

variável B, bastará realizar a seguinte atribuição:

PascalA: =B

Declaração With

Se existe uma série de campos de uma variável do tipo record que ser acessada

repetidamente, pode ser cansativo ter que escrever o nome da variável na frente do campo

diversas vezes. Para resolver o problema, podemos utilizar a declaração With.

Sua forma é a seguinte:

WITH Variavel_do_tipo_record DO Begin comando_1; comando_2; . . . End;

Exemplo:

19

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro { Lê uma variável tipo RECORD e em seguida a mostra } Program Exemplo_1; Uses CRT; Type Pessoas = Record Nome : String[30]; Idade : Integer; Sexo : Char; Altura : Real; End;

Var p : Pessoas;

Begin ClrScr; With p do Begin Write('Nome ------> '); Readln(Nome); Write('Idade -----> '); Readln(Idade); Write('Sexo ------> '); Readln(Sexo); Write('Altura ----> '); Readln(Altura); Writeln; Writeln('Voce digitou os seguintes dados :'); Writeln; Writeln; Writeln(nome); Writeln(idade); Writeln(sexo); Writeln(altura:6:2); End; End.

3.1.4.3 – Definidos pelo Usuário

A linguagem Pascal permite que os programadores, além de usar os tipos predefinidos na

linguagem, também possam criar novos tipos de dados. Isto se torna bastante útil quando lidamos

com estruturas de dados complexas, como também ajuda a tornar o programa mais legível. Este

assunto, pela sua complexidade, será abordado mais adiante.

O Pascal possui vários tipos pré-definidos, como INTEGER, STRING, REAL, CHAR etc,

mas além destes tipos básicos, existe a possibilidade do usuário definir seus próprios tipos de

20

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneirodados. Para isto, é necessário o uso da palavra reservada TYPE, a qual indica que um novo tipo

será criado.

Uma declaração de tipo permite que se associe um identificador à descrição de um tipo.

Uma vez declarado, tal identificador pode ser usado da mesma forma que o nome de um tipo

predefinido.

Sintaxe:

type

ident = descrição-do-tipo;

[ident = descrição-do-tipo;] ...

Onde:

Ident = é o nome que passará a identificar o tipo definido.

Descrição-do-tipo = é a descrição de um tipo válido em Pascal.

Exemplo: Imagine que seja desejado criar um tipo matriz 4X4, sendo que logo em seguida

este novo tipo será usado para definir uma variável como sendo deste tipo. Para isto deverá ser

usada a seguinte definição:

TYPEMatriz = ARRAY[1..4,1..4] OF INTEGERInteiro = Integer;Letras = String;

VARMat : MatrizIdade : inteiro;Nome : Letras

O Pascal permite a definição de tipos usando qualquer um dos tipos pré-definidos, ou até

mesmo utilizando tipos definidos pelo usuário.

Exemplo:program Uso_Do_Type;

type

TDias = (Dom,Seg,Ter,Qua,Qui,Sex,Sab );

TMeses= (Janeiro, Fevereiro, Marco, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro );

TMaiusculas = ‘A’..’Z’;

TContador = 1..MAXINT;

Boolean = ( FALSE, TRUE );

21

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneirovar

Dias : TDias;

Meses : TMeses;

DiasUteis : Seg..Sex;

I: Tcontador;

J : TContador;

BEGIN

...

END.

Variáveis Compostas Homogêneas

É possível dar um Nome para uma posição de memória, sendo que a esta será associado

um valor qualquer. Pois bem, acontece que, muitas vezes, esta forma de definição, ou melhor

dizendo, de alocação de memória, não é suficiente para resolver certos problemas computacionais.

Imagine por Exemplo, como faríamos para construir um algoritmo, para ler o Nome de N Pessoas

e que imprimisse um relatório destes mesmos nomes, mas ordenados alfabeticamente? Não seria

uma tarefa simples, haja vista não ser possível determinar quantos nomes seriam lidos, mesmo

que soubéssemos o número de pessoas, digamos 1.000 pessoas, teríamos que definir 1.000

variáveis do tipo STRING, como é mostrada abaixo:

Exemplo:

program Loucura; uses crt;

var Nome1: string;Nome2: string;Nome3: string;.Nome999: string;Nome1000: : string;

begin<Comandos>

End.

Considere o tamanho do algoritmo, e o trabalho braçal necessário para obstruí-lo. Isto só

com 1.000 Nomes, imagine agora 1.000.000 de pessoas. A construção deste algoritmo começaria

a ficar inviável na pratica. Para resolver problemas como este, e outros, foi criado um novo

conceito para alocação de memória sendo, desta forma, também criado uma nova maneira de

definir variáveis, a qual foi denominada de variável indexada.

22

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroUma variável indexada corresponde a uma seqüência de posições de memória, a qual

daremos único Nome, sendo que cada uma destas pode ser acessada através do que conhecemos

por índice. O índice corresponde a um valor numérico ( exceto REAL ), ou a um valor caracter

( exceto STRING ). Cada uma das posições de memória de uma variável indexada pode receber

valores no decorrer do algoritmo como se fosse uma variável comum, a única diferença reside na

Sintaxe de utilização desta variável.

Variáveis Indexadas Uni Dimensionais (Vetores)

Também conhecida por “Vetor”. Uma variável uni-dimencional, como o próprio Nome já

indica, possui apenas uma dimensão, sendo ser possível definir variáveis com quaisquer tipo de

dados validos do Pascal.

a) Definição:

program define;var

<nome>: array [inicio..fim] of <tipo>;begin

<comandos>;end.

Obs.:

a) “ARRAY” é uma palavra reservada do Pascal

b) Os valores “INICIOV” e “FIMV” correspondem aos índices inicial e final

c) Uma variável indexada pode ser apenas de um tipo de dado

Exemplo Definir uma variável indexada como sendo do tipo REAL, sendo que a mesma

deverá corresponder a 10 posições de memória.

Em pascal:

program exemplo;var

vet: array [1..10] of real;begin

<comandos>;end.

No Exemplo acima, após a definição da variável, a memória estará como mostrada no

esquema abaixo:

Vet

23

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

1 2 3 4 5 6 7 8 9 1

0

Os Valores numéricos apresentados acima correspondem aos índices da variável.

B) Atribuição

<Nome>[<Índice>]: =Valor;

READLN (<Nome>[<Índice>]);

Exemplo:

program atribui; uses crt;

varnomes : array[1..20] of string;i : integer;

begin clrscr;

nomes[1]: =‘joão da silva’;for i: = 2 to 20 do

begin write(‘Digite o Nome.: ‘);

readln(nomes[i]); end; {Mostra os dados na Tela } clrscr;

for i: = 1 to 20 do begin write(‘Digite o Nome.: ‘);

readln(nomes[i]); end; readkey;

end.

24

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Variáveis Indexadas Bidimensionais (Matrizes)

Também conhecida por “Matriz”. Uma variável Bidimencional, como o próprio

Nome já indica, possui duas dimensões, sendo ser possível definirem variáveis com quaisquer

tipos de dados validos do Pascal.

a11 a12A = a21 a22

a31 a33

Matriz A 3x2 (3 Linha x 2 Coluna)

a) Definição: program define;var

<nome>: array [i..j, l..m] of <tipo>;begin

<comandos>;end.

Exemplo: Definir uma variável indexada bidemensional para armazenar os dados de uma matriz

4 por 4 de números do tipo REAL, sendo 4 linhas e quatro colunas, sendo que a mesma deverá

corresponder no total a 16 posições de memória.

program exemplo;var

mat: array [1..4,1..4] of real;begin

<comandos>;end.

No Exemplo acima, após a definição da variável, a memória estará como mostrado no esquema

abaixo:

MAT

1,1 1,2 1,3 1,42,1 2,2 2,3 2,43,1 3,2 3,3 3,44,1 4,2 4,3 4,4

Os Valores numéricos apresentados acima correspondem aos índices da variável.

25

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroB) Atribuição<Nome>[<Índice>,<Índice>]: =Valor;READ (<Nome>[<Índice>,<Índice>]);

Exemplo:program atribui;

uses crt;var

nomes : array[1..4,1..4] of string;l : integer;

c : integer;begin

clrscr;for l: = 1 to 4 do

begin for c := 1 to 4 do

begin write(‘Digite Linha ‘,l ,’ Coluna ‘, c, ‘.: ‘);

readln (nomes[ i,j ); end; end;

end.

26

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

3.2 - Operadores

3.2.1 – Operadores Aritméticos

É comum necessitarmos realizar cálculos matemáticos com as informações que estamos

manipulando. Para isso, é necessário sabermos qual a representação dos símbolos de operações

matemáticas. Vejamos:

Operador Operação Exemplo

+ Adição 10 + 15

- Subtração 20 – 10

* Multiplicação 3 * 5

/ Divisão (onde o resultado será

um número real)

5 / 2 = 2,5

DIV Divisão (onde o resultado será

um número inteiro)

10 div 2 = 5

7 div 2 = 3

MOD Resto de uma divisão 7 mod 2 = 1

** ou exp(a, b) Exponenciação 5 ** 2 ou exp(5, 2)

3.2.2 - Operadores Relacionais

Além de operações matemáticas, é freqüente nossa necessidade em comparar informações.

Por exemplo: Se média for maior ou igual a 7. Para isso, utilizamos operadores relacionais.

Operador Relação

= Igualdade

<> Diferente

> Maior que

>= Maior ou igual que

< Menor que

<= Menor ou igual que

27

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro3.2.3 - Operadores Lógicos

É freqüente precisarmos analisar expressões lógicas, aquelas que só possuem dois valores

possíveis: Verdadeiro ou Falso. Os operadores usados em expressões lógicas são os Operadores

Lógicos. Veja:

Operador Relação

E (And) E lógico

Ou (Or) Ou lógico

Não (Not) Negação lógica

Ou-X (Xor) Ou ‘Exclusivo’

Veja a seguinte tabela para entender melhor os operadores lógicos.

P Q P e Q P ou Q P ou-X Q

F F F F F

F V F V V

V F F V V

V V V V F

3.2.4 - Prioridade na Avaliação de Expressões

1º Parênteses e funções (resolvidos da esquerda para a direita)

2º Multiplicação (*), Divisão ( / e div ) e Resto ( Mod )

(resolvidos da esquerda para a direita)

3º soma e subtração

4º Operadores relacionais: >, <, >=, <=, =, <>5º Operador Lógico Não

6º Operador Lógico E

7º Operador Lógico Ou

3.2.5 - Funções e Procedimentos Numéricos Predefinidos

São subprogramas já prontos à disposição dos usuários, para o cálculo das funções

matemáticas mais comuns.

Função Finalidade Tipo do argumento

Tipo do resultado

ABS(X) Valor Absoluto Inteiro, Real o mesmo do

28

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiroargumento

FRAC(X) Parte Fracionária Real RealTRUNC(X) Parte Inteira Real InteiroROUND(X) Valor Arredondado Real Inteiro

SQR(X) Eleva ao quadrado Inteiro, Real o mesmo do argumento

SQRT(X) Raiz quadrada Inteiro, Real RealLN(X) Logaritmo Natural Real 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, podemos conseguí-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.5ABS(8) 8FRAC(5.234) 0.234TRUNC(2.78) 2ROUND(2.78) 3SQR(2) 4SQR(1.5) 2.25SQRT(4) 2.0SQRT(2.25) 1.5EXP(LN(2)*3) 8

3.2.6 - Expressões Lógicas

As operações lógicas podem ser consideradas afirmações que serão testadas pelo

computador, tendo como resultado, um valor verdadeiro ou falso. São utilizadas com os

operadores relacionais e lógicos.

3.2.7 - Linearização de Expressões

Para a construção de Algoritmos todas as expressões aritméticas devem ser linearizadas,

ou seja, colocadas em linhas.

29

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroÉ importante também ressalvar o uso dos operadores correspondentes da aritmética

tradicional para a computacional.

Exemplo:

3.2.8 - Modularização de Expressões

A modularização é a divisão da expressão em partes, proporcionando maior compreensão

e definindo prioridades para resolução da mesma.

Como pode ser observado no exemplo anterior, em expressões computacionais usamos

somente parênteses “( )” para modularização.

Na informática podemos ter parênteses dentro de parênteses.

Exemplos de prioridades:

(2+2)/2=2

2+2/2 =3

3.2.9 - Operadores Especiais (Mod E Div)

MOD Retorna o resto da divisão entre 2 números inteiros.

DIV Retorna o valor inteiro que resulta da divisão entre 2 números inteiros.

Exemplo:

30

(2/3+(5-3))+1=

Tradicional Computacional

13 2

61

MOD DIV

13 DIV 2 = 6

13 MOD 2 = 1

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

3.3 - Constantes

Constantes são valores declarados no início do programa e que não se alteram na execução

do programa.

Definição: Uma constante é uma posição de memória que possui um valor fixo,

constante, durante toda a existência do programa. A sua utilização possibilita uma maior

clareza do código, tornando a tarefa de manutenção ou entendimento do programa muito

mais simples.

Muitas vezes é conveniente associar um dado simples, tal como um valor numérico ou

uma cadeia a um identificador no início do programa, proporcionando assim um nome ao

elemento de informação. O identificador é designado de constante se o elemento da informação

não se altera em nenhuma parte do programa.

Uma constante deve sempre ser definida antes de aparecer numa instrução de Pascal. Esta

definição tem duas finalidades – estabelece que o identificador é uma constante e associa um

elemento de informação à constante. O tipo da constante será implicitamente determinado pelo

elemento de informação.

Ex:

CONST

nome = ‘Enxuga Gelo SA.’;

tempo = 200;

3.3.1 - Constantes Nomeadas

Em um programa é possível se associar um identificador a uma constante, de forma que

sempre que nos referirmos a esse identificador, estaremos nos referindo ao valor da constante.

Sintaxe:

const

NumDias = 7; { tipo integer }

NumAulas = 14; { tipo integer }

PI = 3.141519265; { tipo real }

Esporte = ´Futebol de Campo´; { tipo literal }

31

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroFatorCalculo = ( PI * 13.5 ) + 9; { tipo real }

AulasDia = NumAulas / NumDias; { tipo real }

3.3.2 - CONSTANTES TIPADAS

Constantes tipadas são constantes que têm tipo definido, mas que podem ter seu conteúdo

alterado da mesma forma que uma variável. Na declaração de uma constante tipada é especificado

tanto o tipo quanto o valor inicial da constante.

const

NumDias : integer = 7; { tipo integer }

NumAulas : integer = 14; { tipo integer }

PI : real = 3.141519265; { tipo real }

Esporte : string[20] = ´Futebol de Campo´; { tipo literal }

Fator : real = ( PI * 13.5 ) + 9; { tipo real }

AulasDia : real = NumAulas / NumDias; { tipo real }

32

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroPROCEDIMENTOS E FUNÇÕES PREDEFINIDOS EM PASCAL

ABS (x) - função aritmética que calcula o valor absoluto do parâmetro x que pode ser integer ou real.

ARCTAN (x) - calcula o valor do arcotangente, em radianos de um parâmetro que pode ser integer ou real.

CHR (i) - função de transferência que retorna o caractere cujo valor ordinal é o parâmetro "i". Acessa valores da tabela ASCII.

EXP (x) - função aritmética que calcula o valor real de e (base neperiana) elevado ao expoente x, que pode ser inteiro ou real.

LN (x) - função que calcula o valor real do logaritmo natural de um inteiro ou real x, onde x>0. Ln(x) dar  erro se x<=0.

ODD (i) - função booleana que retorna true se o argumento inteiro i não for divisível por 2, senão retorna false.

ORD (x) - função de transferência que retorna um inteiro correspondente a posição de x no conjunto de valores definidos para o tipo de x.

PACK (u,i,p) - função de transferência que empacota o conteúdo de um array u começando no componente i para o packed array p.

PRED (x) - função que retorna o elemento predecessor de x na ordem de enumeração do tipo de x, caso ele exista. Pred (x) dar  um erro se x for o menor elemento do tipo.

ROUND (r) - função de transferência que calcula o valor de trunc(r+0.5) se r>0.0 ou trunc(r-0.5) sendo r do tipo real, e retorna um inteiro se este existir. Senão dará  erro.

SIN (x) - função que calcula o valor real do seno do parâmetro x que pode ser inteiro ou real, sendo x em radianos.

SQR (x) - função que calcula o valor real de x*x se x for real ou o valor inteiro de x*x se x for inteiro. Dará  erro se este não existir.

SQRT (x) - função que calcula a raiz quadrada de valor real não negativo de x que pode ser inteiro ou real. Dará  erro se x<0.

SUCC (x) - função que retorna o elemento que sucede x na lista de enumeração do tipo de x, se este existir. Dará  erro se x for o último valor desta lista.

TRUNC (r) - função de transferência que calcula o maior inteiro menor que r se r>0.0 ou o menor inteiro maior que r se r<0.0, se este elemento existir no tipo integer. Caso contrário dará  erro.

UNPACK (p,u,i) - função de transferência que desempacota o packed array p para o array u começando do elemento i de u.

33

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

FUNÇÕES STRING

- STR sintaxe: STR (Num:totcasas:decimais, Stri);

descrição: Este procedimento retorna em Stri uma string convertida a partir de Num, que pode ser inteiro ou real, podendo ainda se utilizar do recurso de formatação de campos. Exemplos: Num := 400 STR (Num:5,Stri); o valor de Stri e ' 400'

nureal := 30.5; STR (nureal:5:1,Novalor); o valor de Novalor é ‘ 30.5'

- VAL

sintaxe: VAL (Stri,numero,status);

descrição: O procedimento VAL realiza o inverso de STR, converte uma sequência (string) em valor e devolve-o a variável numero, na forma real ou inteiro dependendo de sua definição anterior. A variável status é um parâmetro de variável usado para indicar o sucesso ou fracasso da conversão. Ele será ajustado para zero se a conversão for bem sucedida; caso contrário seu valor indicará a posição na string Stri que causou erro na conversão. Status e numero não devem ser constante ou expressão, é importante também que a variável Stri não contenha espaços ou caracteres não numéricos, contudo é permitida notação científica. Stri :='1234'; VAL (Stri,nuint,erro); o valor de nuint é 1234 o valor de erro é 0

- CONCAT

sintaxe: CONCAT(strI,strII, ... strN);

descrição: Retorna uma string que é o resultado da concatenação das n strings parâmetro. Esta função é definida no Turbo Pascal, apenas para ser mantida a compatibilidade com o Pascal Padrão, pois normalmente usamos o operador + com o mesmo efeito.

Strei :='Nao '; Estre :='necessaria'; Result:=Concat (Strei,Estre); o valor retornado ' 'Nao necessaria'

- COPY

sintaxe: COPY(Stri, Pos, Num);

descrição: Esta função retorna uma String que ' copiada da Stri a partir de Pos e contém Num elementos, Pos e Num são do tipo inteiro.

34

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Result1:=COPY ('12345ab',6,2); o valor retornado será 'ab' Result2:=COPY ('12345AB',1,5); o valor retornado será '12345'

- DELETE

Sintaxe: DELETE (Stri, Pos, Num);

descrição: Este procedimento elimina da string Stri, Num caracteres a partir da posição Pos, inclusive. Pos e Num são do tipo inteiro.

Stri :='MISTURA' DELETE (Stri,3,2); o valor retornado será 'MIURA'

- LENGTH

Sintaxe: LENGTH (Stri);

descrição: Esta função retorna a quantidade de caracteres em Stri, o que significa o tamanho efetivo da string Stri. Como mencionamos o tamanho da string em Turbo Pascal fica armazenado na posição zero da string, portanto Length (Stri) é equivalente a Ord(Stri[0]).

Nome:= ‘Ana Maria'; k:= LENGTH(Nome); o valor retornado será 9

- POS

Sintaxe: POS (Str1,Str2);

descrição: Esta função retorna a posição do primeiro caracter de Str1 dentro de Str2. Se não existir, retornará 0. Valor inteiro.

Nome:= ‘ANa Maria'; k:= POS(' ',Nome); o valor retornado será 4.

FUNÇÕES PARA CONTROLE DE TELA

KEYPRESSED - Função o booleana que retoma verdadeiro se alguma tecla for acionada.

LOWVIDEO - Procedimento que diminui a intensidade luminosa do vídeo.

HIGHVIDEO - Procedimento que aumenta a intensidade luminosa do vídeo.

NORMVIDEO - Procedimento que deixa normal a intensidade do vídeo.

WINDOW - Procedimento que define uma janela na tela. Esta janela é definida pelas coordenadas dos cantos superior esquerdo e inferior direito. As linhas são numeradas de 1 a 25 e as colunas numeradas de 1 a 80. Forma geral:

35

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

WINDOW (X1,Y1,X2,Y2); onde: X1 = n da coluna do 1 ponto Y1 = n da linha do 1 ponto X2 = n da coluna do 2 ponto Y2 = n da linha do 2 ponto

CLRSCR - Procedimento para deletar o conteúdo de uma WINDOW e posicionar o cursor no canto superior direito. Quando não se define Window, a função CLRSCR, limpa toda a tela.

GOTOXY - Procedimento que possibilita o endereçamento de tela, para os procedimentos READ e WRITE. O procedimento GOTOXY obedece aos limites definidos pela Window. Forma geral:

GOTOXY (Col,Lin);

Col - coluna de endereçamento Lin - linha de endereçamento

TEXTCOLOR - Procedimento que seleciona a cor dos caracteres de Texto. Forma geral:

TEXTCOLOR (cor);

TEXTBACKGROUND - Procedimento que seleciona a cor de fundo para vídeo. Forma geral:

TEXTBACKGROUND (cor) Tabela de Cores: 0 PRETO 1 AZUL 2 VERDE 3 CIANO 4 VERMELHO 5 MAGENTA 6 MARROM 7 CINZA CLARO 8 CINZA ESCURO 9 AZUL CLARO 10 VERDE CLARO 11 CIANO CLARO

12 ALARANJADO 13 MAGENTA CLARO 14 AMARELO 15 BRANCO DELAY - Procedimento utilizado para retardar a instrução seguinte. Forma geral:

DELAY (N) onde: N é o tempo de retardo, que varia em função do CLOCK da máquina.

36

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Comandos de Entrada e Saída

O computador não é uma máquina isolada, pois ele precisa se comunicar com o mundo

exterior com vídeo, impressora, teclado, discos, fitas etc. Para realizar esta comunicação existem

comandos que permitem que informações sejam exibidas, por Exemplo, no vídeo, como também

existem comandos que permitem que informações sejam colocadas na memória do computador

através do teclado do PC.

Os comandos que iremos ver são os comandos LEIA e ESCREVA, respectivamente,

comando de entrada e de Saída ( em Pascal escreve-se READ e WRITE ).

Exemplo 1: Escrever um algoritmo para ler um valor numérico do teclado e atribuí-lo a

uma variável do tipo numérica.

program le_numero;var

num : integer;begin

readln(num);end.

O algoritmo acima, executará os seguintes comandos:

a) Define uma variável rotulada “Num”, a qual só poderá armazenar dados

numéricos, que estejam compreendidos entre -32768 a +32767 ( INTEIRO ), sendo

que inicialmente o conteúdo desta variável está indefinido.

b) Interrompe o processamento até que uma informação seja digitada, seguida do

pressionamento da tecla ENTER. Caso a informação seja digitada seja compatível

com o tipo INTEGER (INTEIRO), este valor será armazenado dentro da variável

“Num”.

COMANDOS DE CONTROLE DE FLUXO:

Para representar a solução de um problema devemos escrever o conjunto de passos a serem

seguidos, sendo que, a maioria dos problemas exige uma dinâmica na sua solução, impondo assim

que os algoritmos executem conjunto de instruções de acordo com as possíveis situações

encontradas no problema original. E de acordo com a Programação Estruturada os mecanismos

utilizados para esse controle são: Seqüência, Seleção e Repetição.

37

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro SEQUÊNCIA: usada para executar comandos passo a passo, sabendo que todos eles serão

executados na ordem de escrita, sem nenhum desvio. Uma seqüência pode possuir um ou

vários comandos, os quais devem ser delimitados pelos identificadores Begin e End.

BeginComando_1...Comando_n

End;

SELEÇÃO : usada para tomar decisões, ou seja desviar a execução do algoritmo de

acordo com uma condição, podendo ser simples ou composta.

Simples CompostaIf (Expressão Lógica) thenBegin Sequência_1End;

If (Expressão Lógica) thenBegin Sequência_1EndElseBegin Sequência_1End;

REPETIÇÃO : Serve para efetuar um conjunto de ações repetidas vezes. Existem três

tipos básicos de repetições, sendo elas.

Enquanto (Expressão Lógica) façaSequência

O comando Enquanto analisa a Expressão Lógica e enquanto o seu resultado for, o valor lógico, Verdade a Sequência é executada.

Para variável valor_inicial até valor_final façaSequência

O comando Para incrementa, a variável, a partir do valor_inicial de uma unidade, até que, esta atinja o valor_final. E para cada incremento a Sequência é executada..

RepitaSequência Até (Expressão Lógica)

O comando Repita executa a Sequência até que o valor retornado pela Expressão Lógica seja Verdadeiro

Comando_1...Comando_nFim

38

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Estruturas de Controle

Seqüência

Seqüência finita de instruções são agrupamentos de comandos, onde cada comando é

executado um após o outro e sem desvios. Em Pascal a seqüência é delimitada pelas palavras

reservadas BEGIN no início e END no final e seus comando são separados pelo delimitador “;”

(ponto e vírgula).

Comandos condicionais

IF

O comando if é usado para executar um segmento de código condicionalmente.

IF (condição) THEN

begin

{ comandos que serão executados se a condição for TRUE}

end

ELSE

begin

{ comandos que serão executados se a condição for FALSE}

end;

Durante uma execução, o Pascal começa por avaliar a condição da cláusula IF. Esta

condição deve resultar num valor do tipo Booleano, embora possa tomar uma variedade de formas

- ela pode ser uma expressão de qualquer combinação de operadores lógicos ou relacionais, ou

simplesmente uma variável BOOLEAN.

Se a condição for TRUE, o comando ou comandos localizados entre o IF e ELSE são

executados e a execução pula a cláusula ELSE. Alternativamente, se a expressão for FALSE, a

execução é desviada diretamente para o comando ou comandos localizados após a cláusula ELSE.

Observe a estrutura deste comando IF. Ambas as cláusulas, IF e ELSE, são seguidas de

blocos BEGIN/END, que delimitam grupos de comandos. O formato geral desta estrutura é:

IF condição THENbegin

{comandos da cláusula IF}endELSEbegin

{comandos da cláusula ELSE}

39

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiroend;

Devemos tomar cuidado para não esquecer dos marcadores BEGIN e END nos comandos

compostos de várias estruturas IF. Além disso, não devemos colocar um ponto-e-virgula entre o

END e o ELSE numa estrutura IF. O Pascal interpretará essa marcação incorreta como o fim do

comando IF e a cláusula ELSE, a seguir, resultará num erro em tempo de compilação.

Levando em conta que a cláusula ELSE é opcional, a forma mais simples da estrutura IF é

a seguinte:

IF (condição) THEN

Begin

{comandos da cláusula IF}End;

{comando ou comandos executados se (if) a condição for TRUE (verdadeira)}

Neste caso, o programa executa o comando ou comandos localizados após a cláusula IF

somente se a condição for verdadeira. Se ela for falsa, o comando IF não terá nenhuma ação.

As estruturas IF podem estar aninhadas. Em outras palavras, toda uma estrutura de

decisão, completa com as cláusulas IF e ELSE, pode aparecer dentro de uma cláusula IF ou ELSE

de uma outra estrutura. O aninhamento de estruturas IF pode resultar em seqüências de decisão

complexas e poderosas.

Comando de Seleção múltipla: CASE

Quando se deseja testar uma variável ou uma expressão em relação a diversos valores

usamos o comando de seleção múltipla.

Como a estrutura IF, o comando CASE divide uma sequência de possiveis ações em

seções de código individuais. Para a execução de um determinado comando CASE, somente uma

dessas seções será selecionada para execução. A seleção está baseada numa série de testes de

comparação, sendo todos executados sobre um valor desejado.

A forma geral da estrutura CASE é a seguinte:

CASE seleção OFValordeCaso1:

{comando ou comandos executados se aseleção se corresponder com ValordeCaso1 }

ValordeCaso2:{comando ou comandos executados se a seleção se corresponder com ValordeCaso2 }

. . . ELSE

{comando ou comandos executados se nenhum dos casos anteriores produzir uma correspondência }

40

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroEND;

A estrutura de decisão CASE consiste nos seguintes elementos:

– Uma cláusula CASE OF, que fornece a expressão de seleção desejada

– Uma seqüência de ValoresdeCaso a ser comparada com a seleção, cada qual seguida de

um ou mais comandos, que serão executados se a seleção se corresponder com o ValordeCaso

– Um comando ELSE opcional, que fornece um comando ou grupo de comandos a serem

executados somente se não tiver ocorrido nenhuma correspondência com os ValoresdeCaso

anteriores

– Um marcador END, que identifica o fim da estrutura CASE.

Para executar a decisão expressa nessa estrutura, o Pascal começa por avaliar a expressão

de seleção na cláusula CASE OF. Esse valor deve pertencer a um tipo ordinal que tenha uma faixa

entre -32.768 e 32.767. Até aqui, estudamos cinco tipos de dados que correspondem a este

critério: CHAR, BOOLEAN, BYTE, SHORTINT e INTEGER.

A seleção se torna o alvo das comparações com todos os ValoresdeCaso subseqüentes.

Numa execução, o Pascal avalia cada comparacao, seleciona o primeiro ValordeCaso que se

corresponde com a seleção e executa o comando ou comandos localizados entre esse ValordeCaso

e o próximo. Não será executado mais nenhum outro comando.

Se nenhuma das comparações com os ValoresdeCaso produzir uma correspondência com a

seleção, será executada a cláusula ELSE. ELSE é uma cláusula opcional no comando CASE; se

ELSE não estiver presente, e se nenhum ValordeCaso for selecionado, o comando CASE não

resultará em nenhuma ação.

O valor de seleção na cláusula CASE OF pode aparecer como uma variável ou expressão,

desde que o resultado final seja um valor ordinal.Exemplo Program ExemploCase;Uses Crt;Var Ch: char;begin Ch := readkey; case Ch of 'A'..'Z', 'a'..'z': WriteLn('Letra'); '0'..'9': WriteLn('Dígito'); '+', '-', '*', '/': WriteLn('Operador'); #13: Writeln(‘Enter’); #27: Writeln(‘Esc’); ‘ ’: Writeln(‘Espaço’); else WriteLn('Caractere Especial'); end;end.

41

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Comandos de Repetição

Os comandos de repetição são caracterizados por permitir que uma seqüência de comandos

seja executada um número repetido de vezes.

For

O loop FOR é, talvez, a estrutura de repetição mais familiar e comumente usada. e é

utilizado para executar uma seqüência de comandos repetidamente e com um número conhecido

de vezes.

A representação geral da sintaxe da estrutra é:

FOR VardeControle := Valorlnicial TO ValorFinal DO

comando;

Se o bloco do loop possui comandos múltiplos, o formato geral será o seguinte:

FOR VardeControle := Valorlnicial TO ValorFinal DO

begin

(comandos executados para cada iteração do loop}

end;

O comando FOR identifica uma variável de controle (VardeControle) para o loop, e indica

a faixa de valores (Valorlnicial TO [até] ValorFinal) que a variável receberá e o Valorlnicial e o

ValorFinal devem ser compatíveis com esse tipo. Aqui está um esboço da execução do loop:

1. No início da execução, a variável de controle recebe o valor do Valorlnicial, e a primeira

iteração é executada.

2. Antes de cada iteração subseqüente, a variável de controle recebe o próximo valor da faixa

de Valorlnicial .. ValorFinal.

3. O loop termina após a iteração correspondente ao ValorFinal.

Num loop FOR que use a cláusula TO, o valor ordinal do Valorlnicial deve ser menor que

o valor ordinal do ValorFinal, caso contrário o loop não terá ação nenhuma. Alternativamente,

podemos usar a palavra reservada DOWNTO para projetar um loop FOR que seja decrementado

dentro de uma faixa ordinal:

FOR VardeControle := Valorlnicial DOWNTO ValorFinal DO comando;

Neste caso, o valor de Valorlnicial deve ser maior que o de ValorFinal. Antes de cada

iteração subseqüente, a variável de controle recebe o próximo valor mais baixo da faixa.

42

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroA variável de controle do loop FOR possui um status especial. Nenhum comando dentro

do loop deve tentar modificar o valor dessa variável; se fizer isso, estará interferindo com o

processo normal de contagem que o Pascal dirige automaticamente durante a repetição, podendo

causar resultados imprevisíveis. Entretanto, um comando que esteja dentro do loop pode acessar o

valor da variável de contagem para qualquer propósito.

Não devemos utilizar uma declaração de variável global para definir a variável de controle.

Cada variável de controle num determinado programa deve ser declarada dentro da rotina que

realmente contém o loop. Esta prática evita qualquer possibilidade de interferência entre

diferentes variáveis de controle definidas num determinado programa. Embora a variável de

controle de um loop FOR pertença tipicamente a um dos tipos inteiros, o Pascal Ihe permite

realmente utilizar outros tipos ordinais para controlar o loop, incluindo o tipo CHAR e o

enumerado.

Exemplo:Program ExemploFor;Uses Crt;Var I : integer; j: integer;begin for i:= 1 to 10 do begin writeln(‘Tabuada do ’,i); for j:= 1 to 10 do begin writeln(i, ‘ x ’, j , ‘ = ’, i*j); end; end;end.

While e Repeat Until

Diferentemente do loop FOR, os loops WHILE e REPEAT UNTIL dependem de uma

condição expressa para determinar a duração do processo de repetição. Existem também algumas

diferenças importantes entre estes dois tipos de loops:

Num loop WHILE, colocamos a condição no início do loop, e as iterações continuam

enquanto a condição seja TRUE (verdadeira). Tendo em vista que a condição é avaliada sempre

antes de cada iteração, um loop WHILE resulta em nenhuma iteração se a condição for FALSE

(falsa) logo no principio.

Num loop REPEAT UNTIL, a condição vai para o fim do loop, e o processo de repetição

continua até que a condição se torne TRUE (verdadeira). Tendo em vista que a condição é

avaliada após cada iteração, um loop REPEAT UNTIL sempre executa pelo menos uma iteração.

43

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroEsta variedade de escolhas nos permite expressar os loops numa forma que se adapte a

uma aplicação em particular.

A sintaxe do loop WHILE é:

WHILE (condição) DO

comando;

Se o bloco do loop possuir comandos múltiplos, a forma geral é a seguinte:

WHILE (condição) DObegin

{comandos que serão executados uma vez em cada iteração do loop}end;

A condição é uma expressão que o Turbo Pascal pode avaliar como TRUE (verdadeira) ou

FALSE (falsa). A repetição continua enquanto a condição for TRUE. Normalmente, em algum

ponto, a ação dentro do loop altera a condição para FALSE e o loop termina.

A Estrutura do Loop REPEAT UNTIL é:

REPEAT{comandos que seráo executados uma veza cada iteração do loop}

UNTIL (condição);

Esta estrutura de loop sempre realiza uma iteração antes de a condição ser avaliada pela primeira

vez, e continuam as suas iterações até que a condição se tome TRUE; a repetição termina quando

a condição se tornar TRUE. Os comandos múltiplos dentro de um loop REPEAT UNTIL não

necessitam de marcadores BEGIN e END. As palavras reservadas REPEAT e UNTIL servem

como delimitadores para os comandos dentro do loop.

Alguns programadores são cautelosos no uso de estruturas de loop que executam automaticamente

a primeira iteração antes de avaliar a condição de controle. Esses programadores podem preferir

utilizar os loops WHILE, ao invés dos loops REPEAT UNTIL, na maioria dos programas de

repetição. Fora isso, o REPEAT UNTIL é vantajoso, desde que reservemos o seu uso para

situações nas quais sempre desejemos que seja executada pelo menos uma iteração.

{Exemplo de Utilização do comando WHILE}Program ExemploWhile;uses crt;Var

44

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro op: char;procedure imprimir;begin ...end;procedure excluir;begin ...end;{Programa Principal}Begin op := 0; while op <> ‘9’ do begin clrscr; writeln(‘1 - Imprimir’); writeln(‘2 - Excluir’); writeln(‘9 - Sair’); writeln(‘Digite Opcao.: ‘); readln(op); case op of

‘1’: imprimir;‘2’: excluir;

end; end;end.

{Exemplo de utilizacao do commando REPEAT}Program ExemploRepeat;uses crt;Var op: char;procedure imprimir;begin ...end;procedure excluir;begin ...end;{Programa Principal}Begin repeat clrscr; writeln(‘1 - Imprimir’); writeln(‘2 - Excluir’); writeln(‘9 - Sair’); writeln(‘Digite Opcao.: ‘); readln(op);

case op of ‘1’: imprimir; ‘2’: excluir;

end; until op = ‘9’end.

45

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Sub-Rotinas

Um matemático uma vez disse que um grande problema se resolve dividindo-o em

pequenas partes e resolvendo tais partes em separado. Estes dizeres servem também para a

construção de programas.

Portanto, para facilitar a construção de grandes programas, utiliza-se o método de

modularização, que consiste na divisão do programa em pequenas etapas, que são os módulos ou

subprogramas.

O primeiro módulo ou subprograma, por onde começa a execução do programa recebe o

nome de programa principal, e as outras são os subprogramas, que são executados sempre que

ocorre uma chamada dos mesmos, através da especificação dos seus nomes.

A divisão de um programa em subprogramas é particularmente vantajosa quando uma

mesma seqüência de comandos deve ser repetida várias vezes no programa, o que permite a

confecção de um único subprograma, que pode ser freqüentemente solicitado e executado para

valores diferentes de seus parâmetros.

Outra importância da modularização é que ela permite que diferentes programadores

trabalhem simultaneamente na solução de um mesmo problema, através da codificação separada

dos diferentes módulos.

Podemos dar um conceito simples de Sub-rotina dizendo ser um pedaço de código

computacional que executa uma Função bem definida, sendo que esta sub-rotina pode ser

utilizada várias vezes no algoritmo.

Na linguagem Pascal temos dois tipos de subprogramas: PROCEDURE e FUNCTION..

Procedure

Um procedimento (PROCEDURE) é um tipo de subprograma que se assemelha em muito

com um programa em Pascal. Possui um cabeçalho de identificação com o nome do

procedimento, uma lista opcional de parâmetros de comunicação, um bloco de declarações e um

bloco de comandos.

46

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroUm procedimento é na realidade um programa com vida própria, com suas variáveis

locais, mas que, para ser processado, tem que ser solicitado pelo programa principal ou por outro

procedimento.

Sintaxe:

procedure <nome> [(parâmetros)];<definições>

begin<comandos>;

end;

Uma “PROCEDURE”, é um tipo de sub-Rotina que é ativada através da colocação de seu

Nome em alguma parte do programa. Desta forma, assim que o Nome de uma “PROCEDURE”é

encontrado, ocorre um desvio no programa, para que os comandos da sub-Rotina sejam

executados. Ao término da sub-Rotina, a execução retornará ao ponto subsequente a chamada da

“Procedure”.

Exemplo:

program teste; uses crt;

varnumero : integer;

n : integer;

{Sub-Rotina que Escreve numero no vídeo}procedure escrevenovideo;begin

for numero := 1 to n dobegin

writeln(número);end;

end; { Programa Principal }

begin clrscr; write(‘Digite um Numero.: ‘);

readln(n);escrevenovideo;writeln(‘Fim’);

readkey;end.

47

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroExercícios 4 :

Construa uma sub-Rotina para ler uma matriz NXM DO tipo INTEGER. Os valores N e M

deverão ser lidos.

1. Faça uma sub-Rotina para ler um vetor A de N elementos, e um vetor B de M elementos. Os

valores M e N deverão ser lidos.

2. Faça um algoritmo para ler as informações de N alunos, tais como: Nome, idade e sexo. Após

construa sub-Rotina para: a - Emitir um relatório ordenado crescentemente pelo Nome; b -

Emitir um relatório ordenado decrescentemente pela idade; c - Informar qual o percentual de

alunos do sexo feminino.

3. Faça uma PROCEDURE para desenhar uma moldura no vídeo (Tela Padrão);

Variáveis Globais e Locais

Damos o Nome de variáveis globais para aquelas variáveis que são definidas logo após o

comando VAR do programa principal, sendo desta forma visíveis em qualquer parte do programa.

Exemplo:

Pascal

program teste; uses crt;

var nome : string[80]; (variável global)

{ Sub-rotina que faz a leitura de um nome }procedure setanome;begin

write(‘Digite o nome.: ‘); readln(nome);

end;

{Programa Principal}Begin

clrscr; setanome; writeln(nome);

readkey;end.

48

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroNo Exemplo acima, a variável “Nome”, por ser definida como global, pode ser manipulada

dentro de qualquer ponto do programa, sendo que qualquer mudança no seu conteúdo, será

visível nas demais partes da Rotina.

Damos o Nome de variáveis locais às variáveis que são declaradas dentro de uma sub-

Rotina, sendo que as mesmas só podem ser manipuladas dentro da sub-Rotina que as declarou,

não sendo visíveis em nenhuma outra parte do programa.

Exemplo:

program teste; uses crt; { Sub-rotina que lê e escreve um valor na tela }

procedure escrevenovídeo;var numero : integer; {Variável Local}

n : integer; {Variável Local}begin

clrscr; write(‘Digite um numero.: ‘);

readln(n);

for numero : = 1 to n do begin writeln(número); end;end;

{ Programa Principal }begin escrevenovídeo;

writeln(numero); readkey;

end.

Obs: É possível definir variáveis globais e locais com o mesmo Nome, sendo qualquer mudança

no conteúdo da variável local não afetará o conteúdo da variável global.

Exemplo:

program teste; uses crt;

var nome : string;

procedure setanome;begin

write

49

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro read(nome);end;procedure mudança;var

nome : string;begin

read(nome);end;

beginsetanome;write(nome);mudança;write(nome);

end;

No Exemplo acima, a variável global “Nome” e a variável local “Nome” representam

posições de memória totalmente diferentes, logo, qualquer mudança no conteúdo da variável

local, não afetará o conteúdo da variável global.

Exercícios 5 :

1 - Faça uma “PROCEDURE” para calcular A elevado a um expoente B.

2 - Faça uma “PROCEDURE” para calcular o fatorial de um número X qualquer.

3 - Faça um algoritmo para calcular a seguinte expressão matemática:

4 - Faça uma PROCEDURE que informe se uma STRING qualquer é palíndrome.

5 - Faça um algoritmo que leia um vetor de números inteiros. Após, emita um relatório com cada

número diferente, e o número de vezes que o mesmo apareceu repetido no vetor.

6 - Faça um algoritmo para:

Ler as informações de n pessoas : Nome, Idade, sexo, altura, peso e endereço(Rua,

Número, Bairro, Cidade, Estado), armazenando-as em um vetor. O valor n deverá ser

lido.

Alterar o vetor de tal forma que na parte superior, sejam colocados, em ordem

crescente, as pessoas cujas idades sejam pares e na parte inferior, sejam colocadas, em

ordem decrescente, as pessoas cujas idades sejam ímpares.

50

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroObs: O algoritmo deve prever a possibilidade de no vetor , não existirem números pares ou

então, não existirem números ímpares.

51

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Passagem de Parâmetros

Até agora vimos que para ativar uma sub-Rotina bastaria colocar o seu Nome em alguma

parte do programa. Mas isto nem sempre significa que o trabalho de escrever o programa irá

diminuir. Com o que vimos até agora, dependendo da tarefa a ser realizada pela sub-Rotina, o

trabalho de um programador pode até ser bem complicado.

Por Exemplo, como faríamos para ler 5 vetores, todos com tamanhos diferentes?

Poderíamos, por Exemplo, criar 5 sub-rotinas, uma para cada vetor a ser lido. Isto sem dúvida

resolveria esta situação, mas, e se fossem 100 vetores?, ou 1000? Seria realmente uma tarefa

muito trabalhosa ter de escrever 100, ou 1000 sub-rotinas, isto só para ler os vetores, imagine se

tivéssemos também que ordená-los, ou realizar outro processo qualquer.

Com toda esta dificuldade, o uso das sub-rotinas deveria ser considerado. Como já foi dito, as

sub-rotinas foram criadas para serem genéricas o bastante para se adaptarem a qualquer situação,

visando justamente a possibilidade de reutilização do código.

Para realizar esta “mágica”, foi criado o conceito de passagem de parâmetros, ou seja, passar

informações para serem tratadas dentro da Sub-Rotina.

Sintaxe:

Pascal

PROCEDURE <Nome> (<Variável> : <Tipo>);<Definições>;

BEGIN<comandos>;

END;

Obs: Variável do mesmo tipo são separadas por vírgulas (,). Variáveis de tipos diferentes são

separadas por ponto e vírgula (;).

Exemplo:

program teste; uses crt;

varnúmero : integer;funcionário : string;

procedure escrevenome(n : integer; nome : string);var

i : integer;

52

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneirobegin

for i : = 1 to n dobegin

write(nome);end;

end;

begin clrscr; write(‘Digite um numero.: ‘);

readln(numero); write(‘Digite o nome do funcionário.: ‘); readln( funcionário);

escrevenome(numero, funcionario); readkey;

end.

Obs: Os números dados aos parâmetros não necessitam serem iguais as variáveis passadas

para sub-rotina. No Exemplo acima, o valor contida em “Número” será passado para o parâmetro

“N”, da mesma forma que o valor contido na variável “Funcionário” será passada para o

parâmetro “Nome”. Note que os nomes são diferentes.

Exercícios 6 :

1 - Faça um algoritmo para calcular N!

2 - Faça um algoritmo para calcular Ab

3 - Faça um algoritmo para calcular a seguinte expressão até o n-ésimo:

53

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

a) Passagem de Parâmetros por ValorQualquer alteração no conteúdo de um parâmetro, dentro de uma sub-Rotina, não será

refletido no programa chamado.

Exemplo:

program teste; uses crt;

varx : integer;

procedure porvalor(a : integer);begin

a : = 5;end;

begin clrscr;

x : = 10;porvalor(x);writeln(x);

readkey;end.

No Exemplo acima, o conteúdo da variável “X” não será alterado após o retorno ao

programa principal.

b) Passagem do Parâmetros por ReferênciaQuando a alteração no conteúdo de um parâmetro, dentro de uma sub-Rotina, se reflete no

programa chamador. Os parâmetros a serem passados por referência deverão ter, na definição da

sub-Rotina, colocado na frente do Nome do parâmetro, a palavra “VAR”.

Exemplo:

program teste; uses crt;

varx : integer;

procedure porreferência(var a: integer);begin

a : = 5;end;

begin clrscr;

x : = 10;porreferência(x);

54

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneirowriteln(x);

readkey;end.

No Exemplo acima , o conteúdo da variável “X” será alterado após o retorno ao programa

principal

c) O problema dos tipos na definição de parâmetrosO Pascal, a princípio, aceita somente que sejam definidos parâmetros com os seguintes

tipos : INTEGER, REAL, BYTE, WORD, BOOLEAN, CHAR, STRING e os outros tipos ditos

simples . Desta forma, tipos como ARRAY, RECORD e STRING com tamanho definido pelo

usuário, não são aceitos. Acontece que existe uma forma de fazer o Pascal aceitar qualquer tipo de

dados na definição de parâmetros, através da definição de tipos pelo usuário, ou seja, criar tipos

através do comando TYPE.

Exemplo:

program teste;const

máximo = 50type

vetor = array[1..máximo] of integer;registro =record

descrição : string;cor : string;quant : byte;

end;var

vet : vetor;reg : registro;

procedure leinfo(var v: vetor; var r : registro);var

i : integer;begin

write(‘digite os elementos do vetor: ’);for i : = 1 to máximo do

read(v[i]);write(‘digite os elementos do registro’);read(r.descrição, r.cor, r.quant);

end;

beginleinfo(vetor, reg);

end.

55

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroExercícios 7 :

1. Faça um algoritmo para ler 5 vetores do tipo REAL, todos com tamanhos diferentes.

2. Faça um algoritmo para :

Ler um vetor A com N elementos e um vetor B com M elementos( os valores N e M

podem ou não serem iguais).

Formar um terceiro vetor ( C ) com os elementos dos vetores A e B intercalados.

Exemplo:

C[1] : = A[1];

C[2] : = B[1];

C[3] : = A[2];

C[4] : = B[2];

Obs.: Nenhum tipo de ARRAY poderá ser utilizado além dos ARRAY’s A, B e C.

3. Faça um algoritmo para :

Ler um vetor A com N elementos e um vetor B com M elementos(os valores M e N

podem ou não serem iguais).

Ordenar crescentemente estes vetores

Formar um terceiro vetor ( C ) , com os elementos dos vetores A e B intercalados, de

forma que ao final do processamento ( intercalação ), o vetor C continue ordenado. A

ordenação será obtida somente através do processo de intercalação.

Obs: Nenhum outro tipo de ARRAY poderá ser utilizados além dos tipos A, B e C. Caso os

elementos de um dos vetores (A ou B) termine um antes do outro, as posições restantes do vetor

C, deverão ser preenchidas com os elementos restantes do Vetor ( A ou B ) que ainda possui

elementos.

4. Simule um arquivo de clientes na memória e crie um pequeno sistema para envio de mala

direta. O sistema deverá ter as seguintes funções:

Inclusão, alteração e exclusão dos clientes

Listagem dos clientes em ordem alfabéticas, dentro de um intervalo de letras

especificado (A..Z)

Listagem dos Clientes por código, dentro de um intervalo especificado ( código

inicial..código final)

56

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Function

Em Pascal as funções podem ser vistas como um procedimento que retorna um único

valor.

Uma função (FUNCTION) devolve ao programa que a ativou apenas um valor, calculado

por ela mesma e alocado na variável que define o nome da FUNCTION.

Para transferir o controle para uma FUNCTION não basta mencionar seu nome, como no

caso de PROCEDURES. Sua solicitação é caracterizada por um comando de atribuição de valor.

Em uma function deve-se declarar seu tipo, que coincide com o tipo de valor por ela

calculado (integer, real, char, byte, boolean ou string).

Sintaxe:

Pascal

FUNCTION <Nome> [(Parâmetros)] : < Tipo do valor retornado>;<Definições>;

BEGIN<Comandos>;

END;

Uma sub-Rotina do tipo “FUNCTION” possui as mesmas características de uma

“PROCEDURE” no que se refere a passagem de parâmetros, variáveis globais e locais, mas

possui uma importante diferença, que é o retorno de um valor ao término de sua execução, ou

seja, uma FUNCTION sempre deverá retornar um valor ao chamador.

Na definição de uma “FUNCTION”, deverá ser informado qual o tipo do valor retornado,

sendo que poderá ser usado, nesta definição, tanto tipos pré-definidos da linguagem, como tipos

definidos pelo usuário. Somente não poderão ser retornados tipos ARRAY e RECORD,

justamente por serem tipos que definem variáveis que armazenam mais de um valor.

Para informar qual o valor deve ser retornado deve ser colocado, em algum ponto do

código da “FUNCTION” uma linha com a seguinte Sintaxe:

Pascal

<Nome da FUNCTION > < o valor a ser retornado>

57

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroExemplo:

program teste; uses crt;

vark : integer;

num1 : integer; num2 : integer;

{Sub-rotina que faz a soma dos Valores }function soma (v1, v2 : integer) : integer;begin

soma : = v1 + v2;end;

{ Programa Principal } begin

clrscr; write(‘Digite primeiro numero.: ‘); readln(num1); write(‘Digite segundo numero.: ‘); readln(num2);

k : = soma(num1,num2);write(k);

readkey;end.

58

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Exemplo 2: Utilização de array ou vetorprogram teste;

uses crt; type vetor = array[1..5] of integer;

varnumero : vetor;

x : integer; k : integer;

{Sub-rotina que faz a soma dos Valores }function soma (tabela : vetor ) : integer;

var result : integer;

beginresult : = 0;

for x:=1 to 5 do begin result := result + tabela[x]; end; soma := result;

end;

{ Programa Principal } begin

clrscr; for x:= 1 to 5 do begin write(‘Digite primeiro numero.: ‘); readln(numero[x]); end;

k : = soma(numero);write(k);

readkey;end.

Exercícios 8 :

1. Construa “Functions” para :

a) Calcular N!

b) Calcular AB

c) Calcular:

59

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

d) Calcular:

f) Retornar TRUE caso um número seja par, FALSE caso contrário

g) Retornar TRUE caso um número seja ímpar, FALSE caso contrário

2. Faça uma FUNCTION que codifique uma mensagem, da seguinte forma:

A por Z

B por Y

C por X

.

.

X por C

Y por B

Z por A

Obs.: a Rotina deverá fazer o mesmo para letras minúsculas.

3. Faça uma FUNCTION para transformar as letras de uma STRING de minúsculas para

maiúsculas

4. Faça uma FUNCTION para transformar as letras de uma STRING de maiúsculas para

minúsculas

5. Dado um vetor com n elementos numéricos, faça uma FUNCTION que verifique se um dado

valor existe neste vetor

6. Faça uma FUNCTION para acrescentar N espaços em branco a esquerda de uma STRING

qualquer

7. Faça uma FUNCTION para acrescentar N espaços em branco a direita de uma STRING

qualquer

8. Dado uma STRING qualquer e um valor N , faça uma FUNCTION para gerar uma nova

STRING que tenha este tamanho N . Caso a STRING original possua um tamanho menor que o

valor N informado, deverão ser acrescentados espaços em branco a esquerda da STRING, até que

o tamanho N seja alcançado.

60

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro9. Dado uma STRING qualquer e um valor N , faça uma FUNCTION para gerar uma nova

STRING que tenha este tamanho N. Caso a STRING original possua um tamanho menor que o

valor N informado, deverão ser acrescentados espaços em branco a direita da STRING, até que o

tamanho N seja alcançado.

61

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

Manipulação de Numéricos

Parte fracionária FUNCTION FRAC (x:NUMÉRICO):REAL;Parte inteira FUNCTION INT (x:NUMÉRICO):REAL;Valor arredondado FUNCTION ROUND (x:NUMÉRICO):NUMÉRICO;Valor Truncado FUNCTION TRUNC (x:NUMÉRICO):NUMÉRICO;Valor absoluto FUNCTION ABS (x:INTEIRO):NUMÉRICO;Decremento PROCEDURE DEC (VAR x:INTEIRO [; passo:INTEIRO ]);

Incremento PROCEDURE INC (VAR x:INTEIRO [; passo:INTEIRO ]);

Exponencial (ex) FUNCTION EXP (x:NUMÉRICO):REAL;

Logaritmo natural FUNCTION LN (x:NUMÉRICO):REAL;

Potência de 2 (x2) FUNCTION SQR (x:INTEIRO):NUMÉRICO;

Raiz Quadrada FUNCTION SQRT (x:NUMÉRICO):REAL;Pi FUNCTION PI:REAL;Cosseno FUNCTION COS (x:NUMÉRICO):REAL; (em radianos)Seno FUNCTION SIN (x:NUMÉRICO):REAL; (em radianos)Número ímpar FUNCTION ODD (x:INTEIRO):BOOLEAN;Aleatório FUNCTION RANDOM [ (n:INTEIRO) ]:NUMÉRICO;

(Real:0..1) ou (Inteiro:1 .. n - 1);Pode ser usado junto a PROCEDURE RANDOMIZE;

Observações: NUMÉRICO = qualquer tipo numérico real ou inteiro. INTEIRO = qualquer tipo inteiro. REAL = qualquer tipo real.

Manipulação de CaracteresTamanho FUNCTION LENGTH (s:STRING):INTEGER;Copiar FUNCTION COPY (s:STRING; posicao_inicial,

tamanho:INTEGER):STRING;Eliminar PROCEDURE DELETE (VAR s:STRING; posição_inicial,

tamanho:INTEGER);Inserir PROCEDURE INSERT (fonte:STRING; VAR destino:STRING;

posicao:INTEGER); //(Máximo: 255 caracteres)Posição FUNCTION POS (substring_busca:STRING; s:STRING):BYTE;Maiúsculo FUNCTION UPCASE (c:CHAR):CHAR;

Manipulação de Numéricos e CaracteresAntecessor FUNCTION PRED (x:INTEIRO/CHAR):INTEIRO/CHAR;Sucessor FUNCTION SUCC (x:INTEIRO/CHAR):INTEIRO/CHAR;Numérico string PROCEDURE STR (valor [:tamanho [:decimal]]; VAR

destino:STRING);String numérico PROCEDURE VAL (fonte:STRING; VAR

destino:NUMÉRICO; VAR erro:INTEGER);Caracter ASCII FUNCTION CHR (x:INTEIRO):CHAR;Valor Decimal ASCII FUNCTION ORD (x:NUMÉRICO/CHAR):NUMÉRICO;

62

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

63

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroBIBLIOGRAFIA

Manual de Referência Turbo Pascal (7.0). Borland International.

WOOD, S. Turbo Pascal. Guia do Usuário. McGraw Hill.

HERGERT, Douglas. Dominando o Turbo Pascal. Ciência Moderna.

CARROLL, D. W. Programação em Turbo Pascal. McGraw Hill.

WIRTH, Niklaus. Programação Sistemática em Pascal. Campus.

CARVALHO, S. L. R. Introdução a Programação com Pascal. Campus.

FARRER, H. Pascal Estruturado. Guanabara Dois.

SCHLIEVE, Paul L. Turbo Pascal Ilustrado. Lutécia.

GRILLO, M. C. A. Turbo Pascal. LTC.

WORTMAN, L. A. Programando em Turbo Pascal. Campus.

KERNIGHAN. Ferramentas Para Programação Pascal. Campus.

MANZANO, J. A. N. G. Programando em Turbo Pascal 7.0. Érica

RINALDI, Roberto. Turbo Pascal 7.0. Érica.

SWAN, Tom. Mastering Turbo Pascal 5.5. Hayden Books.

VILLAS, Marcos Vianna; VILLASBOAS, Luiz Felipe P. Programação - Conceitos, Técnicas e Linguagens. Campus.

FORBELLONE, A.; EBERSPACHER, H.F. Lógica de Programação - A construção de Algoritmos e Estrutura de Dados. Makron Books.

GUIMARÃES, A.; LAGES, N. Algoritmos e Estruturas de Dados. LTC.

FARRER, H. Algoritmos Estruturados. Guanabara Dois.

PINTO, Wilson Silva. Algoritmos e Estruturas de Dados. Érica.

MECLER, Ian; MAIA, Luiz Paulo. Programação e Lógica com Turbo Pascal. Campus.

64

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro

AAPÊNDICEPÊNDICE

Gabarito dos exercícios de Raciocínio Matemático

1. b2. b3. d4. d5. b6. Falso7. c8. quinta-feira9. não existe um dia em que seja possível essa afirmação10.e

65

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney CarneiroMENSAGENS DE ERROS DO SISTEMA TURBO-PASCAL VERSÃO 7.0

A versão 7.0 do Pascal apresenta o mesmo sistema das versões anteriores no que diz respeito as mensagens de erros, pois também divide os erros em categorias: Erros de Compilação, Erros em tempo de Execução provenientes do DOS ou I/O e Erros Críticos. Também na versão 7.0 mantêm-se a característica de se apontar o erro com o cursor se posicionando sobre o erro, com a mensagem sendo destacada na linha de comandos.

ERROS DE COMPILAÇÃO

1 Out of memory - Este erro ocorre quando a quantidade de memória disponível no equipamento não é suficiente para compilar o programa. Algumas soluções podem ser tentadas para solucionar este problema: - Compilar o Programa com destino para o disco e não para memória, para isto utilizamos a opção DESTINATION DISK - Utilizar a opção LINK BUFFER DISK de modo a utilizar o disco e não a RAM como buffer de enlace. - Retirar todos os utilitários instalados na memória. - Compilar através do TPC.EXE, o qual é um arquivo menor que o TURBO.EXE. - Dividir o programa em UNITS, compilando-as separadamente.

2 Identifier expected - Identificador esperado. Neste local era esperado um identificador, ou houve a tentativa de redefinir uma palavra reservada.

3 Unknown identifier - Identificador não declarado no programa. 4 Duplicate identifier - Identificador repetido no mesmo bloco.5 Syntax error - Erro de sintaxe. Existe algum caracter ilegal na declaração ou os "abre-fecha"

aspas em torno de uma string não estão corretos.6 Error in real constant - Constante real inválida.7 Error in integer constant - Constante inteira inválida.8 String constant exceeds line - Constante string maior que 255. Verificar os "abre-fecha" aspas.10 Unexpected end of file - Fim de Arquivos esperado. Pode-se verificar:

- o casamento dos begin-end. - o casamento de "abre-fecha" chaves de comentários. - se algum arquivo de inclusão está finalizando de forma inválida. - o compilador não encontrou o end de final de arquivo.

11 Line too long - Linha muito longa, ultrapassando o limite de 126 caracteres.12 Type identifier expected - Identificador de tipo era esperado.13 Too many open files - Muitos arquivos abertos ao mesmo tempo. Este erro ocorre quando não

existe o arquivo CONFIG.SYS, ou foram abertos mais arquivos do que o especificado no arquivo de configuração, indica-se FILES=20.

14 Invalid file name - Arquivo não encontrado. Verificar se os nomes estão corretos ou se existe a especificação do caminho.

15 File not found - Arquivo não encontrado no diretório. Verificar nome e caminho. 16 Disk full - Disco cheio. Delete alguns arquivos desnecessários ou utilize outro disco.17 Invalid compiler directive - Diretiva de compilação incorreta.18 Too many files - Existem muitos arquivos envolvidos na compilação do programa.19 Undefined type in pointer definition - Tipo pointer não definido.20 Variable identifier expected - Identificador de variável esperado.21 Error in type - Erro em definição de tipo, o caracter encontrado é inválido.22 Structure too large - Tipo estruturado com mais de 65520 bytes.23 Set base type out of range - Tipo base fora do intervalo de 0 a 255 ou tipos enumerados maior

que 256.

66

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro24 File components may not be files - Arquivos de arquivo não é uma estrutura permitida.25 Invalid string length - String com mais de 255 caracteres.26 Type mismatch - Tipo trocado. Pode-se verificar o seguinte:

- incompatibilidade de tipos em um comando de atribuição. - incompatibilidade de parâmetros e argumentos num procedimento ou função. - incompatibilidade entre índices de vetores em uma declaração. - incompatibilidade entre tipos de operandos em uma expressão.

27 Invalid subrange base type - Intervalo de variação do tipo base está inválido.28 Lower bound greather than upper bound - Limite superior do intervalo é maior que o do

tipo.29 Ordinal type expected - Tipo ordinal esperado, outro tipos como string, real, pointer não são

aceitos.30 Integer constant expected - Constante inteira esperada.31 Constant expected - Constante esperada.32 Integer ou real constant expected - Constante real ou inteira esperada.33 Type identifier expected - Identificador de tipo esperado.34 Invalid function result type - Como resultado de uma função somente _ esperado um tipo

simples, string e pointer.35 Label identifier expected - Identificador de rótulo esperado.36 BEGIN expected - BEGIN esperado.37 END expected - END esperado.38 Integer expression expected - Expressão inteira esperada.39 Ordinal expression expected - Expressão ordinal esperada.40 Boolean expression expected - Expressão booleana esperada.41 Operand types do not match operator - Tipo do operando incompatível com o tipo do

operador.42 Error in expression - Verifique a validade de sua expressão.43 Illegal assignment - Não é permitido atribuir valores a variáveis sem tipo, nem a arquivos.

Outra verificação é que um identificador de função somente poderá receber valores dentro da própria função.

44 Field identifier expected - Identificador de campo esperado.45 Object file too large - Arquivo .OBJ com mais de 64 kb.46 Undefined external - External indefinido. 47 Invalid object file record - Inválido registro de arquivo objeto.48 Code segment too large - Programa ou unidade ultrapassou o limite de 65 Kb.49 Data segment too large - Arquivo de dados ultrapassou limite de 65 Kb.50 DO expected - Comando DO esperado.51 Invalid PUBLIC definition - Inválida definição PUBLIC.52 Invalid EXTRN definition - Inválida definição EXTRN.53 Too many EXTRN definitions - Número de EXTRN superior a 256.54 OF expected - Cláusula OF esperada.55 Interface expected - Cláusula INTERFACE esperada.56 Invalid relocatable reference - Referência realocável inválida.57 THEN expected - THEN esperado.58 TO or DOWNTO expected - TO ou DOWNTO esperado.59 Undefined FORWARD - FORWARD indefinido:

- A procedure ou função foi declarada na INTERFACE, mas esta declaração nunca ocorreu na IMPLEMENTATION. - A procedure ou função foi declarada com FORWARD, mas esta definição não foi encontrada.

61 Invalid typecast - Concatenação de tipos inválidos.

67

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro62 Division by zero - Divisão por zero.63 Invalid file type - Tipo de arquivo inválido.64 Cannot Read or Write variables of this type - Não é possível usar uma variável deste tipo

com os procedimentos READ ou WRITE. 65 Pointer variable expected - Variável do tipo POINTER esperada.66 String variable expected - Variável do tipo STRING esperada.67 String expression expected - Expressão do tipo STRING esperada. 68 Circular unit reference - UNIT não encontrada. Possivelmente não definida na USES.69 Unit name mismatch - UNIT com nome trocado. UNIT declarada porém não existe o

correspondente arquivo .TPU.70 Unit version mismatch - Versão incorreta, deve-se recompilar as UNITS.71 Duplicate unit name - UNIT com nome duplicado.72 Unit file format error - Arquivo .TPU de alguma UNIT com problema.73 Implementation expected - IMPLEMENTATION esperado.74 Constant and case types do not match - Tipos trocados entre as constantes do CASE e a

variável seletor. 75 Record variable expected - Variável do tipo registro esperada.76 Constant out of range - Constante fora dos limites.77 File variable expected - Variável do tipo arquivo esperada.78 Pointer expression expected - Expressão do tipo POINTER esperada.79 Integer or real expression expected - Expressão do tipo inteiro ou real esperada.80 Label not within current block - LABEL não está presente neste bloco.81 Label already defined - LABEL já definido.82 Undefined label in preceding statement part - LABEL não definido na área anterior ao

comando. 83 Invalid @ argument - Inválido argumento @.84 UNIT expected - UNIT esperada.85 ";" expected - ; esperado.86 ":" expected - : esperado.87 "," expected - , esperada.88 "(" expected - ( esperado.89 ")" expected - ) esperado.90 "=" expected - = esperado.91 ":=" expected - := esperado.92 "[" or "(." expected - [ ou ( esperado.93 "]" or ".)" expected - ] ou ) esperado.94 "." expected - . esperado.95 ".." expected - .. esperado.96 Too many variables - Muitas variáveis. O total de variáveis não pode ultrapassar o limite dos

64KB, considerando: procedimentos, funções, units e programas. 97 Invalid FOR control variable - Variável do FOR inválida.98 Integer variable expected - Variável inteira esperada.99 Files are not allowed here - Arquivos não podem ser usados aqui.100 String length mistmatch - String com comprimento incompatível101 Invalid ordering of fields - Ordenação inválida dos campos.102 String constant expected - Constante do tipo string esperada.103 Integer or real variable expected - Variável inteira ou real esperada.104 Ordinal variable expected - Variável escalar esperada.105 INLINE error - Erro no comando INLINE.106 Character expression expected - Expressão do tipo caracter esperada.

68

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro107 Too many relocations items - Muitos itens a serem realocados. Seu programa ultrapassou o

limite de tamanho e deve ser dividido em partes, usando a unidade DOS, através do procedimento EXEC.

108 Overflow in arithmetic operation - O resultado da operação aritmética anterior não está na faixa LongInt. Corrija a operação ou utilize um valor do tipo real ao invés de valores do tipo inteiro.109 No enclosing FOR, WHILE, or REPEAT statement - Os procedimentos padrão Break e Continue não podem ser utilizados fora dos comandos For, While ou Repeat.112 CASE constant out of range - Constante do CASE maior que 32676 ou menor que -32768.113 Error in statement - Erro no comando. Verifique se o nome da função ou procedure está

correto.114 Cannot call an interrupt procedure - Não se pode fazer uma chamada a um procedimento

interrompido.116 Must be in 8087 mode to compile this - As operações que utilizam números reais do tipo SINGLE, DOUBLE, EXTENDED E COMP, exigem um Co-processador 8087 ou 80287.117 Target address not found - Houve erro com a opção FIND ERROR do menu de compilação

e não foi encontrado o local do erro procurado.118 Include files are not allowed here - Não é aceito a inclusão de arquivos neste local.119 No inherited methods are accessible here - Você está utilizando a palavra chave inherited fora do método ou em um método do tipo objeto que não tem ancestral.121 Invalid qualifier - Qualificador inválido. Verificar:

- Quando usar conjuntos indexar apenas uma variável. - Quando especificar campos, definir antes qual o registro. - A referência somente pode se retirada das variáveis tipo pointer.

122 Invalid variable reference - Para chamar uma função do tipo pointer deve-se tirar a referência ao resultado.

123 Too many symbols - Os símbolos utilizados por seu programa ou UNIT ultrapassam os 64Kb.

124 Statement part too large - Verifique se a parte de execução de seu programa ultrapassa os 24KB.

126 Files must be var parameters - É esperado pelo Pascal que seus arquivos tenham parâmetros do tipo VAR.

127 Too many conditional symbols - Símbolos condicionais em excesso.128 Misplaced condicional directive - Diretiva de compilação condicional incompleta. 129 ENDIF directive missing - Falta diretiva {$ENDIF} da diretiva {$IFYYY}.130 Error in initial conditional defines - Erro nas definições das condições iniciais.131 Header does not match previous definition - Cabeçalho não corresponde ao que foi

definido na parte de INTERFACE ou FORWARD, do cabeçalho do procedimento ou função.

133 Canot evaluate this expression - Não é possível avaliar esta expressão.134 Expression incorrectly terminated - Expressão terminada incorretamente.135 Invalid format specifier - Especificador de formato inválido.136 Invalid indirect reference - Referência indireta inválida.137 Structured variables are not allowed here - Variáveis estruturadas não são permitidas aqui.138 Cannot evaluate without system unit - Avaliação não é possível sem a unit system.139 Cannot acess this symbol - Não é permitido acessar este símbolo.140 Invalid floating-point operation - Operação de ponto flutuante inválida ou divisão por zero.141 Cannot compile overlays to memory - Não é possível compilar overlays na memória.142 Procedural or function variable expected - Variável procedure ou função esperada.

69

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro143 Invalid procedure or function reference - Referência inválida em procedure ou função.144 Cannot overlay this unit - Não é possível tornar esta unit num overlay. 146 File access denied - O arquivo não pode ser aberto ou criado. O compilador está tentando escrever para um arquivo somente de leitura.147 Object type expected - O identificador não reconhece um tipo objeto. 148 Local object types are not allowed - O tipo objeto não pode ser definido dentro do escopo de um programa ou unidade e não pode ser definido dentro de procedimentos e funções.149 VIRTUAL expected - A palavra reservada Virtual não foi encontrada. 150 Method identifier expected - O identificador não significa um método.151 Virtual constructors are not allowed - Virtual construtor não é permitido. 152 Constructor identifier expected - Identificador constructor esperado ou não reconhecido.153 Destructor identifier expected - Identificador destructor esperado ou não reconhecido.154 Fail only allowed within constructors - O procedimento padrão Fail só pode ser utilizado dentro de constructors.155 Invalid combination of opcode and operands - Operação de código Assembler não aceita esta combinação de operandos. Pode ocorrer excesso ou falta de operandos, ou o tipo e ordem não estão de acordo com o código Assembler. 156 Memory reference expected - O operador Assembler não é uma referencia de memória, a qual é requerida aqui. Muito provavelmente você esqueceu de colocar colchetes em torno do registrador.157 Cannot add or subtract relocatable symbols - A única operação aritmética que pode ser realizada com símbolo realocável em um operando Assembler é adição o ou subtração de constantes. Variáveis, procedimentos, funções e rótulos são símbolos realocáveis. 158 Invalid register combination - Combinação de registrador inválida.159 Instructions are not enabled - Use a diretiva de compilação {$G+} para permitir operações de código no 286/287, mas esteja consciente que o código resultante não pode rodar nas máquinas 8086 e 8088. 160 Invalid symbol reference - Esse símbolo não pode ser acessado em um operando Assembler.161 Code generation error - Parte do comando precedente contêm uma instrução LOOP ou outra que não pode atingir o seu término.162 ASM expected - Você está tentando compilar uma função ou procedimento em Assembler que contêm o comando Begin...End ao invés de Asm...End.

RUNTIME ERRORS

Os RUNTIME ERRORS ou Erros em tempo de execução podem ser classificados em: DOS ERRORS - Erros do DOS (1 a 99). I/O ERRORS - Erros de Entrada e Saída (100 a 149). CRITICAL ERRORS - Erros críticos (150 a 199). FATAL ERRORS - Erros fatais (200 a 255). Um erro em tempo de execução interrompe o processamento e envia para o vídeo a seguinte mensagem:

RUNTIME ERROR nnn AT xxxx:yyyy onde: nnn - representa o número do erro. xxxx:yyyy - representa o endereço do erro.

DOS ERRORS

1 Invalid function number - Chamada de função inexistente no DOS.

70

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro 2 File not found - Arquivo solicitado pelo RESET, APPEND, RENAME ou ERASE, não foi

encontrado. 3 Path not found - Não foi encontrado o caminho indicado, verificar a estrutura de

subdiretórios, bem como as linhas de chamadas de arquivos neste subdiretório. 4 Too many open files - Verifique a existência de um arquivo CONFIG.SYS, que deverá indicar

o número máximo de arquivos que podem ser abertos ao mesmo tempo. 5 File access denied - Não foi possível acessar os arquivos através do RESET, APPEND,

FILEMODE, REWRITE, RENAME, ERASE, MKDIR, RMDIR, READ, BLOCKREAD, WRITE OU BLOCKWRITE.

6 Invalid file handle - Erro no manuseio do arquivo, verificar se a variável referente ao nome do arquivo não foi alterada.

12 Invalid file access code - Arquivo indicado pelo RESET ou APPEND tem um valor de FILEMODE inválido, causando código inválido de acesso ao arquivo.

15 Invalid drive number - Driver inválido, erro acusado pelo GETDIR.16 Cannot remove current directory - Impossível remover o diretório atual, erro acusado pelo

RMDIR.17 Cannot rename across drives - Impossível renomear o nome do arquivo pois os dois se

encontram no mesmo driver. Erro acusado pelo RENAME.18 No more files -Relatado pela variável DOSERROR na unidade DOS e WINDOS, quando FINDFIRST ou FINDNEXT não encontra arquivo que combine com o nome de arquivo especificado e atributos.

I/O ERRORS

Os erros de entrada e saída podem ser tratados através da diretiva {$I}. O valor default desta diretiva é {$I+}, isto provoca uma interrupção na execução do programa, sempre que ocorrer erros. A outra opção para esta diretiva é {$I-}, o que não acarretará a interrupção do programa, porém um código de erro é emitido, podendo ser recolhido pela função IORESULT e com isto tomarmos as providências necessárias.

100 Disk read error - Tentativa de ler uma variável após o final do arquivo, ocasionando erro de leitura.

101 Disk write error - Não há espaço no disco para gravação.102 File not assigned - Não foi feita a associação do arquivo através do ASSIGN.103 File not open - Arquivo não foi aberto, ocorre num CLOSE, READ, WRITE, SEEK, EOF,

FILEPOS, FILESIZE, FLUSH, BLOCKWRITE, BLOCKREAD.104 File not open for input. Arquivo não aberto para entrada de dados, refere-se a um arquivo tipo texto.105 File not open output - Arquivo não foi aberto para saída de dados, refere-se também a um

arquivo tipo texto.106 Invalid numeric format - Valor numérico incompatível com arquivo tipo texto.

CRITICAL ERRORS

150 Disk is write-protected - Disco Protegido contra gravação.151 Unknown unit - UNIT não encontrada no disco.152 Drive not ready - Disco não formatado ou com defeito.153 Unknown command - Comando não conhecido pelo Pascal.154 CRC error in data - Setor ruim.155 Bad drive request structure length - Acesso a disco danificado.156 Disk seek error - Erro de procura em disco.

71

Apostila de Algoritmo e Estrutura de Dados I – Prof. Rodney Carneiro157 Unknown media type - Tipo de comunicação não encontrado.158 Sector not found - Setor não encontrado, disco com problemas.159 Printer out of paper - Impressora sem papel.160 Device write fault - Direcionamento de saída com defeito.161 Device read fault - Direcionamento de leitura com defeito.162 Hardware failure - Hardware falhando.

FATAL ERRORS

200 Division by zero - Divisão por zero.201 Range check error - Intervalo de variação do índice de um array está fora da faixa.202 Stack overflow error - Falta de espaço na pilha de alocação de variáveis locais de um

subprograma, pode-se solucionar através da opção MEMORY SIZES do menu de compilação.

203 Heap overflow error - Espaço insuficiente na memória para o HEAP.204 Invalid pointer operation - Operação com variáveis do tipo POINTER inválida.205 Floating point overflow - Operação com ponto flutuante causando transbordo de memória.206 Floating point underflow - Operação causando transbordo negativo de memória, ocorre

geralmente quando se trabalha com co-processador 8087.207 Invalid floating point operation - Operação com ponto flutuante inválida, por exemplo

SRQT ou LN de valor negativo, estouro de pilha com 8087. 208 Overlay manager not installed - Gerenciador de overlay não foi instalado.209 Overlay file read error - Erro na leitura do arquivo overlay.210 Object not initialized - Com uma faixa de verificação em operação você fez um chamado para um método de objeto virtual antes que o objeto tenha sido inicializado via a chamada do constructor.211 Call to abstract method - Este erro é gerado por um procedimento abstrato numa unidade objeto; isto indica que o seu programa tenta executar um método abstrato virtual.212 Stream registration error - Este erro é gerado pelo procedimento REGISTER TYPE na unidade objeto.213 Collection index out of range - O índice passado para o método de uma TCollection está fora de faixa.214 Collection overflow error - O erro é relatado por uma TCollection se uma tentativa é feita para adicionar um elemento quando a coleção não pode ser expandida. 215 Arithmetic overflow error - Este erro é relatado por um comando compilado na diretiva {$Q+} quando uma operação aritmética inteira provoca um estouro tal qual quando o resultado de uma operação está fora da faixa suportada.

72