Ejercicio 05 — Función rango(int *arr, int n, int *pmax, int *pmin) que encuentra…

Dificultad: amarillo · Módulo 07 (Punteros)

Enunciado

Función rango(int *arr, int n, int *pmax, int *pmin) que encuentra máximo y mínimo de un array usando aritmética de punteros.

Diagramas de flujo

Diagrama de flujo (actividad) del ejercicio 05

Diagrama de flujo (grafo) del ejercicio 05

Cómo se resuelve

Aquí una función necesita devolver dos resultados, el máximo y el mínimo. Como return solo entrega un valor, el truco es pasar dos direcciones de salida (int *pmax, int *pmin) y escribir el resultado en ellas por referencia.

  • *pmax = arr[0]; y *pmin = arr[0]; — arrancamos suponiendo que el primer elemento es a la vez el mayor y el menor. Escribimos con * porque pmax y pmin son direcciones y queremos rellenar la variable del llamador.
  • Recorremos con aritmética de punteros: p = arr + 1 (empezamos en el segundo, el primero ya está considerado) y fin = arr + n como centinela. En el bucle, if (*p > *pmax) *pmax = *p; va actualizando.
  • En main, la llamada es rango(datos, 7, &maximo, &minimo);. datos ya es un puntero (por ser array), pero maximo y minimo son enteros normales, así que necesitan & para pasar su dirección.

Trampa habitual: olvidar el & en maximo y minimo al llamar, o escribir dentro pmax = *p en lugar de *pmax = *p. Sin el * a la izquierda estarías cambiando a dónde apunta el puntero local, no el valor del llamador, y este se quedaría con basura.

Para practicar — cópialo y complétalo

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 07: Punteros
 * Ejercicio 05 — PRACTICA (rellena los TODO)
 * Enunciado: Función rango(int *arr, int n, int *pmax, int *pmin) que encuentra
 *            máximo y mínimo de un array usando aritmética de punteros.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej05_practica.c -o ej05 && ./ej05
 */
 
#include <stdio.h>
 
/*
 * TODO 1: Define void rango(int *arr, int n, int *pmax, int *pmin).
 *
 *   Pasos sugeridos:
 *   a) Inicializa *pmax y *pmin con arr[0] (el primer elemento).
 *   b) Declara un puntero p = arr + 1  y un centinela fin = arr + n.
 *   c) Bucle while(p < fin):
 *      - Si *p > *pmax  ->  actualiza *pmax
 *      - Si *p < *pmin  ->  actualiza *pmin
 *      - p++
 */
 
int main(void) {
    int datos[7] = {4, 1, 9, 2, 7, 3, 5};
    int maximo, minimo;
 
    // TODO 2: Llama a rango pasando datos, 7, y las DIRECCIONES de maximo y minimo.
 
    // TODO 3: Imprime:
    //   "Max = <valor>"
    //   "Min = <valor>"
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 07: Punteros
 * Ejercicio 05 — MODELO (resuelto)
 * Enunciado: Función rango(int *arr, int n, int *pmax, int *pmin) que encuentra
 *            máximo y mínimo de un array usando aritmética de punteros.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej05_modelo.c -o ej05 && ./ej05
 */
 
#include <stdio.h>
 
/*
 * Recorre arr con un puntero y escribe el maximo en *pmax y el minimo en *pmin.
 * Precondicion: n >= 1.
 */
void rango(int *arr, int n, int *pmax, int *pmin) {
    *pmax = arr[0];        // inicializamos con el primer elemento
    *pmin = arr[0];
 
    int *p = arr + 1;      // empezamos desde el segundo elemento
    int *fin = arr + n;    // centinela
 
    while (p < fin) {
        if (*p > *pmax) *pmax = *p;
        if (*p < *pmin) *pmin = *p;
        p++;
    }
}
 
int main(void) {
    int datos[7] = {4, 1, 9, 2, 7, 3, 5};
    int maximo, minimo;
 
    rango(datos, 7, &maximo, &minimo);
 
    printf("Max = %d\n", maximo);
    printf("Min = %d\n", minimo);
 
    return 0;
}

Ejecútalo en el navegador

▶ Abrir y ejecutar en Compiler Explorer

Se abre con la solución ya cargada; pulsa el botón de ejecutar (Run) para ver la salida. No hay que instalar nada.

Cómo usarlo

Pega el código en un fichero y ejecútalo con tu toolchain habitual (o el botón de Ejecutar de tu editor). Antes de mirar la solución, intenta completar tú el esqueleto: es la mejor forma de aprender.

Conexiones