Técnicas e Linguagens de Programação · Muitas linguagens de programação disponibilizam o tipo...

22

Transcript of Técnicas e Linguagens de Programação · Muitas linguagens de programação disponibilizam o tipo...

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

Pascal

Sintaxe:

Type elementos base = (dado1, dado2, ..., dadon);

ou

Type elementos base = dado1..dadon;

conjunto = SET OF elementos base;

Var nome do conjunto: conjunto;

Exemplo:

Type medidas = (pequeno, medio, grande);

medidascamisa = SET OF medidas;

Var mangacurta, mangacomprida: medidascamisa;