Manipulando matrizes

Teoria Completa

Introdução

Fala aí, aqui é o Guga do Responde Aí! Tudo bem com você?

A utilização de matrizes, como você deve imaginar, é muito interessante em alguns casos e principalmente para a resolução de alguns problemas computacionais, você conhece algum deles?

Sem perder tempo, vamos finalizar o nosso estudo sobre matrizes aprendendo um pouco mais sobre a sua utilização.

Inserindo elementos em uma matriz

Antes de começar, eu vou te dar uma dica que vai economizar muito tempo de estudo. Lembre-se de tudo aquilo que nós conversamos sobre vetores e para saber como manipular uma matriz apenas troque o índice simples por um índice composto (conjunto de linha e coluna).

Fui muito longe? Então vamos pensar um pouco.

Sendo bem sincero, é muito difícil utilizarmos matrizes que possuem mais de 2 dimensões, por outro lado as matrizes bidimensionais são muito comuns na programação e acabam carregando o legado inteiro dessa estrutura.

Para entendermos melhor tudo isso, vamos criar uma matriz bidimensional qualquer e utilizá-la como exemplo daqui para frente:

24 13 17 81

Agora que temos uma matriz, para programarmos ela basta realizarmos a execução das seguintes instruções:

Notou algo de interessante? A sintaxe de inserção em uma matriz é extremamente semelhante a sintaxe que utilizamos para inserir elementos em um vetor.

Isso acontece porque o vetor é uma estrutura unidimensional, já a matriz uma estrutura bidimensional. Isso significa que uma matriz contém todas as características do vetor com o acréscimo apenas de uma dimensão (que em nossa visualização são as colunas).

É justamente por esse motivo que todas as operações realizadas em matrizes são as mesmas realizadas em vetores, a grande diferença está na utilização de um índice composto (linhas e colunas).

De maneira geral, podemos resumir a operação de inserção em uma matriz através das seguintes instruções:

Moleza de entender, né?

Acessando elementos em uma matriz

Para acessarmos o valor de um dado armazenado em uma matriz, basta termos conhecimento da posição que esse dado está na matriz, ou seja, conhecer as coordenadas (conjunto de linha e coluna) dele.

Por exemplo, suponha que tenhamos que imprimir o primeiro elemento da segunda linha da matriz criado anteriormente:

Eu acho que você já sacou que toda essa semelhança com os vetores não é mera coincidência, né? De maneira geral, o acesso ao valor de dados armazenados em uma matriz é feito da seguinte forma:

Operações com matrizes

Não menos importante do que tudo que já foi dito e ainda muito semelhante com o que vimos antes com os vetores, é possível realizar operações com os valores de dados armazenados em uma matriz tranquilamente como se fossem variáveis, por exemplo:

Relacionar o conhecimento prévio sobre vetores com o aprendizado de matrizes é uma forma muito legal e rápida de aprendermos, porém não é motivo para deixarmos de resolver os exercícios de fixação!

É justamente por isso que esperarei você aqui na página do lado, não esquece de passar lá hein?!

Expandir

Exercício Resolvido #1

Elaboração própria.

Desenvolva um programa em C capaz de preencher e imprimir uma matriz de caracteres de ordem 3   x   3 .

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

A primeira coisa que nós temos que fazer, como na grande maioria dos programas, é definir um escopo.

Passo 2

Com o escopo definido, nós podemos declarar a matriz em si e as variáveis que serão úteis.

Aqui está algumas informações sobre elas:

  • i e j são variáveis contadoras;
  • m a t r i z é uma matriz de caracteres de ordem 3   x   3 .

Passo 3

A grande lógica envolvida no preenchimento de uma matriz está na utilização de duas estruturas de repetição aninhadas.

Isso acontece, pois o primeiro laço de repetição é utilizado para avançar as linhas (nesse caso) e o segundo laço para avançar as colunas.

Ou seja, o primeiro laço de repetição vai falar para o programa que está se iniciando em 0 e essa será a primeira linha da matriz que será preenchida com elementos. Em seguida, outro laço se inicia também em 0, mas esse tem a função de preencher as colunas dessa linha, fazendo assim com que o primeiro laço só avance a linha quando todas as posições dela já estiverem preenchidas (segundo laço finalizado).

