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

Dificultad: amarillo · Módulo 07 (Punteros)

Enunciado

Funcion rango(int *arr, int n, int *pmax, int *pmin) que encuentra maximo y minimo de un array usando aritmetica de punteros.

Diagrama de flujo

Diagrama de flujo 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 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 07: Punteros
 * Ejercicio 05 — PRACTICA (rellena los TODO)
 * Enunciado: Funcion rango(int *arr, int n, int *pmax, int *pmin) que encuentra
 *            maximo y minimo de un array usando aritmetica 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: Funcion rango(int *arr, int n, int *pmax, int *pmin) que encuentra
 *            maximo y minimo de un array usando aritmetica 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;
}

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