CLASE_3 Introducción a la Programación Estructurada

 


Entendido. A continuación, te presento un tutorial sobre la implementación de un algoritmo de simulación interactiva para un juego de lotería simplificado en C++, incluyendo el diseño del diagrama de flujo y la explicación del código proporcionado.


Implementación de un Juego de Lotería Simplificado en C++: Un Enfoque Algorítmico

Este tutorial te guiará a través del proceso de diseñar e implementar un juego de lotería interactivo utilizando C++. Exploraremos cómo un algoritmo se traduce de un diagrama de flujo conceptual a un código ejecutable, permitiéndote entender la lógica de un programa y cómo interactúa con el usuario.


1. ¿Qué es un Algoritmo de Simulación Interactiva?

Un algoritmo de simulación interactiva es una secuencia de pasos lógicos que modela un proceso del mundo real (en este caso, un juego de lotería) y permite al usuario interactuar con él, influyendo en su desarrollo y resultado. En nuestro juego, el usuario decide cuánto dinero tiene, qué apuesta quiere hacer y qué número jugar, y el programa simula el sorteo y calcula las ganancias o pérdidas.


2. Diseño del Diagrama de Flujo: La Lógica del Juego

Antes de escribir código, es crucial visualizar la lógica del programa. Un diagrama de flujo es una herramienta excelente para esto, utilizando símbolos estandarizados para representar operaciones, decisiones y el flujo de control.

Aquí tienes un diagrama de flujo simplificado que representa la lógica de nuestro juego de lotería:

Fragmento de código
graph TD
    A[Inicio] --> B{Inicializar Variables: Monto, Tarifas, Semilla Random};
    B --> C[/Mostrar Bienvenida y Pedir Monto Inicial/];
    C --> D{Monto Inicial > 0?};
    D -- Sí --> E[/Preguntar ¿Quieres Intentar? (s/n)/];
    E --> F{Respuesta 's' o 'S'?};
    F -- Sí --> G[/Mostrar Tarifas y Pedir Tarifa/];
    G --> H{Monto Inicial >= Tarifa?};
    H -- Sí --> I[Restar Tarifa del Monto];
    I --> J[Generar Numero Ganador (1-100)];
    J --> K[/Pedir Numero de Jugada (1-100)/];
    K --> L{Numero Jugada == Numero Ganador?};
    L -- Sí --> M[Calcular Premio = Tarifa * 600];
    M --> N[Sumar Premio al Monto Inicial];
    N --> O[/Mostrar Mensaje Ganador y Monto Actual/];
    O --> P{¿Continuar Jugando? (s/n)?};
    P -- No --> Q{Monto Inicial <= 0?};
    L -- No --> R[/Mostrar Mensaje Perdedor y Numero Ganador/];
    R --> P;
    H -- No --> S[/Mostrar "Fondos Insuficientes"/];
    S --> P;
    P -- Sí --> D;
    F -- No --> T[/Mostrar Monto Final y Retirada/];
    T --> Q;
    D -- No --> U[/Mostrar "Te quedaste sin dinero" y Fin del Juego/];
    U --> V[Fin];
    Q -- Sí --> U;
    Q -- No --> V;

Explicación de los Símbolos Clave:

  • Óvalo (Inicio/Fin): Representa el comienzo o el final del algoritmo.
  • Paralelogramo (Entrada/Salida): Indica la lectura de datos del usuario o la impresión de información en pantalla.
  • Rectángulo (Proceso): Representa una operación o cálculo.
  • Rombo (Decisión): Indica un punto donde se toma una decisión, con dos o más caminos posibles (Sí/No, Verdadero/Falso).
  • Flechas: Muestran el flujo de control del algoritmo.

3. Traducción a Código C++: Implementando la Lógica

Ahora, tomaremos el diagrama de flujo y lo traduciremos al lenguaje de programación C++. El código proporcionado ya realiza esta simulación. Lo desglosaremos para entender cada parte.

C++
#include <iostream> // Para entrada/salida (cout, cin)
#include <cstdlib>  // Para funciones de propósito general (rand, srand)
#include <ctime>    // Para obtener la hora actual (usada en srand)
#include <vector>   // Para usar el tipo de dato vector (arreglo dinámico)

using namespace std; // Para no tener que escribir std:: antes de cout, cin, etc.

int main() {
    // Inicializar la semilla del generador de números aleatorios.
    // Esto asegura que los números generados sean diferentes cada vez que ejecutas el programa.
    srand(time(0));

    // Declaración de variables:
    int montoInicial;           // Dinero del jugador
    int tarifa;                 // Costo de la jugada seleccionada
    int numeroGanador;          // Número aleatorio generado por la lotería
    int numeroJugada;           // Número ingresado por el jugador
    int premio;                 // Cantidad a ganar si acierta
    char continuar;             // Para la decisión del usuario de continuar o no
    // Vector para almacenar las tarifas de apuesta disponibles
    vector<int> tarifas = {8, 16, 32, 64};

    // Mensaje de bienvenida al juego
    cout << "Bienvenido al juego de lotería con tarifas variables." << endl;
    // Pedir al usuario su monto inicial
    cout << "Ingresa tu monto inicial: ";
    cin >> montoInicial; // Leer el monto inicial del usuario

    // Bucle principal del juego: continúa mientras el monto sea positivo
    while (montoInicial > 0) {
        // Preguntar al usuario si desea realizar un intento
        cout << "¿Quieres realizar un intento? (s/n): ";
        cin >> continuar; // Leer la respuesta del usuario

        // Condición: Si el usuario quiere jugar ('s' o 'S')
        if (continuar == 's' || continuar == 'S') {
            // Mostrar las tarifas disponibles
            cout << "Selecciona la tarifa: ";
            for (int t : tarifas) { // Recorrer el vector de tarifas
                cout << t << " ";
            }
            cout << endl;
            cin >> tarifa; // Leer la tarifa seleccionada

            // Condición: Verificar si el jugador tiene fondos suficientes para la tarifa
            if (montoInicial >= tarifa) {
                montoInicial -= tarifa; // Restar la tarifa del monto inicial
                // Generar un número ganador aleatorio entre 1 y 100
                numeroGanador = rand() % 100 + 1;

                // Pedir al usuario su número de jugada
                cout << "Ingresa tu número de jugada (1-100): ";
                cin >> numeroJugada; // Leer el número de jugada

                // Condición: Si el número del jugador coincide con el número ganador
                if (numeroJugada == numeroGanador) {
                    premio = tarifa * 600;    // Calcular el premio
                    montoInicial += premio;   // Sumar el premio al monto inicial
                    // Mensaje de felicitación y monto actualizado
                    cout << "¡Felicidades! ¡Ganaste " << premio << "! Tu monto actual es: " << montoInicial << endl;
                } else {
                    // Mensaje de pérdida y mostrar el número ganador
                    cout << "Perdiste. El número ganador era: " << numeroGanador << endl;
                    cout << "Vuelve a intentarlo." << endl;
                }

                // Preguntar si el usuario desea continuar jugando (después de una ronda)
                cout << "¿Continuar jugando? (s/n): ";
                cin >> continuar;
                // Si el usuario no quiere continuar, salir del bucle principal
                if (continuar != 's' && continuar != 'S') {
                    break; // Rompe el bucle 'while (montoInicial > 0)'
                }
            } else {
                // Mensaje de fondos insuficientes
                cout << "Fondos insuficientes. Elige una tarifa menor." << endl;
            }
        } else {
            // Si el usuario no quiere jugar, mostrar monto final y salir
            cout << "Retirando tu dinero. Monto final: " << montoInicial << endl;
            break; // Rompe el bucle 'while (montoInicial > 0)'
        }
    }

    // Condición: Si el juego terminó porque el monto llegó a cero o menos
    if (montoInicial <= 0) {
        cout << "Te quedaste sin dinero. ¡Fin del juego!" << endl;
    }

    // Mensaje de despedida
    cout << "¡Gracias por jugar!" << endl;

    return 0; // Indica que el programa finalizó correctamente
}

