Advertisement
Brunoroman

PI ENTREGA 5.1

Nov 24th, 2021
1,048
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 57.92 KB | None | 0 0
  1. #include <iostream> //LIBRERIA IOSTREAM permite ingresar y mostrar en pantalla texto.
  2. #include <cstring>  //LIBRERIA CSTRING facilita el uso de strings, con comandos como lenght.
  3. #include <stdlib.h> //LIBRERIA STDLIB es una biblioteca estandar, se agrego para la funcion limpiar().
  4. #include <conio.h>  //LIBRERIA CONIO.H permite usar la funcion getch(), hace que no se cierre la terminal al ser ejecutado el programa.
  5. using namespace std;
  6.  
  7. // Funcion del programa
  8. // Sistema para registrar, administrar y consultar prestamos
  9.  
  10. /*
  11. ===================
  12.      VARIABLES
  13. ===================
  14. */
  15.  
  16. const int dFisica = 100; // DIMENSION FISICA DE LOS ARREGLOS
  17.  
  18. int cantidad_categorias = 0;   // Variable para saber la dimension logica de las categorias
  19. int cantidad_prestamos = 0;    // Lo mismo que la anterior para los prestamos
  20. int cantidad_prestatarios = 0; // Lo mismo para los prestatarios
  21.  
  22. /*
  23. ================
  24.      STRUCS
  25. ================
  26. */
  27.  
  28. struct categoria
  29. { // Plantilla del struct para las categorias
  30.     int codigo_categoria;
  31.     string descripcion;
  32. };
  33.  
  34. struct prestamo
  35. { // Plantilla del struct para los prestamos
  36.     int codigo_categoria;
  37.     int prestatario;
  38.     string descripcion;
  39.     bool estado;
  40. };
  41.  
  42. struct prestatario
  43. { // Plantilla del struct para prestatarios
  44.     int codigo_prestatario;
  45.     string apellido;
  46.     string nombre;
  47. };
  48. struct nodoprestamo{
  49.     //Plantilla del struct para cada nodo de prestamos
  50.     prestamo prestamo;
  51.     nodoprestamo* siguiente;
  52. };
  53.  
  54. categoria categorias[dFisica]; //Definicion de los arreglos estaticos para las categorias y los prestatarios
  55. prestatario prestatarios[dFisica];
  56.  
  57. /*
  58. ===================
  59.      FUNCIONES
  60. ===================
  61. */
  62.  
  63. void limpiar()
  64. {
  65.     // Funcion limpiar
  66.     // PROPOSITO: Limpiar la pantalla mediante system("cls")
  67.     // PARAMETROS: No pide ningun parametro
  68.     // RETORNO:No retorna nada ya que es del tipo void
  69.  
  70.     system("cls");
  71. }
  72.  
  73. string mayuscula(string cadena)
  74. {
  75.     // Funcion mayuscula
  76.     // PROPOSITO: Hacer que el string ingresado, retorne en mayusculas, sirve para normalizar los string que se utilicen y evitar errores al compararlos
  77.     // PARAMETROS: Un string deseado para convertirlo en mayusculas
  78.     // RETORNO: Retorna un string que es el mismo que el ingresado, pero con todas sus letras en mayusculas
  79.     int largo=cadena.length(); //Se busca el largo de la cadena
  80.  
  81.     for (int i = 0; i < largo; i++) //Se recorre la cadena haciendo que sus elementos se transformen en su version toupper(mayuscula)
  82.     {
  83.         cadena[i] = toupper(cadena[i]);
  84.     }
  85.     return cadena; //Se retorna la cadena
  86. }
  87.  
  88. string title(string frase)
  89. {
  90.     // FUNCION: title
  91.     // PROPOSITO: visual, retornar una cadena de caracteres en formato titulo
  92.     // PARAMETROS: string
  93.     // RETORNO: retorna un string en formato titulo
  94.  
  95.     string frase_aux = frase; //Se crea una cadena auxiliar
  96.     int largo=frase_aux.length(); //Se almacena el largo de la cadena en la variable "largo"
  97.     frase_aux[0] = toupper(frase_aux[0]); //Se pone la primera letra en mayuscula
  98.     for (int i = 1; i < largo; i++) //Se recorre la cadena desde la segunda letra poniendo las letras en minuscula
  99.     {
  100.         frase_aux[i] = tolower(frase_aux[i]);
  101.     }
  102.     return (frase_aux); //Se retorna la cadena
  103. }
  104.  
  105. string agregarCategoria(string descripcion)
  106. {
  107.     // Funcion agregar_categoria
  108.     // PROPOSITO: Agregar una categoria al struct categorias, le asigna un codigo interno a la categoria y revisa que la categoria no este repetida
  109.     // PARAMETROS: Descripcion de la categoria a agregar
  110.     // RETORNO: Retorna un string que dice si se agrego o no la categoria
  111.  
  112.     for (int i = 0; i <= cantidad_categorias; i++)
  113.     {
  114.         if (mayuscula(descripcion) == mayuscula(categorias[i].descripcion))
  115.         {
  116.             return ("La categoria que desea agregar ya existe!"); //Se comprueba recorriendo el arreglo de categorias, si la categoria ya se encuentra registrada
  117.         }
  118.     }
  119.     for (int i = 0; i <= cantidad_categorias; i++)
  120.     {
  121.         if (mayuscula(descripcion) != mayuscula(categorias[i].descripcion)) //Se recorre el arreglo
  122.         {
  123.             for (int j = cantidad_categorias; j < dFisica; j++)
  124.             {
  125.                 categorias[j].codigo_categoria = cantidad_categorias; //Se almacena los datos de la categoria
  126.                 categorias[j].descripcion = descripcion;
  127.                 cantidad_categorias++; //Se aumenta el numero de categorias
  128.                 return ("Categoria agregada satisfatoriamente!"); //Se retorna el mensaje de exito
  129.             }
  130.         }
  131.     }
  132.     return ("default");
  133. }
  134.  
  135. string modificarCategoria(string descripcion)
  136. {
  137.     // Funcion modificar_categoria
  138.     // PROPOSITO: Modificar una categoria existente en el struct categorias
  139.     // PARAMETROS: Descripcion de la categoria a modificar
  140.     // RETORNO: Retorna un string que dice si la modificacion fue satisfatoria o no
  141.  
  142.     string categoria_modif;
  143.     string aux = descripcion;
  144.  
  145.     for (int i = 0; i <= cantidad_categorias; i++)
  146.     {
  147.         if (mayuscula(categorias[i].descripcion) == mayuscula(aux)) //Se recorre el arreglo para ver si existe la categoria a modificar
  148.         {
  149.             cout << "La categoria a modificar ingresada es correcta!" << endl; //Se informa que xiste
  150.             cout << "\nA continuacion ingrese el nuevo nombre para la categoria: "; //Se pide que se ingrese el nuevo nombre
  151.             cin >> categoria_modif;
  152.             categorias[i].descripcion = categoria_modif; //Se cambia
  153.             limpiar();
  154.             return ("Categoria modificada satisfactoriamente!"); //Se retorna el mensaje de exito
  155.         }
  156.     }
  157.     for (int i = 0; i <= cantidad_categorias; i++)
  158.     {
  159.         if (mayuscula(categorias[i].descripcion) != mayuscula(aux))
  160.         {
  161.             return ("La categoria que desea modificar no existe!"); //Se recorre en diferido para evitar que se informe mas de una vez que no es igual
  162.         }
  163.     }
  164.     return ("default");
  165. }
  166.  
  167. string eliminarCategoria(string descripcion,nodoprestamo* inicio)
  168. {
  169.     // Funcion eliminar_categoria
  170.     // PROPOSITO: Eliminar una categoria del struct antes nombrado, si y solo si la categoria no tiene un prestamo en activo
  171.     // PARAMETROS: Descripcion de la categoria a eliminar y el inicio de la lista de prestamos
  172.     // RETORNO: Retorna un string que dice si se pudo eliminar o no la categoria
  173.  
  174.     string descripcion_aux = descripcion;
  175.     int posicion = 0;
  176.     int codigo_cat = 0;
  177.     bool ocupado=false;
  178.     bool existe=false;
  179.     for(int i=0;i<cantidad_categorias;i++){
  180.         if(mayuscula(descripcion_aux)==mayuscula(categorias[i].descripcion)){  //Se recorre el arreglo para ver si existe la categoria
  181.             codigo_cat=categorias[i].codigo_categoria;
  182.             posicion=i;
  183.             existe=true;
  184.             break;
  185.         }
  186.     }
  187.     if(existe==true){ //Si existe se pasa a recorrer la lista de prestamos para ver si se encuentra utilizada la categoria
  188.         nodoprestamo* aux=new nodoprestamo;
  189.         aux=inicio;
  190.         if(aux!=NULL){
  191.             while(aux!=NULL && ocupado==false){
  192.                 if(codigo_cat==aux->prestamo.codigo_categoria){
  193.                     ocupado=true; //Si se encuentra, el bool ocupado toma el valor true
  194.                 }
  195.                 aux=aux->siguiente;
  196.             }
  197.         }
  198.         if(ocupado!=true){ //Si no esta ocupada la categoria, se pasa a eliminar la categoria
  199.             for(int i=posicion;i<cantidad_categorias;i++){
  200.                 categorias[i]=categorias[i+1];
  201.                 cantidad_categorias--;
  202.                 return("Categoria eliminada satisfactoriamente!");
  203.             }
  204.         }
  205.         else if(ocupado==true){ // Si se encuentra ocupada se informa que no es posible eliminar
  206.             return("La categoria que desea eliminar se encuentra registrada en un prestamo, no es posible eliminarla");
  207.         }
  208.     }
  209.     else{ //Si el bool existe sigue en false, se informa que no existe la categoria
  210.         return("La categoria que desea eliminar no existe");
  211.     }
  212.     return("Default");
  213. }
  214.  
  215. string agregarPrestatario(string nombre, string apellido)
  216. {
  217.     // Funcion agregarPrestatario
  218.     // PROPOSITO: Agregar un prestatario al struct prestatarios
  219.     // PARAMETROS: Nombre y Apellido del prestatario a agregar
  220.     // RETORNO: Retorna un string que dice si se agrego o no el prestatario
  221.  
  222.     int repetidos = 0;
  223.     for (int i = 0; i <= cantidad_prestatarios; i++)
  224.     {
  225.         if (mayuscula(nombre) == mayuscula(prestatarios[i].nombre) && mayuscula(apellido) == mayuscula(prestatarios[i].apellido))
  226.         {
  227.             repetidos++; //Se recorre el arreglo de prestatarios para comprobar que el prestatario a agregar se encuentra o no registrado ya
  228.         }
  229.     }
  230.     if (repetidos == 0) //Si repetidos es igual a 0(lo que indica que no se encuentra registrado ya, se pasa a agregar el prestatario al arreglo
  231.     {
  232.         prestatarios[cantidad_prestatarios].nombre = nombre;
  233.         prestatarios[cantidad_prestatarios].apellido = apellido;
  234.         prestatarios[cantidad_prestatarios].codigo_prestatario = cantidad_prestatarios;
  235.         cantidad_prestatarios++;
  236.         return ("Prestatario agregado satisfatoriamente!");
  237.     }
  238.     else{//Si repetido es diferente de 0, el prestatario ya se encuentra registrado, por lo tanto se informa que no se puede agregar
  239.         return ("El prestatario que desea agregar ya existe!");
  240.     }
  241. }
  242.  
  243. string modificarPrestatario(string nombre, string apellido)
  244. {
  245.     // Funcion modificarPrestatario
  246.     // PROPOSITO: modificar prestatario ya agregado
  247.     // PARAMETROS: Nombre y apellido del prestatario a modificar
  248.     // RETORNO: Retorna un string que indica si se modifico o no al prestatario que se desea
  249.  
  250.     string nombre_modif;
  251.     string apellido_modif;
  252.     string nombre_aux = nombre;
  253.     string apellido_aux = apellido;
  254.     for (int i = 0; i < cantidad_prestatarios; i++)
  255.     {
  256.         if (mayuscula(nombre_aux) == mayuscula(prestatarios[i].nombre) && mayuscula(apellido_aux) == mayuscula(prestatarios[i].apellido))
  257.         {   //Se recorre el arreglo para comprobar si el prestatario existe
  258.             cout << "El prestatario a modificar es correcto!" << endl; //Si existe se pasa a pedir al usuario el nuevo nombre y apellido para el prestatario
  259.             cout << "Ingrese el nuevo nombre del prestatario: ";
  260.             cin >> nombre_modif;
  261.             cout << "Ingrese el nuevo apellido del prestatario: ";
  262.             cin >> apellido_modif;
  263.             prestatarios[i].nombre = nombre_modif; //Se cambian los dos parametros, por los nuevos
  264.             prestatarios[i].apellido = apellido_modif;
  265.             return ("Prestatario modificado satisfactoriamente!"); //Se retorna para informar al usuario el exito de la operacion
  266.         }
  267.     }
  268.     for (int i = 0; i < cantidad_prestatarios; i++) //Se recorre el arreglo
  269.     {
  270.         if (mayuscula(nombre_aux) != mayuscula(prestatarios[i].nombre) && mayuscula(apellido_aux) != mayuscula(prestatarios[i].apellido))
  271.         {
  272.             return ("El prestatario que desea modificar no existe!"); //Para poder avisar que el prestatario a modificar no existe, retornando el mensaje de error
  273.         }
  274.     }
  275.     return ("default");
  276. }
  277.  
  278. string eliminarPrestatario(string nombre, string apellido, nodoprestamo* inicio)
  279. {
  280.     // Funcion eliminarPrestatario
  281.     // PROPOSITO: Eliminar un prestatario ya inscripto, como las anteriores que dependen de que este inscripto o no, notifica al usuario si el prestatario no se encuentra registrado
  282.     // tambien checkea si el prestatario a eliminar no tiene un prestamo en activo, en caso de ser asi permite elminarlo, en caso de que tenga un prestamo no lo permite
  283.     // PARAMETROS: Nombre y apellido del prestatario a modificar y el comienzo de la lista de prestamos.
  284.     // RETORNO: Retorna un string que indica si se elimino o no al prestatario que se desea.
  285.  
  286.     string nombre_aux=nombre;
  287.     string apellido_aux=apellido;
  288.     int posicion = 0;
  289.     int codigo_presta = 0;
  290.     bool ocupado=false;
  291.     bool existe=false;
  292.     for(int i=0;i<cantidad_prestatarios;i++){ //Con el mismo funcionamiento que eliminarCategoria
  293.         if(mayuscula(nombre_aux)==mayuscula(prestatarios[i].nombre)&&mayuscula(apellido_aux)==mayuscula(prestatarios[i].apellido)){
  294.             codigo_presta=prestatarios[i].codigo_prestatario;
  295.             posicion=i;
  296.             existe=true;  //Se revisa el arreglo de prestatarios para ver si existe, en caso de que si se pone existe en true
  297.             break;
  298.         }
  299.  
  300.     }
  301.     if(existe==true){      //En caso de que existe sea true, se pasa a ver si tiene un prestamo registrado el prestatario
  302.         nodoprestamo* aux=new nodoprestamo;
  303.         aux=inicio;
  304.         if(aux!=NULL){
  305.             while(aux!=NULL && ocupado==false){
  306.                 if(codigo_presta==aux->prestamo.prestatario){
  307.                     ocupado=true;
  308.                 }
  309.                 aux=aux->siguiente;
  310.             }
  311.         }
  312.         if(ocupado!=true){ //En caso de que ocupado sea false(no tiene prestamos registrados) se para a eliminar del arreglo el prestatario
  313.             for(int i=posicion;i<cantidad_prestatarios;i++){
  314.                 prestatarios[i]=prestatarios[i+1];
  315.                 cantidad_prestatarios--;
  316.                 return("Prestatario eliminado satisfactoriamente!");  //Y se informa al usuario del exito de la operacion
  317.             }
  318.         }
  319.         else if(ocupado==true){ //Si ocupado es true, se avisa al usuario del error
  320.             return("El prestatario que desea eliminar esta registrado en un prestamo, no es posible eliminarlo!");
  321.         }
  322.     }
  323.     else{ //Si existe no es true, el prestatario no existe, por lo tanto se avisa al usuario
  324.         return("El prestatario que desea eliminar no existe!");
  325.     }
  326.     return("Default");
  327. }
  328.  
  329.  
  330.  
  331. nodoprestamo* agregarPrestamo(string categoria, string nombre, string apellido, string descripcion,nodoprestamo* inicio1)
  332. {
  333.     // Funcion agregarPrestamo
  334.     // PROPOSITO: Agregar un prestamo al struct de los mismos, generando un booleano que indica el estado del prestamo, TRUE=prestamo activo, FALSE=prestamo finalizado
  335.     // PARAMETROS: Categoria del prestamo(aclaracion es un string ya que no se usara el codigo de la categoria, sino la descripcion del primer struct
  336.     // llamado categorias para hacer mas facil al usuario el ingreso), aparte de este, se pide nombre y apellido del prestatario
  337.     // se ingresa tambien la descripcion para el prestamo que va a ser la principal forma de detectar prestamos y para poder agregarlo
  338.     // se pasa como parametro el puntero que va al comienzo de la lista
  339.     // RETORNO: retorna el inicio de la lista
  340.  
  341.     int posicioncategoria=0;
  342.     int posicionprestatario=0;
  343.     bool existe1=false;
  344.     bool existe2=false;
  345.     if(cantidad_categorias==0 && cantidad_prestatarios==0){
  346.         cout<<"No se encuentran categorias ni prestararios registrados"<<endl; //Se comprueba que haya por lo menos una categoria
  347.         cout<<"Sera devuelto al menu"<<endl;                                  //y un prestatario antes de pasar a registrar el
  348.         return(inicio1);                                                     //para evitar posibles errores
  349.     }
  350.     else if(cantidad_categorias==0 && cantidad_prestatarios!=0){
  351.         cout<<"No se encuentran categorias registradas"<<endl;
  352.         cout<<"Sera devuelto al menu"<<endl;
  353.         return(inicio1);
  354.     }
  355.     else if(cantidad_categorias!=0 && cantidad_prestatarios==0){
  356.         cout<<"No se encuentran prestatarios registrados"<<endl;
  357.         cout<<"Sera devuelto al menu"<<endl;
  358.         return(inicio1);
  359.     }
  360.     else{ //En caso que haya categorias y prestatarios disponibles se pasa a anidar dos for, para recorrer sus arreglos y tener los codigos de categoria y prestatario para el prestamo
  361.         for(int i=0;i<cantidad_categorias;i++){
  362.             if(mayuscula(categorias[i].descripcion)==mayuscula(categoria)){
  363.                 existe1=true;
  364.                 posicioncategoria=i;
  365.                 break;
  366.             }
  367.         }
  368.         for(int j=0;j<cantidad_prestatarios;j++){
  369.            if(mayuscula(prestatarios[j].nombre)==mayuscula(nombre) && mayuscula(prestatarios[j].apellido)==mayuscula(apellido)){
  370.                existe2=true;
  371.                posicionprestatario=j;
  372.                break;
  373.            }
  374.         }
  375.         if(existe1==true && existe2==true){
  376.             limpiar();
  377.             nodoprestamo* nuevo=new nodoprestamo(); //Se crea el nuevo nodo
  378.             nuevo->prestamo.codigo_categoria=categorias[posicioncategoria].codigo_categoria; //Se le asignan los valores al struct dentro del nodo
  379.             nuevo->prestamo.prestatario=prestatarios[posicionprestatario].codigo_prestatario;
  380.             nuevo->prestamo.descripcion=descripcion;
  381.             nuevo->prestamo.estado=true;
  382.             nodoprestamo* aux1=inicio1; //nodos auxiliares
  383.             nodoprestamo* aux2;
  384.             while(aux1!=NULL){
  385.                  aux2=aux1;
  386.                  aux1=aux1->siguiente;
  387.             }
  388.             if(inicio1==aux1){
  389.                 inicio1=nuevo; //Se lo ubica donde tenga que ir, ya sea que es el primer nodo agregado, o el segundo, o otro
  390.             }
  391.             else{
  392.                 aux2->siguiente=nuevo;
  393.             }
  394.             nuevo->siguiente=aux1;
  395.             cout<<"Prestamo agregado satisfactoriamente"<<endl; //Se avisa al usuario del exito
  396.             cantidad_prestamos++; //Se aumenta la cantidad de prestamos
  397.             return(inicio1); //Se retorna el inicio
  398.         }
  399.         else if(existe1==true && existe2==false){
  400.             cout<<"El prestatario deseado no existe"<<endl;
  401.             return(inicio1);
  402.         }
  403.         else if(existe1==false && existe2==true){
  404.             cout<<"La categoria que desea no existe"<<endl;
  405.         }
  406.     }
  407.     return(inicio1);
  408. }
  409. void modificarPrestamo(string descripcion,nodoprestamo* inicio)
  410. {
  411.     // Funcion modificar_prestamo
  412.     // PROPOSITO: Modificar la descripcion de un prestamo que se encuentre en la base de datos, en caso de que no se encuentre se informa al usuario
  413.     // PARAMETROS: Descripcion del prestamo a modificar y el inicio de la lista enlazada
  414.     // RETORNO: void, no retorna nada
  415.  
  416.        string descripcion_aux=descripcion;
  417.        string nueva_descripcion;          //Se crean variables, auxiliares, una variable para la nueva descripcion, un nodo para recorrer la lista
  418.        nodoprestamo* aux=new nodoprestamo;//Y un bool para ver si el prestamo buscado existe en la lista
  419.        bool existe=false;
  420.        aux=inicio; //Se iguala el auxiliar al inicio de la lista
  421.        if(inicio!=NULL){
  422.            while(aux!=NULL && existe==false){
  423.                if(aux->prestamo.descripcion==descripcion_aux && aux->prestamo.estado==true){
  424.                    limpiar();
  425.                    cout<<"El prestamo buscado existe"<<endl;
  426.                    cout<<"Ingrese la nueva descripcion para el prestamo: "; //Se recorre y se marca existe como true para salir del while
  427.                    cin>>nueva_descripcion; //Aparte de lo anterior se pide el ingreso de la nueva descripcion y se cambia, todo esto en caso que exista el prestamo
  428.                    aux->prestamo.descripcion=nueva_descripcion;
  429.                    existe=true;
  430.                    cout<<"Prestamo modificado satisfactoriamente!"<<endl; //Y se avisa al usuario del exito de la operacion
  431.                }
  432.                aux=aux->siguiente;
  433.            }
  434.            if(existe==false){ //En caso que no exista un prestamo con la descripcion dada se avisa al usuario
  435.                cout<<"El prestamo que desea modificar no existe"<<endl;
  436.            }
  437.        }
  438.        else{ //Si inicio es igual a NULL, no existen prestamos registrados por lo que se pasa a avisar al usuario de esto
  439.            cout<<"No existen prestamos registrados!"<<endl;
  440. }
  441. }
  442. string eliminarPrestamo(string descripcion,nodoprestamo* inicio) //ERROR AL QUERER ELIMINAR CUANDO SE BORRO UN ELEMENTO DE LA LISTA PERO YA SE BORRO EL PRIMER ELEMENTO
  443. {
  444.     // Funcion eliminar_prestamo
  445.     // PROPOSITO: Eliminar un prestamo de la base de datos
  446.     // PARAMETROS: Se pide la descripcion del prestamo a eliminar para poder identificarlo y el inicio de la lista
  447.     // RETORNO: Retorna un string que indica el estado de la operacion realizada
  448.  
  449.     string descripcion_aux=descripcion;
  450.     if(cantidad_prestamos==0){ //Se revisa si existen prestamos registrados
  451.         return("No se encuentran prestamos registrados");
  452.     }
  453.     if(inicio!=NULL){
  454.         nodoprestamo* aux;
  455.         nodoprestamo* anterior=NULL;
  456.         aux=inicio;
  457.         while(aux!=NULL && mayuscula(aux->prestamo.descripcion)!= mayuscula(descripcion_aux)){
  458.             anterior=aux;
  459.             aux=aux->siguiente;
  460.         }
  461.         if(aux==NULL){
  462.             return("El prestamo que desea eliminar no existe"); //Si aux llego al final de la lista y no se cumplio la condicion, no existe el prestamo buscado y se avisa
  463.             delete aux;
  464.         }
  465.         else if(anterior==NULL){ //Si el prestamo existe, se pasa a eliminarlo
  466.             inicio=inicio->siguiente;
  467.             delete aux;
  468.             return("Prestamo eliminado satisfactoriamente");
  469.         }
  470.         else{
  471.             anterior->siguiente=aux->siguiente; //Mismo caso que el anterior pero cuando se encuentra en diferente posicion
  472.             delete aux;
  473.             return("Prestamo eliminado satisfactoriamente");
  474.         }
  475.     }
  476.     return("default");
  477. }
  478.  
  479. void imprimirPrestatarioActivo(nodoprestamo* inicio)
  480. {
  481.     // Funcion imprimirPrestatarioActivo
  482.     // PROPOSITO: Imprimir lista de prestatarios con prestamos activos
  483.     // PARAMETROS: El inicio de la lista
  484.     // RETORNO: Void, no retorna
  485.  
  486.     cout << "\nLista de prestatarios con prestamos activos: " << endl; //Se imprime
  487.     cout << endl;
  488.     nodoprestamo* aux=new nodoprestamo; //Se crea aux para reocrrer la lista
  489.     aux=inicio;
  490.     int cantidad=0;//cantidad para comprobaciones
  491.     for(int i=0;i<cantidad_prestatarios;i++){//Se recorre el arreglo de prestatarios
  492.         aux=inicio;
  493.         cantidad=0;
  494.         if(aux!=NULL){//Si aux!=NULL la lista de prestamos no esta vacia
  495.  
  496.             while(aux!=NULL){ //Se recorre la lista
  497.                 if(aux->prestamo.prestatario==prestatarios[i].codigo_prestatario && aux->prestamo.estado==true){
  498.                     cantidad++; //Si el prestatario tien prestamos cantidad+1
  499.                 }
  500.                 aux=aux->siguiente;
  501.             }
  502.             if(cantidad!=0){ //Si cantidad no es 0 el prestatario tiene prestamos, por lo tanto se imprime su nombre y apellido y cuandos prestamos tiene
  503.                 cout<<"El prestatario "<<title(prestatarios[i].nombre)<<" "<<title(prestatarios[i].apellido)<<" con codigo "<<prestatarios[i].codigo_prestatario<<" tiene "<<cantidad<< " prestamos"<<endl;
  504.             }
  505.         }
  506.         else{ //Si la lista esta vacia, aux==NULL se imprime
  507.             cout<<"La lista de prestamos se encuentra vacia!"<<endl;
  508.         }
  509.     }
  510.  
  511. }
  512.  
  513. string terminar_prestamo(nodoprestamo* inicio)
  514. {
  515.     // Funcion terminar_prestamo
  516.     // PROPOSITO: Terminar un prestamo en activo, cambiando su parte booleana de true a false
  517.     // PARAMETROS: La descripcion del prestamo a terminar y el puntero al comienzo de la lista
  518.     // RETORNO: Retorna un string y como todas las anteriores, este string indica si la operacion fue satisfatoria o no
  519.  
  520.     int codigoprestatario=0;
  521.     string descripciones[dFisica]={"\0"};
  522.     imprimirPrestatarioActivo(inicio);
  523.     cout<<"Ingrese el codigo del prestatario del cual desea ver sus prestamos:"<<endl;
  524.     cin>>codigoprestatario;
  525.     nodoprestamo* aux=new nodoprestamo();
  526.     aux=inicio;
  527.     int cantidad=1;
  528.     if(aux!=NULL){
  529.         while(aux!=NULL){
  530.             if(aux->prestamo.estado==true && aux->prestamo.prestatario==codigoprestatario){
  531.                 cout<<"Prestamo "<<cantidad<<" : "<<aux->prestamo.descripcion<<endl;
  532.                 descripciones[cantidad-1]=aux->prestamo.descripcion;
  533.                 cantidad++;
  534.             }
  535.             aux=aux->siguiente;
  536.         }
  537.     }
  538.     else{
  539.         return("La lista de prestamos se encuentra vacia");
  540.     }
  541.     aux=inicio;
  542.     bool existe=false;
  543.     cout<<"Ingrese el numero de prestamo a terminar"<<endl;
  544.     cin>>codigoprestatario;
  545.     if(aux!=NULL){
  546.         while(aux!=NULL && existe==false){
  547.             if(aux->prestamo.estado==true && descripciones[codigoprestatario-1]==aux->prestamo.descripcion){
  548.                 aux->prestamo.estado=false;
  549.                 existe=true;
  550.             }
  551.             aux=aux->siguiente;
  552.         }
  553.     }
  554.     if(existe==true){
  555.         return("Prestamo terminado satisfactoriamente");
  556.     }
  557.     else{
  558.         return("Prestamo ingresado incorrectamente");
  559.     }
  560.  
  561. }
  562.  
  563. void imprimirObjetos_Categoria(categoria categorias[], int cantidad_categorias)
  564. {
  565.     // Funcion imprimirObjetos_Categoria
  566.     // PROPOSITO: Imprimir lista de objetos prestados
  567.     // PARAMETROS: Struct de categorias
  568.     // RETORNO: Void, no retorna
  569.  
  570.     for (int i = 0; i < cantidad_categorias; i++) //Se recorre el arreglo de categorias
  571.         {
  572.             cout<<"Objeto Prestado: "<<title(categorias[i].descripcion)<<endl; //Se imprimen las descripciones de cada una
  573.         }
  574.  
  575. }
  576.  
  577. void imprimirPrestatarios(prestatario prestatarios[], int cantidad_prestatarios)
  578. {
  579.     // Funcion imprimirPrestatarios
  580.     // PROPOSITO: Imprimir lista de prestatarios
  581.     // PARAMETROS: Struct prestatarios
  582.     // RETORNO: Void, no retorna
  583.  
  584.     for (int i = 0; i < cantidad_prestatarios; i++) //Se recorre el arreglo de prestatarios
  585.     {
  586.         cout << "Prestatario: " << title(prestatarios[i].nombre) << " " << title(prestatarios[i].apellido) <<endl; //Se imprimen nombre y apellido de cada prestatario
  587.     }
  588. }
  589.  
  590. void imprimirCategorias(categoria categorias[], int cantidad_categorias)
  591. {
  592.     // Funcion imprimirCategorias
  593.     // PROPOSITO: Imprimir lista de categorias
  594.     // PARAMETROS: Struct categorias, int cantegorias
  595.     // RETORNO: Void, no retorna
  596.  
  597.     cout << "\nCategorias:" << endl;
  598.     cout << endl;
  599.     for (int i = 0; i < cantidad_categorias; i++) //Se recorre el arreglo categorias y se imprimen las categorias existentes
  600.     {
  601.         cout << i + 1 << ". " << categorias[i].descripcion <<endl;
  602.     }
  603.     cout << endl;
  604. }
  605.  
  606. void imprimir_prestamos_por_categoria(string descripcion,nodoprestamo* inicio)
  607. {
  608.     // Funcion imprimir_prestamos_por_categoria
  609.     // PROPOSITO: Imprimir los prestamos que presentan la categoria deseada
  610.     // Parametro: La descripcion de la categoria y el inicio de la lista de prestamos
  611.     // Retorno: Void, no retorna nada
  612.  
  613.     string descripcion_categoria=descripcion;
  614.     int codigo_cat=0;
  615.     bool existe=false; //Se crean variables para la descricion a buscar, un int que guarda el codigo de categorias
  616.     int i=0;          // Un bool para guardar si existe o no la categoria, y un int i para iterar con el while
  617.     while(existe==false && i<=cantidad_categorias){
  618.         if(mayuscula(categorias[i].descripcion)==mayuscula(descripcion_categoria)){
  619.             existe=true;
  620.             codigo_cat=categorias[i].codigo_categoria;
  621.         }
  622.         i++;
  623.     }
  624.     if(existe==true){ //Si existe, se pasa a recorrer la lista de prestamos, y se crea un arreglo estatico para almacenar
  625.                      //las descripciones de cada prestamo
  626.         nodoprestamo* aux=new nodoprestamo;
  627.         aux=inicio;
  628.         string lista_p[dFisica]={"\0"};
  629.         int cantidad=0;
  630.         if(aux!=NULL){
  631.             while(aux!=NULL){
  632.                 if(aux->prestamo.codigo_categoria==codigo_cat && aux->prestamo.estado==true){
  633.                     lista_p[cantidad]=aux->prestamo.descripcion;
  634.                     cantidad++;
  635.                 }
  636.                 aux=aux->siguiente;
  637.             }
  638.         }
  639.         else{
  640.             cout<<"No existen prestamos registrados"<<endl; //Si aux es igual a NULL significa que inicio es igual a NULL por lo tanto no hay prestamos registrados
  641.         }
  642.         if(lista_p[0]!="\0"){ //Si el arreglo no se encuentra lleno de "\0"(arreglo vacio para el algoritmo), se pasa a imprimir los miembros del arreglo
  643.             cout<<"Los objetos en prestamo de la categoria ";
  644.             cout<<title(descripcion_categoria);
  645.             cout<<" son:"<<endl;
  646.             for(int i=0;i<cantidad;i++){
  647.                 cout<< i+1;
  648.                 cout<<". ";
  649.                 cout<<lista_p[i]<<endl;
  650.             }
  651.         }
  652.         else if(lista_p[0]=="\0"){ //Si el arreglo sigue con todos los "\0", nunca se cumplio la condicion del if dentro del while por lo tanto la categoria existe
  653.                                   //Pero nunca se registraron prestamos con esa categoria
  654.             limpiar();
  655.             cout<<"La categoria no presenta prestamos registrados o activos"<<endl;
  656.         }
  657.     }
  658.     else{
  659.         cout<<"La categoria que desea buscar no existe!"<<endl;//En caso de existe==false, la categoria que se quiso buscar no existe
  660.     }
  661. }
  662.  
  663.  
  664.  
  665. void cantidad_objetos_categoria(string descripcion,nodoprestamo* inicio)
  666. {
  667.     // Funcion cantidad_objetos_categoria
  668.     // Proposito:Imprimir la cantidad de objetos para una categoria dada
  669.     // Parametros:Descripcion de la categoria a buscar y el puntero al inicio de la lista
  670.     // Retorno:Void, no retorna nada
  671.  
  672.     string descripcion_categoria=descripcion;
  673.     int codigo_cat=0; //Se crean variables locales para almacenar, la descripcion a buscar
  674.     bool existe=false;//Un bool para ver si existe la categoria buscada
  675.     int i=0;//Un i para iterar con el while
  676.     while(existe==false && i<=cantidad_categorias){
  677.         if(mayuscula(categorias[i].descripcion)==mayuscula(descripcion_categoria)){ //Se recorre el arreglo de categorias buscando la categoria ingresada
  678.             existe=true;                                                            //Para obtener el codigo de categoria y saber si existe
  679.             codigo_cat=categorias[i].codigo_categoria;
  680.         }
  681.         i++;
  682.     }
  683.     if(existe==true){ //Si existe se pasa a recorrer la lista de prestamos
  684.         nodoprestamo* aux=new nodoprestamo;//Nodo auxiliar para recorrer
  685.         aux=inicio; //Se iguala a inicio el nodo aux
  686.         int cantidad=0; //Variable para contar cuantas veces se encuentra un prestamo con la categoria buscada
  687.         if(aux!=NULL){
  688.             while(aux!=NULL){
  689.                 if(aux->prestamo.codigo_categoria==codigo_cat && aux->prestamo.estado==true){
  690.                     cantidad++;
  691.                 }
  692.                 aux=aux->siguiente;
  693.             }
  694.         }
  695.         else{
  696.             cout<<"No existen prestamos registrados"<<endl; //Si aux==NULL, no hay partes de la lista
  697.         }
  698.         delete aux; //Se borra aux tras recorrer la lista
  699.         if(cantidad>0){ //Si cantidad es mayor a 0, hay prestamos registrados con esa categoria
  700.             cout<<"La cantidad de prestamos activos de la categoria ";
  701.             cout<<title(descripcion_categoria);
  702.             cout<<" es: ";                 //Se imprime, la descripcion de la categoria y cuantos prestamos tiene adjudicados
  703.             cout<<cantidad<<endl;
  704.         }
  705.         if(cantidad==0){ //Si cantidad es 0 no hay prestamos registrados con esa categoria
  706.             limpiar(); //Se imprime el mensaje de error
  707.             cout<<"La categoria de la cual desea saber la cantidad de prestamos activos no tiene ninguno"<<endl;
  708.         }
  709.     }
  710.     else if(existe==false){ //Si existe sigue siendo false a este punto, no existe la categoria
  711.         cout<<"La categoria que desea no existe"<<endl;
  712.     }
  713. }
  714.  
  715. void imprimirOrdenCategoria(nodoprestamo* inicio)
  716. {
  717.     // Funcion imprimirPorCategoria
  718.     // PROPOSITO: Imprimir lista de prestamos por orden categoria
  719.     // PARAMETROS: el inicio de la lista
  720.     // RETORNO: Void, no retorna
  721.  
  722.     int cantidad=0; //Se crea un int para temas visuales
  723.     nodoprestamo* aux=new nodoprestamo; //Se crea un nodo auxiliar para recorrer la lista de prestamos
  724.     for (int i = 0; i < cantidad_categorias; i++)
  725.     {
  726.         aux=inicio;//Se iguala a inicio, para siempre recorrer la lista desde el principio en cada vuelta del for
  727.         cantidad=1; //Cantidad=1 para grafico
  728.         if(aux!=NULL){//Si la lista no esta vacia
  729.             cout << "Los prestamos de " << categorias[i].descripcion << " son: " << endl;//Se imprime la descripcion de categoria
  730.             while(aux!=NULL){ //Se recorre la lista
  731.                 if(aux->prestamo.codigo_categoria==categorias[i].codigo_categoria && aux->prestamo.estado==true){
  732.                     cout<<cantidad; //Y si se cumple la condicion se imprime cantidad y la descripcion de cada prestamo con la categoria deseada
  733.                     cout<<". ";
  734.                     cout<<aux->prestamo.descripcion<<endl;
  735.                     cantidad++;
  736.                 }
  737.                 aux=aux->siguiente;
  738.             }
  739.             delete aux; //Se borra aux
  740.             if(cantidad==1){
  741.                 cout<<"La categoria no presenta ningun prestamo activo registrado!"<<endl;//Si cantidad sigue siendo 1 no hay prestamos de esa categoria
  742.             }
  743.         }
  744.         else{//Si aux==NULL se para a avisar al usuario que no hay prestamos registrados
  745.             cout<<"No se encuentra ningun prestamo registrado!"<<endl;
  746.             delete aux;//Se borra aux
  747.         }
  748.     }
  749. }
  750.  
  751. void imprimirOrdenPrestatario(nodoprestamo* inicio)
  752. {
  753.     // Funcion imprimirPorCategoria
  754.     // PROPOSITO: Imprimir lista de prestamos por orden prestatario
  755.     // PARAMETROS: El puntero al inicio de la lista de prestamos
  756.     // RETORNO: Void, no retorna
  757.  
  758.     int cantidad = 1; //Cantidad con una funcion parecida a la funcion anterior
  759.     nodoprestamo* aux=new nodoprestamo;//Se crea un nodo aux para recorrer
  760.     for (int i = 0; i < cantidad_prestatarios; i++)
  761.     {
  762.         aux=inicio;//funcionalidad muy parecida a la anterior
  763.         cantidad=1;
  764.         if(aux!=NULL){
  765.             cout << "Los prestamos de " << title(prestatarios[i].nombre) <<" "<< title(prestatarios[i].apellido) << " son: " << endl;
  766.             while(aux!=NULL){ //Lo unico que cambiarira es como se imprimen y que condicion tiene el if
  767.                 if(aux->prestamo.prestatario==prestatarios[i].codigo_prestatario && aux->prestamo.estado==true){
  768.                     cout<<cantidad;
  769.                     cout<<". ";
  770.                     cout<<aux->prestamo.descripcion<<endl;
  771.                     cantidad++;
  772.                 }
  773.                 aux=aux->siguiente;
  774.             }
  775.             delete aux;
  776.             if(cantidad==1){
  777.                 cout<<"El prestatario no presenta ningun prestamo activo registrado!"<<endl;
  778.             }
  779.         }
  780.         else{
  781.             cout<<"No se encuentra ningun prestamo registrado!"<<endl;
  782.             delete aux;
  783.         }
  784.     } //La funcion tiene el mismo procedimiento que imprimirOrdenCategoria
  785. }
  786.  
  787.  
  788.  
  789. /*
  790. ======================
  791.      FUNCION MAIN
  792. ======================
  793. */
  794.  
  795. int main()
  796. {
  797.     nodoprestamo* inicio=new nodoprestamo; //Se crea el nodo para el inicio de la lista de prestamos
  798.     inicio=NULL; //Se iguala a NULL para expresar que esta vacia
  799.     char seleccion, seleccionA, seleccionB, seleccionC;                                                                  // variables donde se almacenara la opcion del usuario
  800.     string categoriaAgregar, categoriaModificar, categoriaEliminar;                                                      // variables donde se almacenara los datos del usuario del inciso A
  801.     string nombrePrestatario, apellidoPrestatario, nombreModificar, apellidoModificar, nombreEliminar, apellidoEliminar; // variables donde se almacenara los datos del usuario del inciso A
  802.     string seleccionMenuB, ingresarCategoriaB, agregarNombreB, agregarApellidoB, descripcionPrestamoB;                   // Variables utilizadas en inciso B
  803.     string seleccionMenuC, opcion_c;
  804.     ; // Variables usadas en el inciso C
  805.  
  806.     // Menu principal, loopeado mediante un do/while
  807.  
  808.     do
  809.     {                                            // Do del menu principal, para permitir volver al menu tras realizada cualquier opcion del menu
  810.         cout << "\nBienvenido al menu!" << endl; // Se muestra el menu mediante un COUT
  811.         cout << "\nA: Administrar y consultar Categorias y Prestatarios." << endl;
  812.         cout << "B: Administrar Prestamos." << endl;
  813.         cout << "C: Consultar Prestamos." << endl;
  814.         cout << "D: Salir." << endl;
  815.         cout << "\nElija la opcion a utilizar: ";
  816.         cin >> seleccion; // CIN ingresa la opcion deseada
  817.  
  818.         seleccion = toupper(seleccion); // convertimos la letra en mayusculas para que sea indiferente el ingreso de mayuscula o minuscula
  819.  
  820.         switch (seleccion)
  821.         {
  822.         case 'A':      // PRIMER CASO DEL MENU PRINCIPAL
  823.             limpiar(); // LIMPIA PANTALLA DEL MENU PRINCIPAL
  824.             do
  825.             { // Do del menu de la opcion A, para permitir volver al menu tras realizada cualquier seleccion
  826.                 cout << "\nOPCION A: Administracion y consulta de Categorias y Prestatarios!" << endl;
  827.                 cout << "\nA: Agregar categoria." << endl;
  828.                 cout << "B: Modificar categoria." << endl;   // Se pone en pantalla las opciones del apartado
  829.                 cout << "C: Eliminar categoria." << endl;    // Administracion y consultas de categorias
  830.                 cout << "\nD: Agregar prestatario." << endl; // Con un funcionamiento casi igual al principal
  831.                 cout << "E: Modificar prestatario." << endl; // Permite ingresar al usuario otra opcion del menu
  832.                 cout << "F: Eliminar prestatario." << endl;  // Y como en el principal, se comprueba si la opcion ingresada
  833.                 cout << "\nG: Volver al menu principal." << endl;
  834.                 cout << "\nElija la opcion a utilizar: "; // Es o no correcta.
  835.                 cin >> seleccionA;
  836.  
  837.                 seleccionA = toupper(seleccionA);
  838.  
  839.                 switch (seleccionA)
  840.                 {
  841.                 case 'A':
  842.                     limpiar();
  843.                     cout << "\nOPCION A: Ingrese la categoria a agregar: "; // Se pide la categoria a agregar
  844.                     getline(cin >> ws, categoriaAgregar);                   // Se ingresa en la variable
  845.                     limpiar();                                              // Limpia pantalla
  846.                     cout << agregarCategoria(categoriaAgregar) << endl;     // Se ejecuta la funcion que la agrega en el struct
  847.                     break;
  848.                 case 'B':
  849.                     limpiar();
  850.                     if(cantidad_categorias==0){
  851.                         cout<<"No se encuentran categorias registradas"<<endl; //Se comprueba si hay categorias registradas para ahorrar errores
  852.                         break;
  853.                     }
  854.                     else{                      
  855.                         imprimirCategorias(categorias,cantidad_categorias);       //Se muestran las categorias existentes
  856.                         cout << "\nOPCION B: Ingrese la descripcion de la categoria a modificar: "<<endl; // Se pide categoria a modificar
  857.                         getline(cin >> ws, categoriaModificar);                   // Se ingresa en la variable para ser modificada                                                                   // Limpia pantalla
  858.                         cout << modificarCategoria(categoriaModificar) << endl;   // Se ejecuta la funcion que modifica la categoria
  859.                         break;
  860.                     }
  861.                 case 'C':
  862.                     limpiar();
  863.                     if(cantidad_categorias==0){
  864.                         cout<<"No se encuentran categorias registradas"<<endl; //Se comprueba si hay categorias registradas para no querer eliminar algo que no existe
  865.                         break;
  866.                     }
  867.                     else{
  868.                         imprimirCategorias(categorias,cantidad_categorias);         //Se muestran las categorias existentes
  869.                         cout << "\nOPCION C: Ingrese la descripcion de la categoria a eliminar: "<<endl;; // Se pide categoria a eliminar
  870.                         getline(cin >> ws, categoriaEliminar);                // Se ingresa la categoria
  871.                         limpiar();                                            // Se limpia pantalla
  872.                         cout << eliminarCategoria(categoriaEliminar,inicio) << endl; // Se elimina la categoria mediante la funcion
  873.                         break;
  874.                     }
  875.                 case 'D':
  876.                     limpiar();
  877.                     cout << "\nOPCION D: Ingrese nombre del prestatario: ";                     // Se pide el nombre del prestatario
  878.                     getline(cin >> ws, nombrePrestatario);                                      // Se ingresa el nombre en la variable
  879.                     cout << "\nIngrese appelido del prestatario: ";                             // Se pide el apellido del prestatario
  880.                     getline(cin >> ws, apellidoPrestatario);                                    // Se ingresa el apellido en la variable
  881.                     limpiar();                                                                  // Se limpia pantalla
  882.                     cout << agregarPrestatario(nombrePrestatario, apellidoPrestatario) << endl; // Se procesan los datos en la funcion
  883.                     break;
  884.                 case 'E':
  885.                     limpiar();
  886.                     if(cantidad_prestatarios==0){
  887.                         cout<<"No se encuentran prestatarios registrados"<<endl;
  888.                         break;
  889.                     }
  890.                     else{
  891.                         cout << "\nOPCION E:"<<endl;
  892.                         cout <<" Prestatarios registrados:"<<endl;
  893.                         imprimirPrestatarios(prestatarios,cantidad_prestatarios);
  894.                         cout << "Ingrese nombre a modificar: ";                       // Se pide el nombre del prestatario a modificar
  895.                         getline(cin >> ws, nombreModificar);                                      // Se ingresa el nombre en la variable
  896.                         cout << "\nIngrese apellido a modificar: ";                               // Se pide el apellido del prestatario a modificar
  897.                         getline(cin >> ws, apellidoModificar);                                    // Se ingresa el apellido en la variable
  898.                         limpiar();                                                                // Se limpia pantalla
  899.                         cout << modificarPrestatario(nombreModificar, apellidoModificar) << endl; // Se modifica el nombre y apellido del prestatario mediante la funcion
  900.                         break;
  901.                     }
  902.                 case 'F':
  903.                     limpiar();
  904.                     if(cantidad_prestatarios==0){
  905.                         cout<<"No se encuentran prestatarios registrados"<<endl;
  906.                         break;
  907.                     }
  908.                     else{
  909.                         cout<<"OPCION F: "<<endl;
  910.                         cout<<"Prestatarios registrados"<<endl;
  911.                         cout << "Ingrese nombre del prestatario a eliminar: ";       // Se pide el nombre del prestatario a modificar
  912.                         getline(cin >> ws, nombreEliminar);                                    // Se ingresa el nombre en la variable
  913.                         cout << "\nIngrese apellido del prestatario a eliminar: ";             // Se pide el apellido del prestatario a modificar
  914.                         getline(cin >> ws, apellidoEliminar);                                  // Se ingresa el apellido en la variable
  915.                         limpiar();                                                             // Se limpia pantalla
  916.                         cout << eliminarPrestatario(nombreEliminar, apellidoEliminar,inicio) << endl; // Se elimina el prestatario mdeiante la funcion
  917.                         break;
  918.                     }
  919.  
  920.                 case 'G':
  921.                     limpiar();
  922.                     cout << "'G': VOLVIENDO AL MENU PRINCIPAL" << endl; // MUESTRA EN PANTALLA LA OPCION SELECCIONADA Y REGRESA AL MENU PRINCIPAL
  923.                     break;
  924.  
  925.                 default:
  926.                     // EN EL CASO DE QUE INGRESE UNA LETRA ERRONEA, EL PROGRAMA MOSTRARA
  927.                     // ESTE MENSAJE Y LE DEJARA VOLVER A INGRESAR OTRA LETRA
  928.                     limpiar(); // se limpia la pantalla
  929.                     cout << "\nPOR FAVOR, SELECCIONE UNA OPCION VALIDA." << endl;
  930.                     break;
  931.                 }
  932.             } while (seleccionA != 'G');
  933.             break;
  934.  
  935.         case 'B':      // SEGUNDO CASO DEL MENU PRINCIPAL
  936.             limpiar(); // LIMPIA PANTALLA DEL MENU PRINCIPAL
  937.             do
  938.             { // Do del menu B, para permitir volver al menu tras realizada cualquier seleccion
  939.                 cout << "\nOPCION B: Administracion de Prestamos!" << endl;
  940.                 cout << "\nA: Agregar prestamo." << endl;
  941.                 cout << "B: Modificar prestamo." << endl; // Se ponen en pantalla las opciones del la opcion B
  942.                 cout << "C: Eliminar prestamo." << endl;
  943.                 cout << "D: Devolver prestamo." << endl;
  944.                 cout << "\nE: Volver al menu principal." << endl;
  945.                 cout << "\nElija la opcion a utilizar: ";
  946.                 cin >> seleccionB; // Se ingresa la opcion seleccionada
  947.  
  948.                 seleccionB = toupper(seleccionB);
  949.  
  950.                 switch (seleccionB)
  951.                 {
  952.                 case 'A':
  953.                     limpiar();
  954.                     cout << "Desea ver las categorias actuales para su Prestamo?" << endl; // Se pregunta al usuario si desea ver las categorias existentes para su prestamo
  955.                     cout << "S/N: ";
  956.                     cin >> seleccionMenuB; // Se ingresa s o n para si o no respectivamente
  957.                     if (mayuscula(seleccionMenuB) == "S")
  958.                     { // Se comprueba que se elija si
  959.  
  960.                         imprimirObjetos_Categoria(categorias, cantidad_categorias); // Se realizaria la muestra de las categorias para los prestamos
  961.  
  962.                         cout << "Ingrese una categoria para el prestamo: ";
  963.                         cin >> ingresarCategoriaB; // Y le permite ingresar la descripcion de la categoria
  964.                     }
  965.                     else if (mayuscula(seleccionMenuB) == "N")
  966.                     {                                                       // Se comprueba si eligio no
  967.                         cout << "Ingrese una categoria para el prestamo: "; // En caso de que no, se le da la opcion a ingresar una categoria sin ver todas
  968.                         cin >> ingresarCategoriaB;                          // Se ingresa la eleccion
  969.                     }
  970.                     else{
  971.                         cout<<"Ingreso una opcion incorrecta"<<endl;
  972.                         cout<<"Sera devuelto al menu"<<endl;
  973.                         break;
  974.                     }
  975.  
  976.                     cout << "Desea ver los prestatarios ya inscriptos?" << endl; // Se realiza lo mismo que en la pregunta anterior pero con los prestatarios
  977.                     cout << "S/N: ";
  978.                     cin >> seleccionMenuB;
  979.                     if (mayuscula(seleccionMenuB) == "S")
  980.                     { // Caso Si
  981.  
  982.                         imprimirPrestatarios(prestatarios, cantidad_prestatarios); // Se realizaria la muestra de los prestatarios
  983.  
  984.                         cout << "Ingrese el nombre del prestatario para el prestamo: "; // Se pide el nombre del prestatario
  985.                         cin >> agregarNombreB;                                          // Se ingresa el nombre
  986.                         cout << "Ingrese el apellido para el prestamo: ";               // Se pide el apellido del prestatario
  987.                         cin >> agregarApellidoB;                                        // Se ingresa
  988.                     }
  989.  
  990.                     // ACLARACION, en la funcion se busca el codigo del prestatario y el codigo de la categoria, para poder almacenar en el struct prestamos
  991.  
  992.                     else if (mayuscula(seleccionMenuB) == "N")
  993.                     {                                                                   // Caso No
  994.                         cout << "Ingrese el nombre del prestatario para el prestamo: "; // Se piden e ingresan directamente nombre y
  995.                         cin >> agregarNombreB;                                          // apellido del prestatario para el prestamo
  996.                         cout << "Ingrese el apellido del prestatario para el prestamo: ";
  997.                         cin >> agregarApellidoB;
  998.                     }
  999.                     else{
  1000.                         cout<<"Ingreso una opcion incorrecta"<<endl;
  1001.                         cout<<"Sera devuelto al menu"<<endl;
  1002.                         break;
  1003.                     }
  1004.                     cout << "Ingrese una descripcion para el prestamo: "; // Se pide ingresar una descripcion al prestamo
  1005.                     cin >> descripcionPrestamoB;                          // Se ingresa
  1006.                     limpiar();
  1007.                     inicio=agregarPrestamo(ingresarCategoriaB, agregarNombreB, agregarApellidoB, descripcionPrestamoB,inicio);
  1008.                     // Se llama a la funcion para agregar prestamo
  1009.                     break;
  1010.  
  1011.                 case 'B':
  1012.                     limpiar();
  1013.                     if(cantidad_prestamos==0){
  1014.                         cout<<"No se encuentran prestamos registrados"<<endl;
  1015.                         break;
  1016.                     }
  1017.                     else{
  1018.                         cout << "\nOPCION B: Ingrese la descripcion del prestamo a modificar: "; // Se le pide al usuario ingresarla
  1019.                         cin >> descripcionPrestamoB;                                             // Se ingresa
  1020.                         limpiar();
  1021.                         modificarPrestamo(descripcionPrestamoB,inicio);
  1022.                         // Se llama a la funcion modificar_prestamo y con el cout se imprime el mensaje de error o no que devuelve la funcion
  1023.                         break;
  1024.                     }
  1025.  
  1026.                 case 'C':
  1027.                     limpiar();
  1028.                     if(cantidad_prestamos==0){
  1029.                         cout<<"No se encuentran prestamos registrados"<<endl;
  1030.                         break;
  1031.                     }
  1032.                     else{
  1033.                         cout << "\nOPCION C: Ingrese la descripcion del prestamo a eliminar: "; // Se pide al usuario
  1034.                         cin >> descripcionPrestamoB;                                            // Se Ingresa
  1035.                         cout << eliminarPrestamo(descripcionPrestamoB,inicio) << endl;                 // Se llama a la funcion con un cout como en los anteriores casos para poder devolver el mensaje de error o lo contrario
  1036.                         break;
  1037.                     }
  1038.  
  1039.                 case 'D':
  1040.                     limpiar();
  1041.                     if(cantidad_prestamos==0){
  1042.                         cout<<"No se encuentran prestamos registrados"<<endl;
  1043.                         break;
  1044.                     }
  1045.                     else{
  1046.                         cout << terminar_prestamo(inicio) << endl;                // Se llama a la funcion con el parametro de la descripcion ingresada y se devuelve el mensaje de correcto o error
  1047.                         break;
  1048.                     }
  1049.  
  1050.                 case 'E':
  1051.                     limpiar();
  1052.                     cout << "'E': VOLVIENDO AL MENU PRINCIPAL" << endl; // MUESTRA EN PANTALLA LA OPCION SELECCIONADA
  1053.                     break;
  1054.  
  1055.                 default:
  1056.                     // EN EL CASO DE QUE INGRESE UNA LETRA ERRONEA, EL PROGRAMA MOSTRARA
  1057.                     // ESTE MENSAJE Y LE DEJARA VOLVER A INGRESAR OTRA LETRA
  1058.                     limpiar(); // se limpia la pantalla
  1059.                     cout << "\nPOR FAVOR, SELECCIONE UNA OPCION VALIDA." << endl;
  1060.                     break;
  1061.                 }
  1062.             } while (seleccionB != 'E');
  1063.             break;
  1064.  
  1065.         case 'C':      // TERCER CASO DEL MENU PRINCIPAL
  1066.             limpiar(); // LIMPIA PANTALLA DEL MENU PRINCIPAL
  1067.             do
  1068.             { // Do del menu de la opcion C, para permitir volver al menu tras realizada cualquier seleccion
  1069.                 cout << "\nOPCION C:Consultas de Prestamos!" << endl;
  1070.                 cout << "\nA: Cantidad de objetos prestados por categoria." << endl;
  1071.                 cout << "B: Listado de prestamos por categoria." << endl; // Se ponen en pantalla las opciones
  1072.                 cout << "C: Listado de prestamos ordenados por prestatario o categoria." << endl;
  1073.                 cout << "D: Prestatarios con objetos en prestamo." << endl;
  1074.                 cout << "\nE: Volver al menu principal." << endl;
  1075.                 cout << "\nElija la opcion a utilizar: ";
  1076.                 cin >> seleccionC; // Se ingresa el numero de opcion
  1077.  
  1078.                 seleccionC = toupper(seleccionC);
  1079.  
  1080.                 switch (seleccionC)
  1081.                 {
  1082.                 case 'A':
  1083.                     limpiar(); // se limpia pantalla
  1084.                     if(cantidad_prestamos==0){
  1085.                         cout<<"No se encuentran prestamos registrados"<<endl;
  1086.                         break;
  1087.                     }
  1088.                     else{
  1089.                         cout << "OPCION A" << endl;
  1090.                         imprimirCategorias(categorias, cantidad_categorias);                                           // imprime las categorias para que los usuarios puedan seleccionar la que desean
  1091.                         cout << "\nIngrese la descripcion de la categoria de la que desea conocer la cantidad de objetos en prestamo: "; // se pide al usuario
  1092.                         getline(cin >> ws, categoriaAgregar);                                                          // se ingresa
  1093.                         cantidad_objetos_categoria(categoriaAgregar,inicio);                                                  // se imprime en pantalla
  1094.                         break;
  1095.                     }
  1096.                 case 'B':
  1097.                     limpiar(); // se limpia pantalla
  1098.                     if(cantidad_prestamos==0){
  1099.                         cout<<"No se encuentran prestamos registrados"<<endl;
  1100.                         break;
  1101.                     }
  1102.                     else{
  1103.                         cout << "OPCION B" << endl;
  1104.                         imprimirCategorias(categorias, cantidad_categorias);                            // imprime las categorias para que los usuarios puedan seleccionar la que desean
  1105.                         cout << "Ingrese la descripcion de la categoria de la que desea conocer los prestamos activos: "; // se pide al usuario
  1106.                         cin >> categoriaAgregar;                                                        // se ingresa
  1107.                         imprimir_prestamos_por_categoria(categoriaAgregar,inicio);                             // se imprime en pantalla
  1108.                         break;
  1109.                     }
  1110.                 case 'C':
  1111.                     limpiar(); // se limpia pantalla
  1112.                     if(cantidad_prestamos==0){
  1113.                         cout<<"No se encuentran prestamos registrados"<<endl;
  1114.                         break;
  1115.                     }
  1116.                     else{
  1117.                         cout << "OPCION C" << endl;
  1118.                         cout << "Desea ver los prestamos ordenados por categoria o por prestatario(C/P): " << endl; // se pregunta al usuario
  1119.                         cin >> opcion_c;                                                                            // se ingresa
  1120.                         if (mayuscula(opcion_c) == "C")                                                             // se verifica
  1121.                         {
  1122.                             imprimirOrdenCategoria(inicio); // se imprime
  1123.                             break;
  1124.                         }
  1125.                         else if (mayuscula(opcion_c) == "P")
  1126.                         {
  1127.                             imprimirOrdenPrestatario(inicio); // se imprime
  1128.                             break;
  1129.                         }
  1130.                         else{
  1131.                             cout<<"Ha ingresado una opcion incorrecta"<<endl;
  1132.                             cout<<"Sera devuelto al menu principal"<<endl;
  1133.                             break;
  1134.                         }
  1135.                     }
  1136.                 case 'D':
  1137.                     limpiar();                    // LIMPIA LA PANTALLA
  1138.                     if(cantidad_prestamos==0){
  1139.                         cout<<"No se encuentran prestamos registrados"<<endl;
  1140.                         break;
  1141.                     }
  1142.                     else{
  1143.                         cout << "\nOPCION D" << endl; // MUESTRA EN PANTALLA
  1144.                         imprimirPrestatarioActivo(inicio);  // SE EJECUTA LA FUNCION QUE MUESTRA LOS PRESTATARIOS ACTIVOS
  1145.                         break;
  1146.                     }
  1147.                 case 'E':
  1148.                     limpiar();
  1149.                     cout << "'E': VOLVIENDO AL MENU PRINCIPAL" << endl; // MUESTRA EN PANTALLA LA OPCION SELECCIONADA
  1150.                     break;
  1151.  
  1152.                 default:
  1153.                     // EN EL CASO DE QUE INGRESE UNA LETRA ERRONEA, EL PROGRAMA MOSTRARA
  1154.                     // ESTE MENSAJE Y LE DEJARA VOLVER A INGRESAR OTRA LETRA
  1155.                     limpiar(); // se limpia la pantalla
  1156.                     cout << "\nPOR FAVOR, SELECCIONE UNA OPCION VALIDA." << endl;
  1157.                     break;
  1158.                 }
  1159.             } while (seleccionC != 'E');
  1160.             break;
  1161.  
  1162.         case 'D':
  1163.             cout << "\nSELECCIONO LA OPCION SALIR." << endl; // MUESTRA EN PANTALLA QUE OPCION SELECCIONO
  1164.             break;
  1165.  
  1166.         default:
  1167.             // EN EL CASO DE QUE INGRESE UNA LETRA ERRONEA, EL PROGRAMA MOSTRARA
  1168.             // ESTE MENSAJE Y LE DEJARA VOLVER A INGRESAR OTRA LETRA
  1169.             limpiar(); // se limpia la pantalla
  1170.             cout << "\nPOR FAVOR, SELECCIONE UNA OPCION VALIDA." << endl;
  1171.             break;
  1172.         }
  1173.     } while (seleccion != 'D');
  1174.  
  1175.     cout << "\nFIN DEL PROGRAMA." << endl; // MUESTRA EN PANTALLA UN MENSAJE DE FIN
  1176.  
  1177.     getch();
  1178.  
  1179.     return 0;
  1180. }
  1181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement