manual psinf - modulo 5
TRANSCRIPT
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
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
Dados Estruturados
• ArrayUm 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
Dados Estruturados
10
12
8
9
15
A1
A3
A4
A2
A5
A5A3A2 A4 A1
10 12 8 15 9
Representação de um array unidimensional, ou vector com 5 elementos
• 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
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
• 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êsGastosmes[1] Janeiro
Gastosmes[2] Fevereiro
…………..
Gastosmes[12] Dezembro
Dados Estruturados
• 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
• 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
• 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
• 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
• 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
• 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
• 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
• 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
• 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
• 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.
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
• 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
• 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
• 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
• 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
Array ou matriz bidimensional
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 110115200
55 80 125150
Lin
ha
sL
inh
as
Lin
ha
s
Colunas Colunas Colunas Colunas
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.
…………………
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
Records ou Registos
• A) definição de um registo como tipo:
type pessoa =Record Nome: string[10];
Idade: integer;
Altura, peso: real;
End;
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;
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
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’
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);
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 doBegin
Writeln (‘ Introduza os dados relativos ao aluno ’ );Writeln (‘ Nome: ‘); Readln (Nome);Writeln (‘ Idade: ‘); Readln (Idade);Writeln (‘ Altura: ‘); Readln (Altura);Writeln (‘ Peso: ‘); Readln (Peso);
End;
Records ou Registos:
Exemplo de um
programa com 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
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.
• 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.
• 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.