Inteiro
Os dados do tipo inteiro são quantidades numéricas inteiras. Os dados
deste tipo podem ser constantes, variáveis, funções e expressões.
Real
Idêntico ao anterior, as quantidades em vez de numéricas são reais.
Carácter
Os caracteres disponíveis encontram-se na tabela ASCII (“American
Standard Code for Information Interchange”).
Apêndice B – Tabela ASCII.
String
Muitas linguagens de programação disponibilizam o tipo string (cadeia de
caracteres – letras, algarismos e caracteres especiais, vulgarmente
delimitados por apóstrofos).
O número máximo de caracteres possíveis de incluir numa string é 255 na
maior parte das linguagens.
Operações com strings:
• Concatenação (+)
nome1 ‘Ana ‘;
nome2 ‘Maria’;
Escrever (nome1+nome2)
O resultado será: Ana Maria.
• Comparação
Comparação resultado
‘caderno’ > ’cadernos’ falso
‘caderno’ > ‘livro’ falso
‘ana’ = ‘ANA’ verdadeiro
Critérios utilizados na comparação:
1. ordem alfabética;
2. quantidade de caracteres.
Booleano
Apenas podem assumir dois valores: verdadeiro (true) e falso (false).
Vetores ou Matrizes Unidimensionais
Um vetor ou array/quadro unidimensional pode ser pensado como uma lista
de dados, todos do mesmo tipo, que são coletivamente referidos pelo
mesmo nome (identificador). Cada elemento do vetor pode ser acedido
individualmente indicando o nome do vetor e o índice, colocado entre
parêntesis retos.
Considere a seguinte lista:
lista[1] lista[2] lista[3] lista[n]
Os elementos individuais do vetor são lista[1], lista[2], lista[3] até lista[n].
........
Pascal – declaração de um vector
VAR
identificador: array[1..n] of tipo_de_dados;
Admitamos que com a variável A pretendemos representar uma coleção de 5
valores que designamos por A[1], A[2], A[3], A[4] e A[5].
Consideremos o seguinte:
1. inteiro A[5]
2. A[1] 3; A[2] 8;
3. A[4] A[2]; i 2;
4. A[i+1] A[1];
5. A[i+3] A[1]*A[i]
A instrução da linha 1 serve para declarar um vetor, A, com 5 inteiros.
Na linha 2 coloca-se 3 e 8 na primeira e segunda posição de A (A[1] e A[2])
respetivamente.
Na linha 3 A[4] passa a ter o valor de A[2] e i passa a ser 2.
Na linha 4 A[i+1], isto é, A[3] passa a ser igual a A[1]
Finalmente, na linha 5, A[5] passa a ser 3*8
1 2 3 4 5
3 8
1 2 3 4 5
A[]:
A[]:
3 8 8
1 2 3 4 5
A[]: i: 2
3 8 3 8
1 2 3 4 5
A[]: i: 2
3 8 3 8 24
1 2 3 4 5
A[]:
Considere o seguinte problema:
Calcular a média de idades de n pessoas.
Isto é trivial! Até porque este algoritmo já está resolvido...
E o desvio de cada idade em relação à média?
E agora?!
No algoritmo anterior as idades não eram guardadas, por isso, não é possível
calcular o desvio, a não ser que se peça novamente as idades! Mas que
aborrecido para o utilizador!
Solução: Guardar as idades num vetor!
inicio
soma 0;
Escrever (‘Quantas pessoas?’);
Ler (n);
Para i1 até n fazer
inicio
Escrever (‘Introduza a idade ’,i );
Ler (idade[i]);
soma soma + idade[i];
fim;
media soma/n;
Para i1 até n fazer
inicio
desvio media - idade[i];
Escrever (‘O desvio da idade ‘, i,’ é ’, desvio);
fim;
fim
Matrizes Bidimensionais
Uma matriz, ou array, bidimensional pode ser pensada como uma tabela de
dados, todos do mesmo tipo, que são coletivamente referidos pelo mesmo
nome (identificador). Cada elemento da matriz pode ser acedido
individualmente indicando o nome da matriz e os índices (da linha e da
coluna), colocados entre parêntesis retos.
Nas matrizes o
1º índice representa as linhas
2º índice representa as colunas.
Suponha que tabela é uma matriz de duas dimensões contendo m linhas e n
colunas. Os elementos individuais da matriz seriam então: tabela[1,1],
tabela[1,2], tabela[1,3], ..., tabela[1,n], tabela[2,1], ..., tabela[2,n], ...,
tabela[m,1], tabela[m,2], ..., tabela[m,n].
Considere a figura:
...
Observação:
O índice de uma variável indexada pode começar em 1(um) ou em 0 (zero)
dependendo da linguagem utilizada.
........
Tabela[1,1] Tabela[1,2] Tabela[1,3] Tabela[1,n]
........
Tabela[2,1] Tabela[2,2] Tabela[2,3] Tabela[2,n]
........
Tabela[m,1] Tabela[m,2] Tabela[m,3] Tabela[m,n]
Pascal – declaração de uma matriz bidimensional
VAR
identificador: array[1..n, 1..m] of tipo_de_dados;
As aplicações que envolvem o uso de matrizes bidimensionais requerem
ciclos encaixados (ou laços embutidos), um ciclo para cada dimensão.
Uma aplicação orientada para o processamento dos elementos de uma matriz
bidimensional poderá fazer o uso de dois ciclos, um dentro do outro.
Como é possível preencher os elementos de uma matriz (bidimensional)?
Existem duas formas de o fazer:
• Preencher por linha
Fixa-se a linha e percorre-se as colunas.
• Preencher por coluna
Fixa-se a coluna e percorre-se as linhas.
Exemplo usando a estrutura de dados matriz bidimensional
Suponhamos as seguintes variáveis
tabela: matriz inteira de duas dimensões (n linhas e m colunas);
l: contador do número da linha;
c: contador do número da coluna.
Se pretendermos:
• Preencher a matriz por linha:
Para l 1 até n fazer
Para c 1 até m fazer
inicio
Escrever (‘Qual o valor da matriz para a
coluna ’,c, ’ e linha ‘,l);
Ler tabela[l,c];
fim
• Preencher a matriz por coluna:
Para c 1 até m fazer
Para l 1 até n fazer
inicio
Escrever (‘Qual o valor da matriz para a
coluna ’,c, ’ e linha ‘,l);
Ler tabela[l,c];
fim
1. Introduza 10 inteiros para um vetor e calcular a sua soma.
2. Escreva um algoritmo que, após ler n valores A[1], A[2], ..., A[n],
desloque os primeiros n-1 valores uma posição para a direita e
escreva o vetor resultante;
por exemplo, se o vetor era:
-1 8 4 -6 11
passa a ser:
-1 -1 8 4 -6
Exercícios
3. Escreva um algoritmo semelhante ao anterior mas que desloque os
elementos para a esquerda.
4. Introduza 10 inteiros, negativos e positivos, num vetor. De seguida
examine cada valor do vetor e escreva no ecrã os negativos e a
respetiva posição (índice).
5. Registe num vetor, 5 idades. De seguida efetue as seguintes
operações:
• Calcule a média das idades;
• Indique as idades que tiveram valores acima da média;
• Indique a menor e a maior idade.
6. Escreva um algoritmo que após ler 6 inteiros para 2 vetores (A e B)
calcule a soma e insira num outro vetor (C). Escreva o vetor resultante;
por exemplo, se
A: 1 3 5 2 4 7
B: -2 4 3 1 5 8
C: -1 7 8 3 9 15
7. Leia 10 inteiros para um vetor e crie um novo vetor somente com os
pares do primeiro. Escreva o vetor resultante; por exemplo, se
A: 2 3 5 2 4 7
B: 2 2 4
8. Registe os preços de 10 artigos e em seguida atualize esses mesmos
preços sabendo que todos sofrem um aumento de n%.
9. Considere os seguintes dados:
3, 2, 1, 5, 29, 6, 40, 3, 1, 2, 12, 31.
Preencha a matriz A (3 linhas e 4 colunas), após cada uma das
seguintes operações:
I
Para i 1 até 3 fazer
Para j 1 até 4 fazer
Ler(A[i,j]);
II
Para i 1 até 3 fazer
Para j 1 até 4 fazer
Ler(A[i,j]);
10. A empresa de tapetes L&A tem dez empregadas e pretende um
programa que registe o número de tapetes feitos por dia (em cinco
dias da semana) por cada uma das empregadas. Pretende
também, registar o total de tapetes feitos por cada empregada na
semana. Os dados registados devem ser guardados para o cálculo
da média de tapetes feitos na semana. A empresa pretende, ainda,
saber qual a empregada que executou mais tapetes e em que dia
da semana.
a) Faça um estudo das estruturas de dados necessárias à resolução
do problema;
b) Elabore um algoritmo considerando o seguinte:
• Registo de valores;
• Total de tapetes feitos por cada empregada;
• Cálculo da média de tapetes feitos por dia na semana;
• Empregada que executou o maior número de tapetes.
11. Dada a matriz A, quadrada de n por n, pretende-se um algoritmo
que preencha uma matriz B, transposta de A, ou seja, troque as
linhas com as colunas.
Tipo de dados estruturados cujos elementos constituintes não necessitam de
ser idênticos (do mesmo tipo – como acontecia nos arrays). Os elementos
individuais designam-se por campos do registo.
A principal diferença entre uma matriz e um registo é que, enquanto uma
matriz agrupa um conjunto de dados do mesmo tipo, um registo pode
conjugar diferentes tipos de dados na mesma estrutura.
Pascal
A definição de um registo pode ser feita directamente como variável ou como
tipo:
a) Exemplo de definição de um registo directamente como variável:
Var aluno: record
nome:string;
telefone: string[10];
morada:string;
idade:integer;
end;
Sintaxe: Var <identificador>: Record <lista de campos> End;
b) Exemplo de definição de um registo como tipo:
Type pessoa= record
nome:string;
telefone: string[10];
morada:string;
idade:integer;
end;
Sintaxe: Type <identificador> = Record <lista de campos> End;
Diferença entre Var e Type:
• Um registo definido como variável (Var) funciona apenas para uma única
variável;
• Um registo definido como Type, serve para definir várias variáveis desse
mesmo tipo.
Exemplo:
Type pessoa= record
nome:string;
telefone: string[10];
morada:string;
idade:integer;
end;
Var aluno, a1,a2:pessoa;
As variáveis aluno, a1 e a2 são registos que têm os mesmos campos
definidos no tipo pessoa.
Para fazer uma atribuição de valores aos campos da variável aluno há
duas maneiras possíveis de o fazer:
1. Designação conjunta do identificador do registo e do campo visado
Sintaxe: <identificador do registo>.<identificador do campo>
Exemplo: aluno.nome:=‘Ana Guedes’;
read(aluno.idade);
write(‘Idade do aluno é ‘, aluno.idade);
2. Por intermédio do operador with
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(‘Quais os dados do aluno?’);
writeln (‘Nome:’);
readln(nome);
writeln(‘Morada:’);
readln(morada);
writeln(‘Telefone:’);
readln(telefone);
writeln(‘Idade:’);
readln(idade);
End;
1. Elabore um algoritmo que:
• Permita a leitura dos dados relativos a 15 empregados de uma
empresa. Os dados são os seguintes:
nome
morada
telefone
categoria
sexo
idade
• Permita a listagem de todos os nomes existentes.
• Indique a idade do empregado mais velho.
• Indique o número de empregados do sexo masculino.
Exercícios
Todas as estruturas de dados, que vimos até aqui, são voláteis, ou seja, elas
contêm valores apenas enquanto o programa está a correr.
Suponhamos que queremos elaborar um programa que registe os
aniversários dos nossos melhores amigos.
É evidente que a estrutura de dados que aprendemos anteriormente
(Registo) é útil. Mas não chega!
É necessário guardar em memória secundária os dados.
Ficheiro é um tipo de dados estruturado que permite fazer isso mesmo.
Os principais tipos de ficheiros com que podemos trabalhar são:
• ficheiros de texto
• ficheiros de tipos definidos pelo utilizador
Pascal
Declaração de ficheiros
• Texto
Sintaxe
Var <identificador>: text;
• Dados
Sintaxe
Var <identificador>: FILE OF tipo;
Exemplo:
Type conta=RECORD
cliente:string;
clientesaldo:real
END;
VAR clientes: FILE OF conta;
Ficheiro de registos do tipo conta.
Ficheiros de texto
Contem informação em formato de caracteres ASCII.
Ficheiros de tipos definidos pelo utilizador
O ficheiro está organizado sob uma determinada forma. Podem ser ficheiros
de inteiros ou reais, de caracteres ou de strings, de arrays, de registos, etc.
Mas todos do mesmo tipo, como acontecia nas estruturas de dados do tipo
array.
Associação de uma variável com o nome de ficheiro
Sintaxe
Assign(<variável de ficheiro>,<nome de ficheiro>)
Abertura de um ficheiro já existente
Sintaxe
Reset(<variável de ficheiro>)
Criação de um novo ficheiro
Sintaxe
Rewrite(<variável de ficheiro>)
Escrever/Ler informação para um ficheiro
Sintaxe
Write(ln)/Read(ln)(<variável de ficheiro>,<dados>)
Fechar um ficheiro
Sintaxe
Close(<variável de ficheiro>)
Acrescentar informação num ficheiro do tipo texto
Sintaxe
Assign(<variável de ficheiro>, <nome de ficheiro>);
Append(<variável de ficheiro>);
Teste de fim de ficheiro/fim de linha
Sintaxe
Eof/Eoln(<variável de ficheiro>)
Um conjunto é uma coleção de elementos simples relativos a um assunto
concreto. Os elementos de um conjunto podem ser do tipo real, inteiro,
booleano, carácter ou string.
Construção dum conjunto:
Identificador:[elemento1, elemento2, ..., elementon]
Exemplos:
Cores:[azul, verde, preto, vermelho, amarelo, castanho, rosa]
Animais: [rato, vaca, ovelha, porco, cão, pintainho]
Formas: [quadrado, elipse, paralelogramo, losango, retângulo,
triângulo, circunferência]
Inteiros10: 1..10