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