Vous êtes sur la page 1sur 41

ALGORITMOS E PROGRAMAO

UNIDADE

VETORES E MATRIZES

PROFESSOR: EDILSON LIMA

ROTEIRO

ROTEIRO

4 VETORES E MATRIZES
4.1 Vetores
4.2 Matrizes

PROFESSOR: EDILSON LIMA

2/41

4 VETORES E MATRIZES

ROTEIRO

uma tcnica de programao que permitir trabalhar com o


agrupamento de vrias informaes dentro de uma mesma varivel,
sendo essa varivel do mesmo tipo e por essa razo podemos chamar
de estrutura de dados homogneos.
A utilizao deste tipo de estrutura de dados recebe diversos
nomes, como: variveis indexadas, variveis compostas, variveis
subscritas, arranjos, vetores, matrizes, tabelas em memria ou arrays (do
ingls).
As matrizes (tabelas em memria) so tipos de dados que podem
ser construdos medida que se fazem necessrios, pois no sempre
que os tipos bsicos (real, inteiro, caractere e lgico) e/ou variveis
simples so suficientes para representar a estrutura de dados utilizada
em um programa.

PROFESSOR: EDILSON LIMA

3/41

4.1 Vetores

ROTEIRO

Vetores ou Matrizes de uma Dimenso


Vetor pode tambm ser denominado por matrizes unidimensionais
e caracteriza-se por ser definida uma nica varivel dimensionada com
um determinado tamanho. Os nomes dados as matrizes seguem as
mesmas regras de nomes utilizados para indicar as variveis simples.
A manipulao de uma matriz tipo vetor utilizada uma nica
instruo de looping (enquanto, para ou repita).
Para ter uma ideia de como utilizar matrizes em uma determinada
situao, considere o seguinte problema: Calcular e apresentar a mdia
geral de uma turma de 8 alunos. A tabela seguinte mostra esse cenrio.

PROFESSOR: EDILSON LIMA

4/41

ROTEIRO

4.1 Vetores

TABELA 1: REPRESENTAO DE UM VETOR EM UMA TABELA.

ALUNO

NOTA1

NOTA2

NOTA3

NOTA4

MEDIA

4.0

6.0

5.0

3.0

4.5

9.0

8.0

9.0

6.0

8.0

3.0

5.0

4.0

2.0

3.5

6.0

7.0

5.0

8.0

6.5

4.0

6.0

6.0

8.0

6.0

7.0

7.0

7.0

7.0

7.0

8.0

7.0

6.0

5.0

6.5

6.0

7.0

2.0

9.0

6.0

PROFESSOR: EDILSON LIMA

5/41

4.1 Vetores

ROTEIRO

Para utilizar matrizes, ser definida a instruo conjunto que indicar em


postugus estruturado a utilizao de uma matriz, tendo como sintaxe:
VARIVEL : conjunto [<dimenso>] de <tipo de dado>
Onde:
<dimenso> ser a indicao dos valores inicial e final do tamanho do
vetor;
<tipo de dado> se o vetor em questo ir utilizar valores reais, inteiros,
lgicos ou caracteres.
Na linguagem C: tipo VARIVEL [<dimenso>];
A seguir um Portugol onde efetua a leitura das notas de 8 alunos,
clculo da mdia e a sua apresentao do vetor.
PROFESSOR: EDILSON LIMA

6/41

4.1 Vetores

ROTEIRO

Na linguagem C

tipo VARIVEL [<dimenso>];


Onde:
<dimenso> ser a indicao dos valores inicial e final do tamanho do
vetor;
<tipo de dado> se o vetor em questo ir utilizar valores reais, inteiros,
lgicos ou caracteres.
A seguir um Portugol onde efetua a leitura das notas de 8 alunos,
clculo da mdia e a sua apresentao do vetor.

PROFESSOR: EDILSON LIMA

7/41

4.1 Vetores

ROTEIRO

programa MEDIA_TURMA
var
MD [8] : real;
SOMA, MEDIA : real;
I : inteiro;
inicio
SOMA = 0;
para I de 0 at 7 passo 1 faa
leia (MD[I]);
SOMA = SOMA + MD[I];
fim para;
MEDIA = SOMA / 8;
escreva (Media = , MEDIA);
fim.
PROFESSOR: EDILSON LIMA

8/41

4.1 Vetores

ROTEIRO

Em C o portugol fica:
//programa MEDIA_TURMA
#include <stdio.h>
#include <stdlib.h>
float MD [8];
float
SOMA, MEDIA;
int
I;
main (){
SOMA = 0;
for(I = 0; I <= 7; I++){
printf("Digite a %i. nota: ",I+1);
scanf("%f", &MD[I]);
SOMA = SOMA + MD[I];
}
MEDIA = SOMA / 8;
printf("Media = %.2f\n\n",MEDIA);
system("pause");
return 0;
}
PROFESSOR: EDILSON LIMA

9/41

ROTEIRO

4.1 Vetores

Em uma matriz no podemos confundir o ndice com o elemento. O ndice


o endereo de alocao de uma unidade da matriz, enquanto elemento o
contedo armazenado em um determinado endereo.
TABELA 2: ndice e elemento de uma matriz, Coluna Mdia

ndice

Elemento

4.5

8.0

3.5

6.5

6.0

7.0

6.5

6.0

PROFESSOR: EDILSON LIMA

10/41

4.1 Vetores

ROTEIRO

A seguir um programa que ler e escreve 8 notas de alunos.


programa MEDIA_TURMA
var
MD [5] : real;
SOMA, MEDIA : real;
I : inteiro;
inicio
SOMA = 0;
para i de 0 at 4 passo 1 faa
leia (MD[I]);
SOMA = SOMA + MD[I];
fim para;
MEDIA = SOMA / 5;
para I de 0 at 4 passo 1 faa
escreva (MD[I]);
fim para;
escreva (Media = , MEDIA);
fim.
PROFESSOR: EDILSON LIMA

11/41

4.1 Vetores

ROTEIRO

//programa MEDIA_TURMA
#include <stdio.h>
#include <stdlib.h>
float MD [5];
float
SOMA, MEDIA;
int
I;
main (){
SOMA = 0;
for(I = 0; I <= 4; I++){
printf("Digite a %i. nota: ",I+1);
scanf("%f", &MD[I]);
SOMA = SOMA + MD[I];
}
MEDIA = SOMA / 5;

for(I = 0; I <= 4; I++){


printf("%i. nota: %.2f\n",I+1, MD[I]);
}
printf("Media = %.2f\n\n",MEDIA);
system("pause");
return 0;
}

PROFESSOR: EDILSON LIMA

12/41

4.1 Vetores

ROTEIRO

O exemplo a seguir efetua a leitura de dez elementos de uma matriz


A, o objetivo construir uma matriz B de mesmo tipo, observando a
seguinte lei de formao: se o valor do ndice for par, o valor dever ser
multiplicado por 5, se for mpar devera ser somado com 5. Ao final
mostrar o contedo da matriz B.

1.
2.
3.
4.

Como resolver:
Iniciar o contador de ndice, varivel I como 0 em um contador at 9;
Ler os 10 valores, um a um;
Verificar se o ndice par se sim multiplicar por 5, se no somar 5.
Criar a matriz B;
Apresentar os contedos das duas matrizes.

PROFESSOR: EDILSON LIMA

13/41

4.1 Vetores

ROTEIRO

Programa INDICE_PAR_OU_IMPAR;
var
A[10], B[10]: inteiro;
I, R: inteiro;
Inicio
para I de 0 at 9 passo 1 faa
leia A[I];
fim para;
para I de 0 at 9 passo 1 faa
R = (I div 2);
se (R = 0) ento
B[I] = A[I] * 5;
seno
B[I] = A[I] + 5;
fim se;
fim para;
para I de 0 at 9 passo 1 faa
escreva B[I];
fim para;
fim.
PROFESSOR: EDILSON LIMA

14/41

4.1 Vetores

ROTEIRO

//Programa INDICE_PAR_OU_IMPAR;
#include <stdio.h>
#include <stdlib.h>
int A[9], B[9], I, R;
main(){
for(I = 0; I <= 9; I++){
printf("Digite o %i. numero: ",I+1);
scanf("%i", &A[I]);
}
for(I = 0; I <= 9; I++){
R = I%2;
if(R == 0){
B[I] = A[I] * 5;
} else {
B[I] = A[I] + 5;
}
}
printf("\n\nO VETOR B E\n\n");
for(I = 0; I <= 9; I++){
printf("%i. numero: %i %i\n",I+1, A[I],B[I]);
}
system("pause");
return 0;
}

