Estructuras de Datos en C++: Ejemplos Prácticos y Conceptos Clave

Enviado por sakura y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 20,13 KB

Ejemplos de Código en C++

Cálculo de Edades con Incremento

Este código en C++ calcula las edades y aplica un incremento si la edad es mayor a 65.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int a[5], i, c[5];

    for (i = 0; i < 5; i++) {
        cout << "Escribe la edad " << i + 1 << ": ";
        cin >> a[i];
    }

    for (i = 0; i < 5; i++) {
        if (a[i] > 65) {
            c[i] = a[i] * 100;
            cout << "\nLa edad " << i + 1 << " con incremento es: " << c[i];
        } else {
            cout << "\nLa edad " << i + 1 << " no tiene incremento.";
        }
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}

Cálculo de Aumento de Sueldo

Este programa en C++ calcula el aumento de sueldo basado en diferentes rangos salariales.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int re, r, i;
    int a[5];

    cout << "Programa para calcular aumento de sueldo" << endl;

    for (i = 0; i < 5; i++) {
        cout << "Escribe el sueldo " << i + 1 << ": ";
        cin >> a[i];
        cout << endl;
    }

    for (i = 0; i < 5; i++) {
        if (a[i] <= 5000) {
            r = a[i] / 2;
            re = r + a[i];
        } else if (a[i] > 5000 && a[i] <= 6000) {
            re = a[i] * 1.40;
        } else if (a[i] > 6000 && a[i] <= 7000) {
            re = a[i] * 1.30;
        } else if (a[i] > 7000 && a[i] <= 8000) {
            re = a[i] * 1.20;
        } else if (a[i] > 8000) {
            re = a[i] * 1.10;
        }
        cout << "El nuevo sueldo " << i + 1 << " es: " << re << endl;
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}

Calculadora Básica

Este código implementa una calculadora simple con operaciones de multiplicación, suma y resta.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int a, b, m;

    cout << "Escribe el primer número: ";
    cin >> a;
    cout << "Escribe el segundo número: ";
    cin >> b;
    cout << "\nEscribe 1 para multiplicar, 2 para sumar, 3 para restar: ";
    cin >> m;

    switch (m) {
        case 1:
            m = a * b;
            cout << "La multiplicación es: " << m << endl;
            break;
        case 2:
            m = a + b;
            cout << "La suma es: " << m << endl;
            break;
        case 3:
            m = a - b;
            cout << "La resta es: " << m << endl;
            break;
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}

Contador de Vocales en una Cadena

Este programa cuenta la cantidad de vocales (mayúsculas y minúsculas) en una cadena dada.

#include <iostream>
#include <cstring>
#include <cstdlib> // Para system("PAUSE")


using namespace std;

int main() {
  
    char cad[30];
    int a = 0, e = 0, i = 0, o = 0, u = 0;

    cout << "Escribe una frase: ";
    cin.getline(cad, 30); // Usar cin.getline para leer toda la línea

    for (int x = 0; x < strlen(cad); x++) {
        char letra = tolower(cad[x]); // Convertir a minúscula para simplificar
        if (letra == 'a')
            a++;
        else if (letra == 'e')
            e++;
        else if (letra == 'i')
            i++;
        else if (letra == 'o')
            o++;
        else if (letra == 'u')
            u++;
    }

    cout << "El número de letras A es: " << a << endl;
    cout << "El número de letras E es: " << e << endl;
    cout << "El número de letras I es: " << i << endl;
    cout << "El número de letras O es: " << o << endl;
    cout << "El número de letras U es: " << u << endl;

    system("PAUSE");
    return 0;
}

Cálculo de Costo de Llamada Telefónica

Este código calcula el costo de una llamada telefónica basándose en la duración y la zona.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int a, c, d, r;

    cout << "Escribe la duración de la llamada en minutos: ";
    cin >> a;
    cout << "\nEscribe la zona (1, 2 o 3): ";
    cin >> c;

    switch (c) {
        case 1:
            if (a > 5) {
                d = a - 5;
                r = 100 * d;
            } else {
                r = 0; // O algún costo base si a <= 5
            }
            cout << "\nEl costo adicional es: " << r << endl;
            break;
        case 2:
            if (a > 5) {
                d = a - 5;
                r = 200 * d;
            } else {
                r = 0; // O algún costo base si a <= 5
            }
            cout << "\nEl costo adicional es: " << r << endl;
            break;
        case 3:
            if (a > 5) {
                d = a - 5;
                r = 300 * d;
            } else {
                r = 0; // O algún costo base si a <= 5
            }
            cout << "\nEl costo adicional es: " << r << endl;
            break;
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}

