Você precisa armazenar mil números inteiros. Você realmente quer declarar int a, b, c... até z e depois continuar? Não. Isso é tedioso e propenso a erros. Em vez disso, você usa um array.
Uma matriz é uma coleção de valores do mesmo tipo. Ele os agrupa em um único bloco de memória. Em C, você declara assim:
int a[5];
É isso. Cinco inteiros. Pronto para ir.
Por que os arrays C começam em zero
Aqui está o truque que engana os iniciantes. Matrizes C são indexadas a zero.
Se você declarar int a[5], você terá cinco slots. Mas eles são numerados 0, 1, 2, 3 e 4. Não existe a[5]. Se você tentar acessar a[5], você está lendo uma memória que não pertence ao seu array. C não vai te impedir. Isso apenas lhe dará lixo ou travará. Este é um recurso, não um bug. É rápido. Também é perigoso.
Você acessa os elementos usando colchetes. a[0] é o primeiro item. a[4] é o último.
Gerando Números Aleatórios em C
Vamos construir algo útil. Criaremos um programa que gera 10 números aleatórios e os classifica.
Primeiro, você precisa dos números. A biblioteca padrão do C possui rand(), mas vamos dar uma olhada em uma implementação clássica para entender a mecânica. Este código usa um gerador congruente linear, um método do livro K&R C.
Observe a linha #define MAX 10. Isso cria uma constante. As constantes são escritas em letras maiúsculas por convenção. Isso os faz se destacar. Você declara o array int a[MAX] fora da função main. Isso a torna uma variável global. Ele existe em todo o programa.
A variável rand_seed também é global. Começa em 10. Como a semente é fixa, os números “aleatórios” são, na verdade, os mesmos sempre que você executa o programa. Se você quiser a verdadeira aleatoriedade, você a propagaria com a hora do sistema. Por enquanto, a consistência é boa para depuração.
Compreendendo a classificação por bolha
Agora vem a parte difícil. Classificando.
Usaremos classificação por bolha. É o algoritmo de classificação mais simples. Também é o mais lento. Mas ensina como loops e arrays interagem.
Adicione este código à sua função main, substituindo o comentário sobre “mais coisas”:
O que está acontecendo aqui?
O loop externo executa MAX-1 vezes. O loop interno é executado menos vezes em cada passagem. Por que? Porque os números maiores “borbulham” até o final da matriz a cada passagem. Você não precisa verificá-los novamente.
Dentro do loop interno, comparamos a[y] com a[y+1]. Se o esquerdo for maior, trocamos. Usamos uma variável temporária t para manter o valor enquanto movemos as peças.
“A única maneira fácil de realmente entender o que esse código está fazendo é executá-lo manualmente.”
Pegue um pedaço de papel. Desenhe cinco caixas. Coloque números neles. Execute o código linha por linha. Mova os números. Você verá os grandes números afundarem. Os pequenos flutuam. É visual. É mecânico.
Erros comuns de array C
C não segura sua mão. Você vai cair da beirada.
- Sem verificação de intervalo. Se você acessar
a[10]em um array de tamanho 10, C não gritará. Ele lerá a próxima memória. Isso leva a bugs sutis que são difíceis de encontrar. - Chamadas de função precisam de parênteses. Você deve escrever
x = rand();. Se você escreverx = rand;, estará atribuindo o endereço de memória da função ax. Não é o resultado. Ele compila. Ele quebra.
Experimente isto
Não apenas leia. Código.
- Altere o loop que preenche o array para uma única linha. Você pode fazer isso?
- Mova a lógica de classificação por bolha para sua própria função. Chame-o de
void bubble_sort(). Mova as variáveis x,yetdentro dessa função. Eles se tornam locais. O arrayaé global, então você não precisa passá-lo. - Altere
rand_seedpara valores diferentes. Observe a mudança de saída.
Matrizes são fundamentais. Eles são os blocos de construção das estruturas de dados. Domine-os e o resto de C ficará mais claro. Ignore o índice zero e você passará horas depurando uma falha que ocorreu três etapas atrás.






