Além disso, não podemos nos esquecer de colocarmos o comando %*c após o identificador de tipo. Isso pois, sempre que apertarmos a tecla Enter para confirmarmos um dos caracteres que preencherá a matriz desconsideraremos o caractere especial \n (quebra de linha) proveniente dessa tecla, que nesse caso é indesejado.

Passo 4

Por fim, basta realizarmos a impressão dessa matriz. Portanto, da mesma forma que os dois laços de repetição são úteis para escanear todas as posições de uma matriz, são também eles que nós utilizamos para imprimir uma.

A grande questão é que agora utilizamos o comando printf() ao invés de scanf() e devemos pular uma linha sempre que uma linha da matriz for avançar (linha 12), pois senão estaríamos imprimindo uma sequência de números e não a matriz em seu formato comum.

Resposta

Exercício Resolvido #2

Universidade Federal Fluminense – UFF, Lista de vetores e matrizes, pp. 01 – Exercício 03 da seção de matrizes.

Faça um programa que gere uma matriz transposta (toda matriz onde são trocadas as linhas pelas colunas, ou vice-versa).

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos começar definindo o escopo do nosso programa.

Passo 2

Com o escopo definido, já podemos declarar as variáveis e matrizes que serão úteis para nós.

Onde:

  • i e j são variáveis contadoras;
  • m a t r i z t r a n s p o s t a são matrizes do tipo float de ordem 3   x   3 .

Passo 3

Com tudo declarado, vamos iniciar a lógica do nosso programa com o preenchimento de m a t r i z .

Passo 4

Em seguida, podemos preencher a matriz t r a n s p o s t a com os elementos de m a t r i z .

Basicamente a única coisa que temos que fazer é percorrer m a t r i z atribuindo os seus elementos na posição contrária a t r a n s p o s t a . Ou seja, o elemento na linha i e coluna j de m a t r i z é atribuído a linha j e coluna de i de t r a n s p o s t a .

Passo 5

Ao fim desse laço de repetição, teremos t r a n s p o s t a preenchida e pronta para ser impressa na tela. Para isso, basta utilizarmos o seguinte trecho de código:

Resposta

Exercício Resolvido #3

Elaboração própria.

Faça um programa que leia uma matriz e um escalar, faça a multiplicação entre os dois e imprima a matriz resultante.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

A primeira coisa que devemos fazer é definir um escopo para o nosso programa.

Passo 2

Com o escopo definido, nós podemos declarar as variáveis que nos ajudarão nesse desenvolvimento.

A seguir estão algumas informações sobre elas:

  • i e j são variáveis contadoras;
  • e s c a l a r é a variável responsável por armazenar o número escalar inserido como entrada pelo usuário;
  • m a t r i z é uma matriz do tipo int de ordem 3   x   3 .

Passo 3

Com tudo aquilo que é necessário já declarado, podemos agora requisitar ao usuário os dados de entrada do programa.

Nesse caso, esses dados são todos os elementos de m a t r i z e o número escalar que será armazenado na variável e s c a l a r .

Passo 4

Logo após o usuário inserir os dados de entrada, nós podemos percorrer todos os elementos de m a t r i z multiplicando o elemento de cada posição pelo número armazenado em e s c a l a r e atualizando essa posição com o resultado.

Passo 5

Ao fim de tudo, teremos todos os elementos de m a t r i z sendo a multiplicação de seus valores originais (inseridos como entrada do programa) pelo número escalar.

Para realizarmos a impressão de m a t r i z , basta executarmos o seguinte trecho de código:

Resposta

Exercício Resolvido #4

Elaboração própria.

Faça um programa que calcule e imprima o determinante de uma matriz de ordem 2   x   2 .

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Iniciaremos o nosso programa com a definição de seu escopo.

Passo 2

Já que temos o escopo definido, podemos agora declarar e inicializar as variáveis que nos ajudarão a desenvolver esse programa.

Onde:

  • i e j são variáveis contadoras;
  • d i a g P r i n c i p a l e d i a g S e c u n d a r i a são variáveis que armazenam as multiplicações das respectivas diagonais de uma matriz;
  • d e t e r m i n a n t e é uma variável que armazena o determinante de uma matriz.

Passo 3

Com as variáveis declaradas e devidamente inicializadas, nesse momento do código devemos requisitar ao usuário o preenchimento da matriz 2   x   2 .

Passo 4

Como já sabemos, para encontrarmos o determinante de uma matriz 2   x   2 temos que subtrair a multiplicação das diagonais dela.

Para isso, primeiro descobrimos o valor de d i a g P r i n c i p a l e d i a g S e c u n d a r i a e em seguida realizamos a subtração dessas duas variáveis, atribuindo o resultado a d e t e r m i n a n t e .

Passo 5

Por último, temos que realizar a impressão do valor armazenado por d e t e r m i n a n t e e isso pode ser feito com o seguinte trecho de código:

Resposta

Exercício Resolvido #5

Universidade Federal Fluminense – UFF, Programação de computadores I – Lista de vetores e matrizes, pp. 01 – Exercício 01 da seção de matrizes.

Faça um algoritmo que construa uma matriz de 10 linhas e 15 colunas contendo números inteiros. Em seguida, escreva a soma dos elementos de cada linhas.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos iniciar o desenvolvimento definindo o escopo do nosso programa.

Passo 2

Com o escopo definido, nós podemos declarar e inicializar as variáveis que serão úteis ao desenvolvimento.

Onde cada uma delas tem a seguinte função:

  • i e j são variáveis contadoras;
  • s o m a é uma variável responsável por armazenar a soma de determinada linha i ;
  • m a t r i z é uma matriz inteira de 10 linhas e 15 colunas.

Passo 3

Nós não conseguimos fazer nada com uma matriz vazia, por esse motivo vamos requisitar os elementos dessas 10 linhas e 15 colunas ao usuário!

Passo 4

Por último, nós iremos percorrer cada posição de m a t r i z com a intenção de somar o valor de cada linha das 10 presentes.

Para isso, utilizaremos a variável s o m a para acumular o valor de soma de cada linha e quando a leitura de uma dessas linhas for finalizada (término do segundo for) o valor armazenado em s o m a deve ser impresso na tela.

Vale ressaltar que durante a transição de cada linha, a variável s o m a deve ser reinicializada, pois cada soma deve se inicializar com o valor 0.

Resposta

Exercício Resolvido #6

Universidade de São Paulo – USP, Projeto MAC Multimídia – Exercícios com matrizes, pp. 01 – Adaptação do exercício 06.

Dada uma matriz de ordem 5, imprimir a quantidade de linhas e colunas nulas.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos começar o nosso programa pelo seu escopo.

Passo 2

Em seguida, podemos declarar e inicializar as variáveis que nos ajudarão.

Informações:

  • i e j são variáveis contadoras;
  • f l a g é uma variável representativa booleana que informa ao programa se determinada linha ou coluna é ou não nula;
  • l N u l a s e c N u l a s são variáveis que armazenam a quantidade de linha ou colunas nulas, respectivamente.

Passo 3

Com as variáveis que serão necessárias já declaradas e devidamente inicializadas, podemos requisitar ao usuário o preenchimento da matriz com elementos que serão inseridos por ele.

Passo 4

Iniciaremos a nossa busca por linhas nulas.

Para isso, reinicializaremos a variável f l a g a cada loop do laço de repetição principal (laço das linhas) enquanto verificamos se alguma coluna dessa linha possui um valor diferente de 0 (segundo laço de repetição).

A lógica consiste em atribuir valor 1 a f l a g caso algum elemento da linha sendo processada seja diferente de 0. Caso seja, sabemos que a linha não é nula, caso contrário acrescentaremos uma unidade em sua contagem (linha 17).

Passo 5

O mesmo ocorre quando buscamos por colunas nulas, a grande diferença está na maneira com que fazemos isso. Agora, o primeiro laço deve avançar nas colunas enquanto o segundo verifica se cada elemento dessa coluna é diferente de 0.

Basicamente, a única coisa que temos que fazer é inverter a função dos laços, o que executava primeiro para verificar linhas nulas agora executa depois e vice-versa. Vale lembrar que a variável também muda, agora utilizaremos c N u l a s que é a responsável pela verificação de colunas nulas.

Passo 6

Por fim, basta imprimirmos as variáveis l N u l a s e c N u l a s que são responsáveis por armazenar a quantidade de linhas e colunas nulas, respectivamente.

Resposta

Exercício Resolvido #7

Universidade Federal Fluminense – UFF, Programação de computadores I – Lista de vetores e matrizes, pp. 01 – Exercício 05 da seção de matrizes.

Faça um programa que faça a soma de duas matrizes.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Que tal começarmos esse programa pelo seu escopo?

Passo 2

Com o escopo definido, nós podemos agora declarar as matrizes que serão operandos e a matriz que armazenará o resultado dessa operação. Além disso, não podemos esquecer das variáveis contadoras do programa.

Informações:

  • i e j são variáveis contadoras;
  • m a t r i z A e m a t r i z B são matrizes inteiras de ordem 3   x   3 que farão o papal de operandos;
  • m a t r i z S o m a é uma matriz inteira de ordem 3   x   3 que será responsável por armazenar a matriz resultante da operação de soma.

Passo 3

Com tudo aquilo que precisamos já declarado, podemos agora requisitar ao usuário o preenchimento das duas matrizes que serão somadas.

Passo 4

Com todos os elementos preenchidos, podemos percorrer as duas matrizes ao mesmo tempo somando os elementos que se encontram na mesma posição.

O resultado da soma desses elementos deve ser atribuído, também no mesmo índice (posição), da m a t r i z S o m a .

Passo 5

Por fim, devemos realizar a impressão da matriz resultante chamada de m a t r i z S o m a . Uma vez que todos os seus elementos em suas respectivas posições se trata da soma dos elementos de m a t r i z A e m a t r i z B nas mesmas posições.

Resposta

Exercício Resolvido #8

Instituto Federal Catarinense – IFC, Linguagens de programação – Exercícios de linguagem C, Ricardo Antonello, pp. 01 – Adaptação do exercício 05.

Faça um programa que lê um vetor de 3 elementos e uma matriz de ordem 5   x   3 elementos. Em seguida o programa deve fazer a multiplicação do vetor pelas colunas da matriz.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

A primeira coisa que nós vamos fazer para resolver esse exercício é definir o escopo do programa.

Passo 2

Com o escopo definido, podemos declarar a matriz o vetor e as variáveis que serão úteis em nosso programa.

A seguir estão algumas informações sobre elas:

  • v e t o r é um vetor inteiro de cinco posições;
  • m a t r i z é uma matriz inteira com cinco linhas e 3 colunas;
  • i e j são variáveis contadoras.

Passo 3

Agora que já temos as declarações, está na hora de requisitarmos os dados de entrada ao usuário do programa.

Nesse caso, as entradas são os elementos do vetor e da matriz, respectivamente.

Passo 4

A lógica desse exercício consiste em utilizar duas estruturas de repetição aninhadas.

Nesse caso, o primeiro for (controlado pela variável contadora i ) é responsável pelas alterações nas linhas, enquanto o segundo for é responsável pelas alterações nas colunas (elementos de uma linha).

Basicamente, a função desse trecho de código é multiplicar todos os elementos da linha que está sendo processada (índice i ) na matriz pelo elemento do vetor armazenado nessa mesma linha, por isso o índice de v e t o r também é i .

Ou seja, o elemento 0 de v e t o r multiplicará todos os elementos de m a t r i z que se encontram na linha 0, já o elemento 1 de v e t o r multiplicará todos os elementos de m a t r i z que se encontram na linha 1 e assim por diante.

Passo 5

Ao término da execução dos laços de repetição, teremos todos os elementos de m a t r i z sendo o resultado da multiplicação entre determinada posição de v e t o r por todos os elementos originais da matriz que se encontravam na linha equivalente a essa posição.

Basta agora realizarmos a impressão de m a t r i z com seus elementos atualizados: