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

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 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.