Vetores e matrizes
Em inglês, vetor é array. A tradução não é vector. Em C uma matriz é uma matriz para o usuário e para o programador que não está lidando com aritmética de ponteiros, mas quando se lida com a aritmética de ponteiros, uma matriz passa a ser um vetor de vetor ou "array of array" em inglês.
Na disciplina de introdução você inicialmente aprende pra que serve vetor e como usar um. A parte mais matemática do assunto, teoremas matemáticos e propriedades específicas não é estudada. Isso é deixado pra ser aprofundado com Álgebra Linear. No começo você pode encarar vetor e matriz como uma espécie de variável que guarda um conjunto de valores, mas é errado chamar vetor e matriz de variável. Fica mais claro depois que você aprende ponteiros, mas até lá dá pra fazer o básico de vetores e matrizes sem pensar nos ponteiros. Por enquanto, vetor como uma sequência ordenada e matriz como matriz mesmo, aquela do ensino médio, é suficiente.
Todos os problemas são "resolvíveis" com vetores ou matrizes de dimensão fixa, dimensão variável precisa usar alocação dinâmica de memória e isso não faz parte da introdução.
A lógica básica é: você usa um laço e um contador. Todo vetor ou matriz tem um índice, as posições dos elementos no conjunto, a ideia é ter um laço e um contador que represente a sequência de posições do vetor ou da matriz.
Erros de lógica:
- O principal é com o índice. Se o contador indicar índice fora da dimensão máxima ou mínima, "run to the hills";
- O menos grave é você errar na contagem, grava ou lê alguma coisa na posição errada, por cima de outra;
- No começo é comum se confundir com o índice, a posição, e o elemento guardado ali propriamente dito.
- Preencher um vetor / matriz com um monte de números:
int vetor[max], i; /* todos os índices, 0 ... max - 1, do vetor recebem o valor 1 */ for (i = 0; i < max; i++) { vetor[i] = 1; }
Com matriz a lógica é a mesma:
int matriz[imax][jmax], i, j; /* preenche todos os índices da matriz com o valor 7. Linha por linha, coluna por coluna */ for (i = 0; i < imax; i++) for (j = 0; j < jmax; j++) matriz[i][j] = 7;
Para n dimensões, serão n laços em cascata, o que é extremamente lento por sinal. O laço mais interno de todos estará variando o índice da última dimensão da matriz (o colchete mais a direita na declaração). O laço mais externo o índice mais a esquerda.
Percorrer linhas primeiro ou colunas primeiro? Apenas por questões como leitura do código e indentação, utilizar o padrão que é linhas primeiro, colunas depois, laço externo conta linhas, laço interno conta colunas, facilita as coisas, embora não seja proibido inverter essa ordem.
- União de conjuntos, união de dois vetores:
int a[max], b[max], c[max]; int i, j, k = 0; /* k conta quantos elementos tem c[] e tambem indica o índice de c[], para não copiar nenhum elemento de b[] onde já havia um elemento de a[] antes */ /* copie todos os elementos de a[] em c[] */ for (i = 0; i < max; i++) c[k++] = a[i]; /* compare todos os elementos de b[] com todos de c[] Interrompa a comparação no primeiro elemento de b[] igual a um de c[]. Se a comparação não foi interrompida, então copie o elemento corrente de b[] em c[] */ for (i = 0; i < max; i++) { for (j = 0; j < k; j++) if (c[j] == b[i]) break; if (j == k) c[k++] = b[i]; }
O algoritmo só funciona corretamente se tanto 'a' quanto 'b' não tiverem nenhum elemento repetido. Como exercício, tente resolver o problema quando há elementos repetidos. Tente também fazer a diferença de conjuntos.
- Álgebra linear, multiplicação de matriz por vetor:
int i, j, linhas, colunas; int c[imax], a[imax][jmax], b[jmax]; /* multiplique matriz por vetor, elemento a elemento. c[i] = 0 é obrigatório, caso contrário o produto da linha anterior é acumulado na seguinte */ for (i = 0; i < linhas; i++) { c[i] = 0; for (j = 0; j < colunas; j++) c[i] += a[i][j] * b[j]; }
Um pequeno detalhe que pode confundir: um vetor, em matemática, é representado como uma matriz com uma coluna e número de linhas igual ao número de colunas da matriz. Mas no computador, o vetor é representado por um índice apenas, não é utilizada uma matriz de uma coluna só.
Se não se lembrar de como se multiplica matriz por vetor, consulte um livro didático ou site que contenha a regra da multiplicação de matrizes. Lembre-se que o produto matriz por vetor sempre resulta num vetor.