Tipo m= matriz [ li1 : ls1 , li2 : ls2 ] m: mat

Transcrição

Tipo m= matriz [ li1 : ls1 , li2 : ls2 ] m: mat
1
MATRIZ
Considere que você necessitasse elaborar um “programa” que efetuasse a leitura das notas dos
alunos, o cálculo da média de cada aluno e no final, apresentar a média do grupo.
Utilizando-se apenas de vetores (matrizes unidimensionais) seria bem trabalhoso, uma vez que se
necessitaria manter um controle de cada índice em cada vetor para um mesmo aluno.
Para facilitar o trabalho é que serão utilizadas matrizes com duas ou mais dimensões.
OBS. Na manipulação de um vetor, é utilizada uma única instrução de looping (enquanto, para ou
repita). No caso de matrizes com duas ou mais dimensões, deverá ser utilizado o número de
loopings relativo ao tamanho de sua dimensão. Ex. três dimensões deverá ser controlada por três
loopings e assim por diante.
Tipo m= matriz [ li1 : ls1 , li2 : ls2 ] <tipo básico>
m: mat
A DIMENSÃO DA MATRIZ SERÁ IGUAL AO NUMERO DE VIRGULAS + 1.
Numero de elementos = ( Ls1 – Li1 + 1 ) * ( Ls2 – Li2 + 1 )
tipo m= matriz [1:4, 1:5] inteiro;
m: M
Para referenciar um elemento da matriz são necessários tantos índices quanto seja a dimensão da
matriz.
1º índice – é sempre a linha
2º índice – é sempre a coluna
Comando leia
Como no caso de vetores, também para matrizes podemos ter comandos concisos para inicialização,
leitura e impressão.
Escrever um algoritmo para ler e imprimir as notas correspondentes a 8 disciplinas de uma turma de 10
alunos.
tipo m = matriz [1: 10, 1 : 8] inteiro;
m = NOTA;
leia (NOTA);
Imprima (NOTA);
(ou
Tipo m = matriz [1: 10, 1 : 8] inteiro;
m = NOTA;
para I de 1 até 10 passo 1 faça
para J de 1 até 8 passo 1 faça
leia NOTA [ I , J ];
fim para;
fim para;
leia ( Mat ); { lê uma linha por cartão, ou linha por linha }
NOTA [ 1, 1] Í 3,5; NOTA [ 3, 5 ] Í 7,3; etc.
2
Inicialização de matriz:
MAT Í 0; ( todos os elementos da matriz receberão o valor 0 )
MAT Í 3; ( todos os elementos da matriz receberão o valor 3 )
MAT (10, -5, 8, 9, 6, 1, 4, 5, ...) ( cada nº seria armazenado na matriz, ou seja, o primeiro elemento da
primeira linha seria 10, o segundo da primeira linha -5, e assim sucessivamente, ao preencher todos os
elementos desta linha, passaria para a próxima linha)
OBS:
1.º) Para percorrer a matriz por linha:
a) Fixa a linha;
b) Varia a coluna;
Esse modo é o mais comum!!!
2.º) Para percorrer a matriz por coluna:
a) Fixa a coluna;
b) Varia a linha;
MATRIZ DE 3 DIMENSÕES
Repete-se a estrutura bi-dimensional tantas vezes quantos são os elementos da 3ª dimensão,
numerando-os de acordo com os limites especificados na declaração tipo.
Exemplo:
tipo m2 = matriz [ 1 : 3 , 2 : 4 , 3 : 4 ]
m2: MAT2;
Número de elementos da 3ª dimensão ( 4 – 3 + 1 ) = 2
Para se referenciar um elemento da matriz são necessários tantos índices quantas são as dimensões da
matriz.
Tipo m3 = matriz [ 1: 4, 1 : 6, 3 : 7] 1º dimensão
m = AB;
Dimensão: 2 + 1 = 3 < Tridimensional >
Número de elementos da 3.º dimensão: 7 – 3 + 1 = 5
2º dimensão
3º dimensão
3
AB [ 2, 3, 4 ] Í AQUI; { 2ª linha, terceira coluna, da dimensão 3 numerada com 4}
Tipo m3 = matriz [ 1: 4, 1 : 6, 3 : 7, 0 : 2] 1º dim.
m = AB;
2º dim. 3º dim. 4o dim.
Repetiria estrutura anterior TRES VEZES, numeradas de 0 a 2.
Tipo m4 = matriz [ 1:3, 2:4, 3:4, 0:2 ] caracter;
m4: Mat2
Mat2 [ 2,3,4,1 ]
Elemento da Linha 2, coluna 3, terceira dimensão l numerada com 4, quarta dimensão numerada
com 1.
O que será impresso após se executar o algoritmo abaixo:
Exemplo 1 pag. 87 G. Lages
Inicio
Tipo m = matriz [ 1 : 3, 1 : 2 ] inteiro;
m : M1
Inteiro: I, J
M1 [ 1, 1 ] Í 1;
M1 [ 1, 2 ] Í 2;
M1 [ 2, 1 ] Í 3;
M1 [ 2, 2 ] Í 4;
4
M1 [ 3, 1 ] Í 5;
M1 [ 3, 2 ] Í 6;
Para I de 1 até 3 faça
Para J de 1 até 2 faça
imprima ( M1[ I, J ] );
Fim para
Fim para
Para I de 1 até 2 faça
Para J de 1 até 3 faça
imprima ( M1[ J, I ] );
Fim para
Fim para
1
3
5
2
4
6
1
2
3
4
5
6
Exemplo 2 O que será impresso após se executar o algoritmo abaixo:
Inicio
Tipo m = matriz [ 1 : 3, 1 : 4 ] inteiro;
Tipo n = matriz [ 1 : 2, 1 : 2 ] caracter;
m : M1
n : N1
Inteiro: I, J
5
J Í2
Para I de 1 até 3 faça
M1 [ I, J ] Í 2;
M1 [ I, J + 2 ] Í 2;
M1 [I, J – 1 ] Í 1;
M1 [I, J + 1 ] Í1;
Fim para
Para I de 1 até 2 faça
Para J de 1 até 2 faça
Se I = J então
N1 [ I , J] Í”A”;
Senão
N1 [ I, J ] Í”Z”;
Fim se
Fim para
Fim para
Imprima ( M1, N1 )
M1
1
2
1
2
1
2
N1
1
1
1
A
Z
2
2
2
Z
A
EX: Dada a matriz MAT ( 4x5 ) escrever um algoritmo para somar os elementos de cada linha e
armazenar em um vetor SOMALINHA; a seguir somar os elementos do vetor SOMALINHA e
armazenar na variável TOTAL. (G. Lajes – Exemplo 6 – pág. 92)
V.SOMALI
2
0
-8
2
-3
3
6
1
0
4
7
-4
4
-2
1
3
1
5
0
2
Î
Î
Î
Î
TOTAL
6
Algoritmo: SOMALINHA/COLUNA { SL j =
5
∑
j =1
MATi , j (i = 1, 2,3, 4) }
Inicio:
Tipo m = matriz [ 1 : 4, 1 : 5 ] inteiro;
m: Mat
Tipo v = vetor [1 : 4 ] inteiro; {vetor coluna vetor [ 4 : 1 ] }
v: SOMALINHA;
Inteiro: TOTAL, I, J;
SOMALINHA Í Ø {todas as linhas do vetor são zeradas}
TOTAL Í Ø
Leia (MAT)
Para I de 1 até 4 faça
Para J de 1 até 5 faça
SOMALINHA [ I ] Í SOMALINHA [ I ] + MAT [ I, J ];
Fim para
Imprima (SOMALINHA[ I ] );
TOTAL Í TOTAL + SOMALINHA [ I ];
Fim para
Imprima (TOTAL)
Fim
Dadas duas matrizes ( 20 x 20 ) escrever um algoritmo para a)-ler, calcular e imprimir a soma destas
matrizes ( elemento por elemento ), b)- dividir cada elemento da linha pelo elemento da diagonal
principal correspondente a esta linha e imprimir apenas estes elementos assim modificados, c) efetuar
a soma dos elementos situados abaixo da diagonal principal, incluindo os elementos da própria
diagonal. ( G. Lajes – a. Exemplo 7, b.expl. 8, c. exepl. 9 – pág. 94 e 95)
a)- Algoritmo. SOMA_ELEM.DE_DUAS_MATRIZES. } { expl. 7, 8 e 9 pag. 93 – G. Lajes}
inicio
Tipo m = matriz [ 1 : 20, 1 : 20 ] real;
m : A, B; { matrizes fornecidas };
C; { matriz soma de A e B }/
inteiro: I, J; { apontadores };
leia ( A, B);
I Í 1;
Enquanto I < = 20 faça
J Í 1;
Enquanto J < = 20 faça
7
C [ I, J ] Í A [ I, J ] + B [ I, J ];
J Í J + 1;
Fim enquanto;
I Í I + 1;
Fim enquanto;
Imprima (C);
Fim.
{ usar também o comando para }
b)- Algoritmo. DIVIDE_ELEM.DA.LINHA/ELEM.DIG. { expl., 8 pag. 95 }
inicio.
Tipo m = matriz [ 1 : 20, 1 : 20 ] real;
m = M;
inteiro: I, J; { apontadores };
real: DIAGONAL; { elemento da diagonal principal }
leia (M);
para I de 1 ate 20 passo 1 faça
DIAGONAL Í M [ I, I ];
Para J de 1 ate 20 passo 1 faça
M [ I, J ] Í M [ I, J ] / DIAGONAL;
fm para;
Fim para;
Imprima (M);
Fim.
8
c)- Algoritmo. SOMA-ABAIXO_DIAGONAL_INCLUINDODIAGONAL{ exemplo 9 pag. 95}
Inicio.
Tipo m = matriz [ 1 : 20, 1 : 20 ] real;
m = M2;
inteiro: I, J, SOMA;
leia (M2);
SOMA Í 0;
Para I de 1 ate 20 passo 1 faça
Para J de 1 ate I passo 1 faça
SOMA Í SOMA + M2 [ I , J ];
Fim para;
Fim para;
Imprima (M2);
Imprima (`A SOMA DOS ELEMENTOS ABAIXO DA DP E`, SOMA);
Fim.
Exercício. 2 – pág, 103 G. Lajes. Escrever um algoritmo para gerar a seguinte tabela:
1
1
1
1
1
1
1
2
2
2
2
1
1
2
3
3
2
1
1
2
3
3
2
1
1
2
2
2
2
1
1
1
1
1
1
1
Exercício.
Descreva o que será produzido., de pois de executados os comandos abaixo se:
A
=
1
3
2
1
Para I de 1 até 2 passo 1 faça;
1
4
C
=
1
2
1
3
1
4
9
Para J de 1 até 2 passo 1 faça;
Para K de 1 até 3 passo 1 faça;
Imprima ( A [ I , K ] + C [ K, J ] );
Fim para;
fim para;
fim para;
Exercício.
Seja o seguinte sistema particular de equações a seguir:
A11 X1
A21 X1 + A22 X2
An1 X1 + An2 X2
= b1
= b2
+ Ann Xn
= bn
Escrever um algoritmo que resolva o sistema acima para qualquer valor de n <= 30. Para tanto o
programa deverá:
a) ler um conjunto de cartões onde:
• o 10 cartão contém o número de incógnitas do sistema (n);
• o 20 cartão contém os termos independentes {bj} do sistema;
• n cartões seguintes: contem os coeficientes não nulos da 1a, 2a, ..., n-ésima equação {aij};
b) calcular e imprimir o valor das n incógnitas { Xi } que satisfaçam o sistema.
Exercício. Referenciando-se aos algoritmos abaixo:
tipo a = vetor [ 1 : 10 ] inteiro; {ALGORITMO A1 }
tipo b = matriz [ 1 : 10 , 1 : 10 ] inteiro;
a = A;
b = B;
inteiro: I, J, SOMA1, SOMA2;
inicio { A1 }
leia (A,B)
SOMA1 Í 0;
SOMA2 Í 0;
Para I de 1 até 10 faça;
10
Para J de 1 até 10 faça;
SOMA1 Í SOMA1 + A [ I ];
SOMA2 Í SOMA2 + B [ I , J ];
fim para;
fim para;
imprima (SOMA1, SOMA2 );
fim.
tipo a = vetor [ 1 : 10 ] inteiro; { ALGORITMO A2 }
tipo b = matriz [ 1 : 10 , 1 : 10 ] inteiro;
a = A;
b = B;
inteiro: I, J, SOMA1, SOMA2;
inicio { A2 }
leia (A,B)
SOMA1 Í 0;
SOMA2 Í 0;
Para I de 1 até 10 faça;
SOMA1 Í SOMA1 + A [ I ];
Para J de 1 até 10 faça;
SOMA2 Í SOMA2 + B [ I , J ];
fim para;
fim para;
imprima (SOMA1, SOMA2 );
fim.
Responda: a) o que executa cada algoritmo? b) os dois algoritmos fornecem as mesmas respostas; c)
no algoritmo A1, quantas vezes são executados os comandos:
SOMA1 Í SOMA1 + A [ I ];
SOMA2 Í SOMA2 + B [ I , J ];
d) no algoritmo A2, quantas vezes são executados os comandos:
SOMA1 Í SOMA1 + A [ I ];
SOMA2 Í SOMA2 + B [ I , J ];
e) qual o algoritmo mais eficiente? Porque?
Exercícios Ler dois vetores de 7 elementos cada, e construir uma matriz C, onde a 1a coluna deverá ser
formada pelos elementos do vetor A e a 2a coluna deverá ser formada pelos elementos de B;
a
11
Ler um vetor A de 10 elementos e construir uma matriz C com três colunas, onde a 1 coluna de C é
formada pelos elementos do vetor A somados com 5, a 2a coluna de C é formada pelo valor do cálculo
do fatorial de cada elemento do vetor A e a 3a coluna deverá ser formada pelos quadrados dos
elementos correspondentes do vetor A.
Exercício. 9 G. Lajes – pág. 106
O que será impresso depois de executar o algoritmo abaixo
Algoritmo. XXX
tipo b = matriz [ 1 : 3 , 1 : 3 ] inteiro;
b= A;
inteiro: INT, X, Y, XANT, YANT, N;
INT Í 1; N Í 3;
A Í 0; { inicializa a matriz A com zeros};
{coloca o valor inicial na linha dop meio da última coluna}
X Í ( N + 1 ) / 2;
Y Í N;
enquanto INT < 10 faça
A [ X, Y ] Í INT;
XANT Í X; {armazena o endereço da última localização}
YANT Í Y;
INT Í INT + 1;
X Í X + 1;
Y Í Y + 1;
se X > N então
X Í 1;
fim se;
se Y > N então
YÍ 1;
fim se;
se A[ X, Y ] = 0 {se sta ocupado, coloca o valor de INT na posição A[XANT, YANT – 1]};
então X Í XANT;
Y Í YANT – 1;
Senão
fm se;
fim enquanto;
imprima ( A );
fim.
12
Escrever um algoritmo para multiplicar duas matrizes A(3 x 3) X B(3x2) = C(3x2)
Algoritmo: MULTIPLICAR MATRIZ
Inicio
Tipo m1 = matriz [1:3,1:3] real;
Tipo m2 = matriz [1:3,1:2] real;
m1= A;
m2 = B, C;
inteiro: I, J, K;
leia (A, B);
C ← 0; {Inicialização de C}
Para I de 1 até 3 passo 1 faça;
Para J de 1 até 2 passo 1 faça;
Para K de 1 até 3 passo 1 faça;
C [ I, J ] Í C [ I , J ] + A [ I, K ] * B [ K, J ];
Fim para;
fim para;
fim para;
imprime (C);
fim MULTIPLICAR MATRIZ
Escrever um algoritmo que cadastre o nome, endereço, cep, bairro e telefone de 20 pessoas. Ao final,
deverá ser apresentado os seus elementos em ordem alfabética, independentemente da forma em que
foram digitados.
Nome (1)
Endereço (2) CEP (3)
Bairro (4)
Fone (5)
1
2
....
20
Observação: nesta tabela, serão utilizados dois elementos (colunas 3 e 5) numéricos, mas como não
são executados cálculos com estes números, eles serão armazenados como caracteres – para se manter
uma estrutura de dados HOMOGENEA.
Depois de cadastrado todos os elementos, será iniciado o processo de classificação alfabética pelo
nome de cada pessoa ( após a comparação do primeiro nome com o segundo, sendo o primeiro maior
que o segundo, estes deverão ser trocados, e também os elementos relacionados ao nome também
deverão ser trocados simultaneamente.
13
Algoritmo. CADASTRO_AGENDA. { pagina. 129}
Inicio.
Tipo m = matriz [ 1 : 20, 1 : 5 ] caracter;
m = NOME;
inteiro: I, J, ATUAL, PROXIMO;
caracter: X;
para I de 1 ate 20 passo 1 faça
{entrada de dados}
imprima (” NOME = ” , leia ( NOME [ I, 1 ] );
imprima (” ENEREÇO = ” , leia ( NOME [ I, 2 ] );
imprima (” CEP = ” , leia ( NOME [ I, 3 ] );
imprima (” BAIRRO = ” , leia ( NOME [ I, 4 ] );
imprima (” TELEFONE = ” , leia ( NOME [ I, 5 ] );
fim para;
para ATUAL de 1 ate 19 faça
{ { execução da ordenação }}
para PROXIMO de ATUAL + 1 ate 20 faça
se NOME [ ATUAL, 1 ] > NOME [ PROXIMO, 1 ] então
X Í NOME [ ATUAL, 1 ];
{ {troca nome} }
NOME [ ATUAL, 1 ] Í NOME [ PROXIMO, 1 ];
NOME [ PROXIMO, 1 ] Í X;
X Í NOME [ ATUAL, 2 ];
{ {troca endereço} }
NOME [ ATUAL, 2 ] Í NOME [ PROXIMO, 2 ];
NOME [ PROXIMO, 2] Í X;
X Í NOME [ ATUAL, 3 ];
{ {troca CEP} }
NOME [ ATUAL, 3 ] Í NOME [ PROXIMO, 3 ];
NOME [ PROXIMO, 3 ] Í X;
X Í NOME [ ATUAL, 4 ];
{ {troca bairro} }
NOME [ ATUAL, 4 ] Í NOME [ PROXIMO, 4 ];
NOME [ PROXIMO, 4 ] Í X;
X Í NOME [ ATUAL, 5 ];
{ {troca telefone} }
NOME [ ATUAL, 5] Í NOME [ PROXIMO, 5 ];
NOME [ PROXIMO, 5 ] Í X;
Fim se;
Fim para;
Fim para;
{ saída de dados }
para I de 1 ate 20 faça
para I de 1 ate 20 faça
imprima ( NOME [ I, J ] );
fim para;
fim para
fim.
14
Exercício - Escrever um algoritmo que leia os nomes de 50 alunos e suas quatro notas bimestrais.
Classificar os alunos ordem alfabética, suas médias e a média geral dos 20 alunos. Utilizar duas
matrizes para a entrada de dados (dois tipos de dados de entrada: texto e real). Uma matriz tipo vetor
para os nomes dos alunos, e outra bi-dimensional ( 50 x 4 ) para as notas.
Exemplo Dado um tabuleiro de xadrez TAB onde, para facilitar a indicação das pedras, vamos
convencionar:
1 – PEÕES
3 – TORRES
2 - CAVALOS 4 – BISPOS
0 – AUSENCIA DE PEDRAS
5 – REIS
6 - RAINHA
Contar a quantidade de cada tipo de pedra no tabuleiro:
1
6
0
0
0
1
0
1
1
1
2
3
4
5
6
7
8
2
0
1
1
0
0
0
0
5
A saída deverá ser do tipo: PEÕES
CAVALOS
3
0
0
1
2
1
1
0
0
4
5
2
1
0
1
3
0
6
5
0
0
0
3
0
0
2
0
6
0
3
1
4
1
4
2
1
7
1
0
0
4
0
0
2
1
8
0
2
0
3
0
1
1
0
COM 17 PEÇAS
COM 06 PEÇAS
Para este problema, vamos utilizar um vetor denominado OC para contar as ocorrências de pedras
usando a própria convenção da pedra como indexador para o vetor:
TORRE (3)
OC:
0
1
2
3
4
5
6
Usaremos também um vetor de caracteres como nome das peças para fins de impressão:
NOMES: PEOES
1
Algoritmo. TABULEIRO.
CAVALOS TORRES
2
3
BISPOS
4
REIS
5
RAINHAS
6
15
Inicio
Inteiro: I, J { I aponta linha / J aponta coluna }
Tipo m = matriz [ 1 : 8, 1 : 8 ] inteiro;
m: TAB;
tipo v= vetor [ 0 : 6 ] inteiro;
v = OC; { ocorrências de peças }
tipo v1= vetor [ 0 : 6 ] caracter;
v1 = NOMES; { nomes das peças }
NOMES Í ( “PEOES”, “CAVALOS”, “TORRES”, “BISPOS”, “REIS”, “RAINHAS”);
OC Í 0;
Leia (TAB);
Para I de 1 ate 8 faça
Para J de 1 ate 8 faça
OC [ TAB[ I, J ] ] Í OC [ TAB[ I, J ] ] + 1;
Fim para;
Fim para;
Para I de 1 ate 6 faça
Imprima ( NOMES [ I ], “COM”, OC [ I ], “PEÇAS” );
Fim para;
Fim. TABULEIRO.
Escrever um algoritmo capaz de contar a quantidade de cada tipo de pedra na região do tabuleiro
indicada nas figuras a seguir:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
O Diagrama abaixo representa o pátio de um depósito de uma empresa de construções, e utiliza as
seguintes convenções:
16
Cimento........1; areia...........2; tubos..........3; blocos de concreto............4;
Madeiras......5; cal..............6; saibro..........7;
20
00
00
53
1
0
0
3
00
23
00
15
0
4
0
0
80
00
30
45
7
0
2
3
40
30
25
20
5
1
2
6
Em cada espaço do deposito acima estão colocados a quantidade do material e o código
(correspondente ao nome) correspondente. Assim (lê apenas um número digamos de três dígitos, onde
o último dígito é o código do material):
30 1
cimento
Significa que naquele local existem 30 sacos de cimento.
Escrever um algoritmo capaz de contar quantos elementos de cada material existe no pátio. Observe
que pode haver mais de um local com o mesmo material.
Sabe-se que os dados são fornecidos em cartão. O algoritmo deve imprimir os resultados conforme o
diagrama (“lay-out”) abaixo:
DEPÓSITO
PRODUTO
QUANTIDADE
AREIA:
XXXX
CAL:
XXXX
CIMENTO:
XXXX