Matrizes e Vetores
Uma matriz é uma coleção de variáveis de mesmo tipo, acessíveis com um único nome e armazenados contiguamente na memória.
A individualização de cada variável de um vetor é feita através do uso de índices.
Os Vetores são matrizes de uma só dimensão.
int Vetor[5]; // declara um vetor de 5 posições
int Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas
Para acessar os elementos de um vetor usa-se índices. O índice define a posição da variável dentro do vetor.
Em todos os vetores tem o primeiro elemento na posição 0(zero). Assim, se tomarmos "K" como sendo o tamanho do vetor a última posição é a de índice "K-1"
Vetor[0] = 4; // Coloca 4 na primeira
posição de "Vetor"
Vetor[4] = 8; // Coloca 8 na última
posição de "Vetor"
int Vetor[5]; // declara um vetor de 5 posições
int Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas
Vetor[0] = 9; //
coloca 9 na primeira posição do vetor
Vetor[4] = 30 // coloca 30 na última posição
do vetor
Matriz[0][1] = 15; // coloca 15 na célula que
está na primeira linha
// e na segunda coluna da matriz
Preenchimento de um vetor com um dado
for(i=0; i<5; i++)
for(i=0; i<=4; i++)
Vetor[i] = 30;
Vetor[i] = 30;
Colocar os números de 1 a 5 em Vetor
for(i=0; i<5; i++)
Vetor[i] = i+1;
Colocar os números de 5 a 1 em Vetor
for(i=0; i<5; i++)
Vetor[i] = 5-i;
Uso de Constantes para definir o tamanho de um vetor
#define TAM_MAX 10
double VetReais[TAM_MAX];
for(i=0; i<TAM_MAX; i++)
VetReais[i] = TAM_MAX - i; // coloca 5,4,3,2,1
no vetor
Copiar os dados de um vetor para outro
#define TAM_MAX 10
double VetReais[TAM_MAX], Copia[TAM_MAX];
for(i=0; i<TAM_MAX; i++)
VetCopia[i] = VetReais[i]; // Copia os dados de
um vetor
// para outro
Copiar os dados de um VET1 para as primeiras 5 posições de COPIA e VET2 para as outras 5
#define TAM_MAX 10
// Note que a declaração do vetor
"Cópia" cria o dobro de posições
double Vet1[TAM_MAX], Vet2[TAM_MAX], Copia[TAM_MAX*2];
for(i=0; i<TAM_MAX; i++)
VetCopia[i] = Vet1[i]; // Copia os dados do
primeiro vetor
for(i=0; i<TAM_MAX; i++) // Copia os dados do segundo
vetor
VetCopia[i+TAM_MAX] = Vet2[i];
// ****** Pergunta: Como fazer a cópia usando um único comando for ?
Leitura dos dados de um um vetor
#define TAM_MAX 10
double Vet1[TAM_MAX];
for(i=0; i<TAM_MAX; i++)
scanf("%f",&Vet1[i]);
Encontrar o maior valor dentro de um vetor
#define TAM_MAX 10
double Vet1[TAM_MAX];
double Maior;
for(i=0; i<TAM_MAX; i++)
scanf("%f",&Vet1[i]);// le os
dados
Maior = Vet1[0]; // assume que o primeiro é o maior
for(i=0; i<TAM_MAX; i++)
if Vet1[i] > Maior
Maior = Vet1[i];
printf("O maior elemento é %f\n",Maior);
// ****** Pergunta: Como fazer a mesma busca e
imprimir também a
// ****** posição do dado dentro do vetor. Tente fazer isto usando
// ****** apenas 1 variável.
Crie um programa que copie para um vetor os elementos de outro em ordem crescente.
// A ideia aqui é encontrar o menor
elemento do vetor 1 e colocar no vetor 2. Tirar este número de vet1, por exemplo,
// colocando no seu lugar, no vetor 1, um número grande e recomeçar a busca pelo novo
número menor.
#define TAM_MAX 10
double Vet1[TAM_MAX], VetOrdenado[TAM_MAX];
double Menor, Maior;
for(i=0; i<TAM_MAX; i++)
scanf("%f",&Vet1[i]);// le os
dados
PosMaior = 0; // assume que o maior
está na 1a. posição
for(i=0; i<TAM_MAX; i++)
if Vet1[i] > Vet1[PosMaior]
PosMaior = i; // acha a
posição do maior
for(j=0; j<TAM_MAX;j++)
{
PosMenor = 0; // assume que o primeiro é o menor
for(i=0; i<TAM_MAX; i++)
if Vet1[i] < Vet1[PosMenor]
PosDoMenor = i;
VetOrdenado[j]= Vet1[PosMenor]; // copia menor para o novo
vetor
// inutiliza a posição do menor colocando nela um número grande
Vet1[PosMenor] = Vet1[PosMaior]; // no caso o maior do
vetor
}
for(i=0; i<TAM_MAX; i++)
print("%f\n",VetOrdenado[i]);// Imprime os dados
Para passar uma
matriz ou vetor como parâmetro, basta declarar o parâmetro da mesma forma que a matriz/vetor
foi declarado.
Por definição da linguagem C, um vetor é sempre passado por referência, logo, qualquer alteração em seus elementos, altera a variável usada como parâmetro na chamada da rotina.
#include <stdio.h>
#define TAM_MAX 10
void ImprimeVet (int Tam, int Vet[TAM_MAX])
{
int i;
for (i=0; i< Tam; i++)
{
printf("%d", Vet[i]);
}
}
int main()
{
int Notas[TAM_MAX];
ImprimeVet(TAM_MAX,
Notas); // Passa o vetor 'Notas' como
// parâmetro
return 0;
}
#define NLIN 10
#define NCOL 10
int Matriz[NLIN][NCOL];
Preencher uma matriz com um dado
for(i=0; i < NLIN; i++)
for(j=0; j < NCOL; j++)
Matriz[i][j] = 30;
Somar um número a uma linha/coluna de uma matriz
void SomaValorNaColuna(int Valor, int Matriz[NLIN][NCOL], int
Coluna)
{
for(i=0; i < NLIN; i++) // para cada linha de 'Coluna'
Matriz[i][Coluna] = Matriz[i][Coluna] + 30;
}
Criar uma matriz identidade
void CriaIdent(int Colunas, int linhas, int
Matriz[NLIN][NCOL])
{
}
Criar uma matriz transposta
void CriaTransp(int Colunas, int linhas,
int Matriz[NLIN][NCOL], int Trasposta[NLIN][NCOL])
{
}
Cria uma rotina que some duas matrizes
void SomaMatrizes(int Colunas, int linhas,
int MatrizA[NLIN][NCOL], int MatrizB[NLIN][NCOL],
int MatrizSOMA[NLIN][NCOL])
{
}
Cria uma rotina que multiplique duas matrizes
void MultMatrizes(int Colunas, int linhas,
int MatrizA[NLIN][NCOL], int MatrizB[NLIN][NCOL],
int MatrizMULT[NLIN][NCOL])
{
}
Acesso a uma linha de uma matriz
Uma linha de uma matriz é vista, em C, como sendo um vetor. O acesso à linha é feito informando apenas a primeira das dimensões da matriz.
No exemplo a seguir as funções InicializaVet e ImprimeVet são usadas para manipular os dados de cada uma das linhas de uma matriz.
Cuidados com os limites dos índices de Matrizes e Vetores
A linguagem C não faz nenhum teste de verificação dos índices usados para acessar os elementos de um vetor.
Isto significa que, se estes limites não forem respeitados, resultados indesejados serão obtidos.
No exemplo a seguir, a matriz int M[2][3] é acessada com índices fora dos limites corretos, o que gera um resultado diferente do esperado.
#include <stdio.h>No caso deste exemplo, no primeiro for, após atribuir um valor para a posição Matriz[0][2], o
código avança sobre os dados da segunda linha, mesmo sendo a linha
definida como 0, como se pode observar na saída do programa,
apresentada a seguir:
0 1 2
3 4 5
Outro exemplo, desta vez usando strings, também ocorre o mesmo problema, neste caso porque a string colocada em cada linha da matriz é maior do que os espaço disponível para armazená-la.
A passagem dos elementos de um vetor como parâmetro é idêntica à passagem de uma variável. Ou seja, quando a passagem for por valor usa-se vet[i] e quando for por referência usa-se &vet[i].
#include <stdio.h>
A passagem dos elementos de um vetor como parâmetro é idêntica à passagem de uma variável. Ou seja, quando a passagem for por valor usa-se vet[i] e quando for por referência usa-se &vet[i].
#include <stdio.h>
#include <string.h>
void Imprime (int N) // função com um parâmetro por valor
{
printf("%d", N);
}
void Set (int *N, int i) // função com um parâmetro por referência
{
*N = i;
}
int main()
{
int i;
int Vet[10];
for (i=0; i< 10; i++)
{
Set(&Vet[i], i); // Note que é preciso colocar o '&' antes
// de Vet[i] pois a função 'Incr' espera um
// parâmetro por REFERÊNCIA
Imprime(Vet[i]); // Note que NÃO se deve colocar nada antes
// de Vet[i] pois a função 'Imprime' espera um
// parâmetro por VALOR
}
return 0;
}