PROFESSOR: EDILSON LIMA

15/41

4.2 Matrizes

ROTEIRO

Desenvolver um programa que efetue a leitura de cinco elementos de


uma matriz A do tipo vetor. No final apresente o total da soma de todos os
elementos que sejam mpares.

1.
2.
3.
4.

Como resolver:
Iniciar o contador de ndice, varivel I como 0 em um contador at 4;
Ler os 5 valores, um a um;
Verificar se o elemento impar; se sim efetuar a soma dos
elementos;
Apresentar o total somado de todos os elementos mpares da matriz.

PROFESSOR: EDILSON LIMA

16/41

4.1 Vetores

ROTEIRO

Programa ELEMENTO_IMPAR;
var
A [5]: inteiro;
R, I, SOMA: inteiro;
Inicio
SOMA = 0;
para I de 0 at 4 passo 1 faa
leia A[I];
fim para;
para I de 0 at 4 passo 1 faa
R = (A[I] div 2);
se (R = 1) ento
SOMA = SOMA + A[I];
fim se;
fim para;
escreva SOMA;
fim.

PROFESSOR: EDILSON LIMA

17/41

4.1 Vetores

ROTEIRO

//Programa ELEMENTO_IMPAR;
#include <stdio.h>
#include <stdlib.h>
int A[5], I, R, SOMA;
main(){
SOMA = 0;
for(I = 0; I <= 4; I++){
printf("Digite o %i. numero: ",I+1);
scanf("%i", &A[I]);
}
for(I = 0; I <= 4; I++){
R = A[I]%2;
if(R == 1){
SOMA = SOMA + A[I];
}
}
printf("\n\nA SOMA DOS VALOR E %i \n\n", SOMA);
system("pause");
return 0;
}
PROFESSOR: EDILSON LIMA

18/41

4.2 Matrizes

ROTEIRO

Classificao dos elementos de uma matriz


Colocar em ordem crescente 5 valores numricos armazenados numa
matriz A e apresent-los.
Como resolver:
1. Iniciar o contador de ndice, varivel I como 0 em um contador at 4;
2. Ler os 5 valores, um a um;
3. Verificar se o elemento seguinte maior que o elemento atual;
4. Apresentar o vetor em ordem crescente.

PROFESSOR: EDILSON LIMA

19/41

4.2 Matrizes

ROTEIRO

Programa ORDENA_VETOR
var
N [5]: inteiro;
I, J, X: inteiro;
inicio
para I de 0 at 4 passo 1 faa
leia (N[I]);
fim para;
para I de 0 at 3 passo 1 faa
para J de I + 1 at 4 passo 1 faa
se (N[I] > N[J]) ento
X = N[I];
N[I] = N[J];
N[J] = X;
fim se;
fim para;
fim para;
para I de 0 at 4 passo 1 faa
escreva (N[I]);
fim para;
fim.
PROFESSOR: EDILSON LIMA

20/41

4.2 Matrizes

ROTEIRO

//Programa ORDENA_VETOR;
#include <stdio.h>
#include <stdlib.h>
int N[5], I, J, X;
main(){
for(I = 0; I <= 4; I++){
printf("Digite o %i. numero: ",I+1);
scanf("%i", &N[I]);
}
for(I = 0; I <= 3; I++){
for(J = I+1; J <= 4; J++){
if(N[I] > N[J]){
X = N[I];
N[I] = N[J];
N[J] = X;
}
}
}
printf("\n\nO VETOR ORDENADO \n\n");
for(I = 0; I <= 4; I++){
printf("%i\n",N[I]);
}
system("pause");
return 0;
}

PROFESSOR: EDILSON LIMA

21/41

4.2 Matrizes

ROTEIRO

MTODO DE PESQUISA EM UMA MATRIZ


