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. Pascal declaração de um vector VAR identificador: array[1..n] of tipo_de_dados; 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].
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. A[]: 1 2 3 4 5 Na linha 2 coloca-se 3 e 8 na primeira e segunda posição de A (A[1] e A[2]) respetivamente. A[]: 1 2 3 4 5 3 8 Na linha 3 A[4] passa a ter o valor de A[2] e i passa a ser 2. 1 2 3 4 5 A[]: 3 8 8 i: 2 Na linha 4 A[i+1], isto é, A[3] passa a ser igual a A[1] 1 2 3 4 5 A[]: 3 8 3 8 i: 2 Finalmente, na linha 5, A[5] passa a ser 3*8 A[]: 1 2 3 4 5 3 8 3 8 24
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 i 1 até n fazer inicio Escrever ( Introduza a idade,i ); Ler (idade[i]); soma soma + idade[i]; fim; media soma/n; Para i 1 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. Pascal declaração de uma matriz bidimensional VAR identificador: array[1..n, 1..m] of tipo_de_dados; 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: Tabela[1,1] Tabela[1,2] Tabela[1,3] Tabela[2,1] Tabela[2,2] Tabela[2,3]...... Tabela[1,n] Tabela[2,n]... Tabela[m,1] Tabela[m,2] Tabela[m,3]... Tabela[m,n] Observação: O índice de uma variável indexada pode começar em 1(um) ou em 0 (zero) dependendo da linguagem utilizada.
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
Exercícios 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
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 j 1 até 4 fazer Ler(A[i,j]); Para i 1 até 3 fazer 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;
Exercícios 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.
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
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. 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.
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:[elemento 1, elemento 2,..., elemento n ] 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
Pascal Sintaxe: Type elementos base = (dado 1, dado 2,..., dado n ); ou Type elementos base = dado 1..dado n ; conjunto = SET OF elementos base; Var nome do conjunto: conjunto; Exemplo: Type medidas = (pequeno, medio, grande); medidascamisa = SET OF medidas; Var mangacurta, mangacomprida: medidascamisa;