Detalles del Código C++:

  1. Inclusión de Librerías:
    • iostream: Esencial para la interacción con el usuario (mostrar mensajes con cout y leer entradas con cin).
    • cstdlib: Contiene la función rand() para generar números aleatorios y srand() para inicializar el generador.
    • ctime: Proporciona time() para obtener la hora actual, que se usa como semilla para srand() y así obtener números aleatorios diferentes en cada ejecución.
    • vector: Permite usar std::vector, un tipo de dato que es como un arreglo dinámico, útil para las tarifas.
  2. using namespace std;: Esta línea evita que tengas que escribir std:: antes de cada elemento de la biblioteca estándar (como cout, cin, endl).
  3. int main() { ... }: Es la función principal donde comienza la ejecución de cualquier programa C++.
  4. srand(time(0));: Inicializa el generador de números pseudoaleatorios. Si no se usa, rand() generaría la misma secuencia de números cada vez. time(0) devuelve la hora actual del sistema, lo que asegura una semilla diferente en cada ejecución.
  5. Declaración de Variables: Se definen las variables para almacenar el dinero del jugador, las tarifas, los números, etc. Nota el uso de vector<int> tarifas para almacenar las opciones de apuesta.
  6. Bucle while (montoInicial > 0): Este es el bucle principal del juego. El juego continúa mientras el jugador tenga dinero. Es una estructura de control que permite la iteración.
  7. if (condición) { ... } else { ... }: Estas son las estructuras de decisión. Permiten que el programa tome diferentes caminos lógicos según si una condición es verdadera o falsa. Ejemplos:
    • Si el usuario quiere jugar.
    • Si tiene fondos suficientes.
    • Si acertó el número ganador.
  8. rand() % 100 + 1: Esta expresión genera un número aleatorio entre 1 y 100 (ambos incluidos).
    • rand(): Genera un número aleatorio entero grande.
    • % 100: El operador módulo (%) obtiene el resto de la división por 100, lo que da un número entre 0 y 99.
    • + 1: Sumamos 1 para obtener un rango entre 1 y 100.
  9. montoInicial -= tarifa;: Es una forma abreviada de montoInicial = montoInicial - tarifa;. Similarmente, montoInicial += premio; es montoInicial = montoInicial + premio;.
  10. break;: Esta palabra clave se utiliza para salir de un bucle (while en este caso) de forma prematura. Se usa cuando el jugador decide no continuar o cuando se agota el dinero.
  11. Mensajes al Usuario: cout << "..." << endl; se utiliza para mostrar texto en la consola. cin >> variable; se utiliza para leer la entrada del usuario.
  12. return 0;: Al final de main(), indica que el programa se ejecutó correctamente.

4. Compilación y Ejecución del Programa

Para que este código funcione, necesitas un compilador de C++ (como g++).

  1. Guarda el Código: Guarda el código anterior en un archivo llamado loteria.cpp.
  2. Abre una Terminal/Línea de Comandos: Navega hasta el directorio donde guardaste el archivo.
  3. Compila el Código: Ejecuta el siguiente comando:
    Bash
    g++ loteria.cpp -o loteria
    
    Esto creará un archivo ejecutable llamado loteria (o loteria.exe en Windows).
  4. Ejecuta el Programa:
    Bash
    ./loteria
    
    Ahora podrás interactuar con el juego en tu terminal.

Este tutorial te ha mostrado cómo diseñar la lógica de un programa usando un diagrama de flujo y cómo esa lógica se traduce en código C++ funcional. La combinación de estructuras de control (while, if/else) y la generación de números aleatorios son conceptos fundamentales en la programación que has aplicado en este juego interactivo de lotería.



Código original

#include <iostream>

#include <cstdlib>

#include <ctime>

#include <vector>


using namespace std;


int main() {

    srand(time(0));

    int montoInicial, tarifa, numeroGanador, numeroJugada, premio;

    char continuar;

    vector<int> tarifas = {8, 16, 32, 64};


    cout << "Bienvenido al juego de lotería con tarifas variables." << endl;

    cout << "Ingresa tu monto inicial: ";

    cin >> montoInicial;


    while (montoInicial > 0) {

        cout << "¿Quieres realizar un intento? (s/n): ";

        cin >> continuar;


        if (continuar == 's' || continuar == 'S') {

            cout << "Selecciona la tarifa: ";

            for (int t : tarifas) {

                cout << t << " ";

            }

            cout << endl;

            cin >> tarifa;


            if (montoInicial >= tarifa) {

                montoInicial -= tarifa;

                numeroGanador = rand() % 100 + 1;


                cout << "Ingresa tu número de jugada (1-100): ";

                cin >> numeroJugada;


                if (numeroJugada == numeroGanador) {

                    premio = tarifa * 600;

                    montoInicial += premio;

                    cout << "¡Felicidades! ¡Ganaste " << premio << "! Tu monto actual es: " << montoInicial << endl;

                } else {

                    cout << "Perdiste. El número ganador era: " << numeroGanador << endl;

                    cout << "Vuelve a intentarlo." << endl;

                }


                cout << "¿Continuar jugando? (s/n): ";

                cin >> continuar;

                if (continuar != 's' && continuar != 'S') {

                    break;

                }

            } else {

                cout << "Fondos insuficientes. Elige una tarifa menor." << endl;

            }

        } else {

            cout << "Retirando tu dinero. Monto final: " << montoInicial << endl;

            break;

        }

    }


    if (montoInicial <= 0) {

        cout << "Te quedaste sin dinero. ¡Fin del juego!" << endl;

    }


    cout << "¡Gracias por jugar!" << endl;


    return 0;

}



Comentarios