Ejercicio 07 — Funciones maximo_array y minimo_array

Dificultad: rojo · Módulo 04 (Funciones)

Enunciado

Funciones maximo_array y minimo_array. Lee 8 enteros e imprime max y min.

Diagrama de flujo

Diagrama de flujo del ejercicio 07

Cómo se resuelve

Aquí pasas un array entero a una función. maximo_array(int arr[], int n) y minimo_array(int arr[], int n) reciben el array y su número de elementos, y devuelven el mayor y el menor.

El algoritmo es el mismo en las dos: se supone que el primer elemento (arr[0]) es el máximo (o el mínimo) provisional, se recorre el resto desde i = 1 y, cada vez que aparece uno mejor, se actualiza. Empezar en arr[0] y recorrer desde 1 evita comparar el elemento consigo mismo.

Lo importante de este ejercicio es cómo viaja el array:

  • Un array no se copia al pasarlo a una función. Lo que recibe arr es un puntero al primer elemento, es decir, la función trabaja sobre el array original de main.
  • Por eso hay que pasar el tamaño n aparte: dentro de la función, arr es en realidad un puntero, y sizeof(arr) te daría el tamaño de un puntero (8 bytes, no el número de elementos). El array “olvida” su longitud al cruzar la frontera de la función.
  • En main se lee con scanf("%d", &v[i]) dentro de un bucle: cada elemento lleva & porque scanf necesita su dirección.

Trampa típica: intentar averiguar el número de elementos dentro de la función con sizeof(arr) / sizeof(arr[0]). Fuera de la función (donde v sí es un array de verdad) eso funciona; dentro, arr es un puntero y el cálculo sale mal. Por eso el tamaño siempre se pasa como parámetro extra.

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 04: Funciones
 * Ejercicio 07 — PRACTICA (rellena los TODO)
 * Enunciado: Funciones maximo_array y minimo_array. Lee 8 enteros e imprime max y min.
 * Dificultad: rojo
 * Compilar: gcc -std=c11 -Wall ej07_practica.c -o ej07 && ./ej07
 */
 
#include <stdio.h>
 
#define TAM 8
 
/* TODO: escribe los prototipos de maximo_array y minimo_array
 *   - ambas reciben: int arr[], int n
 *   - ambas devuelven int
 */
 
int main(void) {
    int v[TAM];
 
    printf("Introduce %d enteros:\n", TAM);
    /* TODO: bucle for para leer cada elemento con scanf
     *       recuerda: &v[i]  (scanf necesita la direccion)
     */
 
    /* TODO: imprime el maximo y el minimo llamando a tus funciones */
    return 0;
}
 
/* TODO: define int maximo_array(int arr[], int n)
 *   - inicializa max = arr[0]
 *   - recorre desde i=1 hasta i<n
 *   - si arr[i] > max, actualiza max
 *   - devuelve max
 *   - CLAVE: no puedes usar sizeof(arr) aqui; usa n
 */
 
/* TODO: define int minimo_array(int arr[], int n)
 *   - igual que maximo_array pero buscando el menor
 */

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 04: Funciones
 * Ejercicio 07 — MODELO (resuelto)
 * Enunciado: Funciones maximo_array y minimo_array. Lee 8 enteros e imprime max y min.
 * Dificultad: rojo
 * Compilar: gcc -std=c11 -Wall ej07_modelo.c -o ej07 && ./ej07
 */
 
#include <stdio.h>
 
#define TAM 8
 
/* Prototipos — reciben el array y su tamano por separado */
int maximo_array(int arr[], int n);
int minimo_array(int arr[], int n);
 
int main(void) {
    int v[TAM];
 
    printf("Introduce %d enteros:\n", TAM);
    for (int i = 0; i < TAM; i++) {
        printf("  v[%d]: ", i);
        scanf("%d", &v[i]);
    }
 
    printf("\nMax: %d\n", maximo_array(v, TAM));
    printf("Min: %d\n", minimo_array(v, TAM));
    return 0;
}
 
/* Recorre el array y devuelve el mayor elemento.
 * IMPORTANTE: dentro de la funcion NO podemos usar sizeof(arr)/sizeof(arr[0])
 * porque arr es un puntero, no un array. Por eso pasamos n aparte. */
int maximo_array(int arr[], int n) {
    int max = arr[0];
    for (int i = 1; i < n; i++) {
        if (arr[i] > max) max = arr[i];
    }
    return max;
}
 
/* Igual que maximo_array pero buscando el menor */
int minimo_array(int arr[], int n) {
    int min = arr[0];
    for (int i = 1; i < n; i++) {
        if (arr[i] < min) min = arr[i];
    }
    return min;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones