Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 LINGUAGEM E TÉCNICA DE PROGRAMAÇÃO I Profa. Gisele Busichia Baioco gisele@ft.unicamp.br Algoritmos Estruturados e Linguagem de Programação Estruturada Matrizes em Algoritmos 1 Variáveis Compostas Homogêneas Multidimensionais O conceito de Variáveis Compostas Homogêneas Unidimensionais ou Vetores, pode ser estendido para N dimensões, cujas posições individuais são acessadas por N índices, originando as Variáveis Compostas Homogêneas Multidimensionais. A sintaxe geral de declaração em algoritmos é a seguinte: declare nome[dimensão1][dimensão2]... [dimensãoN]: tipo-de-dado; onde: nome: é o nome da variável composta homogênea multidimensional; dimensão1, dimensão2, ..., dimensãoN: é a quantidade máxima de posições (índices) de cada dimensão; tipo-de-dado: é um tipo de dado válido em algoritmos. As Variáveis Compostas Homogêneas Multidimensionais de 2 dimensões são as mais utilizadas, sendo denominadas Variáveis Compostas Homogêneas Bidimensionais ou Matrizes. 2 Variáveis Compostas Homogêneas Bidimensionais – Matrizes em Algoritmos As Variáveis Compostas Homogêneas Bidimensionais ou Matrizes correspondem a posições de memória (variáveis) identificadas por um mesmo nome, onde uma posição individual é acessada por dois índices, um para indicar a linha e outro para indicar a coluna, e cujo conteúdo é do mesmo tipo de dado. Em outras palavras, uma matriz tem a estrutura de uma tabela com M linhas e N colunas. Sintaxe de declaração em algoritmos: declare nome[linhas][colunas]: tipo-de-dado; onde: nome: é o nome da matriz; linhas: é a quantidade máxima de linhas da matriz; colunas: é a quantidade máxima de colunas da matriz; tipo-de-dado: é um tipo de dado válido em algoritmos. 2 A referência ao conteúdo do elemento da linha m e coluna n de uma matriz tem a sintaxe: nome[m][n] onde: nome: é o nome da matriz; m é o índice da linha, que corresponde a um número inteiro ou uma variável do tipo inteiro. n é o índice da coluna, que corresponde a um número inteiro ou uma variável do tipo inteiro. Observação: Considera-se que o primeiro elemento tem o índice da linha e da coluna iguais a 0. Entretanto, isso pode variar de uma linguagem de programação para outra. Algumas linguagens podem considerar que o primeiro elemento tem o índice da linha e da coluna iguais a 1, outras permitem que seja definido o valor do índice da linha e da coluna do primeiro elemento. Exemplo de matriz: /* Declaração de uma matriz de nome mat com 2 linhas e 10 colunas que armazena elementos do tipo real */ declare mat[2][10]: numérico real; Esquematicamente tem-se: colunas 0 1 2 3 4 5 6 7 8 9 0 1.5 9.0 5.0 4.0 8.0 6.5 3.5 2.0 5.0 1.0 mat linhas 1 5.5 6.0 9.0 2.5 4.5 9.5 7.0 8.5 7.5 3.0 Para atribuir um valor à linha m e coluna n de uma matriz, usa-se a seguinte sintaxe: nome[m][n] ← valor; onde: nome: é o nome da matriz; m é o índice da linha, que corresponde a um número inteiro ou uma variável do tipo inteiro. n é o índice da coluna, que corresponde a um número inteiro ou uma variável do tipo inteiro. valor é uma variável ou um valor do mesmo tipo de dado da matriz. Considerando a matriz do exemplo anterior, para atribuir o valor 9.5 para a posição correspondente a linha 1 e coluna 5, faz-se: mat[1][5] ← 9.5; 3 Usando Matrizes Assim como um vetor, uma matriz é usada para manter uma grande quantidade de elementos de dados na memória e para referenciar todos os elementos de maneira uniforme. A diferença é que para referenciar um elemento em um vetor basta um índice e em uma matriz mat[1][5] 3 são necessários dois índices. Por exemplo, considerando um edifício com M andares, sendo que cada andar tem N apartamentos. Caso seja necessário apenas armazenar informações sobre cada andar, basta usar um vetor de M posições. Entretanto, se for necessário armazenar informações sobre cada apartamento, deve-se utilizar uma matriz com M linhas e N colunas, onde as linhas representam os andares e as colunas os apartamentos. Supor a necessidade de ler 50 notas, para cada um dos 5 cursos de uma universidade. Para cada curso deve-se calcular a média aritmética das 50 notas e determinar o quanto cada nota se desvia dessa média. Nesse caso é necessário que, para cada um dos 5 cursos as 50 notas lidas sejam armazenadas em variáveis para que o desvio seja calculado após o cálculo da média aritmética dos 5 cursos. Utilizar 250 variáveis para armazenar o total de 250 notas seria uma solução, mas o código do programa ficaria um tanto extenso, pois além de declarar 250 variáveis, seria necessário escrever código para 250 leituras de variáveis e 250 cálculos de desvios. Então, a solução é agrupar as 250 notas em uma matriz onde as linhas referenciam os cursos e as colunas as notas (ou vice-versa). Algoritmo início declare soma, media, desvio, nota[5][50] /* matriz de notas */: numérico real; i, j /* índices da matriz */: numérico inteiro; /* Obtendo as notas para cada curso */ para i ← 0 até 4 passo 1 faça /* para cada curso */ início escreva(“Notas do curso ”,i); para j ← 0 até 49 passo 1 faça /* lê as notas */ início escreva(“Digite uma nota”); leia(nota[i][j]); fim fim /* Cálculo das médias e desvios para cada curso */ para i ← 0 até 4 passo 1 faça /* para cada curso */ início /* Cálculo da média */ soma ← 0; /* para a sumarização das notas do curso i */ para j ← 0 até 49 passo 1 faça soma ← soma + nota[i][j]; media ← soma/50; /* média das notas do curso i */ escreva(“Media = ”, media); /* Cálculo do desvio */ para j ← 0 até 49 passo 1 faça início desvio ← nota[i][j] – media; escreva(“Desvio da nota ”, nota[i][j], desvio); fim fim fim É possível escrever o algoritmo anterior, solicitando do usuário a quantidade de cursos e de notas ao invés de fixar em 5 e 50, respectivamente. O problema é que uma matriz tem que ter um número máximo de linhas e colunas e, nesse caso, é necessário garantir que o usuário entre com a quantidade de cursos e de notas menor ou igual ao número máximo de linhas e colunas, respectivamente. Ou seja, não há necessidade de utilizar todas as posições de uma matriz, mas nunca se deve utilizar posições além do número máximo de linhas e colunas. O número mínimo de linhas e colunas também deve ser garantido – maior que 0. 4 Algoritmo início declare soma, media, desvio, nota[5][50] /* matriz de notas */: numérico real; l, c, i, j /* índices da matriz */: numérico inteiro; /* Entrada da quantidade de cursos e de notas e verificação dos limites da matriz */ repita escreva(“Digite o número de cursos (entre 1 e 5) e o número de notas (entre 1 e 50): ”); leia(l); leia(c); se (l > 5 ou l ≤ 0 ou c > 50 ou c ≤ 0) então escreva(“Quantidade inválida”); até (l > 0 e l ≤ 5 e c > 0 e c ≤ 50); /* Obtendo as notas para cada curso */ para i ← 0 até l-1 passo 1 faça /* para cada curso */ início escreva(“Notas do curso ”,i); para j ← 0 até c-1 passo 1 faça /* lê as notas */ início escreva(“Digite uma nota”); leia(nota[i][j]); fim fim /* Cálculo das médias e desvios para cada curso */ para i ← 0 até l-1 passo 1 faça /* para cada curso */ início /* Cálculo da média */ soma ← 0; /* para a sumarização das notas do curso i */ para j ← 0 até c-1 passo 1 faça soma ← soma + nota[i][j]; media ← soma/c; /* média das notas do curso i */ escreva(“Media = ”, media); /* Cálculo do desvio */ para j ← 0 até c-1 passo 1 faça início desvio ← nota[i][j] – media; escreva(“Desvio da nota ”, nota[i][j], desvio); fim fim fim 4 Exemplosde Algoritmos 1) Faça um algoritmo que calcula o produto de duas matrizes A e B, se possível. A multiplicação de duas matrizes A e B só é possível se o número de colunas da matriz A for igual ao número de linhas da matriz B. Assim, se A é uma matriz m x n e B uma matriz n x p, a multiplicação será possível e o produto será uma matriz C, m x p. Solução: Entrada: matriz A, 2 x 3 e a matriz B, 3 x 2; Processo: 5 A = a00 a01 ... a0n-1 a10 a11 ... a1n-1 ... am-10 am-11 ... am-1n-1 m x n B = n x p C = m x p A matriz produto C é dada por: Onde: c00 = a00 * b00 + a01 * b10 + ... + a0n-1* bn-10 c01 = a00 * b01 + a01 * b11 + ... + a0n-1* bn-11 ... c0p-1 = a00 * b0p-1+ a01 * b1p-1 + ... + a0n-1* bn-1p-1 c10 = a10 * b00 + a11 * b10 + ... + a1n-1* bn-10 c11 = a10 * b01 + a11 * b11 + ... + a1n-1* bn-11 ... c1p-1 = a10 * b0p-1+ a11 * b1p-1 + ... + a1n-1* bn-1p-1 cm-10 = am-10 * b00 + am-11 * b10 + ... + am-1n-1* bn-10 cm-11 = am-10 * b01 + am-11 * b11 + ... + am-1n-1* bn-11 ... cm-1p-1 = am-10 * b1p+ am-11 * b1p-1 + ... + am-1n-1* bn-1p-1 Portanto, cij = ∑∑∑∑k = 0,...,n-1 aik * bkj b00 b01 ... b0p-1 b10 b11 ... b1p-1 ... bn-10 bn-11 ... bn-1p-1 c00 c01 ... c0p-1 c10 c11 ... c1p-1 ... cm-10 cm-11 ... cm-1p-1 Exemplo: 1 2 3 4 5 6 A = 2 x 3 1 4 2 5 3 6 B = 3 x 2 14 32 32 77 C = produto: 2 x 2 Saída: matriz C, 2 x 2 Algoritmo início /* Declaração de variáveis */ declare A[2][3], B[3][2], C[2][2], i, j, k: numérico inteiro; /* Entrada de dados */ escreva(“Carregando a matriz A:”); para i ← 0 até 1 passo 1 faça /* linhas de A */ para j ← 0 até 2 passo 1 faça /* colunas de A */ início escreva(“A[”, i, “,”, j, “]=”); leia(A[i][j]); fim escreva(“Carregando a matriz B:“); para i ← 0 até 2 passo 1 faça /* linhas de B */ para j ← 0 até 1 passo 1 faça /* colunas de B */ início escreva(“B[”, i, “,”, j, “]=”); leia(B[i][j]); fim 6 /* Cálculo da matriz produto C */ para i ← 0 até 1 passo 1 faça /* linhas de C = linhas de A */ para j ← 0 até 1 passo 1 faça /* colunas de C = colunas de B */ início C[i][j] ← 0; para k ← 0 até 2 passo 1 faça /* colunas de A = linhas de B */ C[i][j] ← C[i][j] + A[i][ k] * B[k][j]; fim /* Saída */ escreva(“Matriz produto C:”); para i ← 0 até 1 passo 1 faça /* linhas de C */ início escreva(“linha = ”, i); para j ← 0 até 1 passo 1 faça /* colunas de C */ escreva(C[i][j]); fim fim 2) Uma matriz X de N (N ≤ 150) linhas por 2 colunas contém, na primeira coluna, o número de matrícula de N alunos e, na segunda coluna, a nota dos N alunos. Faça um algoritmo que: • leia a quantidade N de alunos; • leia as informações dos N alunos carregando a matriz X; • leia um determinado número de matrícula e determine a nota do aluno correspondente, repetindo o processo até que o usuário deseje parar. Solução: Entrada: número N de alunos e informações sobre os alunos a serem carregadas na matriz X; Processo e Saída: consulta a notas de alunos a partir do número da matrícula. Algoritmo início /* Declaração de variáveis */ declare N, i, achou: numérico inteiro; X[150][2], mat: numérico real; resp: caractere; /* Entrada de dados */ repita escreva(“Digite a quantidade de alunos (entre 1 e 150): ”); leia(N); se (N > 150 ou N ≤ 0) então escreva(“Quantidade de alunos inválida”); até (N > 0 e N ≤ 150); para i ← 0 até N-1 passo 1 faça início escreva(“Digite o número da matrícula do aluno: ”); leia(X[i][0]); escreva(“Digite a nota do aluno: ”); leia(X[i][1]); fim /* Processo e Saída */ repita /* Lê a matrícula do aluno para consulta */ escreva(“Entre com a matrícula do aluno para consulta: ”); leia(mat); /* Percorre as linhas da matriz X, procurando pela matrícula na primeira coluna e obtendo a nota na segunda coluna */ 7 achou ← 0; /* não achou */ i ← 0; enquanto (i < N e achou = 0) faça início se (X[i][0] = mat) então início achou ← 1; /* achou */ escreva(“Nota = ”, X[i][1]); fim i ← i + 1; fim /* Verifica se a matrícula não foi encontrada */ se (achou = 0) /* não achou */ então escreva(“Matricula não encontrada”); /* Permite que o usuário faça mais uma consulta se desejar */ escreva(“Deseja consultar mais um aluno? (S/N)”); leia(resp); até (resp = ‘N’); fim 5 Exercícios de Fixação 1) Seja a seguinte matriz A: A 0 1 2 3 4 5 0 175 225 10 9000 3.7 4.75 1 9.8 100 363 432 156 18 2 40 301 30.2 6381 1 0 3 402 4211 7213 992 442 7321 4 21 3 2 1 9000 2000 a) Quantos elementos fazem parte do conjunto? b) Qual o conteúdo do elemento identificado por A [3,4]? c) Qual o conteúdo de X, após a execução do comando X := A [2,1] + A [4,0]? d) O que aconteceria caso fosse referenciado o elemento A [5,1] no programa? e) Qual o resultado de S (onde S = A [0,3] + A [1,3] + A [2,3] + A [3,3] + A [3,3]) ? f) Qual o resultado de S (onde S = A [2,0] + A [2,1] + A [2,2] + A [2,3]) ? 2) A matriz X de N linhas (N ≤ 100) por 4 colunas, contém informações sobre alunos de uma Universidade. Os elementos da primeira, segunda, terceira e quarta colunas são, respectivamente, o número de matrícula, sexo (0 ou 1), número do curso e a média geral no curso. Fazer um algoritmo que: • leia o número N de alunos; • leia as informações sobre os alunos; • leia um determinado sexo e número de curso e determine o número da matrícula do aluno do sexo e curso lidos, que obteve a melhor (maior) média. 3) Escrever um algoritmo que leia uma matriz 7x7 de números inteiros, calcule e escreva: • o somatório dos elementos da diagonal principal dessa matriz; • o produto dos elementos da diagonal principal dessa matriz; 8 • a matriz após multiplicar os elementos de sua diagonal principal por uma constante K. Exemplo: 4) Dada uma matriz M x N (M ≤ 20, N ≤ 50) de números reais, fazer um algoritmo para calcular e imprimir a soma de cada linha e a soma de todos os seus elementos. 5) Fazer um algoritmo que leia uma matriz de números inteiros A, M x N (M ≤ 20, N ≤ 50), e determine a matriz transposta de A. Exemplo: A 0 1 2 Transposta de A 0 1 0 9 16 34 0 9 32 1 32 11 17 1 16 11 2 34 17 6) Dadas duas matrizes A e B, M x N (M ≤ 10, N ≤ 20) de números reais, escrever um algoritmo que calcule e imprima a matriz C, sendo que C = A + B. Elementos da diagonal principal da matriz.
Compartilhar