escola secundÁria de emÍdio avarroeteit.cuattrin.com.br/disciplinas/201201/201201md/xx - técnicas...
TRANSCRIPT
EESSCCOOLLAA SSEECCUUNNDDÁÁRRIIAA DDEE EEMMÍÍDDIIOO NNAAVVAARRRROO
AANNOO LLEECCTTIIVVOO 22000000//22000011
TTÉÉCCNNIICCAASS DDEE LLIINNGGUUAAGGEENNSS
DDEE PPRROOGGRRAAMMAAÇÇÃÃOO 1100ºº AANNOO
© 2000 - Prof. Carlos Almeida
1ª Versão
_______________________________________________________________ Notas do Professor
Prof. Carlos Almeida ii
NNoottaa IInnttrroodduuttóórriiaa
O objectivo destes apontamentos não é substituir as aulas, como tal, a
exposição de qualquer matéria não é realizada de modo detalhado. Será necessário
consultar entre outra bibliografia a bibliografia geral da disciplina e alguns manuais
de aplicação. O aluno também deve procurar uma actualização permanente, criando
o hábito de consultar publicações técnicas, investigar novos conceitos e discutir
sobre eles.
A disciplina Técnicas de Linguagens de Programação insere-se no curriculum
do Curso Tecnológico de Informática no 10º e 11º anos, com a carga horária de 4
tempos lectivos, distribuídos, por duas aulas de 2 tempos cada.
A disciplina Técnicas de Linguagens de Programação do 10º Ano pretende
desenvolver no aluno um raciocínio lógico, que lhe possibilite a escrita de programas
informáticos estruturados, documentados, modulares e eficientes.
O aluno não deve ficar limitado pelas características ou potencialidades de uma
linguagem de programação. Facto pelo qual se enfatiza, numa primeira fase, a
resolução de problemas baseado na escrita de algoritmos com passos rigorosos e
sistemáticos.
A aprendizagem da linguagem de programação Pascal, vem completar esta
formação, pelo que se deve executar programas de processamento variado, dando
assim a possibilidade a que os alunos, nos anos posteriores, estejam aptos a
resolver situações complexas que exigem maior abstracção e para as quais se
estabelecem exigências de qualidade total.
É fundamental, a aprendizagem correcta da construção de algoritmos e o
domínio da técnica TOP-DOWN, em detrimento dos fluxogramas, como ferramenta
de análise de um enunciado e sua conversão em forma de algoritmos. Pretende-se
que o fluxograma não seja usado como forma de raciocínio, mas como
documentação do programa ou algoritmo, sendo, portanto, uma explicação
complementar da solução encontrada.
_______________________________________________________________ Notas do Professor
Prof. Carlos Almeida iii
SSiisstteemmaa ddee AAvvaalliiaaççããoo
A avaliação da disciplina é contínua. Para cada Unidade Temática indicam-se
critérios e técnicas de avaliação concretas, e que variam entre a realização de testes
escritos, trabalhos de grupo e provas práticas individuais realizadas no computador.
O professor da disciplina de Técnicas de Linguagens de Programação do 10º
Ano, Carlos Almeida, estabeleceu os seguintes critérios de avaliação para o ano
lectivo de 2000/2001:
COMPONENTE PRÁTICA 30%
• Trabalhos de grupo
• Provas práticas Individuais realizadas no computador
20%
10%
COMPONENTE TEÓRICA 40%
• Testes escritos
• Fichas de trabalho
30%
10%
ATITUDES DO ALUNO 30%
• Destreza com o equipamento
• Capacidade de organização e metodologia de trabalho
• Concentração e qualidade no trabalho
• Relacionamento em grupo
• Assiduidade e pontualidade
5%
5%
5%
10%
5%
_______________________________________________________________ Notas do Professor
Prof. Carlos Almeida iv
EElleennccoo TTeemmááttiiccoo
Nesta disciplina deve ser dada uma grande ênfase à construção de algoritmos,
usando as metodologias top-down, pseudocódigo e fluxogramas. A linguagem
de programação Pascal é, a indicada para se usar na iniciação à programação. O
Pascal deve manter-se como ponto de partida no estudo de algoritmia.
Pretende-se desenvolver no aluno um raciocínio lógico, que lhe possibilite a
escrita de programas estruturados.
UNIDADE 1 Lógica de Programação 1.1. Análise e desenho de um algoritmo.
1.2. Tipos de dados.
1.3. Operações elementares.
1.4. Prioridade de operadores.
1.5. Variáveis e expressões.
1.6. Traçagem de algoritmos.
1.7. Fluxogramas.
1.8. Pseudocódigo.
UNIDADE 2 Estrutura de decisão 1.1. Estrutura Sequencial.
1.2. Estrutura Condicional.
1.3. Estrutura de Repetição.
1.4. Algoritmos de aplicação.
UNIDADE 3. Estrutura de Dados 1.1. Vectores.
1.2. Matrizes.
1.3. Cadeia de caracteres.
1.4. Ficheiros.
1.5. Algoritmos de aplicação.
UNIDADE 4. Subalgoritmos 1.1. Estruturação de programas.
1.2. Funções.
1.3. Procedimentos.
_______________________________________________________________ Notas do Professor
Prof. Carlos Almeida v
UNIDADE 5. Programação em Pascal 1.4. Ambiente de trabalho.
1.5. Características da linguagem Pascal.
1.6. Estrutura do programa e comentários.
1.7. Compilação para a memória e disco.
1.8. Estruturas de controlo.
1.9. Estruturas de dados.
1.10. Funções e Procedimentos.
1.11. Debugger.
1.12. Características gráficas.
1.13. Uso de ficheiros em Pascal.
1.14. Programas de aplicação.
1.15. Programas em memória residente.
______________________________________________________________________ Bibliografia
Prof. Carlos Almeida vi
BBiibblliiooggrraaffiiaa
Apontamentos do professor.
AZUL, Artur Augusto (1998) - Técnicas e Linguagens de Programação –
10º Ano, Porto Editora (Livro adoptado pela disciplina).
LIMA, Jorge Reis (1991) - Programação de Computadores, Porto Editora.
LOPES, Jorge (1989) - Técnicas da Programação, Editorial O Livro
Manual fornecido com o software (PASCAL).
O'BRIEN, Stephen K. - Turbo Pascal 6: The Complete Reference, Borland,
Osborne/McGraw-Hill.
Pascal, Técnicas de Programação, Lidel.
TREMBLAY, Jean-Paul; BUNT, Richard B. (1981) - Ciência dos
computadores uma abordagem algorítmica, McGraw-Hill.
Turbo Pascal 5.0/5.5, Lidel.
__________________________________________________________________ Agradecimentos
Prof. Carlos Almeida vii
AAppooiiooss ee aaggrraaddeecciimmeennttooss
• Paulo Sérgio de Moraes (2000)
• Osmar de Oliveira Braz Júnior (1998)
• Alexandre Alcobia (1998)
___________________________________________________________________________Índice
Prof. Carlos Almeida viii
ÍÍnnddiiccee
NOTA INTRODUTÓRIA II
SISTEMA DE AVALIAÇÃO III
ELENCO TEMÁTICO IV
BIBLIOGRAFIA VI
APOIOS E AGRADECIMENTOS VII
ÍNDICE VIII
LÓGICA DE PROGRAMAÇÃO 1
1. LÓGICA 1
2. SEQUÊNCIA LÓGICA 1
3. INSTRUÇÕES 1
4. ALGORITMO 2
REGRAS PARA CONSTRUÇÃO DO ALGORITMO 3
FASES DE UM ALGORITMO 4
TESTE DO ALGORITMO 5
5. PROGRAMAS 5
EXERCÍCIOS 7
6. ABORDAGEM ESTRUTURADA E CONCEPÇÃO TOP-DOWN 8
ABORDAGEM ESTRUTURADA 8
CONCEPÇÃO TOP-DOWN 8
7. PSEUDOCÓDIGO 8
ATRIBUIÇÃO 10
LEITURA E ESCRITA DE DADOS 10
CABEÇALHO 11
DECLARAÇÕES 11
CORPO DO ALGORITMO 11
COMENTÁRIOS 11
8. FLUXOGRAMAS 12
SIMBOLOGIA 12
_______________________________________________________________ Notas do Professor
Prof. Carlos Almeida ix
9. CONSTANTES, VARIÁVEIS E TIPOS DE DADOS 14
IDENTIFICADORES 15
CONSTANTES 16
VARIÁVEIS 16
TIPOS DE DADOS 17
EXERCÍCIOS 19
10. OPERADORES 21
OPERADORES ARITMÉTICOS 21
HIERARQUIA DAS OPERAÇÕES ARITMÉTICAS 22
OPERADORES DE COMPARAÇÃO OU RELACIONAIS 22
OPERADORES LÓGICOS 23
11. INSTRUÇÕES SIMPLES 24
INSTRUÇÕES DE ESCRITA 24
INSTRUÇÕES DE LEITURA 25
INSTRUÇÕES DE ATRIBUIÇÃO 25
EXERCÍCIOS 26
ESTRUTURAS DE DECISÃO 28
1. ESTRUTURAS FUNDAMENTAIS DE PROGRAMAÇÃO 28
2. ESTRUTURA DE DECISÃO CONDICIONAL - "SE" 28
EXEMPLO PRÁTICO 31
EXERCÍCIOS 32
3. ESTRUTURA DE DECISÃO DE ESCOLHA MÚLTIPLA - "CASO" 33
EXEMPLO PRÁTICO 34
EXERCÍCIOS 36
4. ESTRUTURAS DE REPETIÇÃO OU CICLOS 36
5. ESTRUTURA DE REPETIÇÃO - "PARA... FAZER" 37
6. ESTRUTURA DE REPETIÇÃO - "ENQUANTO... FAZER" 38
EXERCÍCIOS 39
7. ESTRUTURA DE REPETIÇÃO - "REPETIR ... ATÉ" 39
8. EXEMPLO PRÁTICO – NÚMERO PRIMO 41
ANÁLISE DO ALGORITMO 42
_______________________________________________________________ Notas do Professor
Prof. Carlos Almeida x
MELHORIA DO ALGORITMO 45
9. EXERCÍCIOS 48
ESTRUTURA DE DADOS 49
1. ESTRUTURA DE DADOS 49
2. VECTORES 51
EXERCÍCIOS SOBRE VECTORES 52
3. ORDENAÇÃO DE UM VECTOR 53
4. MATRIZES 55
EXERCÍCIOS SOBRE MATRIZES 56
5. REGISTOS 57
EXERCÍCIOS SOBRES REGISTOS 59
6. FICHEIROS 60
FICHEIROS DO TIPO TEXTO 61
FICHEIROS DO TIPO BINÁRIO 61
SUPORTES FÍSICOS DE FICHEIROS 62
OPERAÇÕES COM FICHEIROS 63
7. MANIPULAÇÃO DE FICHEIROS EM PASCAL 63
FICHEIROS FILE 64
TRATAMENTO DE FICHEIROS FILE 65
FICHEIROS TEXT 72
TRATAMENTO DE FICHEIROS TEXT 72
EXERCÍCIOS SOBRE FICHEIROS 77
Prof. Carlos Almeida 1
1 LLÓÓGGIICCAA DDEE PPRROOGGRRAAMMAAÇÇÃÃOO
1.16. Objectivos Iniciar o aluno nos conceitos da programação
estruturada. Decompor um problema nas suas partes elementares
através da técnica TOP-DOWN. Traduzir expressões matemáticas para computação e
vice-versa. Realizar algoritmos simples. Verificar a eficiência dos algoritmos através da técnica
de traçagem.
11.. LLóóggiiccaa
A lógica de programação é necessária para pessoas que desejam trabalhar com
desenvolvimento de sistemas e programas, ela permite definir a sequência lógica
para o desenvolvimento.
Lógica de programação é a técnica de encadear pensamentos para atingir determinado objectivo.
22.. SSeeqquuêênncciiaa LLóóggiiccaa
Estes pensamentos, podem ser descritos como uma sequência de instruções,
que devem ser seguidas para se cumprir uma determinada tarefa.
Sequência Lógica são passos executados até atingir um objectivo ou solução de um problema.
33.. IInnssttrruuççõõeess
Na linguagem comum, entende-se por instruções “um conjunto de regras ou
normas definidas para a realização ou emprego de algo”.
Em informática, porém, instrução é a informação que indica a um computador
uma acção elementar a executar.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 2
Convém ressaltar que uma ordem isolada não permite realizar o processo
completo, para isso é necessário um conjunto de instruções colocadas em ordem
sequencial lógica.
Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar
em prática uma série de instruções: descascar as batatas, bater os ovos, fritar as
batatas, etc.
É evidente que essas instruções tem que ser executadas em uma ordem
adequada – não se pode descascar as batatas depois de fritá-las.
Dessa maneira, uma instrução tomada em separado não tem muito sentido;
para obtermos o resultado, precisamos colocar em prática o conjunto de todas as
instruções, na ordem correcta.
Instruções são um conjunto de regras ou normas definidas para a realização ou emprego de algo. Em informática, é o que indica a um computador uma acção elementar a executar.
44.. AAllggoorriittmmoo
Antes de utilizarmos uma linguagem de computador, é necessário organizar as
acções a serem tomadas pela máquina de forma organizada e lógica, sem nos
atermos as regras rígidas da sintaxe de uma linguagem. Para isto utilizaremos uma
forma de escrever tais acções, conhecida como algoritmo.
Algoritmo consiste em um conjunto lógico e finito de acções (instruções) que resolvem um determinado problema.
Algoritmo é uma sequência lógica de instruções que podem ser executadas.
Um algoritmo é formalmente uma sequência finita de instruções que levam a
execução de uma tarefa. Podemos pensar em algoritmo como uma receita, uma
sequência de instruções que dão cabo de uma meta específica. Estas tarefas não
podem ser redundantes nem subjectivas na sua definição, devem ser claras e
precisas.
Como exemplos de algoritmos podemos citar os algoritmos das operações
básicas (adição, multiplicação, divisão e subtracção) de números reais decimais.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 3
Outros exemplos seriam os manuais de aparelhos electrónicos, como um vídeo, que
explicam passo-a-passo como, por exemplo, gravar um filme.
Até mesmo as coisas mais simples, podem ser descritas por sequências lógicas.
Por exemplo: “Chupar um rebuçado”:
1. Pegar no rebuçado
2. Retirar o papel
3. Chupar o rebuçado
4. Deitar o papel no lixo
“Somar dois números”:
1. Escrever o primeiro número
2. Escrever o segundo número
3. Somar o primeiro número com o segundo número
4. Devolver o resultado
Se analisarmos os diversos algoritmos, verificamos que contêm características comuns. São elas:
• descrição sequencial (ordenada), cada passo corresponde a uma acção elementar clara, não devendo ocasionar ambiguidade na sua interpretação;
• tem um número finito de passos.
Algoritmo não é a solução de um problema, pois, se assim fosse, cada problema
teria um único algoritmo. Algoritmo é um caminho para a solução de um problema, e
em geral, os caminhos que levam a uma solução são muitas.
Aprender algoritmos não se consegue a não ser através de muitos exercícios.
Algoritmos não se aprende:
• Copiando Algoritmos
• Estudando Algoritmos
Algoritmos só se aprendem:
• Construindo Algoritmos
• Testando Algoritmos
Regras para construção do Algoritmo
Para escrever um algoritmo precisamos descrever a sequência de instruções,
de maneira simples e objectiva. Para isso utilizaremos algumas técnicas:
• usar somente um verbo por frase;
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 4
• imaginar que se está a desenvolver um algoritmo para pessoas que não
trabalham com informática;
• usar frases curtas e simples;
• ser objectivo;
• procurar usar palavras que não tenham sentido duvidoso.
Fases de um Algoritmo
É importante ressaltar que qualquer tarefa que siga determinado padrão pode
ser descrita por um algoritmo, como por exemplo “como fazer arroz doce” ou então
“calcular o saldo financeiro de um stock”.
Entretanto ao construir um algoritmo, precisamos primeiro dividir o problema
apresentado em três fases fundamentais:
• ENTRADA: São os dados de entrada do algoritmo.
• PROCESSAMENTO: São os procedimentos utilizados para chegar ao
resultado final.
• SAÍDA: São os dados já processados.
Imagine o seguinte problema: Calcular a média final dos alunos.
Os alunos realizarão 3 provas: P1, P2 e P3. Onde:
3321 PPPMédiaFinal ++
=
Para montar o algoritmo proposto, faremos três perguntas:
a) Quais são os dados de entrada?
R: Os dados de entrada são P1, P2 e P3
b) Qual será o processamento a ser utilizado?
R: O procedimento será somar todos os dados de entrada e dividi-los
por 3: (P1+P2+P3)/3
c) Quais serão os dados de saída?
R: O dado de saída será a média final
ENTRADA PROCESSAMENTO SAÍDA
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 5
O algoritmo seria:
Algoritmo Calcular Média do aluno
1. Receber a nota da prova1
2. Receber a nota de prova2
3. Receber a nota de prova3
4. Somar todas as notas e dividir o resultado por 3
5. Mostrar o resultado da divisão
Teste do Algoritmo
Após desenvolver um algoritmo ele deverá sempre ser testado. Deve-se seguir
as instruções do algoritmo de maneira precisa para verificar se o procedimento
utilizado está correcto ou não.
No exemplo do algoritmo anterior, para calcular a média final do aluno, podia-se
utilizar a seguinte tabela para o teste:
P1 P2 P3 MédiaFinal
Explique o que entende por algoritmo.
55.. PPrrooggrraammaass
Programar consiste em elaborar um conjunto finito de instruções, reconhecidas
pela máquina, de forma que o computador execute estas instruções. Estas
instruções possuem regras e uma sintaxe própria, como uma linguagem tipo
português ou inglês, sendo isto chamadas de linguagem de programação.
No mundo computacional existe uma grande variedade de linguagens: Pascal,
C, C++, Visual Basic, Cobol, Fortran, etc. Nós iremos enfocar uma delas, o Pascal.
Os programas de computadores nada mais são do que algoritmos escritos numa linguagem de programação (Pascal, C, Cobol, Fortran, Visual Basic entre outras) e que são interpretados e executados por uma máquina, no caso um computador. Notem que dada esta interpretação rigorosa, um programa é por natureza muito específico e rígido em relação aos algoritmos da vida real.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 6
Para fazer um programa devemos ter claro o algoritmo do nosso problema.
Portanto, primeiro há que estudar o problema e elaborar o seu algoritmo.
Uma vez estabelecido o seu algoritmo podemos, então, passar para a sua
implementação numa linguagem de programação e assim testar o programa no
computador.
Concluindo, a construção de um programa comporta duas fases fundamentais:
• fase de resolução do problema - consiste na formulação do algoritmo
eficaz para a resolução do problema posto;
• fase de implementação - consiste na tradução do algoritmo para a
linguagem de programação escolhida.
Como exemplo, é apresentado o algoritmo e sua tradução em linguagem
Pascal, do cálculo do múltiplo de um número. Algoritmo do cálculo dos múltiplos de um número:
1. Anotar o limite dos múltiplos (limite)
2. Anotar o número do qual se quer saber os múltiplos (número)
3. O primeiro múltiplo é o próprio número (múltiplo = número)
4. Enquanto o múltiplo for menor que o limite indicado fazer:
4.1. Anotar o múltiplo
4.2. O novo múltiplo será igual ao múltiplo anterior mais o número
(múltiplo = múltiplo + número)
5. Fim do algoritmo.
program Multiplos (input, output);
{Este programa está escrito na linguagem PASCAL};
uses Crt;
var Limite : integer;
Numero : integer;
Multiplo : integer;
begin
clrscr;
write (‘Qual o valor de que se quer achar os múltiplos? ‘);
readln (Numero);
write (‘Qual é o limite da sequência? ‘);
readln (Limite);
writeln (‘Os múltiplos de ‘,Numero, ’ são: ‘);
Multiplo := Numero;
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 7
while Multiplo < Limite do
begin
writeln (Multiplo);
Multiplo := Multiplo + Numero;
end;
end.
EExxeerrccíícciiooss
Construa o algoritmo para calcular a área de um rectângulo. Algoritmo área do rectângulo
1. Entrar pelo teclado o valor do lado1
2. Entrar pelo teclado o valor do lado2
3. Calcular a área A = lado1 x lado2
4. Apresentar no ecrã o valor da área
Faça um algoritmo para somar dois números e multiplicar o resultado pelo primeiro
número.
Crie uma sequência lógica para tomar banho.
Descreva com detalhes a sequência lógica para trocar um pneu de um carro.
Faça um algoritmo detalhado para trocar uma lâmpada.
Algoritmo do calculo da hipotenusa de um triângulo rectângulo.
Temos que saber a fórmula: 22 21 catetocatetohipot +=
Além da fórmula, temos que dar ao computador os valores dos catetos do triângulo.
Construa um algoritmo que transforme os valores da temperatura em graus
Fahrenheit para graus Célsius. Tente resolver este problema, sabendo que a fórmula a aplicar será:
( )3295
−×= fahrcelsius
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 8
Identifique os dados de entrada, processamento e saída no algoritmo seguinte: 1. Receber código da peça
2. Receber valor da peça
3. Receber Quantidade de peças
4. Calcular o valor total da peça (Quantidade * Valor da peça)
5. Mostrar o código da peça e seu valor total
Faça um algoritmo para “Calcular o stock médio de uma peça”, sabendo que
STOCK_MÉDIO = (QUANTIDADE_MÍNIMA + QUANTIDADE_MÁXIMA) /2
Teste o algoritmo anterior com dados à sua escolha.
66.. AAbboorrddaaggeemm EEssttrruuttuurraaddaa ee CCoonncceeppççããoo TToopp--DDoowwnn
Abordagem Estruturada
Numa linguagem estruturada como por ex. o Pascal distingue-se a parte onde
são declarados os dados e o corpo com as instruções do programa – parte
declarativa e parte operativa.
Abordagem estruturada é uma abordagem sistemática da construção de software que usa princípios como a separação das definições de dados e de programa, concepção descendente (designado por abordagem top-down) e refinamento progressivo.
Concepção Top-Down
A abordagem top-down procura identificar os pontos essenciais da questão;
parte-se dos pontos mais gerais para os seus componentes mais particulares, em
níveis sucessivos mais concretos, até ao nível de pormenor desejado.
77.. PPsseeuuddooccóóddiiggoo
Por pseudocódigo entende-se um código de escrita em que se utilizam
representações simbólicas para indicar as instruções do algoritmo. Essas
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 9
representações simbólicas são, usualmente, um misto de palavras da nossa
linguagem natural com termos e notações típicas de uma linguagem de
programação.
O uso da escrita em pseudocódigo presta-se a uma aproximação sucessiva à
versão do algoritmo na linguagem utilizada, ou seja, pode-se ir progredindo por
fases, revendo o pseudocódigo e substituindo-o progressivamente por terminologia
própria da linguagem de programação.
Não é demais relembrar que, depois de efectuar o algoritmo, deve-se verificar
se está escrito sem falhas do ponto de vista dos objectivos que se pretendiam
alcançar, por imprecisões, deficiente formulação algorítmica, vícios de raciocínio,
etc.
O pseudocódigo pode ser visto como a tentativa de fundir a expressividade da linguagem natural e o rigor lógico de esquemas como o fluxograma.
O pseudocódigo permite a descrição do algoritmo de uma forma linear, fácil de ler e fácil de compreender.
Os algoritmos terão a seguinte estrutura: Algoritmo <Nome do algoritmo>
<Definições/Declarações de Variáveis e Constantes>
Início
<Instruções>
Fim
Por curiosidade, em Pascal ficaria da seguinte forma: PROGRAM <Nome do programa>;
<Definições/Declarações de Variáveis e Constantes>;
BEGIN
<Instruções>;
END.
O algoritmo, em pseudocódigo, deve estar enquadrado entre dois indicadores
que possibilitem determinar onde o algoritmo começa e acaba. Assim, aparecem as
instruções Início e Fim.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 10
Atribuição
Esta operação tem por objectivo atribuir um valor a uma variável. A variável
funciona como um recipiente em que vão ser colocados dados.
Temos de criar tantas variáveis (recipientes) quantas as forem necessárias para
o correcto funcionamento do algoritmo.
A operação de atribuição coloca o dado na variável.
Exemplo: X B/A (na variável X é colocado o valor de B/A)
Leitura e Escrita de Dados
A instrução Escrever é utilizada para apresentar os dados ao utilizador.
Exemplo: Escrever(‘O valor da área é: ’, área)
A instrução Ler é utilizada para introduzir dados no computador através do
operador. Estes dados são afectados a variáveis.
Exemplo: Ler(A, B)
Vejamos um exemplo em pseudocódigo do algoritmo da circunferência e vamos
descrever a sua apresentação: Algoritmo circunferência
[Este algoritmo dá as características de uma circunferência]
Dados
RAIO: Inteiro
ÁREA, PERÍMETRO: Reais
PI 3,14159
Início
Ler (RAIO)
ÁREA PI x RAIO2
PERÍMETRO 2 x PI x RAIO
Escrever (ÁREA, PERÍMETRO)
Fim
Num algoritmo, podemos definir três secções:
• Cabeçalho
• Declarações
• Corpo do algoritmo
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 11
Cabeçalho
O cabeçalho é a secção onde é dado o nome ao algoritmo. Começa com a
palavra “Algoritmo”.
Declarações
Nesta, é apresentada a descrição das variáveis e constantes usadas.
Corpo do algoritmo
Esta secção contém a sequência das instruções (acções) do algoritmo. Inicia-se
com a palavra “Início” e termina com a palavra “Fim”.
Comentários
Existe um tipo de objecto de grande importância na clarificação de um algoritmo.
São os comentários que ajudam muito à sua compreensão.
Cada passo do algoritmo pode iniciar com um comentário entre dois parênteses
rectos. Estes comentários dão uma breve descrição da instrução ou de um conjunto
de instruções seguintes.
Os comentários são uma parte importante do algoritmo. Eles servem para tornar a leitura, do algoritmo, mais fácil e clara.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 12
88.. FFlluuxxooggrraammaass
O fluxograma é uma forma padronizada e eficaz para representar as instruções
lógicas de um determinado processamento.
Com o fluxograma podemos definir uma sequência de símbolos, com significado
bem definido, portanto, sua principal função é a de facilitar a visualização dos
passos de um processamento.
Actualmente, a sua utilização restringe-se a um apoio complementar na
documentação do algoritmo, valendo pela vantagem gráfica da apresentação das
interligações.
Simbologia
Existem diversos símbolos num fluxograma. Vamos apresentar os mais
utilizados.
Vejamos de seguida alguns dos símbolos que iremos utilizar:
Processamento em geral (ex. soma de dois números)
Decisão condicional
Leitura/Escrita de dados (ex. escrever a nota da prova escrita)
Escolha múltipla
Início/Fim de processamento (ex. inicio do algoritmo)
Subprograma
Conector de fluxos (ex. Ligação entre partes do fluxograma) Linha de fluxo
Dentro de cada símbolo terá sempre algo escrito, pois caso contrário não nos
dizem nada.
Vejamos o seguinte exemplo, na linguagem pseudocódigo e respectivo
fluxograma, que faz a comparação de dois números:
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 13
Inicio
Ler valor1
Ler valor2
Valor1>Valor2 Valor2>Valor2Não
Escrever"Valor1 é maior"
Sim
Escrever"Valor2 é maior"
Sim
Escrever"Valores iguais"
Não
Rotina Adeus
Fim
Algoritmo Comparar
Dados
VALOR1, VALOR2: Inteiros
FRASE: Caracteres
Início
Ler (VALOR1, VALOR2)
Se VALOR1 > VALOR2 então
FRASE ‘Valor1 é maior’
Senão
Se VALOR1 < VALOR2 então
FRASE ‘Valor2 é maior’
Senão
FRASE ‘Valores iguais’
Fim se
Fim se
Escrever (FRASE)
Chamar Rotina Adeus
Fim
Fluxograma
Pseudocódigo
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 14
99.. CCoonnssttaanntteess,, VVaarriiáávveeiiss ee TTiippooss ddee DDaaddooss
Considere a fórmula simples de matemática do calculo do volume de uma
esfera: 2
34 RV π= . Nesta formula pode-se encontrar:
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 π;
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.
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 (disco duro, disquete, CD-ROM etc.).
A memória do computador pode ser entendida como uma sequência finita de
caixas ou gavetas de um armário, que num dado momento, guardam algum tipo de
informação, como número, uma letra, uma palavra, uma frase etc..
O computador, para poder trabalhar como alguma destas informações, precisa
saber onde, na memória, a informação está localizada. 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.
Variáveis e constantes são os elementos básicos que um programa manipula.
Muitos dos dados com que se opera num algoritmo são variáveis. Uma variável é um
espaço reservado na memória do computador para armazenar um tipo de dado
determinado.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 15
Identificadores
As variáveis e constantes num algoritmo são designadas por meio de
identificadores. Um identificador é um nome normalmente atribuído a um elemento
com que se pretende trabalhar dentro de um algoritmo.
Um identificador é formado por uma letra ou então por uma letra seguida de
letras ou dígitos. Não é permitido o uso de espaços em branco ou de qualquer outro
caracter, que não seja letra ou dígito.
Se utilizar mais do que uma palavra para compor o nome da variável utilize o “_”
underline para separar as palavras.
Por convenção, vamos escrever o nome dos identificadores em letras
maiúsculas, para maior legibilidade do algoritmo.
A formação do identificador deve ser um nome significativo, para que se possa ter ideia do seu conteúdo.
Exemplos, apresentados numa tabela com possíveis entidades e os
correspondentes identificadores das variáveis:
ENTIDADES IDENTIFICADORES Nome do cliente NOME_CLIENTE Morada dos clientes MORADA Data em que foi feita a encomenda DATA
Quando se trata de variáveis, um identificador vai traduzir-se em termos de
compilação, num endereço de memória, o qual corresponde a um determinado
espaço nessa mesma memória, onde se vai armazenar um dado - o valor que a dita
variável assume em cada momento. Isto leva-nos a considerar, em programação,
que um identificador é um endereço simbólico, pois que se preferimos, um candidato
a endereço de memória.
Um identificador é um nome normalmente atribuído pelo algoritmo ou utilizador a um elemento com que se pretende trabalhar dentro de um algoritmo. Em programação, um identificador é um endereço simbólico, um candidato a endereço de memória.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 16
Constantes
Constante é um determinado valor fixo que não se modifica ao longo do tempo,
durante a execução de um programa.
Conforme o seu tipo, a constante é classificada como sendo numérica, lógica e
alfanuméricas.
Constante é um determinado valor fixo que não se modifica ao longo do tempo, durante a execução de um programa.
Exemplo de declarações de constantes, em pseudocódigo: Constantes
PI 3,14
MAXIMO 30
POR_DEFEITO ‘Sem nome’
Variáveis
Variável é a representação simbólica dos elementos de um certo conjunto. Cada
variável corresponde a uma posição de memória, cujo conteúdo pode se alterado ao
longo do tempo durante a execução de um programa.
As variáveis podem assumir:
• um carácter global, quando são declaradas para uso em todo o algoritmo;
• um carácter local, quando são declaradas apenas para uso dentro do
subalgoritmo.
Embora uma variável possa assumir diferentes valores, ela só pode armazenar
um valor a cada instante. As variáveis só podem armazenar valores de um mesmo
tipo, de maneira que também são classificadas como sendo numéricas, lógicas e
alfanuméricas.
Uma variável é uma posição de memória, representada por um Identificador, a qual contém, num dado instante, uma informação.
Exemplos de declarações de variáveis em pseudocódigo:
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 17
Variáveis
MAXIMO, NUM: Inteiro
NOME: Caracteres
SAIR: Lógico
Outros exemplos:
TOTAL PRODUTO * QUANTIDADE
NOME ‘Carlos Almeida’
TOTAL 30
Tipos de Dados
As variáveis e as constantes podem ser basicamente de três tipos: Numéricas
(Inteiro ou real), alfanuméricas (caracter ou cadeia de caracteres) ou lógicas.
Numéricas: Específicas para armazenamento de números, que posteriormente poderão ser
utilizados para cálculos. Podem ser ainda classificadas como Inteiras ou Reais.
As variáveis do tipo inteiro são para armazenamento de números inteiros e as
Reais são para o armazenamento de números que podem ter partes decimais.
Alfanuméricas: Existem actualmente vários códigos susceptíveis de ser utilizados pelos
computadores digitais. Alguns desses códigos permitem representar, não apenas
grandezas numéricas, mas também caracteres literais e sinais de pontuação. É
exemplo o código ASCII ("American Standard Code for Information Interchange" -
leia-se "ásqui"), usado na transferência de informação entre um computador e os
seus dispositivos periféricos. Trata-se de um código que utiliza combinações de oito
bits (28 = 256) para representar os dez algarismos decimais (0, 1, 2, ..., 9), os
caracteres do alfabeto (a, b, ..., z, A, B, ..., Z), sinais de pontuação, parêntesis, sinais
das operações aritméticas e de igualdade, e mais uma série de caracteres de
controlo, entre outros símbolos, num total de 256 símbolos.
Variáveis
Variável Conteúdo da Variável
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 18
Os códigos que se destinam a traduzir, não só informação numérica, mas
também caracteres do alfabeto e sinais convencionais são denominados códigos
alfanuméricos. O código ASCII, referido acima, representa o código alfanumérico
universalmente aceite.
Os dados do tipo caracter (Char em Pascal) correspondem a caracteres
individuais. Os caracteres disponíveis são geralmente os caracteres da Tabela
ASCII. Este tipo de dado pode assumir qualquer caracter da referida Tabela ASCII,
mas apenas um de cada vez. Por curiosidade, existe rotinas para converter um dado
número inteiro para o correspondente caracter na Tabela ASCII. Por exemplo, a
função CHR, em Pascal. Por sua vez, existe rotinas que dá o ordinal de um dado
caracter, por exemplo a função ORD em Pascal.
Para facilitar a manipulação de palavras ou mensagens, dentro de um
programa, existe outro tipo de dados: Cadeia de caracteres (também deignado por:
Cadeia Alfanumérica, texto, ou simplesmente caracteres). Estes tipos de dados são
mais adequados ao manuseamento de texto, nas instruções de leitura, escrita e
atribuição. Em Pascal este tipo de dados é representado pelo tipo de variável: String.
Numa atribuição de um valor a uma variável do tipo CHAR (Caracter) ou
STRING (Cadeia de caracteres), temos que ter o cuidado de colocar o valor (dado)
entre aspas (‘), pois esta é a forma de informar que a informação é caracter ou
cadeia de caracteres.
Lógicas: Os dados do tipo lógico, são dados que podem assumir apenas dois valores
possíveis: verdadeiro e falso. A sua utilidade reside, fundamentalmente, ao nível do
seu emprego em estruturas de controlo.
As variáveis do tipo inteiro são para armazenamento de números inteiros e as Reais são para o armazenamento de números que podem ter partes decimais.
Os dados do tipo caracter correspondem a caracteres individuais. Os caracteres disponíveis são geralmente os caracteres da Tabela ASCII.
Existe tipos de dados mais adequados ao manuseamento de texto, nas instruções de leitura, escrita e atribuição. Este tipo de dados é representado pelo tipo de variável: Caracteres.
Os dados do tipo lógico, são dados que podem assumir apenas dois valores possíveis: verdadeiro e falso.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 19
O que é uma constante? Dê dois exemplos.
O que é uma variável? Dê dois exemplos.
O Pascal exige que no momento da declaração das variáveis, se define 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 de dados para a declaração de variáveis. Alguns destes
tipos de dados 0são representados na seguinte tabela:
Pseudocódigo Pascal Descrição
Inteiro Integer Representa números entre -32768 até +32767. ocupa 2 bytes na memória.
Real Real Representa os números entre 2.9 x 10-39 até 1.7 x 1038. Ocupa 6 bytes na memória.
Caracter Char Representa um dos caracteres, da tabela ASCII. Ocupa 1 byte na memória.
Caracteres String Conjunto de caracteres (Char). Ocupa de 1 a 255 bytes na memória.
Lógico Bolean Valor lógico. Assuma somente dois valores: TRUE (Verdade) ou FALSE (Falso). ocupa 1 byte na memória.
Word Números de 0 até 65535. Ocupa 2 bytes na memória. Byte Números de 0 até 255. Ocupa 1 byte na memória.
Shor Int Representa os números entre -128 até 128. Ocupa 1 bytes na memória.
LongInt Representa os números entre -2147483648 até 2147483648. Ocupa 4 bytes na memória.
Single Representa os números entre 1.5 x 10-45 até 3.4 x 1038. Ocupa 4 bytes na memória.
Double Representa os números entre 5 x 10-324 até 1.7 x 10308. Ocupa 8 bytes na memória.
EExxeerrccíícciiooss
1. Explicite a diferença entre uma constante e uma variável, no contexto de um
programa.
Descreva resumidamente o que se passa ao nível dos identificadores de variáveis,
quando um programa entra em execução e esses identificadores são tratados
internamente pelo computador.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 20
Identifica o tipo de cada uma das constantes
a) 613
b) ‘R’
c) 1
d) 613,0
e) -613
f) ‘613’
g) -3,012 * 1015
h) Falso
i) 17 * 1012
j) -28,3 * 10-23
k) ‘Fim de Questão’
Elabore um Algoritmo para atribuir a variáveis as seguintes informações:
l) 12345
m) ‘123456’
n) -1122
o) 10,45
p) VERDADE
q) ‘c’
r) ‘Amor’
Qual a diferença existente nas seguintes atribuições?
s) Letra ‘A’
Nome ‘João’
t) Letra A
Nome João
É correcto definir uma variável como sendo Carácter e atribuirmos a ela o valor:
“PEDRO”? E se a variável fosse definida como Caracteres (cadeia de caracteres), a
mesma poderia receber um valor do tipo Caracter?
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 21
No seguinte Algoritmo existe algum erro? Onde? Algoritmo Teste
Variáveis
MARIA: Caracteres
IDADE: Inteiro
LETRA: Caracter
MARIA: Real
Inicio
IDADE 23
IDADE 678
IDADE LETRA
LETRA 300
LETRA ‘abc’
LETRA ‘A’
LETRA 22
IDADE IDADE_ALUNO
Fim
1100.. OOppeerraaddoorreess
Os operadores são meios pelo qual incrementamos, decrementamos,
comparamos e avaliamos dados dentro do computador. Temos três tipos de
operadores:
• Operadores Aritméticos
• Operadores Relacionais
• Operadores Lógicos
Operadores Aritméticos
Os operadores aritméticos são os utilizados para obter resultados numéricos.
Além da adição, subtracção, multiplicação e divisão, podem utilizar também o
operador para exponenciação.
Os operadores aritméticos utilizam-se normalmente com dois operandos. No
entanto, os operadores + e - também podem ser usados com um só operando, caso
em que significam: o sinal positivo ou o sinal negativo atribuído ao operando.
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 22
Os símbolos para os operadores aritméticos são:
OPERADORES ARITMÉTICOS DESIGNAÇÃO OPERADOR
Adição + Subtracção - Multiplicação * Divisão / Resto da divisão (Resto) MOD Divisão inteira (Quociente) DIV potenciação ^
Hierarquia das Operações Aritméticas
A hierarquia das operações aritméticas são:
1. ( ) – parênteses
2. ^ – exponenciação
3. * ou / – multiplicação ou divisão (o que aparecer primeiro)
4. + ou – soma ou subtracção (o que aparecer primeiro)
Exemplo: 1 + 7 * 2 ^ 2 –1 = 28
3 * (1 – 2) + 4 * 2 = 5
Operadores de Comparação ou Relacionais
Os operandos empregues com os operadores de comparação devem ser de
tipos compatíveis entre si. Os resultados que devolvem são sempre do tipo valor
lógico, ou seja, verdadeiro ou falso. Estes operadores podem ser usados com
quaisquer tipos de ordinais, com reais e alfanuméricos.
Para estabelecer prioridades no que diz respeito a qual operação executar
primeiro, utiliza-se os parênteses.
Os operadores relacionais são:
Operadores de Comparação Designação Operador
igual a = diferente de ≠ ou <> maior que > menor que < maior ou igual a ≥ ou >= menor ou igual a ≤ ou <=
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 23
Exemplo: Tendo duas variáveis A = 5 e B = 3
Os resultados das expressões seriam:
Expressão Resultado
A = B Falso
A <> B Verdadeiro
A > B Verdadeiro
A < B Falso
A >= B Verdadeiro
A <= B Falso
Operadores Lógicos
Os operadores de valores lógicos operam normalmente com operandos do tipo
valor lógico e devolvem resultados desse mesmo tipo, ou seja, o resultado final é
verdadeiro ou falso. Também são utilizados com muita frequência, tal como os
operadores relacionais, em estruturas de decisão e no controlo de ciclos de
repetição.
Os operadores lógicos servem para combinar resultados de expressões, retornando se o resultado final é verdadeiro ou falso.
Os operadores lógicos são:
Operadores de Valore Lógico Designação Operador
Negação NÃO Conjunção E Disjunção OU Disjunção Inversa XOR
Uma expressão E (AND) é verdadeira se todas as condições forem verdadeiras. O resultado da expressão E é falsa se pelo menos uma condição for falsa.
Uma expressão OU (OR) é verdadeira se pelo menos uma condição for verdadeira. O resultado da expressão OU é falsa se todas as condições forem falsas.
Um expressão NÃO (NOT) inverte o valor da expressão ou condição, se verdadeira inverte para falsa e vice-versa.
A tabela abaixo mostra todos os valores possíveis criados pelos quatro
operadores lógicos:
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 24
Operador AND Operador OR TRUE AND TRUE TRUE TRUE AND FALSE FALSE FALSE AND TRUE FALSE FALSE AND FALSE FALSE
TRUE OR TRUE TRUE TRUE OR FALSE TRUE FALSE OR TRUE TRUE FALSE OR FALSE TRUE
Operador NOT Operador XOR NOT TRUE FALSE NOT FALSE TRUE
TRUE XOR TRUE FALSE TRUE XOR FALSE TRUE FALSE XOR TRUE TRUE FALSE XOR FALSE FALSE
Exemplos: Suponha que temos três variáveis A=5, B=8 e C=1.
Os resultados das expressões seriam: Expressões Resultado
A=B AND B>C FALSO
A<>B OR B<C VERDADEIRO
NOT A>B VERDADEIRO
A<B AND B>C VERDADEIRO
A>=B OR B=C FALSO
NOT A<=B FALSO
1111.. IInnssttrruuççõõeess SSiimmpplleess
Instruções de Escrita
As instruções de escrita são aquelas que servem para enviar dados
(mensagens, valores de variáveis, etc.) para um dispositivo de saída ou periférico de
"output".
Como se sabe, o dispositivo de saída mais comum no trabalho com um
computador é o monitor de vídeo ou ecrã; no entanto, o envio de dados para a
impressora ou para um ficheiro em disco ou disquete também são tarefas normais e,
por vezes, mesmo imprescindíveis.
Exemplos das instruções de escrita, mais usuais, em pseudocódigo: [Imprimir a mensagem]
Escrever(‘Não existe quarto vago do tipo escolhido.')
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 25
[Imprimir a percentagem]
Escrever(‘A percentagem de alunos com nota superior à media é ‘,
PERC, ‘%’)
Instruções de Leitura
Tal como a saída de dados do computador para um periférico é essencial,
também a entrada de dados o é.
Os principais dispositivos que permitem a leitura, entrada ou "input" de dados
num sistema informático são, como se sabe, em primeiro lugar, o teclado, em
segundo, os dispositivos de armazenamento secundário, ou seja os discos e
disquetes, e ainda mais alguns outros, como o rato, etc.
Exemplo de uma instrução de escrita em pseudocódigo: [Ler a remuneração mensal]
Ler(REMUNERAÇÃO)
[Ler as variáveis X e Y ]
Ler(X, Y)
Instruções de Atribuição
Muitos dos dados com que se opera num algoritmo são variáveis. As variáveis e
constantes num algoritmo são designadas, como foi dito anteriormente, por meio de
identificadores. Quando declaramos uma variável é natural atribuirmos a ela um
valor ou uma informação.
Uma das formas de atribuir ou alterar um valor a uma variável, é através da
instrução de leitura como acabámos de ver no ponto anterior. Uma outra forma é
através de uma instrução de atribuição. Para isto utilizaremos o símbolo “:=” em
Pascal, e “ ” em pseudocódigo, que significa “recebe o valor”, ou seja, a posição,
de memória que uma variável representa, receberá um valor, a qual será atribuído à
variável.
Numa instrução de atribuição, o valor que se atribui à variável em causa pode
ser:
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 26
• um valor directo; por exemplo: NUM 10
• um valor contido noutra variável; por exemplo: NUM TOTAL
• um valor resultante de uma expressão; por exemplo: NUM (A + B) / 2
Exemplos de instruções de atribuição, em pseudocódigo: [Inicializar variáveis]
SOMA 0
[Calcular a Média e incrementar Valor]
MÉDIA SOMA / 15
VALOR VALOR + 1
EExxeerrccíícciiooss
1. Indique qual o resultado será obtido das seguintes expressões:
a) 1/2
b) 1 DIV 2
c) 1 MOD 2
d) (200 DIV 10) MOD 4
e) 6 +19-23
f) 3,0* 5,0 +1
g) 1/4+2
h) 29,0/7+4
i) ‘Carlos ‘ + ‘Almeida’
Indique o resultado das seguintes expressões:
j) 2 > 3
k) (6 < 8) OR (3 > 7)
l) (((10 DIV 2) MOD 6) > 5) XOR (3 < (2 MOD 2))
m) NOT (2 < 3)
Construa o algoritmo que calcule a seguinte expressão:
2 + 3 * { 23 - 12 + [ { ( 123 / 34 ) + 10 } / 2 - 1 * ( 45 - 12 ) ] / 3 }
____________________________________________________________Lógica de Programação
Prof. Carlos Almeida 27
Escreva os comandos de atribuição para a seguintes fórmulas matemáticas:
n) XA B
C
D EF
=+
−
o) X B A FA
=− +
−
−2 4 23 2
3
Construa uma algoritmo e respectivo fluxograma que lê o raio de uma circunferência
e calcula sua área.
Prof. Carlos Almeida 28
2 EESSTTRRUUTTUURRAASS DDEE DDEECCIISSÃÃOO
1.17. Objectivos Prosseguir com o estudo de algoritmos, introduzindo
agora as estruturas clássicas de decisão, o que vem completar a unidade anterior.
11.. EEssttrruuttuurraass FFuunnddaammeennttaaiiss ddee PPrrooggrraammaaççããoo
Nas estruturas de um algoritmo é, frequentemente, necessário:
• jogar com determinadas condições, para decidir se se deve executar uma
ou outra instrução;
• repetir uma série de instruções, um determinado número de vezes ou
enquanto se verificar uma certa condição;
• noutros casos ainda, temos um conjunto de instruções que se repete em
diversos pontos do programa, tornando-se então útil passar a tratá-lo
como um subalgoritmo.
22.. EEssttrruuttuurraa ddee DDeecciissããoo CCoonnddiicciioonnaall -- ""SSee""
Até agora temos estado a lidar com algoritmos puramente sequenciais, isto é, as
instruções são cumpridas uma após outra até chegar ao fim do algoritmo. No
entanto existem estruturas que permitem a tomada de decisões em função de
condições estabelecidas e assim, o algoritmo apresenta instruções alternativas.
Estas condições podem ser verdadeiras ou falsas; conforme esse valor o algoritmo
segue uma instrução ou segue outra em alternativa.
Estas estruturas não são mais que instruções complexas, geralmente,
compostas por várias palavras, mas formando um todo.
A estrutura de decisão condicional mais difundida e utilizada é a que se baseia
na instrução “Se”.
As estruturas “Se” podem ser “encaixadas” umas dentro das outras (Estruturas
“Se” encadeadas).
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 29
A sintaxe desta estrutura, em pseudocódigo, é a seguinte: Se <Condição> Então
<Instrução se condição verdadeira>
[Senão
<Instrução se condição falsa>]
Fim Se
• <Condição> - a condição de controlo é normalmente uma expressão do
tipo lógico, isto é, que pode assumir apenas um entre dois valores
possíveis: verdadeiro ou falso;
• <Instrução...> - obviamente, será uma determinada instrução que se
pretende efectuar. Esta instrução tanto pode ser uma instrução simples,
como uma instrução composta, ou seja, um conjunto de instruções;
• o significado dos parêntesis rectos [...] indica que se trata de uma parte
opcional. Assim, o comando “Senão” e a sua respectiva instrução é
opcional, ou seja, só é utilizável quando se desejar ou for necessário.
Se tivermos um conjunto de instruções (instruções compostas) para considerar
dentro da estrutura podemos inseri-la entre delimitadores “Início ... Fim”.
Resumindo a sintaxe:
<Condição> NÃO
<Instrução seFALSO>
<Instrução seVERDADEIRO>
SIM
Se <Condição> Então
<Instrução se VERDADEIRO>
Senão
<Instrução se FALSO>
Fim Se
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 30
<Condição> SIM
<Instrução seVERDADEIRO>
Se <Condição> Então
<Acção se VERDADEIRO>
Fim Se
Num fluxograma, toda decisão terá sempre como resposta o resultado VERDADEIRO ou FALSO.
Essas decisões interferem directamente no andamento do algoritmo.
Como no exemplo do algoritmo “Chupar um Rebuçado”. Imaginemos que
algumas pessoas não gostem de chupar rebuçados de morango, neste caso
teremos que modificar o algoritmo para:
Algoritmo “Chupar um rebuçado”
Pegar no rebuçado
O rebuçado é de morango?
Se sim, não chupar o rebuçado
Se não, continuar com o algoritmo
Retirar o papel
Chupar o rebuçado
Deitar o papel no lixo
Inicio
Pegar no rebuçado
É de morango?
Não chupar orebuçado
Retirar o papel
Chupar o rebuça
Deitar o papel nolixo
Fim
SIMNÃO
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 31
Exemplos de estruturas de decisão condicional, em pseudocódigo:
[Exemplo 1]
Se X = 1 E K > VALOR Então
Se K < MENOR Então
M VALOR
Fim Se
Fim Se
[Exemplo 2a]
Se ANDAR = 0 Então
QUARTO_VAGO 0
K 0
Senão
Escrever(‘Nenhum quarto vago.’)
Fim Se
[Exemplo 2b]
Se ANDAR = 0 Então
Início
QUARTO_VAGO 0
K 0
Fim
Senão
Escrever(‘Nenhum quarto vago.’)
Fim Se
Exemplo Prático
Vejamos o seguinte exemplo:
Dado dois valores A e B quaisquer, faça um algoritmo que
imprima se A > B, ou A < B , ou A = B
Algoritmo Maior
Variáveis
A, B: Inteiro
Inicio
Escrever(‘Digite os valores A e B’)
Ler(A, B)
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 32
Se A > B Então
Escrever(‘A é maior que B’)
Senão
Se A < B Então
Escrever(‘A é menor que B’)
Senão
Escrever(‘A é igual a B’)
Fim Se
Fim Se
Fim
Com curiosidade, na linguagem pascal seria: PROGRAM Maior;
VAR
A, B: BYTE;
BEGIN
WRITE(‘Digite os valores A e B’);
IF A > B THEN
WRITE(‘A é maior que B’)
ELSE
IF A < B THEN
WRITE(‘A é menor que B’)
ELSE
WRITE(‘A é igual a B’);
END.
Exercícios
1. Elabore um fluxograma que leia um número. Se positivo armazene-o em A, se for
negativo, em B. No final mostrar o resultado.
2. Faça um algoritmo que leia os valores A, B, C e diga se a soma de A + B é
menor que C.
3. Faça um algoritmo que leia dois valores inteiros A e B. Se os valores forem iguais
soma A com B, caso contrário multiplique A por B. No final do calculo atribuir o
valor para uma variável C.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 33
4. Construa um algoritmo em pseudocódigo para ler um número e verificar se ele é
par ou ímpar. Quando for par armazenar esse valor em P e quando for ímpar
armazená-lo em I. Exibir P e I no final do algoritmo.
5. Construa um fluxograma para ler uma variável numérica N e imprimi-la somente
se a mesma for maior que 100, caso contrário imprimi-la com o valor zero.
6. Tendo como dados de entrada a altura e o sexo de uma pessoa, construa um
algoritmo que calcule seu peso ideal, utilizando as seguintes fórmulas:
• Para homens: (72.7*h) - 58
• Para mulheres: (62.1*h) - 44.7 (h = altura)
7. Construa uma algoritmo e respectivo fluxograma que lê o nome e as 4 notas
bimestrais de um aluno. Em seguida o Algoritmo calcula e escreve a média
obtida pelo aluno escrevendo também se o aluno foi aprovado ou reprovado.
33.. EEssttrruuttuurraa ddee DDeecciissããoo ddee EEssccoollhhaa MMúúllttiippllaa -- ""CCaassoo""
Há casos em que se tem de optar entre várias opções que uma variável pode
dispor, pelo que se terá de recorrer a várias estruturas “Se” encadeadas. O
encadeamento das estruturas de decisão condicional “Se” traz dificuldade na
interpretação do algoritmo. Neste caso, temos uma estrutura de decisão composta
ou decisão de escolha múltipla que vai tornar a leitura do algoritmo mais fácil.
Essa estrutura é conhecida pela estrutura “Caso”. Numa estrutura "Caso" há
uma variável, cujos valores que possa assumir vão ser utilizados no controlo das
alternativas ou instruções a escolher - a esta variável é costume chamar-se selector.
A Sintaxe desta estrutura, em pseudocódigo, é a seguinte: Caso <Variável>
<Valor 1> : <Instrução 1>
<Valor 2> : <Instrução 2>
(...)
<Valor n> : <Instrução n>
[Senão : <Instrução>]
Fim Caso.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 34
• Quando se indica <Valor 1>, <Valor 2>, etc., estamos a referir aos valores
possíveis que a variável de controlo poderá assumir. Pode ser apenas um
valor ou um conjunto de valores.
• Quando de indica <Instrução 1>, <Instrução 2>, etc., pode tratar-se de
uma só instrução ou de uma instrução composta, portanto um conjunto de
instruções a realizar.
• Em algumas implementações existe também uma cláusula "Senão" que se
destina a complementar o leque de alternativas, no caso de haver ainda
mais hipóteses não explicitadas, e em que pode haver ainda uma outra
instrução ou conjunto de instruções a indicar.
O fluxograma seria da forma:
Variável
Instrução 1 Instrução 2 (...) Instrução n-1 Instrução n
Valor 1
Valor 2
(...)
Valor n-1
Valor n
Exemplo Prático
Construa um algoritmo que caracteriza algumas letras do alfabeto usando a
estrutura condicional “Se” e a estrutura “Caso”, com a seguinte caracterização:
• Primeiras letras: ‘a’, ‘b’
• Alfabeto inglês: ‘k’, ‘w’, ‘y’
• Última letra: ‘z’
• Outras letras do alfabeto: restantes letras
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 35
Algoritmo Selecção
[Este algoritmo caracteriza algumas letras do alfabeto]
Variáveis
LETRA: Caracter
FRASE: Caracteres
Início
Ler(LETRA)
Caso LETRA
‘a’, ‘b’: FRASE ‘Primeiras letras’
‘k’, ‘w’, ‘y’: FRASE ‘Alfabeto inglês’
‘z’: FRASE ‘Última letra’
Senão: FRASE ‘Outras letras do alfabeto’
Fim Caso
Escrever(FRASE)
Fim
LETRA
FRASE <-- 'Primeiras letras' FRASE <-- 'Alfabeto inglês' FRASE <-- 'Última letra' FRASE <-- 'Outras letras do alfabeto'
'a', 'b'
'k', 'w', 'y' 'z'
outros valores
Início
Escrever FRASE
Ler LETRA
Fim
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 36
Exercícios
1. Construa um algoritmo da discussão da equação do segundo grau. A equação do
segundo grau apresenta-se na forma 02 =++ cbxax . A resolução desta equação
é baseada na utilização do binómio discriminante acb 42 − . Assim, temos três
situações:
• binómio discriminante > 0: tem solução dada por a
acbb2
42 −±−
• binómio discriminante < 0: não tem solução nos reais
• binómio discriminante = 0: tem solução dada por a
b2
−
2. Construa um algoritmo que disponha do cálculo do valor da área de três figuras
geométricas. O utilizador escolherá uma das três figuras disponíveis a tratar e o
algoritmo produzirá o valor da área.
Sugestão: A partir de um menu em que são apresentadas as figuras geométricas
disponíveis, o utilizador escolherá a pretendida. De seguida, ser-lhe-ão pedidos
os dados referentes à figura e produzir-se-á o cálculo do valor da área que será
apresentado no ecrã.
44.. EEssttrruuttuurraass ddee RReeppeettiiççããoo oouu CCiiccllooss
Frequentemente é necessários repetir, um determinado número de vezes, uma
certa instrução ou conjunto de instruções.
Frequentemente é necessários manter, um número indeterminado de vezes, um
ciclo ("Loop") de repetições, enquanto se verificar certa condição.
Essa repetição, na maior parte das vezes, não tem que ser uma repetição
exacta das mesmas operações, pois pode haver pelo meio certos dados (variáveis)
ou parâmetros que se vão alterando à medida que o ciclo vai decorrendo.
Exemplo de estruturas de repetição:
• Para... fazer
• Enquanto... fazer
• Repetir ... até
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 37
Enquanto numa estrutura do tipo "Para... fazer" o número de vezes que vai
ocorrer a repetição do ciclo é determinada à partida por uma variável de controlo que
é incrementada ou decrementada à medida que o ciclo decorre. Na estrutura
"Enquanto.. fazer" e "Repetir...até" o ciclo decorrerá um número indeterminado de
vezes, dependendo da verificação ou não da condição de controlo - o que depende
dos acontecimentos no decurso do próprio ciclo.
55.. EEssttrruuttuurraa ddee RReeppeettiiççããoo -- ""PPaarraa...... FFaazzeerr""
Esta estrutura de repetição é controlada por uma variável - Variável de controlo -
que parte de um determinado valor e incrementa ou decrementa até um outro
determinado valor.
A Sintaxe, em pseudocódigo, é a seguinte: Para <variável> de <valor inicial> até <valor final> fazer
<Instrução>
Fim Para
As expressões <valor inicial> e <valor final> podem ser valores numéricos
directos, valores de outras variáveis ou expressões, desde que esses valores sejam
números inteiros.
À variável que controla o ciclo, também é costume chamar "contador" ou
variável de iteração, na medida em que vai assumindo valores sucessivos.
Os valores da variável de controlo podem variar num sentido crescente ou
decrescente.
O fluxograma seria da forma:
VariávelValor_Inicial até Valor_Final
Instrução
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 38
A variável toma um valor inicial que vai incrementando (ou decrementando) até um valor final. À partida já sei quantas vezes vou repetir a instrução ou conjunto de instruções.
Exemplo: Faça um algoritmo para ler e escrever o nome de 20 pessoas. Algoritmo Ler_escrever
Variáveis
NOME: Caracteres
CONTADOR: Inteiro
Início
Para CONTADOR de 1 até 20 fazer
Ler(NOME)
Escrever(NOME)
Fim para
Fim
66.. EEssttrruuttuurraa ddee RReeppeettiiççããoo -- ""EEnnqquuaannttoo...... FFaazzeerr""
O ciclo ou estrutura de repetição começa com a verificação de uma expressão
ou condição, digamos, a "condição de controlo".
Se a condição for verdadeira, a instrução ou conjunto de instruções, será
executado um número vezes indeterminado à partida, dependendo de a condição de
controlo se manter verdadeira ou passar a falsa.
A Sintaxe, em pseudocódigo, é a seguinte: Enquanto <Condição> fazer
<Instrução>
Fim enquanto
O fluxograma seria da forma:
Condição
Instrução
Sim
Não
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 39
• Neste caso, a Instrução repete-se enquanto a condição for verdadeira.
• A condição é testada antes de se iniciar a Instrução.
• Se a condição for verdadeira executa-se a instrução, se for falsa já não se executa a instrução.
Exemplo: Faça um algoritmo para ler e escrever o Nome de 20 pessoas. Algoritmo Ler_escrever
Variáveis
NOME: Caracteres
TOTAL: Inteiro
Início
TOTAL ← 0
Enquanto TOTAL < 20 fazer
Ler(NOME)
Escrever(‘Nome = ‘, NOME)
TOTAL ← TOTAL + 1
Fim enquanto
Fim
Exercícios
O algoritmo seguinte produz um ciclo infinito. Corrija-o. CONTAGEM 1
Enquanto CONTAGEM <= 10 fazer
Escrever(‘Não acabou’)
Fim enquanto
77.. EEssttrruuttuurraa ddee RReeppeettiiççããoo -- ""RReeppeettiirr ...... aattéé""
Como a condição de controlo de repetição só é avaliada no final do ciclo, a
instrução ou instruções será(ão) executada(s) sempre pelo menos uma vez.
O ciclo será interrompido quando a condição de controlo for verdadeira.
A instrução será executada sempre pelo menos uma vez.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 40
A Sintaxe em pseudocódigo: Repetir
<Instrução>
até <Condição>
Na forma de fluxograma:
Condição
Sim
Não Instrução
• A instrução será repetida até que a condição seja verdadeira.
• A condição será testada depois de realizada a instrução.
• Portanto, a acção realizar-se-á pelo menos uma vez.
• Se a condição for falsa executa-se a instrução, se for verdadeira já não se executa a instrução.
Exemplo: Faça um algoritmo para ler e escrever o Nome de 20 pessoas. Algoritmo Ler_escrever
Variáveis
NOME: Caracteres
TOTAL: Inteiro
Início
TOTAL ← 0
Repetir
Ler(NOME)
Escrever(‘Nome = ‘, NOME)
TOTAL ← TOTAL + 1
até TOTAL >= 20
Fim
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 41
A estrutura “Repetir... até” pode ser realizada utilizando a estrutura “Enquanto...
fazer”.
Basta mudar de “Repetir... até <condição>”, para “Enquanto Não <Condição>...
fazer”.
A estrutura “Repetir... até” pode ser realizada utilizando a estrutura “Enquanto... fazer”.
Apresentamos um exemplo. Trata-se de um algoritmo para o cálculo dos múltiplos
de um número até um determinado valor definido por LIMITE.
Assim, temos: Algoritmo múltiplos
NUMERO, LIMITE, MULTIPLO: Inteiro
Início
Ler(NUMERO, LIMITE)
MULTIPLO NUMERO
Repetir
Escrever (MULTIPLO)
MULTIPLO MULTIPLO + NUMERO
até (MÚLTIPLO >= LIMITE)
Fim
Algoritmo múltiplos
NUMERO, LIMITE, MULTIPLO: Inteiro
Início
Ler(NUMERO, LIMITE)
MULTIPLO NUMERO
Enquanto (MÚLTIPLO < LIMITE)
Escrever (MULTIPLO)
MULTIPLO MULTIPLO + NUMERO
Fim enquanto
Fim
Nota: Não (MÚLTIPLO >= LIMITE) = (MÚLTIPLO < LIMITE)
88.. EExxeemmpplloo PPrrááttiiccoo –– NNúúmmeerroo PPrriimmoo
vamos ver um algoritmo para verificar se um número é ou não primo.
Algoritmo Números_Primos
[Vamos verificar se é primo]
NUMERO, CONTAGEM: Inteiro
FRASE: Caracteres
PRIMO: Lógico
Início
Ler(NUMERO)
PRIMO ← verdadeiro
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 42
Para contagem de 2 até NUMERO-1 fazer
[Se for divisível não é primo]
Se (NUMERO mod CONTAGEM = 0) então
PRIMO ← falso
Fim se
Fim para
Se PRIMO então
FRASE ← ‘É número primo’
senão
FRASE ← ‘Não é primo’
Fim se
Escrever(FRASE)
Fim
Análise do Algoritmo
Um número primo é aquele que é divisível, só e somente, pela unidade e por ele
próprio. Se for divisível por qualquer outro, não é número primo.
Como todos os números são divisíveis por um e por si próprios não
necessitamos de verificar a divisibilidade. Assim, temos de verificar todos os outros
números desde 2 até ao número anterior ao que queremos verificar (NUMERO - 1).
Por isso aparece a estrutura: Para CONTAGEM de 2 até NUMERO-1 fazer
Instrução
Fim para
A instrução é a verificação da divisibilidade.
Se um número ‘a’ for divisível por outro ‘b’ então o resto da divisão será zero.
Temos uma operação que nos dá o resto da divisão de inteiros. É o mod.
Neste caso temos que se (NUMERO mod CONTAGEM = 0) então o número
não será primo. Daí que surge: Para contagem de 2 até NUMERO-1 fazer
Se (NUMERO mod CONTAGEM = 0) então
PRIMO ← falso
Fim se
Fim para
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 43
Na realidade estamos a verificar se o número não é primo. Para indicar se o
número é ou não primo usamos uma variável lógica que toma um de dois valores: ou
verdadeiro ou falso. A variável está identificada com o nome PRIMO.
Por isso usamos: Se (NUMERO mod CONTAGEM = 0) então
PRIMO ← falso
Fim se
Para mandar a indicação para o ecrã, usamos o valor da variável lógica para
fazer a diferenciação. Se for primo (primo terá o valor verdadeiro) é apresentado no
ecrã “É número primo”; se não for será apresentada a frase “Não é primo”. Se PRIMO então
FRASE ← ‘É número primo’
senão
FRASE ← ‘Não é primo’
Fim se
Escrever(FRASE)
Pode-se considerar uma variante da estrutura “Enquanto... fazer” Vejamos: Algoritmo Números_Primos
[Vamos verificar se é primo]
NUMERO, CONTAGEM: Inteiro
FRASE: Caracteres
PRIMO: Lógico
Início
Ler(NUMERO)
PRIMO ← verdadeiro
[Para não ser primo deve ser divisível por qualquer número entre
1 e ele próprio, isto é, de 2 até número-1]
CONTAGEM 2 [Para iniciar a contagem]
Enquanto (CONTAGEM <= NUMERO-1) fazer
[Se for divisível não é primo]
Se (NUMERO mod CONTAGEM = 0) então
PRIMO ← falso
Fim se
CONTAGEM CONTAGEM + 1 [Incremento de uma unidade]
Fim enquanto
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 44
Se PRIMO então
FRASE ← ‘É número primo’
senão
FRASE ← ‘Não é primo’
Fim se
Escrever(FRASE)
Fim
Neste caso é necessária a inicialização da variável contador (CONTAGEM)
antes da estrutura “Enquanto... fazer”.
Dentro do ciclo, é necessário proceder ao incremento da variável contador
(CONTAGEM) para que alcance o valor final pretendido.
Vejamos o fluxograma do algoritmo número primo usando a estrutura
“Enquanto... fazer”:
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 45
CONTAGEM <=NUMERO-1
Sim
Início
LerNUMERO
PRIMO <-- verdadeiro
CONTAGEM <-- 2
NUMERO modCONTAGEM = 0
PRIMO <-- falso
Sim
Não
CONTAGEM <-- CONTAGEM + 1
Não
PRIMO
FRASE <-- 'Não é primo'
FRASE <-- 'É número primo'
EscreverFRASE
Fim
Melhoria do Algoritmo
O algoritmo pode ser melhorado em dois aspectos:
1. Não tem interesse a verificação de números negativos, nem o zero nem o
número um.
Solução: impedir ao utilizador a introdução dos referidos valores.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 46
2. Quando se encontra um valor em que o número é divisível não há
vantagem em continuar a verificação, pois o número não é primo.
Solução: quando se encontra o valor que divide o número termina-se a
estrutura ”Enquanto”.
Vamos começar pelo primeiro aspecto: (...)
NUMERO 0
Enquanto NUMERO < 2 fazer
Ler(NUMERO)
Fim enquanto
(...)
Acrescentamos a estrutura “Enquanto... fazer” para verificar o valor que o
utilizador introduz na variável NUMERO, obrigando o utilizador a repetir novo valor
caso tenha introduzido um valor não apropriado.
Existe a inicialização da variável NUMERO (NUMERO 0) para obrigar ao
pedido da introdução do número a verificar. Caso não se faça a inicialização
referida, não sabemos o que poderá acontecer uma vez que não sabemos que valor
a variável número contém no momento do teste da condição da estrutura
“Enquanto... fazer”.
Para o segundo aspecto referido, temos: PRIMO ← Verdadeiro
CONTAGEM 2 [Para iniciar a contagem]
Enquanto (CONTAGEM <= NUMERO-1) E (PRIMO) fazer
[Se for divisível não é primo]
Se (NUMERO mod CONTAGEM = 0) então
PRIMO ← Falso
Fim se
CONTAGEM CONTAGEM + 1 [Incremento de uma unidade]
Fim enquanto
Vimos nos operadores lógicos que na conjunção (E) basta uma proposição ser
falsa para que a condição seja falsa. Quando a condição é falsa termina a estrutura
de repetição “Enquanto... fazer”.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 47
Assim, basta encontrar um valor que divida o número (quando PRIMO passa a
ter o valor Falso) para acabar a estrutura “Enquanto... fazer”. Esta, também acaba
se a contagem chegar ao fim.
Vejamos a tabela de teste para as condições postas. CONTAGEM <= NUMERO-1 PRIMO (CONTAGEM <= NUMERO-1) E (PRIMO)
V V V (continua o ciclo) V F F (termina o ciclo) F V F (termina o ciclo) F F F (termina o ciclo)
O algoritmo final seria: PRIMO: Lógico
Início
NUMERO 0
Enquanto NUMERO < 2 fazer
Ler(NUMERO)
Fim enquanto
PRIMO ← verdadeiro
[Para não ser primo deve ser divisível por qualquer número entre
1 e ele próprio, isto é, de 2 até número-1]
CONTAGEM 2 [Para iniciar a contagem]
Enquanto (CONTAGEM <= NUMERO-1) E (PRIMO) fazer
[Se for divisível não é primo]
Se (NUMERO mod CONTAGEM = 0) então
PRIMO ← falso
Fim se
CONTAGEM CONTAGEM + 1 [Incremento de uma unidade]
Fim enquanto
Se PRIMO então
FRASE ← ‘É número primo’
senão
FRASE ← ‘Não é primo’
Fim se
Escrever(FRASE)
Fim
Para melhor compreensão do algoritmo faz a tabela de teste com valores a tua
escolha.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 48
99.. EExxeerrccíícciiooss
1. Faça um algoritmo para calcular:
a. ∑=
50
12
NN
b. ∑=
30
1
1N N
2. Faça um algoritmo para ler base e altura de 50 triângulos e imprimir a sua
área.
3. Faça um algoritmo para calcular o factorial de um número N!.
4. Faça um algoritmo que conte de 1 a 100 e a cada múltiplo de 10 emita uma
mensagem: “Múltiplo de 10”.
5. Faça um algoritmo que determine o maior entre N números. A condição de
termo é a entrada de um valor 0, ou seja, o algoritmo deve continuar a
calcular o maior número até que a entrada seja igual a 0 (ZERO).
Prof. Carlos Almeida 49
3 EESSTTRRUUTTUURRAA DDEE DDAADDOOSS
1.18. Objectivos O objectivo fundamental é conseguir que os alunos
percebam em profundidade o conceito de vector e matriz, como estrutura de dados em memória. O conceito de ficheiro deverá ser mais explorado na unidade relativa à Programação em Pascal.
Distinguir estruturas de dados em memória volátil e memória magnética
Realizar algoritmos com a utilização de vectores e matrizes
Aplicar no mesmo algoritmo várias estruturas de decisão.
11.. EEssttrruuttuurraa ddee DDaaddooss
Na programação de alto nível, sempre que se declaram variáveis, estas têm de
ser associadas a um determinado tipo de dados, para que o compilador saiba com
que tipo de valores vai operar e que espaço deve ser reservado em memória para
cada variável. Para além das estruturas de dados que mantenha em memória
primária, existem estruturas de dados que conserve em memória secundária, que é
o caso dos ficheiros.
Para além de uma categoria de dados a que podemos chamar de simples
(Inteiro, Lógico, Real, caracteres,...), temos ainda os dados que são estruturadas,
isto é, que são compostos por outros dados.
⎪⎩
⎪⎨
⎧
asEstruturadou Complexas
Simples Dados de Estrutura
Imaginemos por exemplo, um algoritmo para ler o nome de N pessoas e que
imprimisse esses mesmos nomes ordenados alfabeticamente. Não seria uma tarefa
simples, visto não ser possível determinar quantos nomes seriam lidos. Mesmo que
soubesse-mos o número de pessoas, digamos 1000 pessoas, teríamos que definir
1000 variáveis do tipo Caracteres como é indicado abaixo:
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 50
Algoritmo Loucura
Variáveis
NOME1,
NOME2,
NOME3,
(...)
NOME999,
NOME1000: Caracteres
Início
<Instruções>
Fim
Vamos considerar o tamanho do algoritmo, e o trabalho de escrita necessário
para o construir. Imaginemos agora o algoritmo com 1000000 pessoas. Na prática, a
construção deste algoritmo começaria a ficar inviável. Para resolver problemas como
este, e outros, foi criado um novo conceito de estrutura de dados e uma nova forma
de definir as variáveis, as quais foi denominada de variáveis do tipo Array.
Um array revela-se uma estrutura de dados muito mais económica em termos de escrita, mas, sobretudo, encerra muito mais potencialidades de manipulação em termos de programação.
Uma variável do tipo Array corresponde a uma sequência de posições de
memória, identificada com um único nome. Cada uma destas posições pode ser
acedida através de um índice. O índice corresponde a um valor numérico Inteiro.
Cada uma das posições de memória de uma variável Array 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.
Uma variável do tipo Array corresponde a uma sequência de posições de memória, identificada com um único nome.
Um índice corresponde a um valor numérico Inteiro e representa cada uma das posições de um array.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 51
22.. VVeeccttoorreess
Um vector (Array unidimensional) é um tipo estruturado que pode agrupar numa
mesma variável um conjunto finito de valores todos do mesmo tipo. Um vector é um
conjunto de elementos representados por um identificador e um único índice. Cada
elemento tem uma única dimensão. O índice varia entre um limite inferior e um limite
superior, em correspondência com o número de elementos do conjunto. Os vectores
são colocados na memória em posições ordenadas e adjacentes.
Um vector agrupa numa mesma variável um conjunto finito de valores todos do mesmo tipo.
Suponhamos que pretendemos representar, num programa, os gastos de um
determinado departamento em cada um dos 12 meses do ano. Evidentemente,
poderíamos definir 12 variáveis, designadas por 12 identificadores diferentes; por
exemplo: JAN; FEV; MAR; etc. Todavia, o uso de uma variável estruturada, neste
caso, um vector, com um único identificador agrupando os 12 elementos em causa,
revela-se uma técnica muito mais económica em termos de escrita, mas, sobretudo,
encerra muito mais potencialidades de manipulação em termos de programação.
Neste caso, poderíamos definir um vector mediante um único identificador, por
exemplo: GASTOS_MÊS. Mas, para que esse identificador possa representar os 12
elementos correspondentes aos 12 meses do ano, temos de utilizar índices.
Em pseudocódigo, poderíamos escrever assim: Variaveis
GASTOS_MES: Vector[1..12] de Real
em que:
• GASTOS_MES é o identificador ou nome atribuído à variável;
• VECTOR indica que a variável é do tipo Vector;
• [1..12] define o número de elementos da variável (12-1+1=12 elementos)
e ao mesmo tempo o intervalo dos seus índices, neste caso entre 1 e 12.
• DE REAL indica qual o tipo de dados dos elementos do vector.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 52
e, em Pascal: Var
GASTOS_MES: Array[1..12] of Real
De um modo geral, cada elemento desta variável de tipo Vector designa-se por:
GASTOS_MES[K] em que [K] representa a posição do elemento no conjunto que
compõem o vector, ou seja, neste caso, o número do mês que se pretende designar.
Por exemplo o gasto do mês de Fevereiro seria designados por: GASTOS_MES[2]
Segue-se alguns exemplos de operações com vectores: [Definir um vector A de 40 elementos do tipo inteiro]
A: Vector[1..40] de Inteiro
[Instrução de leitura com acesso sequencial]
Para K de 1 até 40 Fazer
Ler(A[K])
[Instrução de atribuição:
armazenar na 4ª posição do vector A o valor 13]
A[4] 13
[Instrução de escrita do 4ª elemento do vector A]
Escrever(A[4])
De um modo geral a estrutura “Para...” é muito útil no trabalho de vectores.
Exercícios Sobre Vectores
1. Construa um algoritmo que permita verificar qual o maior valor inteiro
introduzido pelo utilizador num vector de 20 elementos.
2. Dado um vector com 12 elementos, imprimir a soma de todos os elementos
par.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 53
33.. OOrrddeennaaççããoo ddee uumm VVeeccttoorr
Quando se preenche um vector com dados, estes ficam arrumados em função
da ordem de entrada que o utilizador usou. Assim, os dados ficam sem uma ordem
convencional. Por questão de lógica de procura ou de leitura, pode haver interesse
em que os dados estejam ordenados.
Por esta razão, vamos estudar um algoritmo simples que permitirá proceder à
ordenação dos dados de um vector.
Seja o vector definido por: IDADES: Vector[1..5] de Inteiro
que contém as idades de cinco pessoas: 45 27 33 40 35
Os dados do vector Idades não se encontra ordenado. Seria legítimo
pretender-se que as IDADES estivessem ordenadas por ordem crescente. Para tal,
teremos de percorrer o vector comparando os valores sucessivos e, caso
necessário, fazer a troca conveniente. Vejamos, a posição IDADES[1] é 45 e a
posição IDADES[2] é 27, logo terão de ser trocados os valores de modo que a
posição IDADES[1] fosse 27 e IDADES[2] fosse 45. Depois verificamos IDADES[2] e
IDADES[3] e têm de ser trocados. Todo este procedimento corre o vector até ao fim.
Esquematizando, temos: Para COLUNA de 1 até 4 fazer
Se IDADES[COLUNA] > IDADES [COLUNA+1] então
Troca (IDADES[COLUNA],IDADES[COLUNA+1])
Fim se
Fim Para
Este algoritmo tem uma operação especial a que chamámos “Troca” que vai
realizar a troca pretendida.
Uma análise mais atenta, mostra-nos que este algoritmo não chega. Vejamos,
no quadro seguinte, o que se passa a cada incremento da variável COLUNA na
estrutura “Para...”.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 54
45 27 33 40 35 Vector Original 1 27 45 33 40 35 2 27 33 45 40 35 3 27 33 40 45 35
Para
CO
LUN
A
de 1
até
4
4 27 33 40 35 40
O vector mostra-nos que a ordenação não ficou completa. É necessário fazer
correr, mais uma vez, a estrutura “Para...”. Portanto, o algoritmo só deve acabar
quando a estrutura “Para...” percorrer o vector e não efectuar nenhuma troca de
valores: Repetir
TROCAS FALSO
Para COLUNA de 1 até 4 fazer
Se IDADES[COLUNA] > IDADES [COLUNA+1] então
Troca (IDADES[COLUNA],IDADES[COLUNA+1])
TROCAS VERDADEIRO
Fim se
Fim Para
Até NÃO TROCAS [Até não haver trocas]
Falta criar o algoritmo da operação “Troca”: TEMPORARIO IDADES[COLUNA]
IDADES[COLUNA] IDADE[COLUNA+1]
IDADES[COLUNA+1] TEMPORARIO
Agora podemos construir o algoritmo completo: Algoritmo Ordena_Vector
[Este algoritmo ordena por ordem crescente]
COLUNA, TEMPORARIO: Inteiro
IDADES: Vector[1..5] de Inteiro
TROCAS: Lógico
Início
Repetir
TROCAS FALSO
Para COLUNA de 1 até 4 fazer
Se IDADES[COLUNA] > IDADES [COLUNA+1] então
TEMPORARIO IDADES[COLUNA]
IDADES[COLUNA] IDADE[COLUNA+1]
IDADES[COLUNA+1] TEMPORARIO
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 55
TROCAS VERDADEIRO
Fim se
Fim Para
Até NÃO TROCAS [Até não haver trocas]
Fim
44.. MMaattrriizzeess
Uma matriz (Array multidimensional) é um tipo estruturado que pode agrupar
numa mesma variável um conjunto finito de valores todos do mesmo tipo.
No caso dos vectores, temos apenas um agrupamento de elementos, cujos
índices estão compreendidos entre dois limites; nas matrizes temos dois (ou mais)
elementos, cada qual com o seu par de limites próprio.
Uma matriz é um conjunto de elementos representados por um identificador e
dois índices. Da mesma forma do que os vectores, os dois índices variam entre um
limite inferior e um limite superior, em correspondência com o número de elementos
do conjunto.
Uma matriz bidimensional é um conjunto de elementos representados por um identificador e dois índices.
Segue-se alguns exemplos de operações com matrizes: [Definir uma matriz M, de 10 linhas e 5 colunas, com elementos do tipo
inteiro]
M: Matriz[1..10, 1..5] de Inteiro
[Instrução de leitura com acesso sequencial]
Para K de 1 até 10 Fazer
Para L de 1 até 5 Fazer
Ler(M[K, L])
[Instrução de atribuição]
M[4, 3] 20
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 56
Seja o exemplo seguinte: QUADBID: matriz[1..5, 1..10] de Inteiro
LINHA, COLUNA: Inteiro
...
Para LINHA de 1 até 5 fazer
Para COLUNA de 1 até 10 fazer
Ler(QUADBID[LINHA, COLUNA])
Fim Para
Fim Para
Como vemos no exemplo acima apresentado, existe a matriz QUADBID de 5
linhas por 10 colunas que é referenciado com a ajuda de duas estruturas “Para...”.
A primeira estrutura corre as linhas da matriz e a segunda corre, em cada linha,
as colunas. Cada vez que realiza a instrução Ler, o utilizador introduz um inteiro na
matriz na posição referenciada no momento pelos contadores linha e coluna (os dois
índices da matriz).
Se usarmos uma matriz bidimensional usam-se duas estruturas “Para...” para correr a matriz porque passam a existir dois indicadores de posição para cada célula da matriz.
Exercícios Sobre Matrizes
1. Um stand de venda de automóveis, concessionário de uma marca, vende
sete modelos dessa marca. Crie um algoritmo que introduza num array
bidimensional os modelos e respectivo preço para posterior consulta. Modelos Preço (contos)
ModA 2500 ModB 3000 ModC 2500 ModD 3500 ModE 2500 ModF 3000 ModG 4000
A matriz terá de ser do tipo caracteres, pois terá que conter a designação do modelo. Será
de sete linhas e duas colunas como se pode ver na tabela acima apresentada.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 57
2. Faça um algoritmo para mostrar os dados contidos na matriz preenchida no
exercício anterior. Partindo do algoritmo do exercício anterior será fácil construir este.
3. Construa um algoritmo para ordenação dos dados da matriz do exercício 1,
por ordem crescente do preço. Neste caso, o quadro é bidimensional havendo necessidade de ordenar as duas colunas. De
qualquer modo, a primeira coluna só será ordenada em função da ordenação da segunda,
isto é, quando houver uma alteração da ordem de preços ter-se-á de fazer a alteração na
ordem dos modelos respectivos.
55.. RReeggiissttooss
Os registos (Record’s) são um outro tipo de dados estruturados que permitem
agrupar elementos de vários tipos diferentes, sob a forma de campos.
CAMPO é um espaço reservado em memória para receber informações (dados).
Exemplo: Campo Nome, Campo Endereço.
A principal diferença que costuma apontar-se entre um array (vector ou matriz) é
que, quando um array agrupa um conjunto de dados do mesmo tipo, um registo
pode conjugar diferentes tipos de dados na mesma estrutura. Todavia, existem
outras diferenças importantes, sobretudo no modo de acesso aos elementos de um
e de outro tipo de estrutura.
REGISTRO é um conjunto de campos.
Exemplo: Registro de Clientes.
Ao contrário de um array um registo pode conjugar diferentes tipos de dados na mesma estrutura.
De facto, o que interessa sobretudo é a maneira como se vai aceder a essa
informação estruturada.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 58
• se o problema exige que o acesso seja por “indexação”, isto é, do género, “toma lá
um índice, dá cá um valor”, então o que faz falta é um array;
• se, por qualquer motivo, o que queremos é um acesso por “nomeação” – “passa para cá a informação com este nome” – então o melhor é ir pelos registos.
Um exemplo típico de dados organizáveis sob a forma de registos é o que se
relaciona com informação sobre pessoas. Os seguintes dados poderiam ser os
campos de um registo: nome; morada; idade; telefone; etc.
Em pseudocódigo seria: [Registo que inclui os campos: Nome, Morada, Idade e Telefone]
[Tipo de dado DADOS_PESSOA definido pelo programador]
Tipo de Dados
DADOS_PESSOA de Registo
NOME: Caracteres
MORADA: Caracteres
IDADE: Inteiro
TELEFONE: Caracteres
Fim
Variáveis
[Definir as variável CLIENTE_A e CLIENTE_B do tipo DADOS_PESSOA]
CLIENTE_A, CLIENTE_B: DADOS_PESSOA
Em Pascal: [O mesmo registo em Pascal, definido pelo programador]
Type
DADOS_PESSOA = Record
NOME: String[30];
MORADA: String[50];
IDADE: Integer;
TELEFONE: String[12];
End;
Var
CLIENTE_A, CLIENTE_B: DADOS_PESSOA;
Na Linguagem Pascal, 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.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 59
Continuando o exemplo, caso desejarmos atribuir um valor à variável CLIENTE,
devemos fazê-lo da seguinte forma:
Em pseudocódigo: [Atribuir 45 ao campo IDADE da variável CLIENTE_A]
CLIENTE_A.IDADE 45
[Os valores existentes de todos os campos da variável CLIENTA_A
para a variável CLIENTA_B]
CLIENTA_B CLIENTA_A
Em Pascal: CLIENTE_A.IDADE := 45;
CLIENTA_B := CLIENTA_A;
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 (.) e seguido do nome do campo
(CLIENTE_A.IDADE := 45;).
É 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
(CLIENTA_B := CLIENTA_A;).
Exercícios Sobres Registos
1. Define um registo tendo os seguintes campos: Nome, Semestre, Sala,
Curso, Notas (total de 6 notas).
2. Faça um programa para ler as informações, descritas no exercício 1.
3. Ampliar a definição anterior, acrescentando a definição de um outro campo
(Endereço) que será também um Registo, o qual terá os seguintes campos:
Rua, Bairro, Código Postal, Cidade,.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 60
4. Faça um programa para ler as informações de um aluno, junto com o
endereço descrito no exercício 3.
5. Defina um vector de alunos, os campos serão os mesmos descritos no
exercício 3.
6. Faça um programa para ler as informações de n alunos.
7. Ordene crescentemente pelo Nome, os alunos.
66.. FFiicchheeiirrooss
Os ficheiros têm como função, armazenar a informação em suportes de
memória secundária ou externas (discos ou disquetes, etc.), onde essa informação
possa ser guardada para além do tempo em que o programa está a correr no
computador, e, eventualmente, reutilizada, nesse ou em outro programa.
As restantes estruturas de dados, são dados voláteis, porque são armazenados
apenas temporariamente na RAM (memória primária) do computador, quando estes
estão a funcionar com o programa. Quando se sai do programa em que os dados
foram introduzidos ou obtidos, toda a informação desaparece.
Um ficheiro é uma unidade de informação, armazenada fisicamente num suporte de memória secundária.
Ao contrário das estruturas de dados estudadas anteriormente, armazenadas em suporte de memória primária, os ficheiros têm como função, armazenar a informação em suportes de memória secundária ou externas.
Assim, a unidade básica de armazenamento de informação em sistemas
informáticos é o ficheiro (file). Um ficheiro é uma unidade de informação,
armazenada fisicamente num suporte de memória secundária.
⎩⎨⎧
r)programado pelo (definidos binário tipo do ficheiros texto tipo do ficheiros
ficheiro de Tipo
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 61
Ficheiros do Tipo Texto
Os ficheiros do tipo texto, são ficheiros em que a informação é totalmente
armazenada em formato de caracteres (ASCII), podendo ser criados ou modificados
por um editor de texto, fora do programa que os utiliza.
O acesso aos dados neste tipo de ficheiros é do tipo sequencial, querendo isto
dizer, que a leitura dos dados tem de partir sempre do início e percorrer todos os
elementos até ao ponto pretendido.
Ficheiros do Tipo Binário
Os ficheiros definidos pelo programador são ficheiros que agrupam dados
simples (como por exemplo, um inteiro) ou estruturados (como por exemplo, um
registo), em formato binário, assumindo formas muito variáveis. Podemos, por
exemplo, ter ficheiros de números inteiros ou reais, de vectores ou de registos,
etc. - o que permite uma grande flexibilidade de trabalho com sequências de dados
armazenadas em suportes de memória secundária.
Em particular, os ficheiros de registos permitem manipular dados num formato
bem estruturado para trabalho com informação externa (em disco ou disquete). Com
este tipo de ficheiros (ficheiros de registos) pode trabalhar-se com informação um
pouco à maneira de bases de dados.
O acesso aos dados destes ficheiros pode ser feito de forma aleatória, ou seja,
por escolha da posição pretendida, e não forçosamente de forma sequencial, como
nos ficheiros de texto.
Em qualquer dos casos, um ficheiro de dados (Ficheiro de texto ou binário), para
além de permitir o armazenamento da informação num suporte de armazenamento
externo à memória primária, também permite reunir uma colecção de dados sem
tamanho fixo à partida. Qualquer um dos outros tipos de dados estruturados
(vectores, matrizes ou registos) tem um tamanho – em termos de número de
elementos – que é determinado à partida, na respectiva declaração do tipo ou da
variável. Em princípio, um ficheiro não tem essa limitação, pois pode conter um
número maior ou menor de dados, sem que esse número tenha que ser determinado
à partida. Um ficheiro pode ser acrescentado com mais dados, desde que estes
sejam compatíveis com o tipo-base dos dados que o constituem, ou pode ser
totalmente reescrito com um número completamente diferente de elementos.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 62
• O acesso de um ficheiro do tipo texto é feito de forma sequencial.
• O acesso de um ficheiro do tipo binário é feito de forma aleatória.
• Um ficheiro que agrupa dados do tipo registo pode ser considerado uma base de dados.
Suportes Físicos de Ficheiros
As memórias auxiliares, embora sendo exteriores ao computador, operam como
extensões da sua memória central. São meios de memorização capazes de
armazenar quantidades de informação muito superiores às que a memória central
pode guardar, e funcionam como armazéns de informação que a memória central
requisita sempre que necessário. Existem grande variedade de memórias auxiliares,
como suporte físico de ficheiros, sendo mais frequentes as unidades de discos
magnéticos e as unidades de fita magnética.
Suportes físicos mais utilizados para armazenar informação:
• banda magnética;
• disquetes;
• disco magnético duro;
• discos ópticos;
• tapes;
• etc.
A escolha dos suportes relaciona-se com três características:
1. capacidade – sendo as bandas magnéticas, discos duro e óptico e as
tapes, de maior capacidade;
2. tipo de tratamento a dar ao ficheiro;
3. velocidade de tratamento – em que os discos duros e ópticos são os mais
rápidos.
O acesso aos ficheiros nestes suportes é também de grande importância pois
condiciona algumas das características atrás referidas. Assim o acesso pode ser de
dois tipos:
• acesso sequencial;
• acesso directo – nunca se poderia utilizar a banda magnética.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 63
Operações com Ficheiros
Os ficheiros são estruturas de dados que implicam a sua manipulação a dois
níveis:
1. ao nível interno do programa, com variáveis que identificam os ficheiros e
os dados a ler ou escrever nessas unidade de informação;
2. ao nível externo ou de interacção entre o programa e os dispositivos
físicos onde são armazenados os ditos ficheiros.
As principais operações a ter em conta no trabalho com ficheiros são:
• declaração de tipos e variáveis de ficheiros;
• associação de uma variável de ficheiro com um nome externo de ficheiro;
• criação de novos ficheiros ou reescrita total de um ficheiro já existente;
• escrita de informação num ficheiro;
• abertura de um ficheiro para leitura;
• procura de dados num ficheiro;
• fecho de um ficheiro aberto;
• fusão de ficheiros;
• etc.
Exemplos de operações no trabalho com ficheiros de registo:
• consultar registo por registo;
• listar todos os registos de um ficheiro;
• acrescentar mais registos;
• alterar os dados de um determinado registo;
• consulta de uma registo dada a sua posição no ficheiro
77.. MMaanniippuullaaççããoo ddee FFiicchheeiirrooss eemm PPaassccaall
Um ficheiro é de grande importância nos programas em computador, desde o
tempo em que o primeiro computador surgiu, pois, para que um programa faça
algum tipo de operação, o mesmo precisa ser alimentado com informações: estas,
ou são fornecidas pelo teclado, ou são fornecidos através de um ficheiro.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 64
O PASCAL, possui dois tipos de ficheiros, os quais são:
1. Ficheiros FILE
2. Ficheiros TEXT
Ficheiros FILE
Um ficheiro do tipo FILE, também conhecido por ficheiro aleatório, ou de acesso
aleatório, é o ficheiro mais importante do Pascal, sendo desta forma também o mais
utilizado. Um ficheiro aleatório é caracterizado pelo fato de ser possível buscar uma
determinada informação em qualquer posição que a mesma se encontre, sem haver
a necessidade de se percorrer todo o ficheiro até se alcançar a informação
desejada. O acesso a informação é directo.
Sintaxe: <Nome da variável>: FILE OF <tipo>
Um ficheiro FILE deve ser apenas um tipo de dado, ou seja: INTEGER, REAL, RECORD, STRING, BYTE, etc.
O programa seguinte define uma variável como sendo um ficheiro FILE de
STRING’s: Program Exemplo;
Var
MINHA_VARIAVEL: File of String;
Begin
End.
Quando um Ficheiro FILE é criado, o mesmo possui a seguinte estrutura interna: Posição Física Informação
0 1 2 … N
A posição física corresponde a um número gerado automaticamente no instante
em que uma dada informação é inserida no ficheiro. Este número, corresponde ao
“Endereço” da informação no ficheiro.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 65
É através deste endereço que é possível recuperar qualquer informação, sem
ter que percorrer todo o ficheiro em busca da mesma, bastando para isto, fornecer o
número da sua posição física.
Vamos passar a chamar as informações armazenadas num ficheiro por “Registros”.
Tratamento de Ficheiros FILE
Existem uma grande quantidade de subrotinas construídas especialmente para
manipular ficheiros FILE. Vamos conhecer as principais:
Rotina: ASSIGN()
Função: Serve para associar um determinado nome de ficheiro, no disco ou disquete com o ficheiro definido pelo programador.
Sintaxe: ASSIGN(Meu_Ficheiro, STRING_Com_Nome_Ficheiro_DOS);
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
End.
Rotina: REWRITE()
Função: Cria e abre para Entrada\Saída um Ficheiro. Caso o ficheiro não exista, o mesmo será criado. Caso o ficheiro já exista, todos os dados existentes nele serão apagados.
Sintaxe: REWRITE(Meu_Ficheiro);
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 66
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Rewrite(FICHEIRO);
End.
Rotina: RESET()
Função: Abre para E/S um ficheiro que já exista. Caso o ficheiro não exista ocorrerá um erro de execução e o programa será abortado.
Sintaxe: RESET(Meu_Ficheiro);
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Reset(FICHEIRO);
End.
Rotina: CLOSE()
Função: Fecha um ficheiro que tenha sido aberto com RESET ou REWRITE.
Sintaxe: CLOSE(Meu_Ficheiro);
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 67
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Rewrite(FICHEIRO);
Close(FICHEIRO);
End.
Rotina: WRITE()
Função: A rotina WRITE tem a mesma função de saída de informações até agora estudado, invés da informação ser apresentada no ecrã, a mesma será armazenada num ficheiro.
Sintaxe: WRITE(Meu_Ficheiro, Registro);
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String; IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
REG: REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Rewrite(FICHEIRO);
Write(‘Digite o Nome: ’);
Readln(REG.NOME);
Write(‘Digite a Idade: ’);
Readln(REG.IDADE);
Write(FICHEIRO, REG);
Close(FICHEIRO);
End.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 68
Rotina: READ()
Função: A rotina READ tem a mesma função de entrada de informações até agora estudado, invés da leitura ser feita pelo teclado, a mesma será feita de um ficheiro.
Sintaxe: READ(Meu_Ficheiro, Registro);
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
REG: REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Reset(FICHEIRO);
Read(FICHEIRO, REG);
Writeln(‘Nome: ’, REG.NOME);
Writeln(‘Idade: ’, REG.IDADE);
Close(FICHEIRO);
End.
Após cada operação READ/WRITE no Ficheiro, o endereço do registro corrente no ficheiro é incrementado em uma unidade. Assim por exemplo, se o endereço do registro corrente é igual a 10, após uma operação de READ/WRITE, o registro corrente passará a ser o número 11.
Rotina: ILEPOS()
Função: etorna um número inteiro indicando qual o registro corrente do ficheiro.
Sintaxe: Registro_Corrente := FILEPOS(Meu_Ficheiro);
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 69
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
CORRENTE: Integer;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Reset(FICHEIRO);
CORRENTE := Filepos(FICHEIRO);
Writeln(‘Registo actual n.º ’, CORRENTE);
Close(FICHEIRO);
End.
Rotina: FILESIZE()
Função: Retorna quantos registro existem armazenados no ficheiro.
Sintaxe: Tamanho_Ficheiro : = FILESIZE(Meu_Ficheiro);
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
TOTAL: Integer;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Reset(FICHEIRO);
TOTAL := FileSize(FICHEIRO);
Writeln(‘Total de registos no ficheiro: ’, TOTAL);
Close(FICHEIRO);
End.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 70
Rotina: SEEK()
Função: Posiciona o ponteiro do ficheiro num registro determinado, para que o mesmo possa ser processado.
Sintaxe: SEEK(Meu_Ficheiro, Endereço_Registro);
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
REG: REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Reset(FICHEIRO);
Seek(FICHEIRO, 10);
Read(FICHEIRO, REG);
Writeln(‘Nome: ’, REG.NOME);
Writeln(‘Idade: ’, REG.IDADE);
Close(FICHEIRO);
End.
Rotina: EOF()
Função: Retorna TRUE caso se alcance o final do ficheiro, FALSE caso contrário.
Sintaxe: Chegou_Final := EOF(Meu_Ficheiro);
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 71
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String;
IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
REG: REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Reset(FICHEIRO);
While not eof(FICHEIRO) do
Begin
Read(FICHEIRO, REG);
Writeln(‘Nome: ’, REG.NOME);
Writeln(‘Idade: ’, REG.IDADE);
End;
Close(FICHEIRO);
End.
Rotina: ERASE()
Função: Elimina o ficheiro do disco. É importante notar que o ficheiro a ser eliminado não pode estar aberto.
Sintaxe: ERASE(Meu_Ficheiro);
Exemplo: Program Teste;
Type
REGISTRO = Record
NOME: String; IDADE: Byte;
End;
Var
FICHEIRO: File of REGISTRO;
Begin
Assign(FICHEIRO, ‘Dados.Dat’);
Erase(FICHEIRO);
End.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 72
Ficheiros TEXT
Um ficheiro do tipo TEXT, também conhecido por arquivo sequencial, é um tipo
especial de ficheiro que, ao contrário do ficheiro FILE, pode ser editado normalmente
através de um editor de textos qualquer. Ele é dito sequencial porque a leitura tem
que ser feita sequencialmente do início ao fim do ficheiro, não podendo desta forma,
como é feito no arquivo FILE através do comando SEEK, posicionar de forma
directa, o ponteiro de ficheiro em um registro em particular.
Sintaxe: <Nome da variável>: TEXT
O programa seguinte define uma variável como sendo um ficheiro do tipo TEXT: Program Exemplo;
Var
MINHA_VARIAVEL: Text;
Begin
End.
Nos ficheiros do tipo TEXT (STRING), as informações nele armazenadas são
todas texto, mesmo assim, é possível escrever no arquivo informações de qualquer
tipo de dado simples (INTEGER, REAL, BYTE, etc.) as quais, ao serem fisicamente
armazenadas no ficheiro, serão automaticamente convertidas do seu tipo original
para o tipo STRING. A leitura se processa de forma inversa, ou seja, quando é lida
uma informação num ficheiro TEXT, a mesma será automaticamente convertida
para o tipo da variável que irá armazenar a informação, isto é, do tipo STRING para
o tipo da variável receptora da informação lida.
Tratamento de Ficheiros TEXT
Existem uma grande quantidade de subrotinas construídas especialmente para
manipular ficheiros TEXT, algumas das quais já foram vistas. Vamos mostrar as
principais.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 73
Rotina: ASSIGN()
Função: Serve para associar um determinado nome de ficheiro, no disco ou disquete com o ficheiro definido pelo programador.
Sintaxe: ASSIGN(Meu_Ficheiro, STRING_Com_Nome_Ficheiro_DOS);
Exemplo: Program Teste;
Var
FICHEIRO: Text;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
End.
Rotina: REWRITE()
Função: Crie e abre um ficheiro no formato Write-Only (somente para escrita). Caso o ficheiro não exista, este será criado. Caso já exista, todos os dados existentes nele serão apagados.
Sintaxe: REWRITE(Meu_Ficheiro);
Exemplo: Program Teste;
Var
FICHEIRO: Text;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Rewrite(FICHEIRO);
End.
Rotina: RESET()
Função: Abre um ficheiro que já existe, mas no formato Read-Only (somente para leitura). Caso o ficheiro não exista ocorrerá um erro de execução e o programa será abortado.
Sintaxe: RESET(Meu_Ficheiro);
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 74
Exemplo: Program Teste;
Var
FICHEIRO: Text;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Reset(FICHEIRO);
End.
Rotina: APPEND()
Função: Abre um ficheiro para inclusão de novas informações do tipo Write-Only (somente para escrita). Caso o ficheiro não exista ocorrerá um erro de execução e o programa será abortado. É importante notar que as inclusões se processam sempre no final do ficheiro.
Sintaxe: APPEND(Meu_Ficheiro);
Exemplo: Program Teste;
Var
FICHEIRO: Text;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Append(FICHEIRO);
End.
Rotina: CLOSE()
Função: Fecha um ficheiro que tenha sido aberto com Reset, Rewrite ou Append.
Sintaxe: CLOSE(Meu_Ficheiro);
Exemplo: Program Teste;
Var
FICHEIRO: Text;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Rewrite(FICHEIRO);
Close(FICHEIRO);
End.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 75
Rotina: WRITE() ou WRITELN()
Função: A rotina WRITE ou WRITELN têm a mesma função de saída de informações até agora estudado, invés da informação ser apresentada no ecrã, a mesma será armazenada no ficheiro. Ao ser usado o comando WRITE, todas as informações serão escritas no ficheiro na mesma linha, como acontece quando se usa este comando para escrever no ecrã. Por outro lado, ao ser usado o comando WRITELN, todas as informações serão colocadas uma em cada linha, como acontece quando se usa este comando para escrever informações no ecrã.
Sintaxe: WRITE(Meu_Ficheiro, Registro); ou WRITELN(Meu_Ficheiro, Registro);
Exemplo: Program Teste;
Var
FICHEIRO: File of REGISTRO;
NOME: String[30];
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Rewrite(FICHEIRO);
Write(‘Digite o Nome: ’);
Readln(NOME);
Writeln(FICHEIRO, ‘Nome do aluno:’);
Writeln(FICHEIRO, NOME);
Close(FICHEIRO);
End.
Rotina: READ() ou READLN()
Função: A rotina READ ou EADLN têm a mesma função de entrada de informações até agora estudado, invés da leitura ser feita pelo teclado, a mesma será feita de um ficheiro. Ao ser usado o comando READ, a leitura será feita sempre na mesma linha, como acontece quando se usa este comando para ler informações pelo teclado. Por outro lado, ao ser usado o comando READLN, as leituras serão feitas linha a linha, como acontece quando se usa este comando para leitura pelo teclado.
Sintaxe: READ(Meu_Ficheiro, Registro); ou READLN(Meu_Ficheiro, Registro);
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 76
Exemplo: Program Teste;
Var
FICHEIRO: Text;
IDADE: Byte;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Reset(FICHEIRO);
Readln(FICHEIRO, IDADE);
Writeln(‘Idade: ’, IDADE);
Close(FICHEIRO);
End.
Rotina: EOF()
Função: Retorna TRUE caso se alcance o final do ficheiro, FALSE caso contrário.
Sintaxe: Chegou_Final := EOF(Meu_Ficheiro);
Exemplo: Program Teste;
Var
FICHEIRO: Text;
CH: Char;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Reset(FICHEIRO);
While not eof(FICHEIRO) do
Begin
Read(FICHEIRO, CH);
Write(CH);
End;
Close(FICHEIRO);
End.
Rotina: ERASE()
Função: Elimina o ficheiro do disco. É importante notar que o ficheiro a ser eliminado não pode estar aberto.
Sintaxe: ERASE(Meu_Ficheiro);
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 77
Exemplo: Program Teste;
Var
FICHEIRO: Text;
Begin
Assign(FICHEIRO, ‘Dados.txt’);
Erase(FICHEIRO);
End.
Exercícios Sobre Ficheiros
1. Crie um ficheiro FILE formado por números inteiro de 1 a 10000. Faça a
leitura do ficheiro e escreva no ecrã somente os números ímpares.
2. Crie um ficheiro com Nome e salário de n funcionários e armazene estas
informações num ficheiro FILE.
3. Faça a leitura do ficheiro anterior e escreva no ecrã o nome e o salário dos
funcionários que ganham mais de 100 000$00.
4. Abra o ficheiro anterior e aumente em 15% o salário de todos os funcionários
que ganham menos de 100 000$00.
5. Ordene crescentemente pelo nome do funcionário o ficheiro anterior.
6. Abra o ficheiro anterior e escreva o seu conteúdo de trás para frente, ou seja,
do último registro até o primeiro. Utilize os comandos SEEK, FILEPOS e
FILESIZE.
7. Crie um ficheiro com nome e salário de n funcionários e armazene estas
informações num ficheiro TEXT. Faça a leitura do ficheiro e escreva no ecrã
o nome e salário dos funcionários que ganham mais que 100 000$00.
_____________________________________________________________ Estruturas de Decisão
Prof. Carlos Almeida 78
8. Envie os dados do ficheiro anterior para a impressora. Para isso, use USES
PRINTER e o comando WRITE(LST, TEXTO) ou WRITELN(LST, TEXTO),
onde TEXTO é o texto a enviar para a impressora.