Pesquisa sequencial
Consiste em efetuar a busca da informao a partir do primeiro elemento
sequencialmente at o ltimo. Este mtodo lento, porm eficiente nos casos em
que a matriz encontra-se com seus elementos desordenados.
Pesquisa binria
Este mtodo de pesquisa em mdia mais rpida, porm exige que a matriz
esteja previamente classificada, pois este mtodo divide a lista em duas partes e
procura saber se a informao a ser pesquisada est acima ou abaixo da linha
de diviso. Se estiver acima, por exemplo, toda a metade abaixo desprezada.
Em seguida, se a informao no foi encontrada, novamente dividida em duas,
e pergunta se aquela informao est acima ou abaixo, e assim vai sendo
executada at encontrar ou no a informao pesquisada. Pelo fato de ir
dividindo sempre em duas partes o volume de dados que o mtodo recebe a
denominao de pesquisa binria.

PROFESSOR: EDILSON LIMA

22/41

4.2 Matrizes

ROTEIRO

A seguir um exemplo utilizando Pesquisa sequencial onde o programa dar


entrada de 10 nomes e a apresentao desses nomes que venham a ser
solicitados durante a fase de pesquisa.
Consiste em efetuar a busca da informao a partir do primeiro elemento
sequencialmente at o ltimo. Este mtodo lento, porm eficiente nos casos em
que a matriz encontra-se com seus elementos desordenados.
Como resolver:
1. Iniciar o contador de ndice, varivel I como 0 em um contador at 9;
2. Criar um looping que efetue a pesquisa enquanto o usurio assim desejar.
Durante a fase de pesquisa, dever ser solicitada a informao a ser
pesquisada. Essa informao dever ser comparada com o primeiro
elemento; sendo igual mostra, caso contrrio avana para o prximo. Se no
achar em toda a lista, informar que no existe o elemento pesquisado; se
existir dever mostr-lo;
3. Encerrar a pesquisa quando desejado.

PROFESSOR: EDILSON LIMA

23/41

4.2 Matrizes

ROTEIRO

Programa PESQUISA_SEQUENCIAL
var
NOME [5]: caractere;
I: inteiro;
PESQ, RESP : caractere;
ACHA: lgico;
inicio
para I de 0 at 4 passo 1 faa
leia (NOME [I]);
fim para;
RESP = SIM;
enquanto (RESP = SIM) faa
escreva Entre com o nome a ser pesquisado: ;
leia PESQ;
I = 0;
ACHA = falso;

PROFESSOR: EDILSON LIMA

24/41

4.2 Matrizes

ROTEIRO

enquanto (I <= 4) e (ACHA = falso) faa


se (PESQ = NOME[I]) ento
ACHA = verdadeiro;
se no
I = I + 1;
fim se;
fim enquanto;
se (ACHA = verdadeiro) ento
escreva (PESQ, foi localizado na posio , I);
se no
escreva (PESQ, no foi localizado);
fim se;
escreva (Deseja continuar? );
leia (RESP);
fim enquanto;
fim.

PROFESSOR: EDILSON LIMA

25/41

4.2 Matrizes

ROTEIRO

//Programa PESQUISA_SEQUENCIAL;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char NOME[5][100];
int I;
char PESQ[100], RESP, ACHA;
main(){
for(I = 0; I <= 4; I++){
printf("Digite o %i. nome: ",I+1);
gets (NOME[I]);
}
RESP = 'S';
while(RESP == 'S' || RESP == 's'){
printf("Entre com o nome a ser pesquisado: ");
fflush (stdin);
gets(PESQ);

PROFESSOR: EDILSON LIMA

26/41

4.2 Matrizes

ROTEIRO

I = 0;
ACHA = 'F';
while((I <= 4) && (ACHA == 'F')){
if(strcmp(PESQ, NOME[I]) == 0){
ACHA = 'V';
} else {
I++;
}
}
if(ACHA == 'V'){
printf("%s foi localizado na posicao %i\n\n", PESQ, I+1);
} else {
printf("%s nao foi localizado\n\n", PESQ);
}
printf("Deseja continuar (S/N)?");
scanf("%s", &RESP);
}
system("pause");
return 0;
}

PROFESSOR: EDILSON LIMA

27/41

4.2 Matrizes

ROTEIRO

Agora um exemplo utilizando Pesquisa binria, para esse exemplo iremos


