Buscar

Aula_006 - Tipos Estruturados I



Continue navegando


Prévia do material em texto

1
Aula 6
Professores:
Dante Corbucci Filho
Alexandre Plastino
Conteúdo:
- Tipos Estruturados (1a Parte)
 - Array (Vetor)
 - String (Cadeia de Caracteres)
2
Array (ou Vetor)
Um array é um agregado de elementos (valores)
de um mesmo tipo.
Lista
nome do vetor
4o_ elemento Lista[4]
posição dos elementos Lista é um vetor de 100 elementos
7 19 4 10 8 1
1 2 3 4 99 100
3
Array (ou Vetor)
Lista[1] representa o primeiro elemento e possui o valor 7.
Lista[2] representa o segundo elemento e possui o valor 19.
Lista[100] representa o centésimo elemento e possui o valor 1.
Lista[i] representa o i-ésimo elemento.
_
_
_
O índice ou seletor do elemento indica sua ordem (posição)
7 19 4 10 8 1
1 2 3 4 99 100
Lista
4
Array (ou Vetor)
 Os elementos de um vetor podem ser caracterizados 
como variáveis comuns, podendo aparecer em expressões 
e atribuições.
Lista[1] := Lista[3]*2 + Lista[4]
7 19 4 10 8 1
1 2 3 4 99 100
Lista
18 19 4 10 8 1
1 2 3 4 99 100
Lista
5
Array (ou Vetor)
 O índice de um elemento do vetor pode ser 
uma variável ou expressão.
i:= 2;
Lista[i] := Lista[i-1]*2 - Lista[Lista[100]]
14 1
7
7 19 4 10 8 1
1 2 3 4 99 100
Lista
7 7 4 10 8 1
1 2 3 4 99 100
Lista
6
Array (ou Vetor)
 Suponha que se queira somar todos os elementos
de um vetor.
begin
 Soma:=0;
 for Ind:= 1 to 100 do 
 Soma:= Soma + Lista[Ind];
end
7
Características:
 • Trata-se de uma estrutura homogênea, isto é, formada
por elementos de um mesmo tipo, chamado tipo base;
 • Todos os elementos da estrutura são igualmente
acessíveis, ou seja, o tempo e o tipo de procedimento para
acessar qualquer elemento são iguais;
 • Cada elemento da estrutura tem um nome próprio,
composto pelo nome do vetor e pelo índice.
Array (ou Vetor)
8
Array (ou Vetor)
Declaração
 
type 
 T_Vetor = array [1 . . 100] of integer;
var 
 Lista: T_Vetor;
ou ainda
var 
 Lista: array [1 . . 100] of integer;
9
Array (ou Vetor, ou Matriz N-Dimensional)
Declaração - Diagrama Sintático
• Tipo do índice pode ser qualquer tipo escalar; 
• Tipo base pode ser qualquer tipo simples ou estruturado.
,
array [ ] of Tipodo Índice
Tipo
Base
10
Array (ou Matriz)
 A declaração a seguir corresponde a uma matriz
(ou array de duas dimensões) cujo tipo base é boolean. 
 
var Matriz: array [1 . . 2,1 . . 5] of boolean;
Matriz true falsefalse true true
true true false true false
Matriz[2,3]
11
Array (ou Vetor)
program Atribuicao(input{teclado}, output{vídeo});
type 
 t_vetor = array[1..100] of integer;
var 
 X, Y: t_vetor;
 Z: array[1..10] of integer;
begin 
 X:= Y; {Esta atribuição pode ser feita diretamente pois X e Y são 
 vetores de mesmo tipo, ou pode ser feita elemento a elemento}
 Z:= Y; {Erro de compilação: 
 Z e Y são vetores de tamanhos e tipos diferentes}
 Y:= Z; {Erro de compilação: 
 Apesar de Z ser menor que Y, são de tipos diferentes}
end. 
12
program Erros(input{teclado}, output{vídeo});
var 
 X: array[1..100] of integer;
 A: boolean;
 B,I: integer; 
begin 
 A:= X[1]; {Erro de compilação: 
 A não é do mesmo tipo que os elementos de X}
 I:= 200;
 B:= X[I]; {Erro de execução: 
 valor de I fora do intervalo 1..100}
 B:= X[A]; {Erro de compilação: 
 A não é do mesmo tipo que o índice de X}
end. 
Array (ou Vetor)
13
Array (ou Vetor)
Observação:
 Leitura e Escrita de um vetor devem ser 
 realizadas elemento a elemento.
14
Exemplos
Uma lista com 100 números inteiros
 
const
 Tamanho = 100;
type 
 T_Vetor = array [1 . . Tamanho] of integer;
var 
 Lista: T_Vetor;
15
Exemplos
Uma linha de texto de 80 posições
 
const
 Num_Col = 80;
type 
 T_Linha = array [1 . . Num_Col] of char;
var 
 Buffer: T_Linha;
16
Exemplos
Vetor para guardar quantas vezes 
um caracter aparece em um texto
type 
 T_Positivo = 0 . . maxint;
 T_Conta = array [char] of T_Positivo;
var 
 Frequencia: T_Conta;
17
Exemplos
Uma página de 66 linhas de texto
Folha representa uma matriz de 66 linhas por 80 colunas,
Folha[i] representa a i-ésima linha da matriz, ou seja,
 um vetor de 80 caracteres,
Folha[i][j] representa o caracter que está na linha i e coluna j.
type 
 T_Linha = array [1 . . 80] of char;
 T_Pagina = array [1 . . 66] of T_Linha;
var 
 Folha: T_Pagina;
18
Exemplos
Lista com os nomes dos funcionários
const
 NumMaxFunc = 250;
 TamNome = 30;
type 
 T_Nome = array [1 . . TamNome] of char;
 T_ListaNome = array [1 . . NumMaxFunc] of T_Nome;
var 
 ListaNomeFunc: T_ListaNome;
19
Exemplos
Estado do Jogo da Velha
type 
 T_Marca = (Nada, Cruz, Bola);
 T_Tabuleiro = array [1 . . 3] of array [1 . . 3] of T_Marca;
var 
 Jogada: T_Tabuleiro;
20
Exemplos
Tabela com os resultados de cada aluno para cada prova
const
 NumAlunos = 100;
 NumProvas = 10;
type
 T_CodAluno = 1 . . NumAlunos;
 T_CodProva = 1 . . NumProvas;
var 
 Resultado: array [T_CodAluno] of array [T_CodProva] of real;
21
String (ou Cadeia de Caracteres)
 Um objeto do tipo string representa um vetor 
de caracteres (cadeia de caracteres) de tamanho 
variável.
A declaração 
 indica que a variável Nome representa uma 
cadeia de até 20 caracteres. 
var Nome: string [20]
22
String (ou Cadeia de Caracteres)
A atribuição
é válida e será internamente representada 
 da seguinte forma.
Nome:= ’Ana’
Nome
Indica o tamanho da cadeia armazenada
3 A n a
0 1 2 3 19 20
23
String (ou Cadeia de Caracteres)
A atribuição
 é válida, mas a constante atribuída à variável
Nome possui mais de 20 caracteres, sendo truncada!
Nome:= ’Ana Maria Ribeiro de Carvalho’
24
String (ou Cadeia de Caracteres)
Declaração - Diagrama Sintático
• Tamanho é um valor entre 1 e 255.
• Se a definição do tamanho for omitida, será declarada uma
 cadeia de caracteres de tamanho 255 (default).
string [ ]Tamanho
25
String (ou Cadeia de Caracteres)
Atribuição
program Cadeia1(input{teclado}, output{vídeo});
 var 
 X: string[10];
 Y: string[20];
 Z: string[30];
 begin
 Z:= ’Ensino a Distância’;
 Y:= Z;
 {Neste ponto, Y vale ’Ensino a Distância’}
 X:= Y;
 {Neste ponto, X vale ’Ensino a D’}
 end.
26
String (ou Cadeia de Caracteres)
Comparação: operadores relacionais =, <>, <=, >=, <, >
program Cadeia2(input{teclado}, output{vídeo});
var 
 X, Y, Z: string[10]; 
begin
 X:= ’ABCD’;
 Y:= ’ABCZ’;
 Z:= ’ABCDEFG’;
 {Neste ponto, retornam true as seguintes comparações:
 X < Y, X <> ’DCBA’, X < Z, Y > Z } 
