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);
}