utilizar o problema anterior onde o algoritmo l 10 nomes e a apresentao
somente de nomes que venham a ser solicitadas pelo usurio durante a
execuo do programa.
Como resolver:
1. Iniciar o contador de ndice, varivel I como 0 em um contador at 9;
2. Criar um looping que efetue a pesquisa enquanto o usurio assim desejar.
Durante a fase de pesquisa, dever ser solicitada a informao a ser
pesquisada. Essa informao dever ser comparada utilizando-se o mtodo
de pesquisa binria. Sendo igual mostra, caso contrrio avana para o
prximo. Se no achar em toda a lista, informar que no existe o elemento
pesquisado; se existir dever mostr-lo;
3. Encerrar a pesquisa quando desejado.

PROFESSOR: EDILSON LIMA

28/41

4.2 Matrizes

ROTEIRO

Programa PESQUISA_BINRIA
var
NOME [5]: caractere;
I, X, J , COMECO, MEIO, FINAL : inteiro;
PESQ, RESP: caractere;
ACHA: lgico;
inicio
para I de 0 at 4 passo 1 faa
leia (NOME [I]);
fim para;
//ordenao
para I de 0 at 3 passo 1 faa
para J de I + 1 at 4 passo 1 faa
se (NOME[I] > NOME[J]) ento
X = NOME[I];
NOME[I] = NOME[J] ;
NOME[J] = X;
fim se;
fim para;
fim para;

PROFESSOR: EDILSON LIMA

29/41

4.2 Matrizes

ROTEIRO

//treco de pesquisa
RESP = SIM;
enquanto (RESP = SIM) faa
escreva Entre com o nome a ser pesquisado: ;
leia PESQ;
COMECO = 0;
FINAL = 4;
ACHA = falso;
enquanto (COMECO <= FINAL) e (ACHA = falso) faa
MEIO = (COMECO + FINAL) / 2;
se (PESQ = NOME[MEIO]) ento
ACHA = verdadeiro;
se no
se (PESQ < NOME[MEIO]) ento
FINAL = MEIO -1;
se no
COMECO = MEIO + 1;
fim se;
fim se;
fim enquanto;

PROFESSOR: EDILSON LIMA

30/41

4.2 Matrizes

ROTEIRO

se (ACHA = verdadeiro) ento


escreva (PESQ, foi localizado na posio , MEIO);
se no
escreva (PESQ, no foi localizado);
fim se;
escreva (Deseja continuar? );
leia (RESP);
fim enquanto;
fim.

PROFESSOR: EDILSON LIMA

31/41

4.2 Matrizes

ROTEIRO

O exemplo na linguagem C.
//Programa PESQUISA_BINARIA;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char NOME[10][100];
int I, J, COMECO, MEIO, FINAL;
char PESQ[100], RESP, ACHA;
char X[100];
main(){
for(I = 0; I <= 9; I++){
printf("Digite o %i. nome: ",I+1);
gets (NOME[I]);
}
//ordenao
for(I = 0; I <= 8; I++){
for(J = I+1; J <= 9; J++){
if(strcmp(NOME[I], NOME[J]) > 0){
strcpy(X, NOME[I]);
strcpy(NOME[I], NOME[J]);
strcpy(NOME[J], X);
}
}
}

PROFESSOR: EDILSON LIMA

32/41

4.2 Matrizes

ROTEIRO

//treco de pesquisa
RESP = 'S';
while(RESP == 'S' || RESP == 's'){
printf("Entre com o nome a ser pesquisado: ");
fflush (stdin);
gets(PESQ);
COMECO = 0;
FINAL = 9;
ACHA = 'F';
while((COMECO <= FINAL) && (ACHA == 'F')){
MEIO = (COMECO + FINAL) / 2;
if(strcmp(PESQ, NOME[MEIO]) == 0){
ACHA = 'V';
} else {
if(strcmp(PESQ, NOME[MEIO]) < 0){
FINAL = MEIO -1;
} else {
COMECO = MEIO + 1;
}
}
}
PROFESSOR: EDILSON LIMA

33/41

4.2 Matrizes

ROTEIRO

if(ACHA == 'V'){
printf("%s foi localizado na posicao %i\n\n", PESQ, MEIO);
} else {
printf("%s nao foi localizado\n\n", PESQ);
}
printf("Deseja continuar (S/N)?");
scanf("%s", &RESP);
}
system("pause");
return 0;
}