end.
27
String (ou Cadeia de Caracteres)
Indexação de cada caracter
O tipo string pode ser tratado também como um Array.
Considere a declaração:
e a atribuição: 
Temos então que:
var Nome: string [20];
Nome:= ’Ana’;
Nome[0] = ASCII 3
Nome[1] = ’A’
Nome[2] = ’n’
Nome[3] = ’a’
28
String (ou Cadeia de Caracteres)
Função length(Cad{e}:string): integer
• Retorna o tamanho da cadeia Cad.
Considere a declaração:
e a atribuição: 
Temos então que: length(Nome) = 3
var Nome: string [20];
Nome:= ’Ana’;
29
String (ou Cadeia de Caracteres)Função length(Cad{e}: string): integer
Observe que, para qualquer string A,
length(A) = ord( A[0] )
30
String (ou Cadeia de Caracteres)
Função concat(A{e},B{e}: string): string
 Retorna a concatenação das cadeias A e B.
Considere a declaração: 
 var Nome, Sobrenome, NomeCompleto: string;
e as atribuições: 
 Nome:= ’Ana’;
 Sobrenome:= ’Carvalho’
 NomeCompleto:= concat (Nome,Sobrenome);
 Temos então que: NomeCompleto = ’AnaCarvalho’
31
String (ou Cadeia de Caracteres)
Função concat(A{e},B{e}: string): string
 A concatenação pode ser realizada pelo operador +
Considere a declaração: 
 var Nome, Sobrenome, NomeCompleto: string;
e as atribuições: 
 Nome:= ’Ana’;
 Sobrenome:= ’Carvalho’
 NomeCompleto:= Nome + ’ ’ + Sobrenome;
 Temos então que: NomeCompleto = ’Ana Carvalho’ 
32
String (ou Cadeia de Caracteres)
Procedimento delete (var Cad{e/s}: string; 
 Inicio{e}, Quantos{e}: integer)
 Retira Quantos caracteres da cadeia Cad, 
 começando na posição Inicio.
Considere a declaração: 
 var Nome: string [20];
e o trecho de programa: 
 Nome:= ’Ana Carvalho’;
 delete (Nome, 4, 9);
Temos então que: Nome = ’Ana’ 
33
String (ou Cadeia de Caracteres)
Procedimento insert(Nova{e}: string; 
 var Velha{e/s}: string; 
 Inicio{e}: integer)
 Insere a cadeia Nova na cadeia Velha, 
 começando na posição Inicio.
Considere a declaração: 
 var Nome: string [20];
e o trecho de programa: 
 Nome:= ’Ana Carvalho’;
 insert (’ de’, Nome, 4);
Temos então que: Nome = ’Ana de Carvalho’ 
34
String (ou Cadeia de Caracteres)
Função copy(Cad{e}: string; 
 Inicio{e}, Quantos{e}: integer): string
 Retorna a subcadeia de Cad, que tem Quantos 
 caracteres, começando na posição Inicio.
Considere a declaração: 
 var Nome, A: string [20];
e o trecho de programa: 
 Nome:= ’Ana Carvalho’;
 A:= copy(Nome, 5, 8);
Temos então que: A = ’Carvalho’ 
35
String (ou Cadeia de Caracteres)
Função pos(Parte{e}, Completa{e}: string): integer
 Retorna a posição inicial da subcadeia Parte 
 dentro da cadeia Completa.
Considere a declaração: 
 var Nome: string [20];
 i: integer;
e o trecho de programa: 
 Nome:= ’Ana Carvalho’; 
 i:= pos(’Carvalho’,Nome); 
 
Temos então que: i = 5
36
String (ou Cadeia de Caracteres)
Função pos(Parte{e}, Completa{e}: string): integer
 Retorna 0 (zero) caso Parte não seja 
 subcadeia de Completa.
Considere a declaração: 
 var Nome: string [20];
 i: integer;
e o trecho de programa: 
 Nome:= ’Ana Carvalho’; 
 i:= pos(’de’,Nome); 
 
Temos então que: i = 0
37
String (ou Cadeia de Caracteres)
Leitura e Escrita
 Variáveis do tipo string podem ser 
lidas e escritas através dos comandos 
read, readln, write e writeln.
38
Exemplo com Vetor
Program Classico(input{teclado}, output{vídeo});
Const 
 Tam = 10;
Type
 T_Dominio = 1..Tam;
 T_Vetor = array[T_Dominio] of real;
Var
 Numeros: T_Vetor;
Begin 
End. 
Especificação do Problema: 
 Faça um programa para ler, do teclado, dez números reais e 
 escrevendo-os, no vídeo, em ordem crescente.
