Version:0.9 StartHTML:0000000105 EndHTML:0000023925 StartFragment:0000000152 EndFragment:0000023891
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************** FPII ****************************/
/****************** Practica 5 ************************/
/******************************************************/

#include <iostream.h>
#include <stdlib.h>
#include <conio.c>    // para hacer los clrscr (borrados de pantalla)
#include "Pasaje.h"   // uso de la clase pasaje

Valor LeerNota();     // Funcion usada para interactuar con el usuario a la hora de pedir la introduccion de notas

int main()
{
    /* Declaracion de variables e inicialización */

    int idnota, id, borrarnotas;
    int opcion;  // variable para los menus de seleccion de opciones
    bool salirpasaje, salirpartitura, salir, ok; // controles de bucles y de errores
    Pasaje pas, part;   // los dos pasajes que usaremos en el programa
    Valor nota;
    string fichero, titulo;

    salirpasaje = false;
    salirpartitura = false;
    salir = false;
    ok = true;
    idnota = 1;
    opcion = 0;

    /* Menus */

    cout << " Programa para la composicion de melodias musicales\n";
    cout << " Program by Isidro Pastor Jorda -> ITTT UV\n";
    cout << " **************************************************\n";
    while (!salir)
    {


        cout << " ************** Menu Principal *************\n";
        cout << " 1. Menu de edicion de pasajes\n";
        cout << " 2. Menu de edicion de partituras\n";
        cout << " 3. Salir del programa\n";
        cout << " *******************************************\n";
        cout << " Elige una opcion -> ";
        cin >> opcion;
        cout << endl;

        switch (opcion)
        {
            case 1:
                while (!salirpasaje)
                {
                    clrscr(); // Llamada a clrscr() contenida en conio.c para borrar la pantalla
                    cout << " *********** Menu Pasaje **************\n";
                    cout << " 1. Introducir nueva nota\n";
                    cout << " 2. Eliminar nota del pasaje\n";
                    cout << " 3. Visualizar pasaje por pantalla\n";
                    cout << " 4. Limpiar todo el pasaje\n";
                    cout << " 5. Volver al menu principal\n";
                    cout << " **************************************\n";
                    cout << " Opcion elegida -> ";
                    cin >> opcion;
                    cout << endl;

                    switch (opcion)
                    {
                        case 1:
                            cout << " Grupo de notas y duraciones disponibles:\n";
                            cout << " Do, Do#, Re, Re# ,Mi, Fa, Fa#, Sol, Sol#, La, La#, Si, Pausa\n";
                            cout << " negra, blanca, redonda, corchea, semicorchea\n";
                            nota = LeerNota();
                            nota.iden = idnota;
                            pas.IntroNota(nota);
                            idnota++;
                            break;
                        case 2:
                            cout << " Introduce el id de la nota que quieres borrar -> ";
                            cin >> id;
                            cout << endl;
                            ok = pas.EliminarNota(id);
                            break;
                        case 3:
                            pas.Visualizar();
                            break;
                        case 4:
                            pas.LimpiarPasaje();
                            break;
                        case 5:
                            salirpasaje = true;
                            break;
                        default:
                            cerr << " La opcion elegida no es valida\n";
                            break;
                    } // switch pasaje
                    if (!ok)
                        cerr << " Se Produjeron errores en la ejecucion de la opcion\n";

                    if (!salirpasaje)
                    {
                        cin.ignore();
                        cout << " Pulse la tecla return para continuar ... ";
                        cin.get();
                    }
                    ok = true; // Volvemos a inicializar ok para detectar posibles fallos
                } // while (!salirpasaje)
                salirpasaje = false;
                break;
            case 2:
                while (!salirpartitura)
                {
                    clrscr(); // Llamada a clrscr() contenida en conio.c para borrar la pantalla
                    cout << " *********** Menu Partitura *********************\n";
                    cout << " 1. Introducir el pasaje creado\n";
                    cout << " 2. Eliminar un pasaje de la partitura\n";
                    cout << " 3. Visualizar la partitura completa por pantalla\n";
                    cout << " 4. Reproducir la partitura\n";
                    cout << " 5. Reproducir la partirura alreves\n";
                    cout << " 6. Grabar el pasaje en un archivo\n";
                    cout << " 7. Cargar pasaje de un archivo\n";
                    cout << " 8. Volver al menu Principal\n";
                    cout << " ************************************************\n";
                    cout << " Opcion elegida -> ";
                    cin >> opcion;
                    cout << endl;

                    switch (opcion)
                    {
                        case 1:
                            cout << " Dime el id de la nota delante de la que quieres insertar \n";
                            cout << "(inicio = 0, final = -1)-> ";
                            cin >> id;
                            cout << endl;
                            ok = part.IntroPasaje(pas, id, idnota);
                            break;
                        case 2:
                            cout << " Dime el id a partir del cual quieres borrar -> ";
                            cin >> id;
                            cout << endl << " Dime cuantas notas quieres borrar -> ";
                            cin >> borrarnotas;
                            ok = part.EliminarPasaje(id,borrarnotas);
                            break;
                        case 3:
                            part.Visualizar();
                            break;
                        case 4:
                            part.Tocar();
                            break;
                        case 5:
                            part.TocarAlreves();
                            break;
                        case 6:
                            cout << " Dime el nombre del fichero donde almacenar la partitura -> ";
                            cin >> fichero;
                            cout << "\n Dame un titulo para esta partitura (sin espacios)-> ";
                            cin >> titulo;
                            cout << endl;
                            ok = part.GrabarMelodia(fichero,titulo);
                            break;
                        case 7:
                            cout << " Dime el fichero que quieres cargar -> ";
                            cin >> fichero;
                            ok = part.LeerMelodia(fichero,idnota);
                            break;
                        case 8:
                            salirpartitura = true;
                            break;
                        default:
                            cerr << " La opcion elegida no es valida\n";
                            break;
                    } // switch partitura
                    if (!ok)
                        cerr << " Se Produjeron errores en la ejecucion de la opcion\n";

                    if (!salirpartitura)
                    {
                        cin.ignore();
                        cout << " Pulse la tecla return para continuar ... ";
                        cin.get();
                    }
                    ok = true; // Volvemos a inicializar ok para detectar posibles fallos
                } // while (!salirpartitura)
                salirpartitura = false;
                break;
            case 3:
                salir = true;
                break;
            default:
                cerr << "Opcion seleccionada no valida\n";
                break;
        clrscr(); // Llamada a clrscr() contenida en conio.c para borrar la pantalla
        } // switch Principal
    clrscr();
    } // while (!salir)

    return 0;
}

/*****************************************************************************
* Funcion: LeerNota
* Descripcion: Pide y lee una nota introducida por teclado
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*
*
*
*
* Valor devuelto:
*       devuelve un dato de tipo Valor que es la nota leida de teclado
*****************************************************************************/

Valor LeerNota()
{
    string aux, aux2;  // strings para leer el nombre de la nota y la duracion
    Valor notaaux;     // variable para almacenar la estructura de la nota
    int oct;
    bool ok;
    ok = false;


    while(!ok)
    {
        ok = true;
        cout << "\n Introduce la nota en formato <octava nota duracion>\n";
        cout << " Por ejemplo ' 1 Sol# corchea ' \n";
        cout << " Nota -> ";
        cin >> oct >> aux >> aux2;
        oct = oct - 1;  // Restamos uno a la octava teniendo en cuenta que el 1 corresponde a la primera octava

        while (oct <0 || oct>1)
        {
            cout << "\n Has introducido mal la octava, que octava quieres usar? -> ";
            cin >> oct;
            oct--;
        };

        notaaux.octava = Tipooctava(oct);

        switch ( int(aux[0]) )             // Comprobaremos el indice entero que tiene la primera letra de la nota
        {
            case 68:                       // aceptaremos la nota escrita tanto con mayuscula como en minuscula
            case 100:                       // caso en que la primera letra es una D o d
                if ( aux.find('#') != -1)
                    notaaux.nota = do_s;
                else
                    notaaux.nota = do_;
                break;
            case 70:
            case 102:                       // caso en que la primera letra es una F
                if ( aux.find('#') != -1)
                    notaaux.nota = fa_s;
                else
                    notaaux.nota = fa;
                break;
            case 76:
            case 108:                       // caso en que la primera letra es una L o l
                if ( aux.find('#') != -1)
                    notaaux.nota = la_s;
                else
                    notaaux.nota = la;
                break;
            case 77:
            case 109:                       // caso en que la primera letra es una M
                notaaux.nota = mi;
                break;
            case 82:
            case 114:                      // caso en que la primera letra es una R
                if ( aux.find('#') != -1)
                    notaaux.nota = re_s;
                else
                    notaaux.nota = re;
                break;
            case 83:
            case 115:                       // caso en que la primera letra es una S
                if (aux == "Si" || aux == "si")
                    notaaux.nota = si;
                else
                {
                    if ( aux.find('#') != -1)
                        notaaux.nota = sol_s;
                    else
                        notaaux.nota = sol;
                }
                break;
            case 80:                       // caso que la letra sea una p o P tendremos una pausa
            case 112:
                notaaux.nota = pausa;
                break;
            default:
                cerr << " Formato de la nota no reconocido\n";
                ok = false;
                break;
        };// switch


        switch (int (aux2[0])) // La duracion solo aceptaremos letras minusculas, podremos usar abreviaciones como  bl, sc
        {
            case 110:
                notaaux.duracion = negra;
                break;
            case 98:
                notaaux.duracion = blanca;
                break;
            case 114:
                notaaux.duracion = redonda;
                break;
            case 99:
                notaaux.duracion = corchea;
                break;
            case 115:
                notaaux.duracion = semicorchea;
                break;
            default:
                cout << " Formato de Duracion no reconocido\n";
                ok = false;
                break;
        };// switch

    } // while
    return (notaaux);
}