Ejercicios de C/C++ para principiantes

Eliminar los duplicados de un arreglo en C y C++

En esta lección vas a eliminar los valores repetidos de un arreglo manteniendo el orden de primera aparición.

Introducción

Para eliminar los duplicados manteniendo el orden, se crea un arreglo de resultado aparte. Para cada elemento del arreglo original, el programa comprueba si ya está en el arreglo de resultado. Si todavía no está, lo añade.

Puntos importantes

  • Activa los avisos del compilador (compiler warnings) y corrígelos todos.
  • Entiende bien el tipo y la vida útil (lifetime) de cada valor.
  • Comprueba siempre los datos de entrada y los límites de los índices de los arreglos.

Ejemplos de código C y C++

C
Ejecutar →
main.c
#include <stdio.h>
int main(void) {
    int input[] = {1, 2, 1, 3, 2, 4}, output[6], size = 0;
    // Keep the first occurrence of every value.
    for (int i = 0; i < 6; ++i) { int seen = 0; for (int j = 0; j < size; ++j) if (output[j] == input[i]) seen = 1; if (!seen) output[size++] = input[i]; }
    for (int i = 0; i < size; ++i) printf("%s%d", i ? " " : "", output[i]); puts("");
}
Resultado de la ejecución
1 2 3 4
C++
Ejecutar →
main.cpp
#include <iostream>
#include <unordered_set>
#include <vector>
int main() {
    std::vector input{1, 2, 1, 3, 2, 4}; std::vector<int> output; std::unordered_set<int> seen;
    // Insert returns true only for the first occurrence.
    for (int value : input) if (seen.insert(value).second) output.push_back(value);
    for (size_t i = 0; i < output.size(); ++i) std::cout << (i ? " " : "") << output[i]; std::cout << '\n';
}
Resultado de la ejecución
1 2 3 4

Comparación entre C y C++

El bucle interior comprueba si input[i] ya está en output y lo guarda en la variable seen. Solo cuando seen vale 0 se añade el valor al final de output y aumenta size. El resultado es 1 2 3 4. Este método es fácil de entender, pero cuesta O(n²). Con muchos datos, C++ puede usar std::unordered_set para comprobarlo más rápido.

C

C usa funciones procedurales pequeñas y muestra abiertamente cómo se representan los datos en memoria.

C++

C++ sigue permitiendo trabajar a bajo nivel, pero añade tipos de biblioteca y abstracciones más seguras.

Ejercicios de práctica

Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.

  • Prueba entradas no válidas y valores límite.
  • Compila con las opciones -Wall -Wextra -Wpedantic para activar más avisos.
  • Pon las declaraciones comunes en un archivo de cabecera y la implementación en un archivo aparte.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos