Compreensão de Arrays Bidimensionais
Um array bidimensional pode ser visualizado como uma matriz composta por linhas e colunas. Tecnicamente, em C, trata-se de um array cujos elementos são, eles próprios, outros arrays unidimensionais.
A sintaxe fundamental para a declaração é: tipo_dado nome_do_array[quantidade_linhas][quantidade_colunas];
Formas de Inicialização
Existem diferentes maneiras de definir os valores iniciais de uma matriz no momento da declaração:
// Inicialização segmentada por linhas
int matriz[2][3] = {
{10, 20, 30},
{40, 50, 60}
};
// Inicialização linear (o compilador organiza conforme as dimensões)
int dados[2][3] = {1, 2, 3, 4, 5, 6};
// Inicialização parcial (elementos omitidos tornam-se zero)
int valores[3][3] = {{1}, {4, 5}};
Acesso e Manipulação de Elementos
Para interagir com um elemento específico, utilizamos os índices de posição, lembrando que a contagem em C sempre inicia em zero.
int valor = matriz[0][2]; // Obtém o elemento da primeira linha e terceira coluna
Exemplos Práticos de Implementação
1. Preenchimento e Exibição de Matrzies
O código abaixo demonstra como popular uma matriz dinamicamente e exibi-la formatada no console.
#include <stdio.h>
int main() {
int grade[4][5];
int contador = 10;
// Populando a matriz
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 5; c++) {
grade[r][c] = contador++;
}
}
// Exibindo os dados
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 5; c++) {
printf("%d\t", grade[r][c]);
}
printf("\n");
}
return 0;
}
2. Ordenação e Busca Binária em Matrizes de Strings
Arrays bidimensionais de caracteres são frequentemente usados para armazenar listas de palavras. Abaixo, ordenamos essa lista e aplicamos uma busca binária.
#include <stdio.h>
#include <string.h>
int main() {
char nomes[][20] = {"Brasil", "Angola", "Portugal", "Moçambique"};
int n = sizeof(nomes) / sizeof(nomes[0]);
// Ordenação Bolha (Bubble Sort)
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (strcmp(nomes[i], nomes[j]) > 0) {
char temp[20];
strcpy(temp, nomes[i]);
strcpy(nomes[i], nomes[j]);
strcpy(nomes[j], temp);
}
}
}
// Busca Binária
char alvo[] = "Brasil";
int esq = 0, dir = n - 1, encontrado = 0;
while (esq <= dir) {
int meio = (esq + dir) / 2;
int res = strcmp(alvo, nomes[meio]);
if (res == 0) {
encontrado = 1;
break;
} else if (res > 0) {
esq = meio + 1;
} else {
dir = meio - 1;
}
}
printf(encontrado ? "Registro localizado.\n" : "Registro não encontrado.\n");
return 0;
}
3. Construção de Quadrado Mágico (3x3)
O algoritmo de construção de um quadrado mágico posiciona números de forma que a soma de linhas, colunas e diagonais seja idêntica.
#include <stdio.h>
int main() {
int magico[3][3] = {0};
int lin = 0, col = 1; // Posição inicial
magico[lin][col] = 1;
for (int k = 2; k <= 9; k++) {
int ant_lin = lin;
int ant_col = col;
lin--;
col++;
if (lin < 0) lin = 2;
if (col > 2) col = 0;
if (magico[lin][col] != 0) {
lin = ant_lin + 1;
col = ant_col;
if (lin > 2) lin = 0;
}
magico[lin][col] = k;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%2d ", magico[i][j]);
}
printf("\n");
}
return 0;
}
Fundamentos de Funções
As funções permitem a modularização do código, facilitando a manutenção e o reaproveitamento de lógica.
- Definição: Composta pelo tipo de retorno, nome, parâmetros e corpo da função.
- Parâmetros Formais vs. Reais: Os formais são variáveis declaradas na assinatura da função; os reais (argumentos) são os valores passados durante a chamada.
- Retorno de Valores: Utiliza-se a palavra-chave
returnpara enviar um resultado ao chamador. Funçõesvoidnão retornam valores. - Recursividade: Técnica onde uma função chama a si mesma para resolver subproblemas, exigindo sempre uma condição de parada para evitar estouro de pilha (stack overflow).
Tipos de Funções
As funções podem ser classificadas em duas categorias principais:
- Bibliotecas Padrão: Funções integradas como
printf(),scanf()estrlen(), acessíveis via arquivos de cabeçalho (.h). - Funções de Usuário: Criadas pelo desenvolvedor para atender necessidades específicas do projeto.