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


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*porquepmaxypminson 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) yfin = arr + ncomo centinela. En el bucle,if (*p > *pmax) *pmax = *p;va actualizando. - En
main, la llamada esrango(datos, 7, &maximo, &minimo);.datosya es un puntero (por ser array), peromaximoyminimoson enteros normales, así que necesitan¶ 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.