Encontrar los elementos más grandes y más pequeños de una matriz en C

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Encontrar los elementos más grandes y más pequeños en una matriz es un problema común en la programación que encontrarás con frecuencia. Esta habilidad es esencial para diversas aplicaciones, como el análisis de datos, el desarrollo de juegos y los algoritmos de clasificación.

En este laboratorio (lab), aprenderás cómo escribir un programa en C que identifique tanto el elemento más grande como el más pequeño en una matriz de enteros. Desglosaremos el proceso en pasos claros y manejables para ayudarte a entender la lógica detrás de esta técnica fundamental de programación.

Finding the largest and smallest elements in an array

Este laboratorio (lab) requiere conocimientos básicos de programación en C, incluyendo variables, matrices, bucles y sentencias condicionales. Al final de esta sesión, habrás creado un programa en C completo que demuestre cómo encontrar valores extremos en un conjunto de datos.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/if_else("If...Else") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-123271{{"Encontrar los elementos más grandes y más pequeños de una matriz en C"}} c/operators -.-> lab-123271{{"Encontrar los elementos más grandes y más pequeños de una matriz en C"}} c/if_else -.-> lab-123271{{"Encontrar los elementos más grandes y más pequeños de una matriz en C"}} c/for_loop -.-> lab-123271{{"Encontrar los elementos más grandes y más pequeños de una matriz en C"}} c/arrays -.-> lab-123271{{"Encontrar los elementos más grandes y más pequeños de una matriz en C"}} c/user_input -.-> lab-123271{{"Encontrar los elementos más grandes y más pequeños de una matriz en C"}} c/output -.-> lab-123271{{"Encontrar los elementos más grandes y más pequeños de una matriz en C"}} end

Configurando la estructura del programa

Comencemos creando un nuevo archivo en C y configurando la estructura básica de nuestro programa. Esto incluirá los archivos de encabezado necesarios, la función principal (main) y las declaraciones de variables.

Primero, navega al directorio del proyecto y crea un nuevo archivo llamado main.c:

cd ~/project
touch main.c

Ahora, abre el archivo main.c en el editor y agrega el siguiente código:

#include <stdio.h>

int main() {
    // We'll declare an array with a maximum capacity of 50 elements
    int array[50];
    // Variables to store the size of the array and loop counter
    int size, i;
    // Variables to store the largest and smallest elements
    int largest, smallest;

    printf("Finding Largest and Smallest Elements in an Array\n");
    printf("------------------------------------------------\n\n");

    return 0;
}

Este código configura la estructura básica de nuestro programa. Entendamos qué hace cada parte:

  • #include <stdio.h> incluye la biblioteca estándar de entrada/salida, que proporciona funciones como printf() y scanf().
  • La función main() es el punto de entrada de nuestro programa.
  • Declaramos una matriz de enteros llamada array con una capacidad de 50 elementos.
  • La variable size almacenará el número de elementos que el usuario desee ingresar.
  • La variable i se utilizará como contador de bucle.
  • Las variables largest y smallest almacenarán los valores máximo y mínimo encontrados en la matriz.

Guarda el archivo después de agregar este código. Esto establece la base de nuestro programa.

Obteniendo la entrada del usuario

Ahora que tenemos lista la estructura de nuestro programa, agreguemos código para obtener la entrada del usuario. Necesitamos preguntar al usuario el tamaño de la matriz y luego recopilar los elementos de la matriz.

Abre el archivo main.c en el editor y modifícalo agregando el siguiente código antes de la instrucción return 0;:

// Ask user for the size of the array
printf("Enter the size of the array (max 50): ");
scanf("%d", &size);

// Validate the input size
if (size <= 0 || size > 50) {
    printf("Invalid array size. Please enter a size between 1 and 50.\n");
    return 1;
}

// Get array elements from the user
printf("\nEnter %d elements of the array:\n", size);
for (i = 0; i < size; i++) {
    printf("Element %d: ", i + 1);
    scanf("%d", &array[i]);
}

// Display the entered array
printf("\nThe array you entered is: [ ");
for (i = 0; i < size; i++) {
    printf("%d ", array[i]);
}
printf("]\n\n");

Este código:

  1. Solicita al usuario que ingrese el tamaño de la matriz.
  2. Valida que el tamaño esté entre 1 y 50.
  3. Pide al usuario que ingrese cada elemento de la matriz uno por uno.
  4. Muestra la matriz ingresada al usuario para confirmar.

Compilémos y ejecutemos nuestro programa para ver lo que tenemos hasta ahora:

gcc main.c -o main
./main

Deberías ver una solicitud que te pide el tamaño de la matriz. Ingresa un número pequeño como 5 y luego ingresa 5 valores. El programa mostrará la matriz que ingresaste.

Por ejemplo, si ingresas 5 como tamaño y luego ingresas los valores 10, 25, 5, 17 y 9, deberías ver la siguiente salida:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

Ahora que hemos recopilado los elementos de la matriz del usuario, podemos proceder a encontrar los valores más grandes y más pequeños.

Encontrando el elemento más grande

Ahora agreguemos código para encontrar el elemento más grande en la matriz. La estrategia es:

  1. Suponer que el primer elemento es el más grande.
  2. Comparar cada elemento subsiguiente con el más grande actual.
  3. Si se encuentra un elemento más grande, actualizar el valor del más grande.

Agrega el siguiente código a tu archivo main.c, antes de la instrucción return 0;:

// Initialize largest with the first element of the array
largest = array[0];

// Find the largest element
printf("Finding the largest element...\n");
for (i = 1; i < size; i++) {
    if (array[i] > largest) {
        largest = array[i];
        printf("New largest found at position %d: %d\n", i + 1, largest);
    }
}

printf("\nThe largest element in the array is: %d\n\n", largest);

Este código inicializa la variable largest con el primer elemento de la matriz. Luego itera a través de la matriz comenzando desde el segundo elemento (índice 1), comparando cada elemento con el valor más grande actual. Si se encuentra un elemento más grande, actualiza la variable largest e imprime un mensaje.

Compilémos y ejecutemos nuestro programa para ver los resultados:

gcc main.c -o main
./main

Ingresa el tamaño y los elementos de la matriz como antes. Por ejemplo, si ingresas los valores 10, 25, 5, 17 y 9, deberías ver una salida similar a:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

Finding the largest element...
New largest found at position 2: 25

The largest element in the array is: 25

Esto demuestra cómo nuestro programa encuentra el elemento más grande en la matriz. El algoritmo comienza con el primer elemento como el más grande y se actualiza cada vez que encuentra un valor más grande.

Encontrando el elemento más pequeño

Ahora que hemos encontrado el elemento más grande, agreguemos código para encontrar el elemento más pequeño en la matriz. La estrategia es similar:

  1. Suponer que el primer elemento es el más pequeño.
  2. Comparar cada elemento subsiguiente con el más pequeño actual.
  3. Si se encuentra un elemento más pequeño, actualizar el valor del más pequeño.

Agrega el siguiente código a tu archivo main.c, antes de la instrucción return 0;:

// Initialize smallest with the first element of the array
smallest = array[0];

// Find the smallest element
printf("Finding the smallest element...\n");
for (i = 1; i < size; i++) {
    if (array[i] < smallest) {
        smallest = array[i];
        printf("New smallest found at position %d: %d\n", i + 1, smallest);
    }
}

printf("\nThe smallest element in the array is: %d\n", smallest);

Este código inicializa la variable smallest con el primer elemento de la matriz. Luego itera a través de la matriz comenzando desde el segundo elemento (índice 1), comparando cada elemento con el valor más pequeño actual. Si se encuentra un elemento más pequeño, actualiza la variable smallest e imprime un mensaje.

Compilémos y ejecutemos nuestro programa para ver los resultados completos:

gcc main.c -o main
./main

Ingresa el tamaño y los elementos de la matriz como antes. Por ejemplo, si ingresas los valores 10, 25, 5, 17 y 9, deberías ver una salida similar a:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

Finding the largest element...
New largest found at position 2: 25

The largest element in the array is: 25

Finding the smallest element...
New smallest found at position 3: 5

The smallest element in the array is: 5

Esto demuestra cómo nuestro programa encuentra tanto el elemento más grande como el más pequeño en la matriz. Los algoritmos comienzan con el primer elemento y se actualizan cada vez que encuentran un valor más grande o más pequeño, respectivamente.

Optimización del programa y código completo

Ahora que tenemos un programa funcional, optimicémoslo combinando la búsqueda de los elementos más grande y más pequeño en un solo bucle. Esto es más eficiente ya que solo necesitamos recorrer la matriz una vez en lugar de dos veces.

Abre el archivo main.c y reemplaza todo su contenido con la siguiente versión optimizada:

#include <stdio.h>

int main() {
    // We'll declare an array with a maximum capacity of 50 elements
    int array[50];
    // Variables to store the size of the array and loop counter
    int size, i;
    // Variables to store the largest and smallest elements
    int largest, smallest;

    printf("Finding Largest and Smallest Elements in an Array\n");
    printf("------------------------------------------------\n\n");

    // Ask user for the size of the array
    printf("Enter the size of the array (max 50): ");
    scanf("%d", &size);

    // Validate the input size
    if (size <= 0 || size > 50) {
        printf("Invalid array size. Please enter a size between 1 and 50.\n");
        return 1;
    }

    // Get array elements from the user
    printf("\nEnter %d elements of the array:\n", size);
    for (i = 0; i < size; i++) {
        printf("Element %d: ", i + 1);
        scanf("%d", &array[i]);
    }

    // Display the entered array
    printf("\nThe array you entered is: [ ");
    for (i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("]\n\n");

    // Initialize largest and smallest with the first element
    largest = smallest = array[0];

    // Find both the largest and smallest elements in a single pass
    printf("Searching for largest and smallest elements...\n");
    for (i = 1; i < size; i++) {
        // Check for largest
        if (array[i] > largest) {
            largest = array[i];
            printf("New largest found at position %d: %d\n", i + 1, largest);
        }

        // Check for smallest
        if (array[i] < smallest) {
            smallest = array[i];
            printf("New smallest found at position %d: %d\n", i + 1, smallest);
        }
    }

    // Display results
    printf("\nResults:\n");
    printf("- The largest element in the array is: %d\n", largest);
    printf("- The smallest element in the array is: %d\n", smallest);

    // Calculate and display the range
    printf("- The range (difference between largest and smallest) is: %d\n", largest - smallest);

    return 0;
}

Esta versión optimizada:

  1. Utiliza un solo bucle para encontrar tanto el elemento más grande como el más pequeño, lo que hace que el programa sea más eficiente.
  2. Inicializa tanto largest como smallest al primer elemento de la matriz.
  3. Agrega un cálculo para el rango (la diferencia entre los valores más grande y más pequeño).

Compilémos y ejecutemos nuestro programa optimizado:

gcc main.c -o main
./main

Ingresa el tamaño y los elementos de la matriz como antes. Por ejemplo, si ingresas los valores 10, 25, 5, 17 y 9, deberías ver una salida similar a:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

Searching for largest and smallest elements...
New largest found at position 2: 25
New smallest found at position 3: 5

Results:
- The largest element in the array is: 25
- The smallest element in the array is: 5
- The range (difference between largest and smallest) is: 20

Esta versión optimizada proporciona los mismos resultados que antes, pero es más eficiente e incluye información adicional sobre el rango de valores.

Al trabajar con matrices grandes, estas mejoras de eficiencia pueden reducir significativamente el tiempo de cálculo, lo cual es una consideración importante en la programación.

Resumen

En este laboratorio, has creado con éxito un programa en C que encuentra tanto el elemento más grande como el más pequeño en una matriz. Repasemos lo que has aprendido:

  1. Has configurado una estructura básica de programa con las declaraciones de variables necesarias.
  2. Has escrito código para obtener la entrada del usuario sobre el tamaño y los elementos de la matriz.
  3. Has implementado un algoritmo para encontrar el elemento más grande en la matriz.
  4. Has implementado un algoritmo similar para encontrar el elemento más pequeño en la matriz.
  5. Has optimizado el programa combinando ambas búsquedas en un solo bucle y has agregado funcionalidad adicional.

Este laboratorio cubrió varios conceptos fundamentales de programación:

  • Matrices (arrays) y recorrido de matrices
  • Uso de bucles para la iteración
  • Sentencias condicionales
  • Optimización de algoritmos
  • Obtención y validación de la entrada del usuario

Estas habilidades son esenciales para cualquier programador y forman la base para estructuras de datos y algoritmos más complejos. La capacidad de encontrar valores extremos en un conjunto de datos es un requisito común en muchos escenarios de programación, como encontrar las puntuaciones más altas en juegos, analizar lecturas de temperatura o procesar datos financieros.

Puedes ampliar este programa agregando características como:

  • Encontrar el promedio de todos los elementos de la matriz
  • Ordenar la matriz
  • Encontrar el valor de la mediana
  • Contar las ocurrencias de valores específicos

Sigue practicando estos conceptos para fortalecer tus habilidades de programación.