Contador de Caracteres (Ni Vocales Ni Consonantes)

Este código cuenta caracteres que no son ni vocales ni consonantes en una cadena.

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]) {
    char a[100];
    int b[27] = {0}; // Inicializar el arreglo a 0, 27 elementos para incluir todas las letras
    int n, i, co = 0;

    cout << "Ingresa una cadena: ";
    cin.getline(a,100);
    n = strlen(a);

    cout << endl;

    for (i = 0; i < n; i++) {
      
        char letra = tolower(a[i]); //Convertir a minusculas

        if (letra >= 'a' && letra <= 'z') { // Asegurarse de que es una letra
            switch (letra) {
                case 'a': b[1]++; break;
                case 'e': b[2]++; break;
                case 'i': b[3]++; break;
                case 'o': b[4]++; break;
                case 'u': b[5]++; break;
                case 'b': b[6]++; break;
                case 'c': b[7]++; break;
                case 'd': b[8]++; break;
                case 'f': b[9]++; break;
                case 'g': b[10]++; break;
                case 'h': b[11]++; break;
                case 'j': b[12]++; break;
                case 'k': b[13]++; break;
                case 'l': b[14]++; break;
                case 'm': b[15]++; break;
                case 'n': b[16]++; break;
                case 'p': b[17]++; break;
                case 'q': b[18]++; break;
                case 'r': b[19]++; break;
                case 's': b[20]++; break;
                case 't': b[21]++; break;
                case 'v': b[22]++; break;
                case 'w': b[23]++; break;
                case 'x': b[24]++; break;
                case 'y': b[25]++; break;
                case 'z': b[26]++; break;
            }
        }
    }

    for(int j = 1; j<= 26; j++){
      co += b[j];
    }

    co = n - co;
    cout << "Cantidad de caracteres que no son ni vocales ni consonantes: " << co << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

Cálculo de Salario con Vector

Este programa calcula el salario de empleados almacenados en un vector, aplicando diferentes porcentajes de aumento.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int re, r, x, i;
    int a[5];

    cout << "Programa para calcular salario con vector" << endl;

    for (i = 0; i < 5; i++) {
        cout << "Escribe el salario " << i + 1 << ": ";
        cin >> a[i];
    }

    cout << "Ingresa el salario a buscar: ";
    cin >> x;

    for (i = 0; i < 5; i++) {
        if (a[i] == x) {
            if (a[i] <= 5000) {
                r = a[i] / 2;
                re = r + a[i];
            } else if (a[i] > 5000 && a[i] <= 6000) {
                re = a[i] * 1.40;
            } else if (a[i] > 6000 && a[i] <= 7000) {
                re = a[i] * 1.30;
            } else if (a[i] > 7000 && a[i] <= 8000) {
                re = a[i] * 1.20;
            } else if (a[i] > 8000) {
                re = a[i] * 1.10;
            }
            cout << "El nuevo salario del empleado " << i + 1 << " es: " << re << endl;
        } else {
            cout << "El salario del empleado " << i + 1 << " no coincide con la búsqueda." << endl;
        }
    }


    system("PAUSE");
    return EXIT_SUCCESS;
}

Cálculo del Tamaño de una Cadena

Este código calcula el tamaño de una cadena y cuenta las ocurrencias de cada letra (aunque el conteo está incorrecto, siempre resta 1).

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]) {
    char a[100];
    int b[26] = {0}, n, i; // Inicializar b con 26 ceros

    cout << "Ingresa una cadena: ";
    cin.getline(a,100);
    n = strlen(a);

    cout << "\nEl tamaño de la cadena es: " << n << endl;

    for (i = 0; i < n; i++) {
        char letra = tolower(a[i]); // Convertir a minúscula
        if (letra >= 'a' && letra <= 'z') {
            b[letra - 'a']++; // Incrementar el contador correcto
        }
    }


    system("PAUSE");
    return EXIT_SUCCESS;
}

Almacenamiento de Datos de Trabajadores en un Vector

Este programa almacena la información (dirección, teléfono, edad y sueldo) de 5 trabajadores en un vector de estructuras.

#include <iostream>
#include <cstring> // Necesario para strcpy

using namespace std;

int main(int argc, char *argv[]) {
    int i;
    struct Trabajador {
        char dir[20];
        char tel[15]; // Aumentar el tamaño para números de teléfono
        int edad;
        float sueldo;
    } trabajador[5];

    for (i = 0; i < 5; i++) {
        cout << "Escribe la dirección del trabajador " << i + 1 << ": ";
        cin.getline(trabajador[i].dir, 20);
        cout << "Escribe la edad del trabajador " << i + 1 << ": ";
        cin >> trabajador[i].edad;
        cin.ignore(); // Limpiar el buffer después de leer un entero
        cout << "Escribe el teléfono del trabajador " << i + 1 << ": ";
        cin.getline(trabajador[i].tel, 15);
        cout << "Escribe el sueldo del trabajador " << i + 1 << ": ";
        cin >> trabajador[i].sueldo;
        cin.ignore(); // Limpiar el buffer después de leer un flotante
    }

    for (i = 0; i < 5; i++) {
        cout << "\nDatos del trabajador " << i + 1 << ":" << endl;
        cout << "Dirección: " << trabajador[i].dir << endl;
        cout << "Edad: " << trabajador[i].edad << endl;
        cout << "Teléfono: " << trabajador[i].tel << endl;
        cout << "Sueldo: " << trabajador[i].sueldo << endl;
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}

Cálculo de Ventas en una Zapatería

Este programa calcula las ventas totales de una zapatería, aplicando descuentos según el número de pares y mostrando el total de cada venta y la suma total.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int x, i, ren = 0;
    int a[5]; // Precio base de los zapatos
    int b[5]; // Cantidad de pares
    int c[5]; // Total por tipo de zapato

    cout << "Programa para calcular ventas de zapatería" << endl;

    for (i = 0; i < 5; i++) {
        cout << "Escribe el precio base del tipo de zapato " << i + 1 << ": ";
        cin >> a[i];
        cout << endl;
        cout << "Escribe la cantidad de pares vendidos del tipo " << i + 1 << ": ";
        cin >> b[i];
        cout << endl;
    }

    // Aplicar descuentos
    for (i = 0; i < 5; i++) {
        if (b[i] >= 10) {
            a[i] = a[i] * 0.90; // 10% de descuento
        } else if (b[i] >= 5) {
            a[i] = a[i] * 0.95; // 5% de descuento
        }
    }


    for (i = 0; i < 5; i++) {
        c[i] = a[i] * b[i];
        ren = ren + c[i];
        cout << "El total de la venta del tipo " << i + 1 << " es: " << c[i] << endl;
    }

    cout << "\nLa suma total de las ventas es: " << ren << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

Ordenamiento Burbuja

Este código implementa el algoritmo de ordenamiento burbuja para ordenar un arreglo de 5 números.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int a[5], i, au, j;

    for (i = 0; i < 5; i++) {
        cout << "Escribe el número " << i + 1 << ": ";
        cin >> a[i];
    }

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4 - i; j++) {
            if (a[j] > a[j + 1]) {
                au = a[j];
                a[j] = a[j + 1];
                a[j + 1] = au;
            }
        }
    }

    cout << "\nNúmeros ordenados:" << endl;
    for (i = 0; i < 5; i++) {
        cout << a[i] << " ";
    }
    cout << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

Búsqueda de Edades

Este programa busca un número específico en un arreglo de edades y cuenta cuántas veces aparece.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    int a[5], i, r, n = 0;

    for (i = 0; i < 5; i++) {
        cout << "Escribe la edad " << i + 1 << ": ";
        cin >> a[i];
    }

    cout << "\nEscribe la edad a buscar: ";
    cin >> r;

    for (i = 0; i < 5; i++) {
        if (a[i] == r) {
            n = n + 1;
        }
    }

    cout << "\nEl número de veces que aparece la edad " << r << " es: " << n << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

Estructuras de Datos Fundamentales

Listas Enlazadas

Una lista enlazada es un tipo de dato auto-referenciado que contiene un puntero o enlace a otro dato del mismo tipo. Consiste en una secuencia de nodos, donde se almacenan campos de datos y referencias (punteros) a nodos anteriores o posteriores. Permiten inserciones y eliminaciones eficientes de nodos, pero no acceso aleatorio.

Tipos de listas enlazadas:

  • Listas Enlazadas Simples
  • Listas Doblemente Enlazadas
  • Listas Enlazadas Circulares
  • Listas Enlazadas Doblemente Circulares

Listas Doblemente Enlazadas

Una lista doblemente enlazada es una colección de nodos donde cada nodo tiene dos punteros: uno apunta al nodo predecesor y otro al sucesor. Esto permite recorrer la lista en ambas direcciones.

Tipos de listas doblemente enlazadas:

  • Listas dobles lineales: El puntero izquierdo del primer nodo y el derecho del último apuntan a NULL.
  • Listas dobles circulares: El puntero izquierdo del primer nodo apunta al último, y el derecho del último apunta al primero.

Importancia:

  • Almacenamiento organizado de datos.
  • Estructura TDA dinámica.
  • Recorrido bidireccional gracias a los dos punteros por nodo.

Colas

Una cola es una estructura de datos donde la inserción (push) se realiza por un extremo y la extracción (pop) por el otro. Se le llama también estructura FIFO (First In First Out), ya que el primer elemento en entrar es el primero en salir. Se utilizan en sistemas informáticos, transportes y operaciones de investigación.

Colas Circulares

En una cola circular, los elementos están dispuestos de forma circular, con cada elemento teniendo un sucesor y un predecesor. Las operaciones se realizan desde la cabeza del anillo. También se le conoce como anillo.

NBzJGaOPpjuJTq2VdWt58IepLv3j4xbao+6Gbr48

Pilas

Una pila es una estructura de datos de tipo LIFO (Last In First Out), donde el último elemento en entrar es el primero en salir. Las operaciones básicas son apilar (push, colocar un elemento) y desapilar (pop, retirar el último elemento). Solo se tiene acceso a la parte superior de la pila (TOS - Top of Stack).

Programación Modular

La programación modular es un método para mejorar la calidad de un programa dividiéndolo en módulos o subprogramas más pequeños que se llaman entre sí. La independencia de los módulos facilita el trabajo, ya que no es necesario conocer los detalles internos de otros módulos para desarrollarlos.

Términos clave:

  • Módulo independiente: Permite crear módulos por separado.
  • Búsqueda: Mejora el rendimiento del programa.
  • Subprograma: Un subprocedimiento o función.

La programación modular, también conocida como programación descendente o estructurada, sigue estas reglas:

  1. Diseño modular del programa.
  2. Diseño descendente de los módulos.
  3. Clasificación de cada módulo usando estructuras básicas (secuencial, selección, repetición).

El diseño descendente soluciona problemas descomponiéndolos en subproblemas de mayor a menor nivel de abstracción. Se busca una sola entrada y salida para cada programa.

Conceptos Adicionales

  • Nodo: Variable dinámica con al menos dos campos: el dato y un enlace de tipo puntero.
  • Dinámica: Valor que cambia constantemente.
  • Estática: Valor que permanece constante.
  • Puntero: Estructura con dos campos (dirección y dato).
  • Arreglo de registros: Estructura de datos con registros que contienen campos.
  • Array: Arreglo unidimensional.
  • Índice: Secuencial y del mismo tipo.
  • Buffer: Memoria intermedia para operaciones de entrada/salida por bloques.

Ejemplo de Declaración de Estructura y Arreglo de Registros

struct Trabajador {
    char dir[20];
    int edad;
    char tel[10];
    float sueldo;
};

Trabajador trabajadores[10]; // Arreglo de 10 trabajadores

// Acceso a los campos
// Leer trabajadores[i].dir;
// Leer trabajadores[i].edad;

Ejemplo de Algoritmo de Búsqueda en Lista Ordenada

1. INICIO
2. LEER i, A[5], NUM
3. FOR (i=0; i<5; i++)  // Corregido: Los índices de arreglos en C++ comienzan en 0
4.   LEER A[i]
5. FIN DEL FOR
6. LEER NUM
7. FOR (i=0; i<5; i++) // Corregido: Los índices de arreglos en C++ comienzan en 0
8.  IF A[i] == NUM ENTONCES
9.    IMPRIMIR A[i]
10. FIN DEL FOR
11. FIN DEL PROGRAMA

Entradas relacionadas: