Você está na página 1de 8

Matrizes (Aula 7) Uma matriz um array de duas dimens es.

Uma matriz til por exemplo para armazenar tabelas, fazer calculos matem ticos, fazer desenhos, resolver problemas, etc. Imagina que desejamos guardar no computador a lista dos alunos com suas respetivas notas em todas as disciplinas cursadas durante o ano. Por exemplo a seguinte tabela mostra a lista de 10 alunos e as notas em 8 disciplinas. Alunos 1 Jo ozinho 7 4 8 4 5 6 7 6 6 7 2 7 5 8 5 4 7 7 4 4 7 3 8 5 7 6 5 7 8 5 5 8 4 9 7 5 7 4 8 8 4 4 6 notas 5 5 8 7 5 6 5 6 6 6 8 6 6 9 8 6 5 9 6 5 5 9 7 6 6 9 7 5 8 8 5 5 8 8 9 6 7 3 3 9 9 6 6 9 Media

Pedrinho Gabriela Roberto Paulo Gisele Vera Jorginho Paulinho Flavio

Gostariamos fazer um programa para armazenar essa tabela no computador e depois poder calcular por exemplo a media de todas as notas de todos os alunos. Inclusive para saber o desempenho da turma inteira poderiamos calcular a media das medias. Bom, para come ar vamos pensar apenas em como armazenar as notas na memoria do computador. Para isso vamos utilizar uma matriz. Em Pascal, uma matriz definida em forma muito similar a um vetor, da seguinte forma:
Var notas : array [1..10,1..8] of real;

Onde o n mero 10 indica o n mero maximo de linhas da matriz e o n mero 8 indica o n mero maximo de colunas. Se n o sabemos com antecedencia qual ser o tamanho de nossa matriz podemos reservar um n mero grande como foi feito com vetores. Para manter a informa o completa da tabela no computador, poderiamos armazenar tamb m os nomes dos alunos num vetor de string e as medias dos alunos num vetor de n meros reias. Vejamos como trabalhar com matrizes, analisando o seguinte programa que le as notas dos alunos, calcula as medias, guarda num vetor e imprime os resultados na tela do computador. Programa
Program Turma; Var notas: array [1..10,1..8] of real; Media: array [1..8] of real; Soma: real; i,j,N,M: integer; Begin {Entrada de Dados} Readln(N); {ler o n mero de alunos} Readln(M); {ler o n mero de disciplina} For i:=1 to N do Begin For j:=1 to M do Begin {ler as notas dos alunos em cada disciplina}

Read (notas[i][j]); End; End; {Processamento de D ados} For i:=1 to N do Begin Soma:=0; {zerar a soma das notas do aluno i} For j:=1 to M do Begin {acrecentar a soma as notas da disciplina j} Soma:=Soma + notas[i][j] End; Media[i]:=Soma/M; End; {Sa da de Resultados} For i:=1 to N do Begin Writeln('a nota media aluno ',i,' : ',Media[i]); End; End.

Para acessar aos elementos de uma matriz utilizamos dois ndices: o primeiro para definir a linha e o segundo para definir a coluna. No programa observamos que precisamos sempre de dois la os para percorrer todos os elementos de uma matriz. Quando um la o est dentro de outro la o, estes s o chamados de la os aninhados. muito comum encontrar em programas la os anhinhados, especialmente quando se trabalha com vetores e matrizes. Os vetores e matrizes s o bastante usados em c lculos matem ticos. Vejamos agora um outro exemplo de opera es com matrizes. Problema Fazer um programa que dada duas matrizes A e B, determinar a soma de A e B. A soma de duas matrizes bastante simples, apenas precisamos somar os elementos correspondentes de cada matriz e o resultado colocar em uma outra matriz. Veja o seguinte exemplo de soma de dois matrizes A e B de tamanho 3x3:
A | 1 4 2 | | 0 5 1 | | 2 2 8 | + B | 1 2 3 | | 1 0 1 | | 2 3 2 | = C | 2 6 5 | | 1 5 2 | | 4 5 10|

Solu o Vamos escrever um programa que le os elementos da matriz, depois faz a soma de seus elementos e finalmente imprime a matriz resultante. A primeira entrada s o as dimens es da matriz. Para poder somar duas matrizes, elas devem ter as mesmas dimens es. Os elementos de cada linha devem ser digitados deixando um espaco, como mostra o seguinte exemplo: Exemplo de entrada:
digite as dimens es das matrizes: 3 3 digite os elementos da matriz A: 1 4 2 0 5 1 2 2 8 digite os elementos da matriz B: 1 2 3 1 0 1 2 3 2

Programa
Program soma_matrizes; Var A,B,C: array[1..100,1..100] of integer; i,j: integer; M,N: integer; Begin Writeln('digite as dimens es das matrizes:'); Readln(N,M); Writeln('digite os elementos da matriz A:'); For i:=1 to N do Begin

