1. Bibliografia
• Bases de Programação da Plátano Editora,
• Bases de Programação da Porto Editora,
• Cardoso, Vasco, Fundamental do Turbo Pascal 6 e 7. Lisboa:FCA,1997
• Guerreiro, Pedro,Pascal, Técnicas de Programação- 3ª edição, Europa
América
• Byron S.Gottfried, Programação em Pascal, MC Graw-Hill
• Internet
2. Módulo V: Estrutura de Dados Compostas
Módulo VI : Estrutura de Dados Dinâmicas
Módulo VII: Tratamento de Ficheiros
Módulo VIII: Conceitos Avançados de Programação
Módulo IX: Introdução à Programação Orientada a Objectos
Módulo X: Programação Orientada a Objectos
4. Dados Estruturados
• Array
Um array é um tipo estruturado que pode agrupar numa mesma
variável um conjunto de valores todos do mesmo tipo.
• Arrays Unidimensionais ou vectores
• Arrays Multidimensionais
• Arrays Unidimensionais – Conjunto de elementos representados
por um identificador e um índice; o índice varia entre um limite inferior
e um limite superior em correspondência com o número de
elementos do conjunto
6. • Um array pode ser declarado :
a) Como tipo – TYPE – e, em seguida, serem definidas variáveis com base nesse mesmo
tipo;
b) Directamente como uma variável.
Exemplo:
a) Como tipo – TYPE
Type <identificador de tipo> = Array [limites] of <tipo de Dados>
Type gastosmes = Array [1..12] of integer;
Com base neste tipo, podemos ter uma ou mais variáveis deste tipo
Exemplo:
Var gastossector1, gastos2,g3: gastosmes;
Dados Estruturados
7. b) Declaração de um Array Directamente como uma variável.
Var <identificador > : Array [limites] of <tipo de Dados>
– Var gastosmes : Array [1..12] of integer;
• Var- indica que se pretende definir uma variável;
• Gastosmes – é o identificador ou nome atribuído a essa variável;
• : array – indica que a variável é do tipo array;
• [1..12] – define o número de elementos da variável e ao mesmo tempo o
intervalo dos seus índices, neste caso entre 1 e 12;
• Of integer- indica qual o tipo-base dos elementos do array
Dados Estruturados
8. • Depois de declarada ou definida uma variável do tipo array, a designação individual
de cada um dos seus elementos, faz-se:
– Escrevendo o identificador da variável, seguido do seu índice entre parêntesis rectos
De um modo geral, cada elemento desta variável de tipo array designa-se por:
gastosmes [i]
Em que [i] representa a posição do elemento no conjunto que compõem o array, ou seja, neste
caso, o número do mês que se pretende designar.
Exemplo:
Identificador Gastos do mês
Gastosmes[1] Janeiro
Gastosmes[2] Fevereiro
…………..
Gastosmes[12] Dezembro
Dados Estruturados
9. • Nota:
– Não confundir os valores assumidos pelos índices de um array
com os valores assumidos pela própria variável:
• Exemplo:
– O mês de Março é representado pelo índice 3 -
gastosmes[3];
– O valor assumido pela variável no índice 3, ou seja, os
gastos do mês de Março, será aquele que lhe for atribuído,
por uma instrução de atribuição ou de input.
Dados Estruturados
10. • Utilização de variáveis do tipo Array com instruções básicas
– (leitura, atribuição, escrita)
Exemplos:
Read (gastosmes[1]);
Faz a leitura dos gastos do mês índice1, ou seja, Janeiro
gastosmes[4]:=25350;
Faz com que o elemento índice 4 do array (mês Abril) seja atribuído com o valor de
25350;
Write(‘Gastos do mês de Dezembro: ‘, gastosmes[12]);
Escreve a mensagem da string indicada seguida do valor dos gastos do mês de
Dezembro
Dados Estruturados
11. • Exercício:
– Elabore um programa para calcular o total anual dos gastos de um
departamento, sendo dados (introduzidos pelo utilizador) os valores dos
respectivos gastos mensais; no mesmo programa pretendemos calcular
também a média dos gastos mensais.
– Resolução
Dados Estruturados
12. • program meses;
• var m:integer;
• totalano, mediames: real;
• gastosmes: array [1..12] of real;
• begin
• totalano:=0;
• For m:=1 to 12 do
• begin
• write('introduza o gastomes[' ,m,’]);
• read(gastosmes[m]);
• totalano:=totalano+ gastosmes[m];
• end;
• mediames:= totalano/12;
• writeln('O total dos gastos anuais foi:', totalano:2:2 );
• writeln('a media dos gastos do mes e:', mediames:2:2);
• readln;
• end.
Dados Estruturados
13. • Explicação do Exercício:
– A variável m é utilizada como contador do ciclo For e, dentro desse ciclo, é utilizada também
para indicar o número de ordem de cada mês.
– A variável gastosmes é definida como um array de 12 elementos do tipo-base real.
• Esta variável do tipo array vai ser utilizada no ciclo For em duas situações distintas:
– Numa instrução de leitura, para receber a entrada do utilizador em cada iteração do
ciclo; é evidente que, de cada vez que o contador do ciclo incrementa uma unidade,
o índice do array também é incrementado, passando assim a representar cada um
dos 12 meses do ano;
– Numa instrução de atribuição feita com a variável totalano, que efectua o somatório
ou o total dos gastos nos 12 meses, mediante a técnica já conhecida: inicializa-se a
variável a zero antes de começar o ciclo e dentro do ciclo, essa mesma variável vai
acumulando os sucessivos valores introduzidos como gastos de cada mês.
Uma vez calculado o somatório ou total dos gastos nos 12 meses, é só calcular a
média: basta dividir o total encontrado pelo numero de valores introduzidos, que
neste caso é 12.
Dados Estruturados
14. • Elabore um Algoritmo que permita inserir 15 valores e depois
apresente todos os números inseridos superiores a 10. Não
necessita utilizar procedimentos.
• Grave o programa com o nome numeros_vector.PAS.
• Resolução
Dados Estruturados
15. • Program numeros_vector;
• var i:integer;
• inicio:array [1..15] of integer;
• begin
• for i:=1 to 15 do
• Begin
• writeln(' digite os numeros');
• readln (inicio[i]);
• end;
• For i:=1 to 15 do
• begin
• If inicio[i]>10 then
• writeln (' inicio [',i,']=',inicio [i]);
• end;
• readln;
• end.
Dados Estruturados
17. • Elabore um Algoritmo que permita apresentar a soma de dois
vectores, com 5 índices de posição. Apresente o resultado.
• Utilize os seguintes procedimentos:
• Inserir;
• Calcular.
• Grave o programa com o nome soma_vectores.PAS
• Resolução
Dados Estruturados
18. • Elabore um algoritmo que permita inserir a notas de PsinF de dez
alunos, deve ser apresentada a média das notas obtidas e ainda
o número de alunos com nota superior à média.
• Este algoritmo deve ser feito com base nos seguintes
procedimentos:
• - Procedimento Inserir;
• - Procedimento Somatorio;
• - Procedimento Verificar_Superior;
• - Procedimento Sair.
• Grave o programa com o nome notas_alunos_vector_.PAS.
• Resolução
Dados Estruturados
19. • Programa com o nome notas_alunos_vector_.PAS.
• Program notas_alunos_vector;
• type
• notas=array[1..10] of integer;
• var
• nota:notas;
• somanotas, cont, i:integer;
• media:real;
• op:char;
• Procedure Inserir;
• begin
• for i:=1 to 10 do
• begin
• write (' Introduza a nota');
• read (nota[i]);
• end;
• end;
• Procedure somatorio;
• begin
• somanotas:=0;
• For i:=1 to 10 do
• begin
• somanotas:=somanotas + nota[i];
• media:=somanotas/10;
• writeln (' A média das notas, : ', media:8:2);
• end;
• end;
• Procedure verificarsuperior;
• begin
• cont:=0;
• for i:=1 to 10 do
• begin
• if (nota[i]>media)then
• cont:=cont+1;
• writeln(' Existem', cont,'alunos com a nota superior a:', media:8:2);
• end;
• end;
• Procedure continuar;
• begin
• writeln(' Quer continuar?');
• read (op);
• end;
• begin
• repeat
• inserir;
• somatorio;
• verificarsuperior;
• continuar;
• until (op='n')
• end.
20. Array ou matriz bidimensional
• É possível definir um array de arrays – arrays
multidimensionais
• Podemos imaginar um armário, com x fiadas de gavetas na horizontal e y
colunas na vertical. Dentro de cada gaveta estará, por exemplo, uma
determinada quantia de documentos, dinheiro ou outra coisa qualquer.
• Se quisermos referir-nos a uma determinada gaveta do armário, podemos
fazê-lo indicando o nº da fila e o da coluna em que a gaveta se encontra;
por exemplo: a gaveta da fila 3, coluna 2, seria representada por:
– Gaveta[3,2]
– Gaveta[i,j] Coluna
Fila ou linha
21. • Var gaveta: array [1..4] of array [1..3] of integer;
Ou
• Var gaveta: array [1..4,1..3] of integer;
Array ou matriz bidimensional
22. • Para pedir a introdução de todos os valores da variável gaveta, a
melhor técnica é a de dois ciclos encaixados
• Exemplo:
– For i:=1 to 4 do
• For j:=1 to 3 do
– Readln (gaveta [i,j])
Array ou matriz bidimensional
23. • Exercício:
– Programa para resolver a seguinte situação:
• Pretende-se registar as notas de um grupo de alunos, num conjunto de
disciplinas comuns a todos eles;
• Fazer média por aluno;
• Fazer médias por disciplina
• Resolução
Array ou matriz bidimensional
24. • program notas;
• const nalunos=3; ndiscip=2;
• var i,j: integer;
• nota:array[1..nalunos,1..ndiscip] of real;
• soma,media:real;
• Begin
• for i:=1 to nalunos do
• begin
• writeln(' introduza o ',i,' aluno');
• for j:=1 to ndiscip do
• begin
• writeln('introduza a nota da ',j,' disciplina');
• readln(nota[i,j])
• end;
• end;
• for i:=1 to nalunos do
• begin
• Soma:=0;
• for j:=1 to ndiscip do
• soma:= soma+nota[i,j];
• media:= soma/ndiscip;
• writeln('media do aluno ',i, ' e: ', media:5:1);
• end;
• for j:=1 to ndiscip do
• begin
• Soma:=0;
• for i:=1 to nalunos do
• soma:= soma+nota[i,j];
• media:= soma/nalunos;
• writeln('media da disciplina ',j, ' e: ', media:5:1);
• end;
• readln;
• end.
• Resolução
26. Exemplo de um array ou matriz bidimensional de 4 por 3
A[1,1] A[1,2] A[1,3] A[1,4]
A[2,1] A[2,2] A[2,3] A[2,4]
A[3,1] A[3,2] A[3,3] A[3,4]
150 110 120 160
90 110
115
200
55 80 125
150
Linhas
Linhas
Linhas
Colunas Colunas Colunas Colunas
27. Records ou Registos:
Os Registos são um outro tipo de dados estruturados
que permitem agrupar dados de vários tipos diferentes, sob
a forma de campos:
Exemplo de Informações sobre Pessoas:
Nome; Morada;
Data de Nascimento; Telefone;
Idade; Estado Civil;
Etc;
Os registos podem ser utilizados com as entidades mais diversificadas que
se possa imaginar: artigos de uma empresa, livros de uma Biblioteca, dados
estatísticos sobre países ou regiões geográficas, etc.
…………………
28. Records ou Registos:
• Tal como se passa com outros tipos de dados em Pascal, a
definição de um registo pode ser feita directamente como variável,
ou como tipo.
• A) definição de um registo directamente como
variável:
Var pessoa: Record
Nome: string[10];
Idade: integer;
Altura, peso: real;
End;
• Formato: Var <identificador>: Record <lista de campos> End
29. Records ou Registos
• A) definição de um registo como
tipo:
type pessoa =Record
Nome: string[10];
Idade: integer;
Altura, peso: real;
End;
30. Records ou Registos:
Formato: Type <identificador> = Record <lista de campos> End
• Um record definido como uma variável funciona apenas para uma
Única variável;
• Se definirmos um record como tipo, podemos, em seguida, definir
Várias variáveis desse mesmo tipo.
Exemplo:
Var p1,p2,aluno,desportista,empregado: pessoa;
31. Records ou Registos:
Designação e acesso aos campos de um registo:
Exemplo:
type pessoa =Record
Nome: string[10];
Idade: integer;
Altura, peso: real;
End;
Var aluno, p: pessoa;
As variáveis aluno e p são registos que têm os mesmos campos
definidos no tipo pessoa
32. Records ou Registos:
Suponhamos que queríamos fazer uma atribuição de valores
aos campos das variáveis aluno e p.
Há 2 maneiras possíveis de o fazer:
a) Designação conjunta do identificador do record e do campo visado;
b) Por intermédio do operador With
a) <Identificador do registo>. <Identificador do campo>
Exemplo: Se quisermos atribuir ao registo aluno o nome de “Isabel Gonçalves”
seria: aluno.nome := ‘Isabel Gonçalves’
33. Records ou Registos:
Exemplo1:
Se quisermos fazer a leitura do valor do campo idade do
mesmo registo e, em seguida, a escrita desse mesmo dado as
instruções poderiam ser:
Write (‘idade do aluno:’, aluno.idade);
Read (aluno.idade);
34. B) Por intermédio do operador With
Records ou Registos:
O operador With permite indicar uma vez o identificador
do registo e em seguida trabalhar apenas com os identificadores
dos campos
Exemplo:
With aluno do
Begin
Writeln (‘ Introduza os dados relativos ao aluno ’ );
Writeln (‘ Nome: ‘); Readln (Nome);
Writeln (‘ Idade: ‘); Readln (Idade);
Writeln (‘ Altura: ‘); Readln (Altura);
Writeln (‘ Peso: ‘); Readln (Peso);
End;
35. Records ou Registos: Program Registos;
type
pessoa = record
nome: string[10];
idade: integer;
end;
Var p,q:pessoa;
Begin
Writeln('Dados relativos a primeira pessoa');
Writeln('Nome: '); Readln(p.nome);
Writeln('Idade: '); Readln(p.idade);
Writeln('Dados relativos à segunda pessoa');
Writeln('Nome: '); Readln(q.nome);
Writeln('Idade: '); Readln(q.idade);
if p.idade >q.idade then
Writeln ('O aluno mais velho e ', p.nome)
else
if q.idade >p.idade then
Writeln ('O aluno mais velho e ', q.nome)
else
Writeln(' Os alunos têm a mesma idade');
Readln;
End.
Programa agenda
36. Program arrayofrecords;
Type ficha = record
sexo:char;
idade: integer;
end;
Var pessoa: ficha;
grupo :array [1..6]of ficha;
i, masc,femin,idadesmasc,idadesfemin:integer;
mediamasc,mediafemin: real;
Begin
For i:=1 to 6 do {introdução dos dados por elemento}
begin
Writeln('Sexo - m/f: '); Readln(pessoa.sexo);
Writeln('Idade:'); Readln(pessoa.idade);
grupo[i]:= pessoa;
end;
masc:=0;femin:=0;
idadesmasc:=0;idadesfemin:=0;
For i:=1 to 6 do {soma das idades por sexos}
begin
pessoa:=grupo [i];
if pessoa.sexo = 'm' then
begin
masc:=masc+1;
idadesmasc:=idadesmasc+pessoa.idade;
end;
if pessoa.sexo= 'f' then
begin
femin:= femin+1;
idadesfemin:=idadesfemin+pessoa.idade
end;
end;
mediamasc:=(idadesmasc/masc);
mediafemin:=(idadesfemin/femin);
Writeln(' Media de idades sexo masculino', mediamasc:8:1);
Writeln(' Media de idades sexo femenino', mediafemin:8:1);
readln
end.
37. • Program agenda;
• type
• palavra = string [10];
• tpessoa = record
• nome: palavra;
• morada: palavra;
• telefone: palavra;
• end;
• Tlista= array [1..10]of Tpessoa;
• Var
• pessoa:tpessoa;
• lista_agenda:tlista;
• cont:integer;
• Begin
• for cont:=1 to 10 do
• Begin
• Writeln(' Nome ');
• readln(pessoa.nome);
• Writeln(' Morada ');
• readln(pessoa.morada);
• Writeln(' Telefone ');
• readln(pessoa.telefone);
• lista_agenda[cont]:= pessoa;
• end;
• Writeln('Lista dos nomes');
• for cont:=1 to 10 do
• begin
• pessoa:=lista_agenda[cont];
• writeln(pessoa.nome);
• end;
• end.
38. • Program arrayofrecords;
• Type ficha = record
• sexo:char;
• idade: integer;
• end;
• Var pessoa: ficha;
• grupo :array [1..6]of ficha;
• i, masc,femin,idadesmasc,idadesfemin:integer;
• mediamasc,mediafemin: real;
• Begin
• For i:=1 to 6 do {introdução dos dados por elemento}
• begin
• Writeln('Sexo - m/f: '); Readln(pessoa.sexo);
• Writeln('Idade:'); Readln(pessoa.idade);
• grupo[i]:= pessoa;
• end;
• masc:=0;femin:=0;
• idadesmasc:=0;idadesfemin:=0;
• For i:=1 to 6 do {soma das idades por sexos}
• begin
• pessoa:=grupo [i];
• if pessoa.sexo = 'm' then
• begin
• masc:=masc+1;
• idadesmasc:=idadesmasc+pessoa.idade;
• end;
• if pessoa.sexo= 'f' then
• begin
• femin:= femin+1;
• idadesfemin:=idadesfemin+pessoa.idade
• end;
• end;
• mediamasc:=idadesmasc/masc;
• mediafemin:=idadesfemin/femin;
• Writeln(' Media de idades sexo masculino', mediamasc:8:1);
• Writeln(' Media de idades sexo femenino', mediafemin:8:1);
• readln