Domínio de Arrays Multidimensionais e Estruturas de Funções em Linguagem C

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 return para enviar um resultado ao chamador. Funções void nã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:

  1. Bibliotecas Padrão: Funções integradas como printf(), scanf() e strlen(), acessíveis via arquivos de cabeçalho (.h).
  2. Funções de Usuário: Criadas pelo desenvolvedor para atender necessidades específicas do projeto.

Tags: C Arrays Algoritmos estrutura de dados Programação Estruturada

Publicado em 6-19 17:43