For j:=1 to M do Begin Read(A[i,j]); End; Readln; end; Writeln('digite os elementos da matriz B:'); For i:=1 to N do Begin For j:=1 to M do Begin Read(B[i,j]); End; Readln; end; {calcular a soma de A + B} For i:=1 to N do Begin For j:=1 to M do Begin C[i,j]:=A[i,j]+B[i,j]; End; End; {imprimir o resultado} Writeln('O resultado da soma de A+B:'); For i:=1 to N do Begin For j:=1 to M do Begin Write(C[i,j],' '); {deixar espa o entre n End; Writeln; { quebra linha } End; End.

meros}

Problema: Aeroporto A crescente utiliza o do transporte a reo preocupa os especialistas, que prev em que o congestionamento em aeroportos poder se tornar um grande problema no futuro. Os n meros atuais j s o alarmantes: relat rios oficiais demonstram que na Europa, em junho de 2001, houve uma m dia de 7.000 atrasos de v os por dia. Preocupada com a previs o dos seus especialistas em tr fego a reo, a Associa o de Transporte A reo Internacional (ATAI) est come ando um estudo para descobrir quais s o os aeroportos onde o tr fego a reo pode vir a ser mais problem tico no futuro. Tarefa Como programador rec m contratado pela ATAI voc foi encarregado de escrever um programa para determinar, a partir de uma listagem de aeroportos e v os, qual aeroporto possui maior probabilidade de congestionamento no futuro. Como medida da probabilidade de congestionamento ser utilizado neste estudo o n mero total de v os que chegam ou que partem de cada aeroporto. Entrada A primeira linha de entrada cont m dois n meros inteiros A e V, que indicam respectivamente o n mero de aeroportos e o n mero de v os. Os aeroportos s o identificados por inteiros de 1 a A. As V linhas seguintes cont m cada uma a informa o de um v o, representada por um par de n meros inteiros positivos X e Y, indicando que h um v o do aeroporto X para o aeroporto Y. Exemplo de Entrada
5 1 2 3 3 4 3 2 7 3 1 2 4 5 5 5

Restri es 0 A 100 0 V 10000 1XA 1YA XY Solu o

Para resolver este problema vamos usar matrizes. Os indices de cada elemento da matriz vai indicar o origem e o destino do v o, por exemplo 1,3 indica que tem v o do aeroporto 1 ao aeroporto 3. Em cada elemento da matriz vamos armazenar o n mero de v os, por exemplo mat[1][3] vamos colocar um 1 indicando que existe um v o entre estes dois aeroportos. A tabela ou matriz para armazenar os dados de acima seria uma matriz quadrada de tamanho igual ao n mero de aeroportos. 1 2 3 4 5 1 0 0 1 0 0 1 0 0 0 1 2 0 1 0 1 1 3 0 0 0 0 1 4 0 0 0 0 0 5 A partir desta tabela podemos determinar os aeroportos mas congestionados, contando os v os que chegam e os v os que saem. Para isso vamos somar as linhas e as colunas de forma similar como foi feito com a tabela das notas. Estes ser o armazenados em vetores para depois fazer a soma e finalmente procurar os aeroportos mais congestionados. Vejamos o programa: Programa
PROGRAM aeroporto; VAR mat: array [1..100,1..100] of integer; total,sai,cheg: array[1..100] of integer; A,V:integer; i,j:integer; x,y:integer; max: integer; BEGIN WRITELN('digite o n mero de aeroportos e o n mero de v os'); READ(A); {ler numero de aeroportos} READLN(V); {ler n mero de v os} {zerar a matriz mat} FOR i:=1 TO A DO BEGIN FOR j:=1 TO A DO BEGIN mat[i][j]:=0; END; END; {ler x, y e acrecentar 1 na matriz se existir v o de x para y} Writeln('para cada v o digite o origem e o destino na mesma linha'); FOR i:=1 to V DO BEGIN READLN(x,y); mat[x][y]:=mat[x][y]+1; END; {somar as saidas do aeroporto i} FOR i:=1 TO A DO BEGIN sai[i]:=0; FOR j:=1 TO A DO BEGIN sai[i]:=sai[i]+mat[i][j]; END; END; {somar as chegadas ao aeroporto j} FOR j:=1 TO A DO BEGIN cheg[j]:=0; FOR i:=1 TO A DO BEGIN cheg[j]:=cheg[j]+mat[i][j]; END; END; {procurar o valor maximo da soma de chegadas e saidas} max:=0; FOR i:=1 TO A DO BEGIN total[i]:=cheg[i]+sai[i]; IF(total[i]>max) THEN max:=total[i];

END; {imprimir os aeroportos congestionados} WRITELN(' Os aeroportos congestionados:'); FOR i:=1 TO A DO BEGIN IF(max=total[i]) THEN WRITE(i, ' '); END; WRITELN; {quebra linha} END.

Exerc

cios

1. O jogo de xadrez, al m de ser um jogo que exige bastante racioc nio, uma tima fonte de quebra-cabe as. Este problema trata de um destes quebra-cabe as, envolvendo os movimentos de uma de suas pe as, o cavalo. Os movimentos do cavalo s o ditos em 'L', pois ele sempre deve andar duas casas em uma dire o e uma casa na dire o perpendicular.

A figura acima ilustra os poss veis movimentos do cavalo, onde o caractere 'C' indica a posi o inicial e o caractere '' representa as poss veis finais. importante notar que o cavalo a unica pe a que pode saltar sobre outras pe as do xadrez. Note ainda que na representa o que usamos n o desting imos casas brancas de casas pretas no tabuleiro. Tarefa Usando os movimentos do cavalo, voce deve fazer um programa para determinar qual o n mero m nimo de movimentos do cavalo para ir de uma casa Inicio at uma casa Final, sendo proibido que o cavalo para sobre algumas casas especificadas com X durante a seq ncia de movimentos.

Entrada Como entrada ser o fornecidas LI e CI indicando a posi o (coluna e linea) inicial do cavalos no tabuleiro, a posi o final LF e CF, o n mero de casas proibidas e a sequencia de LX e CX indicando a posi o das casas proibidas. Exemplo de entrada:

4 3 7 8 13 3 5 4 4 4 5 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 8 5 8 6

Sa

da

O programa deve mostrar o minimo n mero de movimentos que o cavalo deve fazer para ir da posi o inicial ate a posi o final. Por exemplo, a sa da para os dados de acima : 6. 2. Quebracabe a Este um jogo antigo bem popular entre crian as que consiste de uma matriz de 5x5 contendo 25 quadradinho todos de igual tamanho. Em cada quadradinho esta escrito uma unica letra do alfabeto, por m um quadradinho esta vazio, como mostra a figura abaixo.

Um quadradinho pode ser movido para o espa o vazio se este estiver a direita, esquerda, acima ou abaixo imediato. O objetivo da quebracabe a mover os quadradinho no espa o vazio de forma que todas as letras aparecem em ordem alfabetico. Tarefa Escreva um programa que mostre o quebracabe a resultante depois de uma seq movimentos dada a posi o inicial. Entrada A entrada consiste da configura o inicial da quebracabe a, e a sequencia de movimentos. As primeiras 5 linhas descreve a configura o inicial, a linha seguinte contem a seq ncia de movimentos, definidos pelas letras A,B,E,D. Onde cada letra tem o seguinte significado ncia de

A --- O movimento para abaixo, a letra que esta acima do espa o vazio ser movido B --- O movimento para acima, a letra que esta abaixo do espa o vazio ser moviemdo E -- O movimento para esquerda, a letra que esta direita do espa o vazio ser movida D -- O movimento para a direita, a letra que esta esqueda do espa o vazio ser movida Caso exista algum movimento n o permitido, imprimir que a quebracabe a n o tem configura o final. Exemplo de entrada
TRGSJ XDOKI M VLN WPABE UQHCF AEEBBR

ida

A s ida a configura o final da quebracabe a depois da seq ncia de movimentos, as letras devem ser imprimidas deixando um espa o, como mostra o exemplo: Exemplo de sa da
T X M W U R O D P Q G S J K L I V B N A E H C F

3. Sensor do escaner Uma imagem em branco e preto pode ser considerado como uma matriz de pontos brancos e pretos. Onde os pontos pretos representam o objeto e o branco o fundo. Quando desejamos guardar no computador uma imagem, utilizamos um escaner. O escaner um aparelho que tem v rios sensores que detecta os pontos brancos e pretos quando passa pela imagem e depois reconstrui a imagem colocando numa matriz de zeros e unos. Um dos sensores do escaner barre a imagem em forma diagonal, como mostra a figura abaixo. Em cada diagonal conta o n mero de pontos pretos.

Tarefa Fa a um programa que conte o n mero de pontos pretos em cada diagonal da imagem.

Dados de entrada A entrada composta de M e N que indica o tamanho da imagem e de uma matriz de 1s e 0s que representa a imagem. Ejemplo de entrada

5 0 1 0 0 0

7 0 1 0 1 0

0 0 1 0 0

0 1 0 1 1

0 0 0 0 0

1 0 1 0 1

0 0 0 0 0

Sa

da

Na sa da o programa deve imprimir o n mero de pontos pretos em cada diagonal. Exemplo de sa da


0 1 1 0 3 1 1 2 0 1 0

As solu

es voce encontra aqui.

Você também pode gostar