Ejercicio 04 — Invertir un array IN-PLACE (sin array auxiliar) y mostrarlo

Dificultad: amarillo · Módulo 05 (Arrays y cadenas)

Enunciado

Invertir un array IN-PLACE (sin array auxiliar) y mostrarlo.

Diagrama de flujo

Diagrama de flujo del ejercicio 04

Cómo se resuelve

Invertir in-place significa dar la vuelta al array sin crear otro array auxiliar: reordenamos las casillas del mismo a. La técnica es el patrón de dos índices que se acercan.

  1. Colocamos un índice izq = 0 al principio y otro der = n - 1 al final.
  2. Mientras izq < der, intercambiamos a[izq] con a[der] y luego avanzamos izq++ y retrocedemos der--. Los dos índices se van juntando hacia el centro; cuando se cruzan, el array ya está del revés.

El intercambio se hace con el swap de variable temporal, imprescindible en C:

int tmp = a[izq];
a[izq] = a[der];
a[der] = tmp;

Trampa habitual: si intentas el swap sin tmp (a[izq] = a[der]; a[der] = a[izq];), la primera línea ya machacó a[izq], así que la segunda copia el valor equivocado y pierdes un dato. La variable temporal guarda una copia antes de sobrescribir. La condición izq < der (y no <=) es correcta: cuando ambos apuntan a la misma casilla central no hay nada que intercambiar.

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 05: Arrays y cadenas
 * Ejercicio 04 — PRACTICA (rellena los TODO)
 * Enunciado: Invertir un array IN-PLACE (sin array auxiliar) y mostrarlo.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej04_practica.c -o ej04 && ./ej04
 */
 
#include <stdio.h>
 
int main(void) {
    int n;
 
    // TODO 1: Pedir N y leerlo. Declara el array y lee los N enteros.
 
    // TODO 2: Declara dos indices: 'izq = 0' y 'der = n - 1'.
 
    // TODO 3: Bucle while mientras izq < der:
    //         a) Guarda a[izq] en una variable temporal 'tmp'.
    //         b) Copia a[der] en a[izq].
    //         c) Copia 'tmp' en a[der].
    //         d) Incrementa izq y decrementa der.
    //         (Este es el patron "swap con variable temporal".)
 
    // TODO 4: Imprime el array resultante.
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 05: Arrays y cadenas
 * Ejercicio 04 — MODELO (resuelto)
 * Enunciado: Invertir un array IN-PLACE (sin array auxiliar) y mostrarlo.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej04_modelo.c -o ej04 && ./ej04
 */
 
#include <stdio.h>
 
int main(void) {
    int n;
    printf("Cuantos numeros (max 50)? ");
    scanf("%d", &n);
 
    if (n < 1 || n > 50) {
        printf("N debe estar entre 1 y 50.\n");
        return 1;
    }
 
    int a[50];
    for (int i = 0; i < n; i++) {
        printf("a[%d] = ", i);
        scanf("%d", &a[i]);
    }
 
    // Invertir con dos indices: uno desde el principio (izq) y otro desde el final (der).
    // Intercambiamos los elementos y avanzamos hacia el centro.
    int izq = 0;
    int der = n - 1;
    while (izq < der) {
        // Swap clasico con variable temporal
        int tmp = a[izq];
        a[izq] = a[der];
        a[der] = tmp;
        izq++;
        der--;
    }
 
    printf("Array invertido: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
 
    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