Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Pascal I - Apostilas - Informática Part3, Notas de estudo de Informática

Apostilas de Informática sobre a Linguagem Pascal, Introdução à programação, Definição de algoritmo, Algoritmo x programa, Linguagem de programação, A linguagem pascal, Estrutura de um programa pascal, O turbo pascal, Elementos da linguagem pascal.

Tipologia: Notas de estudo

2013

Compartilhado em 28/08/2013

Garoto
Garoto 🇪🇸

4.6

(121)

1 / 22

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Universidade Tiradentes - Departamento de Ciência da Computação
Pascal - 49
Manipulação de Registros
Referência aos Campos
Os nomes dos campos de um registro são semelhantes aos índices de uma array. Eles
permitem acessar individualmente cada informação. Para tal, colocamos o nome da variável do tipo
record ao qual o campo pertence, seguida de um ponto e finalmente do nome do campo.
Sintaxe
Nome-Do-Registro.Nome-Do-Campo
Exemplo
type Reg_Aluno = record
Nome : string(40);
Matricula : integer;
Notas : array[1..3] of real;
end;
VAR Aluno1 : Reg_Aluno;
Aluno2 : Reg_Aluno;
I : integer;
...
{ Leitura dos campos de Aluno1 }
read( Aluno1.Nome, Aluno1.Matricula );
for I := 1 to 3 do
read( Aluno1.Notas[ I ] );
{ Exibição dos campos de Aluno2 }
writeln( Aluno2.Nome );
writeln( Aluno2.Matricula );
for I := 1 to 3 do
write( Aluno2.Notas[ I ] );
...
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16

Pré-visualização parcial do texto

Baixe Pascal I - Apostilas - Informática Part3 e outras Notas de estudo em PDF para Informática, somente na Docsity!

Manipulação de Registros

Referência aos Campos

Os nomes dos campos de um registro são semelhantes aos índices de uma array. Eles permitem acessar individualmente cada informação. Para tal, colocamos o nome da variável do tipo record ao qual o campo pertence, seguida de um ponto e finalmente do nome do campo.

Sintaxe

Nome-Do-Registro. Nome-Do-Campo

Exemplo type Reg_Aluno = record Nome : string (40); Matricula : integer ; Notas : array [1..3] of real ; end ;

VAR Aluno1 : Reg_Aluno; Aluno2 : Reg_Aluno; I : integer ; ...

{ Leitura dos campos de Aluno1 } read ( Aluno1.Nome, Aluno1.Matricula ); for I := 1 to 3 do read ( Aluno1.Notas[ I ] );

{ Exibição dos campos de Aluno2 } writeln ( Aluno2.Nome ); writeln ( Aluno2.Matricula ); for I := 1 to 3 do write ( Aluno2.Notas[ I ] ); ...

Comando WITH

O comando with é utilizado para simplificar a referência aos campos de uma variável tipo

record , eliminando a necessidade de se colocar seu nome antes dos nomes dos campos.

Sintaxe

with Variável-Registro [,Variável-Registro]... do comando

with Variável-Registro [,Variável-Registro]... do begin comando; comando; ... end;

Exemplo

type Reg_Aluno = record Nome : string (40); Matricula : integer ; Notas : array [1..3] of real ; end ;

VAR Aluno1, Aluno2 : Reg_Aluno; I : integer ; ...

{ Leitura dos campos de Aluno1 } with Aluno1 do begin read ( Nome, Matricula ); for I := 1 to 3 do read ( Notas[ I ] ); end ; ...

Registros Aninhados

Algumas vezes temos necessidade de estruturar um registro de forma hierárquica, onde algum

campo seja também um registro.

Declaração

type Reg_Data = record Dia : 1..31; Mes : 1..12; Ano : integer ; end ;

Reg_Aluno = record Nome : string (40); Matricula : integer ; Notas : array [1..3] of real ; Data_Nascimento : Reg_Data; end ;

var Aluno1, Aluno2 : Reg_Aluno;

Referência aos Campos

Para referenciar os campos do registro procedemos da mesma forma já descrita:

Aluno1.Nome := ´Josias´; Aluno1.Data_Nascimento.Ano := 1970;

Aluno1.Data_Nascimento := Aluno2.Data_Nascimento;

Arrays de Registros

Muitas vezes encontramos um problema no qual temos que trabalhar com um conjunto de registros

de mesmo tipo. para tais problemas, podemos utilizar uma estrutura de dados que combina arrays e

records.

Por exemplo, suponhamos que temos uma classe com 50 alunos onde cada aluno é representado

pelo registro Reg_Aluno, assim, podemos criar um array de 50 elementos, onde cada elemento é do tipo

Reg_Aluno.

Exemplo

type Reg_Aluno = record Nome : string (40); Matricula : integer ; Notas : array [1..3] of real ; end ;

VetClasse = array [ 1..50 ] of Reg_Aluno;

var Classe : VetClasse; I, J : integer ;

Os registros dos 50 alunos poderiam ser lidos da seguinte forma:

for I := 1 to 50 do begin read ( Classe[ I ].Nome, Classe[ I ].Matricula ); for J := 1 to 3 do read ( Classe[ I ].Notas[ J ] ); end ;

Os registros dos 50 alunos poderiam ser exibidos da seguinte forma:

for I := 1 to 50 do begin with Classe[ I ] do begin write ( Nome, Matricula ); for J := 1 to 3 do read ( Notas[ J ] ); end ; end ;

program Relatorio_de_Vendas; { Programa que lê as vendas e as devoluções de um grupo de vendedores e imprime uma tabela mostrando para cada vendedor os dados lidos, a venda líquida e a comparação de sua venda líquida com a média das vendas. }

const NumVendedores = 20;

type Reg_Vendedor = record Nome : string (30); Vendas, Devolucoes, Liquido, Comparacao : integer ; end ; Var Vendedor : array [ 1..NumVendedores ] of Reg_Vendedor; Media, Soma, I : integer ;

BEGIN { Leitura dos Dados } for I := 1 to NumVendedores do with Vendedores[ I ] do readln ( Nome, Vendas, Devolucoes );

{ Calculo das Vendas Liquidas e da Media das Vendas } Soma := 0; for I := 1 to NumVendedores do with Vendedores[ I ] do begin Liquido := Vendas - Devolucoes; Soma := Soma + Liquido; end;

Media := Soma / NumVendedores; { Comparacao das vendas de cada vendedor com a media } for I := 1 to NumVendedores do

Vendedores[ I ].Comparacao := Vendedores[ I ].Liquido - Media;

{ Impressão dos Resultados } clsrscr(); writeln (´ ´:25, ´Resumo das Vendas´); writeln; writeln (´ ´:10, ´Nome´, ´ ´:12, ´Vendas´, ´ ´:6, ´Devol´, ´ ´:4, ´Liquido´, ´ ´:5, ´DifMedia´ ); writeln; for I := 1 to NumVendedores do with Vendedores[ I ] do writeln ( Nome, Vendas:11, Devolucoes:11, Liquido:11, comparacao:11 );

END.

REGISTROS VARIANTES

REGISTROS CONSTANTES

ESTRUTURA DE DADOS TIPO CONJUNTO

DEFINIÇÃO

Um conjunto é uma coleção de objetos correlatos. Cada objeto de um conjunto é denominado membro ou elemento.

Exemplos de Conjuntos

 Todos os números inteiros compreendidos entre 0 e 100  As letras do alfabeto  As consoantes do alfabeto

Embora na matemática, não exista nenhuma restrição sobre quais objetos podem ser membros de um conjunto, em Pascal somente uma forma restrita de conjuntos pode ser usado. Assim, os conjuntos, em Pascal, só podem conter elementos de mesmo tipo, chamado tipo base , podendo este apenas ser um dos tipos escalares ordenados da linguagem.

A definição de um tipo conjunto é feita da seguinte forma :

[ packed ] set of tipo-base

onde, o tipo-base pode ser um tipo escalar enumerado, o identificador de um tipo escalar ou uma faixa.

Exemplo

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

TCaracters = set of char; TDiasDoMes = set of 1..31 ; TDiasUteis = set of SEG..SEX;

OBS.: O número máximo de elementos em um conjunto no Pascal é de 256, e, se o tipo-base for inteiro, os valores só podem estar no intervalo de 0 a 255.

EXPRESSÕES COM CONJUNTOS

Valores do tipo conjunto podem ser calculados através de expressões de conjuntos, as quais consistem de conjuntos, de variáveis do tipo conjunto, de construtores de conjuntos e operadores de conjuntos.

Os operadores envolvidos em uma expressão de conjunto são os seguintes:

Complemento de um Conjunto ( not )

Retorna o conjunto complementar do operando.

Exemplo

type TDias = set of ( Dom, Seg, Ter, Qua, Qui, Sex, Sab ); var DiasDeTrabalho, FimDeSemana : TDias; ... DiasDeTrabalho := [ Seg..Sex ]; FimDeSemana := not DiasDeTrabalho; { Dom e Sab }

Interseção de Conjuntos ( * )

Retorna o conjunto contendo os elementos comuns aos dois conjuntos.

Exemplo : [ 1, 3 ] * [ 3, 5, 7 ] => [ 3 ]

Diferença de Conjuntos ( - )

Retorna o conjunto contendo os elementos do primeiro conjunto quer não estão no segundo.

Exemplo : [ 1, 2, 3, 4 ] - [ 2, 4 ] => [ 1, 3 ]

União de Conjuntos ( + )

Retorna o conjunto contendo todos os elementos existente nos dois conjuntos.

Exemplo : [ 1, 3 ] + [ 3, 5, 7 ] => [ 1, 3, 5, 7 ]

Igualdade de Conjuntos ( = )

Retorna TRUE se os elementos do primeiro conjunto são os mesmos do segundo.

Exemplo : [ 1, 3 ] = [ 3, 1 ] => retorna TRUE

Desigualdade de Conjuntos ( + )

Retorna TRUE se os elementos do primeiro conjunto não são os mesmos do segundo.

Exemplo : [ 1, 3 ] <> [ 3, 1, 2 ] => retorna TRUE

SubConjunto de um Conjunto ( <= )

Retorna TRUE se o primeiro conjunto está contido no segundo.

Exemplo : [ 1, 2, 3 ] <= [ 3, 1, 2, 4, 5 ] => retorna TRUE

SuperConjunto de um Conjunto ( >= )

Retorna TRUE se o primeiro conjunto contém o segundo.

Exemplo : [ 3, 1, 2, 4, 5 ] >= [ 1, 2, 3 ] => retorna TRUE

Elemento de um Conjunto ( in )

Retorna TRUE se o primeiro operando é elemento do conjunto.

Exemplo : 3 in [ 1, 2, 3 ] => retorna TRUE

APLICAÇÕES DE CONJUNTOS

Exemplo 1

Expressões de conjuntos são úteis para tornar mais claros testes complicados. Por exemplo :

if ( Ch = ´A´ ) or ( Ch = ´E´ ) or ( Ch = ´I´ ) or ( Ch = ´O´ ) or ( Ch = ´U´ ) then

pode ser expresso mais facilmente da seguinte maneira :

if Ch in [ ´A´, ´E´, ´I´, ´O´, ´U´ ] then

Outro exemplo seria :

if ( Valor >= 0 ) and ( Valor <= 9 ) then

fica melhor se for expresso como :

if Valor in [ 0..9 ] then

END.

SUBPROGRAMAS

Até agora temos desenvolvido programas que englobam a lógica completa do algoritmo para a solução de um determinado problema. É comum, em programação, decompor a lógica de programas complexos em programas menores e, depois, juntá-los para compor o programa final. Essa técnica de programação é denominada programação modular.

A programação modular consiste num método para facilitar a construção de grandes programas, através de sua divisão em pequenas etapas, que são os módulos ou subprogramas e para possibilitar o reaproveitamento de código, já que podemos utilizar um módulo quantas vezes for necessário, eliminando assim a necessidade de escrever o mesmo código do programa em situações repetitivas. Outra importância da modularização é que ela permite que diferentes programadores trabalhem simultaneamente na solução de um mesmo problema, através da codificação separada dos diferentes módulos.

A modularização, em Pascal, pode ser feita através de procedimentos ( procedures ) e funções ( functions ). Isso é feito associando-se um nome a uma seqüência de comandos através do que chamamos Declaração do Procedimento ou da Função. Pode-se, então, usar o nome do procedimento ou da função dentro do corpo do programa, sempre que desejarmos que o seu bloco de comandos seja executado, isso é o que chamamos de Chamada do Procedimento ou da Função.

Procedimentos

Definição

Um procedimento é uma estrutura de programa autônoma que está incluída num programa em Pascal. Nele podem ser colocados todos os elementos da linguagem Pascal, como se fosse um programa completo, isso é feito através de sua declaração.