Metodologia para a Solução: 
2. Escolha um nome para o programa e diga os parâmetros do programa;
3. Salve o programa no seu diretório;
4. Identifique a "necessidade" de constantes: Tam;
5. Identifique a "necessidade" de tipos: T_Dominio e T_Vetor;
6. Salve-o, novamente, e compile-o (via fpc).
7. Declare as variáveis necessárias: Numeros;
39
Exemplo com Vetor
Metodologia para a Solução: 
2. Identifique "macro" operações a serem realizadas: 
 Ler, Ordenar, Escrever;
Program Classico(input{teclado}, output{vídeo});
Const 
 Tam = 10;
Type
 T_Dominio = 1..Tam;
 T_Vetor = array[T_Dominio] of real;
Var
 Numeros: T_Vetor;
Begin 
 Ler(Numeros);
 Ordenar(Numeros);
 Escrever(Numeros);
End. Vídeo
Teclado
Classico
40
1. Faça os cabeçalhos e blocos vazios ("stubs") das operações;
2. Salve o programa novamente. Compile-o.
Program Classico(input{teclado}, output{vídeo});
Const 
 Tam = 10;
Type
 T_Dominio = 1..Tam;
 T_Vetor = array[T_Dominio] of real;
Procedure Ler(Var V{s}: T_Vetor); 
 begin 
 end;
Procedure Ordenar(Var V{e/s}: T_Vetor); 
 begin 
 end;
Procedure Escrever(V{e}: T_Vetor); 
 begin 
 end;
Var
 Numeros: T_Vetor;
begin 
 Ler(Numeros);
 Ordenar(Numeros);
 Escrever(Numeros);
end. 
41
Program Classico(input{teclado}, output{vídeo});
...
Procedure Ler(Var V{s}: T_Vetor); 
 var ind: integer;
 begin 
 for ind:= 1 to Tam do
 begin
 write(output, ’Elemento[’, Ind, ’]= ’);
 readln(input, V[Ind]); 
 end;
 end;
...
Var
 Numeros: T_Vetor;
Begin 
 Ler(Numeros);
 Ordenar(Numeros);
 Escrever(Numeros);
End. 
1. Escreva o corpo de uma primeira operação (escolhida por funcionalidade);
2. Salve, compile e execute o programa.
V
Teclado
 Ler
Vídeo
{s}
42
1. Escreva o corpo da próxima operação (escolhida por funcionalidade);
2. Salve, compile e execute o programa.
Program Classico(input{teclado}, output{vídeo});
...
Procedure Escrever(V{e}: T_Vetor); 
 var ind: integer;
 begin 
 for ind:= 1 to Tam do
 writeln(output, ’Elemento[’, Ind, ’]= ’, V[ind]);
 end;
...
Var
 Numeros: T_Vetor;
Begin 
 Ler(Numeros);
 Ordenar(Numeros);
 Escrever(Numeros);
End. 
V
Vídeo
{e}
Escrever
43
Procedure Ordenar(Var V{e/s}: T_Vetor); 
 Procedure Trocar(Var A{e/s}, B{e/s}: Real);
 begin
 end; 
 Procedure Selecionar(Vet{e}: T_Vetor; Inicio{e}:T_Dominio; Var Local{s}: T_Dominio);
 begin
 end; 
Var 
 ind: T_Dominio;
Begin 
 for ind:= 1 to Tam-1 do
 begin
 Selecionar(V, Ind, Posicao);
 Trocar(V[Ind], V[Posicao]);
 end;
End;
• Escreva o corpo da próxima operação (escolhida por funcionalidade);
V
{e/s}
Ordenar
44
Procedure Ordenar(Var V{e/s}: T_Vetor); 
 Procedure Trocar(Var A{e/s}, B{e/s}: Real);
 var Temp: real;
 begin
 Temp:= A;
 A:= B;
 B:= Temp;
 end; 
 Procedure Selecionar(Vet{e}: T_Vetor; Inicio{e}:T_Dominio; Var Local{s}: T_Dominio);
 var Indice: Integer;
 begin
 Local:= Inicio;
 for Indice:= Inicio+1 to Tam do
 if Vet[Indice]<Vet[Local]then Local:= Indice;
 end;
Begin
 . . .
End;
45
Aula 6
Professores:
Dante Corbucci Filho
Alexandre Plastino
Conteúdo:
- Tipos Estruturados (1a Parte)
 - Array (Vetor)
 - String (Cadeia de Caracteres)