vetores e matrizes em C UTILIDADE PUBLICA
Introdução
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.
Declaração de Matrizes
int Vetor[5]; // declara um vetor de 5 posiçõesint Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas
Acesso aos elementos do vetor
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 10double 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 10double 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.
// ****** 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// colocando no seu lugar, no vetor 1, um número grande e recomeçar a busca pelo novo número menor.
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
Passagem de Matrizes e Vetores como Parâmetro
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;
}
Exemplos com Matrizes
#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.
#include <stdio.h>
#define NLinhas 10
#define NColunas 5
void ImprimeVet(int Vet[NColunas])
{
int i;
for(i = 0; i < NColunas; i++) {
printf("%d ", Vet[i]);
}
}
void InicializaVet(int Vet[NColunas], int n)
{
int i;
for(i = 0; i < NColunas; i++) {
Vet[i] = i * n;
}
}
int main()
{
int Matriz[NLinhas][NColunas];
int i;
for(i = 0; i < NLinhas; i++) {
InicializaVet(Matriz[i], i);
printf("\n");
}
for(i = 0; i < NLinhas; i++) {
ImprimeVet(Matriz[i]);
printf("\n");
}
return 0;}
#define NLinhas 10
#define NColunas 5
void ImprimeVet(int Vet[NColunas])
{
int i;
for(i = 0; i < NColunas; i++) {
printf("%d ", Vet[i]);
}
}
void InicializaVet(int Vet[NColunas], int n)
{
int i;
for(i = 0; i < NColunas; i++) {
Vet[i] = i * n;
}
}
int main()
{
int Matriz[NLinhas][NColunas];
int i;
for(i = 0; i < NLinhas; i++) {
InicializaVet(Matriz[i], i);
printf("\n");
}
for(i = 0; i < NLinhas; i++) {
ImprimeVet(Matriz[i]);
printf("\n");
}
return 0;}
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>
void ImprimeVet(int Vet[3])
{
int i;
for(i = 0; i < 3; i++) {
printf("%d ", Vet[i]);
}
}
int main()
{
int Matriz[2][3];
int i;
for(i = 0; i < 10; i++)
{
Matriz[0][i] = i; // a matriz tem 3 colunas, mas o laço do for vai até 10
}
for(i = 0; i < 2; i++) {
ImprimeVet(Matriz[i]);
printf("\n");
}
return 0;
}
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.
#include <stdio.h>
#include <string.h>
void ImprimeVet(int Vet[3])
{
int i;
for(i = 0; i < 3; i++) {
printf("%d ", Vet[i]);
}
}
int main()
{
char Texto[2][17];
int i;
strcpy(Texto[0], "Aula de Programacao"); // esta string não cabe na linhada matriz
strcpy(Texto[1], "em linguagem C.");
for(i = 0; i < 2; i++) {
printf("%s\n", Texto[i]);
}
return 0;
}
A saída do programa é :
Aula de Programacem linguagem C.
em linguagem C.
Passagem dos Elementos de Matrizes e Vetores como Parâmetro (por valor)
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);
}
int main()
{
int i;
int Vet[10];
for(i = 0; i < 10; i++)
{
Vet[i] = i;
}
for (i=0; i< 10; i++)
{
Imprime(Vet[i]);// passa o valor de cada um dos elementos do vetor como parâmetro
}
return 0;
}
A saída do programa é :
0123456789
Sugere-se, antes da leitura das próximas seções, a consulta à página sobre ponteiros.
Passagem dos Elementos de Matrizes e Vetores como Parâmetro (por referência)
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;
}
A saída do programa é :
0123456789
Comentários
Postar um comentário