PROFESSOR: EDILSON LIMA

34/41

4.2 Matrizes

ROTEIRO

Matrizes com mais de uma dimenso


Tambm conhecida como matrizes bidimensionais ou arranjos (arrays) as
matrizes com mais de uma dimenso tem variveis no sentido horizontal
e vertical. Uma matriz de duas dimenses dever ser controlada com
dois looping de trs dimenses dever ser controlado por trs loopings e
assim por diante.
Em matrizes de mais de uma dimenso os seus elementos so tambm
manipulados de forma individualizada, sendo a referncia feita sempre
por meio de dois ndices: o primeiro para indicar a linha e o segundo para
indicar a coluna.

PROFESSOR: EDILSON LIMA

35/41

4.2 Matrizes

ROTEIRO

Operaes bsicas com matrizes de duas dimenso


Uma matriz de duas dimenses est sempre fazendo meno a linhas e
colunas e representada por seu nome e seu tamanho (dimenso) entre
colchetes. Desta forma uma matriz de duas dimenes.
TABELA [0..8, 0..4] ou TABELA [9, 5]
Onde:
TABELA -> nome o nome da matriz;
0..8 -> quantidade de linhas;
0..4 -> quantidade de colunas;
No exemplo acima quer dizer que podemos armazenar at 45 elementos.

PROFESSOR: EDILSON LIMA

36/41

ROTEIRO

4.2 Matrizes

Como exemplo temos: leia um valor numrico X e uma matriz A 4x2,


elabore um algoritmo que calcule e exiba uma outra matriz B que dever
conter cada elemento da matriz A dividido pelo valor numrico X.
Para resolver este problema, vamos criar uma tabela com 10 linha [0..9]
para guardar pessoas e 5 colunas [0..4] para guardar dados pessoais.

[0]

[1]

[1]
[2]
[3]
[4]

PROFESSOR: EDILSON LIMA

37/41

4.2 Matrizes

ROTEIRO

//algoritmo "Calcula Matriz B"


var
A, B: vetor[0..3,0..1]: inteiro
X real
I, J: inteiro
inicio
leia(X)
para I de 0 ate 3 faca
para J de 0 ate 1 faca
leia(A[I, J]);
B[I, J] = A[I, J]/X;
fim para;
fim para;
para I de 0 ate 3 faca
para J de 0 ate 1 faca
escreva( B[I, J]);
fim para;
fim para;
Fim.

PROFESSOR: EDILSON LIMA

38/41

4.2 Matrizes

ROTEIRO

NOSSO EXEMPLO DESENVOLVIDO NA LINGUAGEM C

//algoritmo "Calcula Matriz B"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int A[4][2];
int B[4][2];
int X, I, J;

PROFESSOR: EDILSON LIMA

39/41

4.2 Matrizes

ROTEIRO

main(){
printf("Digite o valor de X: ");
scanf("%i",&X);
printf("ELEMENTOS DA MATRIZ A \n\n");
for(I = 0; I <= 3; I++){
for(J = 0; J < 2; J++){
printf("digite o elemento da linha %i coluna %i: ",I, J);
scanf("%i",&A[I][J]);
B[I][J] = A[I][J]/X;
}
}
printf("\n\nELEMENTOS DA MATRIZ B (elemento da matriz A dividido pelo valor numrico X) \n\n");
for(I = 0; I <= 3; I++){
for(J = 0; J < 2; J++){
printf("elementos da matriz B [%i, %i]........: %i \n",I, J, B[I][J]);
}
}
system("pause");
return 0;
}
PROFESSOR: EDILSON LIMA

40/41

Bibliografia

ROTEIRO

ARAJO, Everton C. Algoritmos: fundamento e prtica. Captulo 6 Estrutura de Dados Homogneas I; Captulo
7 Aplicaes Prticas do Uso de Matrizes do Tipo Vetor; e Captulo 8 Estrutura de Dados Homogneas II.
VICTORINA, VIVIANE, MIZRANE. Treinamento em Linguagem C: curso completo. Captulo 7 Matrizes e
Strings; Captulo 1 Introduo e Captulo Funes.

PROFESSOR: EDILSON LIMA

41/41