Você está na página 1de 12

UNIVERSIDADE ESTADUAL DE GOIS UNIDADE UNIVERSITRIA DE POSSE COORDENAO DE INFORMTICA SISTEMAS DE INFORMAO 1 ANO LINGUAGEM E TCNICAS DE PROGRAMAO PROF.

. RONALDO FERREIRA DA SILVA


(www.posse.ueg.br/blop/ronaldo)

R$__________ 05/09/2013

VARIVEIS COMPOSTAS HOMOGNEAS

... const N_LIN = 8; N_COL = 8; type matriz : array[1..N_LIN,1..N_COL] of string; var tabuleiro: matriz; lin_origem, col_origem function cavalo(lin_origem, col_origem: integer): boolean; var lin, col: integer; begin write('Entre com a nova posio [Linha, Coluna]: '); readln(lin,col); if ((lin < 1 or lin > 8) or (col < 1 or col > 8)) then cavalo := false; if ((lin_origem = lin - 2 or lin_origem = lin + 2) and(col_origem = col - 1 or col_origem = col + 1)) then ...

... begin tabuleiro[lin,col] = 'C'; tabuleiro[lin_origem, col_origem] := ' '; cavalo := true; end; if ((lin_origem = lin - 1 or lin_origem = lin + 1) and(col_origem = col - 2 or col_origem = col + 2)) then begin tabuleiro[lin,col] = 'C'; tabuleiro[lin_origem, col_origem] := ' '; cavalo := true; end; end; ...

Variveis compostas homogneas correspondem a posies de memria, identificadas por um mesmo nome, individualizadas por ndices e cujo contedo do mesmo tipo. O conjunto de 10 notas dos alunos de uma disciplina pode constituir uma varivel composta. A este conjunto associa-se o identificador NOTA que passar a identificar no uma nica posio de memria, mas 10. A referncia ao contedo do n-simo elemento do conjunto ser identificada pela notao NOTA[n], onde n um nmero inteiro ou uma varivel numrica contendo um valor inteiro. Exemplo 1.1: Supondo-se que em um dado instante a varivel composta NOTA contivesse os seguintes valores. NOTA

NOTA[3] estaria referenciando o terceiro elemento do conjunto cujo contedo 90. possvel, tambm, a utilizao de uma forma de acesso genrica, atravs de uma varivel que contenha um valor inteiro. Exemplo 1.2: No mesmo conjunto NOTA, esboado no exemplo 1.1, utilizando se da varivel I, tem-se a possibilidade de acesso a qualquer uma das notas armazenadas. I 6 A uma referncia NOTA[i], antes de ser consultada a varivel composta NOTA, I seria substitudo pelo seu contedo no dado instante. Nesse caso, est-se referenciando ao elemento do conjunto que tem o ndice 6 associado, ou seja, a nota 91. Exemplo 1.3: Escrever o trecho do algoritmo que faa a leitura de 10 notas dos alunos de uma disciplina e armazenar em uma varivel composta NOTA.
algoritmo leitura; ... inicio i 1; program leitura; ... begin i := 1; repeat if I > 10 then break; readln(NOTA[I]); I := i+1; until (i>=10); end.

repita se i>10 ento interrompa; leia(NOTA[I]); i i+1;

at (i>=10); fim.

Supondo que as notas fossem 70,75,80,90,65,85,75,85,91,92 e estive uma em cada linha de um dispositivo de entrada, aps a execuo do trecho do algoritmo anterior a varivel nota ficaria assim: NOTA

Exemplo 1.4: Escrever o trecho do algoritmo que leia um conjunto de 10 notas armazene-as na varivel composta NOTA e calcule a sua mdia.
algoritmo leitura; ... inicio Exemplo i 1; repita se i>10 ento interrompa; leia(NOTA[I]); soma soma + NOTA[i]; i i+1; program leitura; ...

1.5:

begin i := 1; repeat if i>10 then break; readln(NOTA[I]); soma := soma + NOTA[i]; i := i+1; until (i>=10); end.

at (i>=10); fim.

Escrever a estrutura que compare o contedo da stima posio da varivel NOTA com o valor 60.

Escreva o mesmo trecho descrito acima de forma genrica, ou seja, usando a varivel INDICE, para individualizar os elementos.

A partir do conceito fundamental de variveis compostas so criadas estruturas de 3

dados mais complexas, visando adequar o instrumento aos vrios problemas do dia-a-dia do programador. Assim surgem as variveis compostas bidimensionais, que necessitam de pelo menos dois ndices para individualizao dos seus elementos. So muito teis quando se tem que manipular matrizes e tabelas. O primeiro ndice representa o nmero da linha e o segundo o nmero da coluna. Exemplo 1.6: A varivel MATRIZ constituda por nove elementos dispostos em trs linhas e trs colunas cada: MATRIZ 12 69 11 19 14 112 32 37 42

MATRIZ[2,2] referencia o elemento da segunda linha e segunda coluna, cujo contedo 14; MATRIZ [2,3], referencia o elemento da segunda linha e terceira coluna, cujo contedo 37. O conceito de variveis compostas bidimensionais estendida para as de n dimenses. Trata-se apenas, de uma facilidade a mais, visto que o conjunto de ndices, conceitualmente pode ser encarado como um refinamento da individualizao do elemento do conjunto. A seguir sero abordadas as variveis compostas unidimensionais e multidimensionais. VARIVEIS COMPOSTAS HOMOGNEAS UNIDIMENSIONAIS Conjunto de dados referenciados por um mesmo nome e que necessitam de somente um ndice para que seus elementos sejam endereados, so ditos compostos unidimensionais.

NOTA 72 43 91 67 92 84 76 79 81 20 PESO 46,5 66,1 99,1 33,1 14,2 132,0 67,5 58,8 IDADE 27 28 15 12 64 NOME JOS MARIA JONAS A B C X Y Z 9 Declarao A criao de variveis compostas unidimensionais pode ser feita de duas formas: 1 forma 4

Portugol
var nome_da_variavel:vetor[li..ls] de t;

Pascal
var nome_da_variavel:array[li..ls] of t;

Onde: var a palavra-chave reservada; nome_da_variavel nome associado a varivel que deseja declarar; li o limite inferior do intervalo de variao dos ndices; ls o limite superior do intervalo de variao dos ndices; t o tipo dos componentes da varivel (real, inteiro, caractere, lgico); 2 forma Tipos de dados Uma das caractersticas das linguagens de programao de alto nvel a nfase em tipos. A notao de tipo de dados ocorre na maioria das linguagens de programao usuais. Ao declararmos o tipo de uma varivel, delimitamos o conjunto de valores que ela pode tomar e as operaes que podemos efetuar com ela. De um modo geral, uma linguagem de programao oferece alguns tipos bsicos predefinidos que chamaremos de tipos primitivos, bem como certos mecanismos para criar outros tipos, aqui chamados de tipos construdos. Tipos primitivos Sero considerados disponveis os quatro tipos abaixo: Inteiro / integer Real / real Lgico / boolean Caractere / lgico

Mecanismo para construo de tipos Para facilitar a meno ao tipo construdo podemos dar um nome a ele atravs de uma definio de tipo. O formato geral o seguinte:

Portugol
tipo nome_do_tipo_definido = array[li..ls] de tipo_primitivo; var nome_da_variavel: nome_do_tipo_definido;

Pascal
type nome_do_tipo_definido of tipo_primitivo;

var nome_da_variavel: nome_do_tipo_definido;

Onde: tipo a palavra-chave reservada; nome_do_tipo_definido e o nome associado ao tipo que deseja criar; tipo_primitivo o tipo base do novo tipo criado (real, inteiro, caractere, lgico) Apesar dos tipos definidos terem um grau de abstrao mais alto, eles sempre so baseados em algum tipo primitivo. IMPORTANTE: Sempre que criarmos um tipo definido, devemos declarar uma varivel com esse novo tipo. Exemplo 1.7: Declarar uma varivel composta de 10 elementos do tipo real de nome NOTA:

Portugol
var NOTA:vetor[1..10] de real; OU tipo NOTA=vetor[1..10] de real; var NOTAS: NOTA;

Pascal
var NOTA:vetor[1..10] of real; OU type NOTA=array[1..10] de real; var NOTAS: NOTA;

Com esta declarao, cria-se uma estrutura de dados constituda por 10 elementos do tipo real endereveis por ndices que podem variar de 1 a 10. Exemplo 1.8: Preencher o arranjo M, abaixo, com o valor 2. M 1 2 3 4 5 6
algoritmo preenche; var M: vetor[1..6] de inteiro; inicio i 1; program preenche; var M: array[1..6] of integer; begin i := 1; repeat M[I]=2; i i+1; until (i>=6); end.

repita M[I]=2; i i+1; at (i>=6); fim.

Aps a execuo do repita, a varivel composta M ficaria assim. 2 2 2 2 2 2

EXERCCIOS

1. Faa um algoritmo que leia um conjunto de 5 elementos inteiros, armazene-os na varivel composta A e escreva-a. Utilizar o comando para.

2. Faa um algoritmo para ler uma varivel de 100 elementos inteiros e verificar se existem elementos iguais a 30. Se existirem escrever a posio em que esto armazenados. Utilizar o comando enquanto.

VARIVEIS COMPOSTAS MULTIDIMENSIONAIS Conjunto de dados referenciado por um mesmo nome e que necessita de mais de um ndice para ter seus elementos individualizados dito multidimensional. Existem certas estruturas que no podem ser representadas pelos vetores vistos at agora. Tais estruturas tm pelo menos uma dimenso a mais que os vetores. Nessa seo veremos estruturas multidimensionais, tambm conhecidos como matrizes. Alguns exemplos: Representao de objetos/funes no espao multidimensional definido pelos eixos x e y. Tabuleiros de jogos em geral (xadrez, damas, etc). Matrizes matemticas. Todos os pontos definidos em um monitor (TV/ Vdeo). O volante de um jogo de loteria. Geralmente usamos matrizes em situaes que precisamos de linhas e colunas para a identificao de elementos. Matrizes matemticas so particularmente interessantes para o aprendizado, pois h uma srie de operaes sobre matrizes definidas na matemtica que podem ser utilizadas na assimilao desses conceitos. Vejamos a representao matemtica de uma matriz M(3x2) (trs linhas por duas colunas) A11 A21 A31 A12 A22 A33

Os nmeros subscritos indicam os ndices dos elementos da matriz. Representao grfica de uma matriz 3x4 (ESCANINHO3x4) ESCANINHO 211 936 437 331 412 118 591 212 630 1120 67 430

Nas variveis bidimensionais, o primeiro ndice representa a linha, o segundo a coluna. ESCANINHO[3,2] referencia o elemento que est na terceira linha e segunda coluna, cujo contedo 591. Declarao

A criao de estruturas de dados da forma multidimensionais feita atravs da seguinte declarao.

de

variveis

composta

Portugol
var identificador: matriz[li1..ls1,lin..lsn] de tipo

Pascal
var identificador: array[li1..ls1,lin..lsn] of tipo

Onde: var a palavra-chave reservada; identificador o nome associado a varivel multidimensional; li1..ls1,lin..lsn so os limites dos intervalos de variao dos ndices; tipo o tipo a que pertencem todos os componentes do conjunto; Vejamos alguns exemplos de operaes com matrizes. Exemplo 2.1: Declarar a varivel composta ESCANINHO de quatro linhas por trs colunas:

Portugol
var ESCANINHO: matriz[1..4,1..3] de inteiro;

Pascal
var ESCANINHO:array[1..4,1..3] of integer;

Com essa declarao, passa a ter uma estrutura de dados agrupada conhecida por ESCANINHO, com 4x3=12 elementos numricos endereveis por um par de ndices, com o primeiro deles indicando o ndice da linha e o outro o da coluna. Exemplo 2.1: Consideremos a seguinte matriz M.

Portugol
var a1: real; M: matriz[1..3,1..2] de real;

Pascal
var a1: real; M: vetor[1..3,1..2] of real;

M 10 7 -3 5 22 14

Escreva (M[1,1]); {escrita do valor da primeira linha e primeira coluna, ou seja 10} Escreva (M[3,2]); {escrita do valor 14}

Se executarmos os comandos:
M[1,1] := 90; a1 := M[1,1]; {cada elemento da matriz comporta-se como uma varivel primitiva} M[3,2] := a1; M[1,2] := 12;

A matriz ser atualizada como segue: 90 7 -3 12 22 90

