Operações Avançadas com Arrays
Nesta etapa, exploraremos algumas operações avançadas que você pode realizar em arrays, como encontrar os valores máximo e mínimo e ordenar o array. Essas técnicas são essenciais para análise de dados, processamento e implementação de algoritmos.
Vamos escrever um programa para encontrar os valores máximo e mínimo em um array:
cd ~/project
touch find_max_min.c
#include <stdio.h>
int main() {
int numbers[5] = {10, 20, 30, 40, 50};
int max = numbers[0];
int min = numbers[0];
for (int i = 1; i < 5; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] < min) {
min = numbers[i];
}
}
printf("Maximum value: %d\n", max);
printf("Minimum value: %d\n", min);
return 0;
}
Este código demonstra uma técnica simples, mas poderosa, para encontrar os valores máximo e mínimo em um array. Ao inicializar max e min com o primeiro elemento e, em seguida, comparar cada elemento subsequente, podemos identificar eficientemente os valores extremos no array.
Linhas de código-chave:
- Inicialização:
int max = numbers[0]; int min = numbers[0]; - As variáveis max e min são inicializadas com o primeiro elemento do array. Esta etapa fornece um ponto de partida para a comparação.
- Laço de Comparação:
for (int i = 1; i < 5; i++) - Este laço for começa do índice 1 (o segundo elemento) até o final do array. Isso garante que cada valor subsequente seja verificado em relação aos valores max e min existentes.
- Encontrando o Máximo:
if (numbers[i] > max) { max = numbers[i]; } - Este bloco verifica se o elemento atual é maior que o max atual. Se for verdadeiro, a variável max é atualizada para o valor do elemento atual.
- Encontrando o Mínimo:
if (numbers[i] < min) { min = numbers[i]; } - Da mesma forma, isso verifica se o elemento atual é menor que o min atual, atualizando o min quando um valor menor é encontrado.
Em seguida, vamos escrever um programa para ordenar o array em ordem crescente usando o algoritmo de ordenação por bolha (bubble sort):
cd ~/project
touch bubble_sort.c
#include <stdio.h>
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main() {
int numbers[5] = {50, 20, 30, 10, 40};
bubbleSort(numbers, 5);
printf("Sorted array:\n");
for (int i = 0; i < 5; i++) {
printf("numbers[%d] = %d\n", i, numbers[i]);
}
return 0;
}
O bubble sort é um algoritmo de ordenação clássico que percorre repetidamente a lista, compara elementos adjacentes e os troca se estiverem na ordem errada. Embora não seja o método de ordenação mais eficiente para grandes conjuntos de dados, ele fornece uma excelente introdução aos conceitos de ordenação e manipulação de arrays.
Linhas de código-chave:
- Laço Externo:
for (int i = 0; i < n-1; i++) - Este laço externo controla o número de passagens pelo array. O laço é executado até n-1 vezes (onde n é o tamanho do array) porque o maior elemento estará em sua posição final após cada passagem.
- Laço Interno:
for (int j = 0; j < n-i-1; j++) - O laço interno realiza as comparações e trocas reais. À medida que os maiores elementos "sobem" para o final, o intervalo do laço interno diminui, por isso temos n - i - 1 em vez de n
- Comparação:
if (arr[j] > arr[j+1]) - Esta instrução verifica se o elemento atual é maior que o elemento seguinte.
- Troca: As linhas
int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; realizam a troca dos dois elementos, quando arr[j] é maior que arr[j+1]. Uma variável temporária temp é usada para evitar a perda de um dos valores durante a troca.
Para compilar e executar os programas, use os seguintes comandos no terminal:
gcc find_max_min.c -o find_max_min
./find_max_min
gcc bubble_sort.c -o bubble_sort
./bubble_sort
Exemplo de saída para encontrar o máximo e o mínimo:
Maximum value: 50
Minimum value: 10
Exemplo de saída para ordenação:
Sorted array:
numbers[0] = 10
numbers[1] = 20
numbers[2] = 30
numbers[3] = 40
numbers[4] = 50
Esses exemplos ilustram operações fundamentais de array que formam os blocos de construção de técnicas de processamento de dados mais complexas na programação C.