Um procedimento pode ser referido escrevendo simplesmente o seu nome seguido de um lista opcional de parâmetros. Quando um procedimento é referenciado, o controle de execução do programa é automaticamente transferido para o início do procedimento. As instruções de execução dentro do procedimento são então executadas, tendo em conta quaisquer declarações especiais que sejam únicas para o procedimento. Quando todas as instruções de execução tiverem sido executadas, o controle passa automaticamente para a instrução imediatamente a seguir à da chamada do procedimento.

Declaração

procedure Nome_Do_Procedimento( Lista-parametros ); [ declaração de rótulos ] [ declaração de constantes ] { Declarações Locais } [ declaração de tipos ] [ declaração de variáveis ] [ declaração de subprogramas ]

begin

comando [ ; comando] ... { Corpo do Procedimento }

end;

Parâmetros

Os parâmetros são uma forma dos procedimentos trocarem informações com os programas. Para ilustrar melhor o uso de parâmetros, considere um programa para solicitar as notas obtidas por um aluno com o respectivo peso, para depois calcular a média aritmética ponderada. O programa deveria começar por :

writeln( ´Primeira Nota´); writeln( ´Digite a Nota : ´); readln( Nota1 ); writeln( ´Digite o Peso da Nota : ´); readln( Peso1 );

A seguir o programa deverá solicitar a segunda nota como indicado abaixo :

writeln( ´Segunda Nota´); writeln( ´Digite a Nota : ´); readln( Nota2 ); writeln( ´Digite o Peso da Nota : ´); readln( Peso2 );

Note que as quatro últimas linhas dos dois trechos do programa executam a mesma tarefa: eles apresentam uma mensagem, depois lêem um número, a seguir apresentam um segunda mensagem e finalmente lêem um segundo número. Visto que são tarefas repetitivas, faz sentido pensarmos em declararmos essas linhas como um procedimento. Existe, no entanto, um problema : na primeira parte nós usamos as variáveis Nota1 e Peso1 e na segunda parte nós usamos as variáveis Nota2 e Peso2.

O problema é resolvido em Pascal com o uso de variáveis especiais chamadas de parâmetros formais. Esses parâmetros são, na realidade, posições que serão preenchidas com os endereços das variáveis quando o procedimento for chamado pelo programa.

O procedimento LerDadosNota usado no programa a seguir, usa os parâmetros formais Nota e Peso para fazer aquilo que desejamos:

program MediaGlobal; var Nota1, Nota2, Nota3, Peso1, Peso2, Peso3, Media : real;

{ Procedimento para solicitar os dados da Nota do aluno ao usuário } procedure LerDadosNota( var Nota : real; var Peso : real ); begin writeln( ´Digite a Nota : ´); readln( Nota ); writeln( ´Digite o Peso da Nota : ´); readln( Peso ); end;

{ PROGRAMA PRINCIPAL } BEGIN writeln( ´Primeira Nota´); LerDadosNota( Nota1, Peso1 );

writeln( ´Segunda Nota´); LerDadosNota( Nota2, Peso2 );

writeln( ´Terceira Nota´); LerDadosNota( Nota3, Peso3 );

Media := ( ( Nota1 * Peso1 ) + ( Nota2 * Peso2 ) + ( Nota3 * Peso3 ) ) / ( Peso1 + Peso2 + Peso3 );

writeln( ´Media Global = ´, Media:5:2 ); END.

Passagem de Parâmetros por Referência

A forma como os parâmetros foram passados vista no item anterior é uma das várias formas de passegem de parâmetros, denominada Passagem por Referência ( ou Passagem por Variável ). Os parâmetros passados dessa forma refletem todas as modificações que neles forem feitas quando for retornado ao programa. Assim, você pode usar esse tipo de parâmetro para fornecer valores aos procedimentos como para retornar valores ao programa. Por consequência, somente variáveis podem ser passadas por esse mecanismo; expressões e constantes não são permitidas.

Para um melhor entendimento, considere o seguinte cabeçalho de um procedimento:

procedure Total( var N : integer; var P, B : real );

Os parâmetros formais N, P e B, por terem sido definidos como parâmetros de referência ( possui a palavra reservada var na frente da lista ), na realidade não são verdadeiramente variáveis e, por isso, não tem nenhuma memória alocada a elas.

Agora considere a seguinte chamada

Passagem de Parâmetros por Valor

Passagem de Parâmetros por Constantes

Parâmetro Abertos

Identificadores Locais

Funções

Definição Declaração Aplicações Funções recursivas

Units do Turbo Pascal

Units Predefinidas Estrutura de uma Unit