Exemplo 2.3: Faa um algoritmo que leia uma matriz 2x3. Vejamos a abordagem inicial.
constante N_LIN = 2; constante N_COL = 3; tipo MATRIZ_2_3=matriz[1..N_LIN,1..N_COL] de real; var MAT: MATRIZ_2_3; L,C: inteiro; inicio para L 1 at N_LIN faa para C 1 at N_COL faa leia(MAT[L,C]); fim. const N_LIN = 2; const N_COL = 3; type MATRIZ_2_3=array[1..N_LIN,1..N_COL] of real; var MAT: MATRIZ_2_3; L,C: integer; begin for L := 1 to N_LIN do for C := 1 to N_COL do read(MAT[L,C]); end.

Utilizamos um lao para percorrer as linhas e dentro desse, um outro lao para percorrer as colunas, assim garantimos que nenhuma clula da matriz ficar sem leitura. Exemplo 2.4: Calcular a soma de duas matrizes 3x2. Escreva um algoritmo que calcule a soma de duas matrizes 3x2. Lembre-se que se C=A+B temos a relao cij=aij+bij.

10 7 -3

5 22 14

90 7 3

15 22 4

100 14 0

20 44 18

A resoluo desse problema tem um ponto em comum com o anterior, j que todos 10

os elementos da matriz devem ser acessados.


constante N_LIN = 2; constante N_COL = 3; tipo MATRIZ_2_3=matriz[1..N_LIN,1..N_COL] de real; var A,B,C: MATRIZ_2_3; L,C: inteiro; inicio para L 1 at N_LIN faa para C 1 at N_COL faa C[L,C]) A[L,C]+B[L,C]; fim; const N_LIN = 2; const N_COL = 3; type MATRIZ_2_3=array[1..N_LIN,1..N_COL] of real; var A,B,C: MATRIZ_2_3; L,C: inteiro; begin for L := 1 to N_LIN do for C := 1 to N_COL do C[L,C]):=A[L,C]+B[L,C]; fim;

Utilizamos as mesmas variveis (L,C) para representar os ndices das trs matrizes. Isso porque a soma dos elementos feita entre os elementos na mesma posio das matrizes e atribuda a matriz resultado (C) tambm na mesma posio.

11

EXERCCIOS 1. Faa um algoritmo para ler e imprimir uma matriz 2x4 de nmeros inteiros; 2. Dada uma matriz 3X3 faa um algoritmo que: a. Calcule a soma dos elementos da primeira coluna; b. Calcule o produto dos elementos da primeira linha; c. Calcule a soma de todos elementos da matriz. d. Calcule a soma da diagonal principal; Para essa soluo utilize mdulos. 3. Faa um algoritmo que determine quantas vogais h em um vetor de caracteres. 4. Faa um algoritmo que leia e mostre um vetor de 20 elementos inteiros. a seguir, conte quantos valores pares existem no vetor. 5. Faa um algoritmo que leia um vetor de 10 posies de nmeros inteiros e imprimir, logo aps, gerar 2 vetores a partir dele, um contendo os elementos de posies mpares do vetor e o outro os elementos de posies pares. Imprimi-los no final. 6. O Departamento de Informtica da UEG deseja saber se existem alunos cursando, simultaneamente, as disciplinas Linguagem e Tcnicas de Programao I e Clculo Diferencial Integral. Existem disponveis na unidade de entrada os nmeros de matrcula dos alunos de ambas as disciplinas, onde existem no mximo 150 para Linguagem e Tcnicas de Programao e no mximo 220 para Clculo Diferencial Integral. Cada conjunto de nmeros de matrcula dos alunos de uma disciplina tem a matrcula fictcia 9999 no final. Formular um algoritmo que imprima o nmero de matrcula dos alunos que esto cursando estas disciplinas simultaneamente. Trata-se, ento, da verificao da ocorrncia de um elemento de um conjunto em um outro conjunto. Assim aps a leitura dos dados, poderiam estar montadas as seguintes variveis compostas unidimensionais LTPI e CDI contendo, respectivamente, os nmeros de matrcula dos alunos que esto cursando as disciplinas citadas. LTPI ... 1 2 3 151 CDI ... 12 3 4 221 12 9999 4 9999