rodneycarneiro.com.brrodneycarneiro.com.br/Apostilas/AlgoI/Apostila Algoritmo Rodney.doc · Web...
Transcript of rodneycarneiro.com.brrodneycarneiro.com.br/Apostilas/AlgoI/Apostila Algoritmo Rodney.doc · Web...
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 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