Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/03/2016, 03:15
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: headers, carpetas y menúes c++

Código C++:
Ver original
  1. struct persona lista[20];
  2.     int maxIdP = 0;
  3.     int lastP = 0;
  4.     int ind = 0;

¿Variables globales? Evítalas salvo que sea imperativo usarlas... y en un programa de 200 líneas dudo mucho que sea imprescindible tirar de variables globales.

Una forma de eliminar algunas variables globales:

Código C++:
Ver original
  1. int getMaxIdP(){
  2.   static int maxIdp = 0;
  3.   return ++maxIdP;
  4. }

Además, No tiene demasiado sentido que esperes a que el nuevo registro se añada definitamente a la lista para actualizar maxIdp... int, para el uso particular que tienen estos identificadores, tiene un rango lo suficientemente amplio como para poder desaprovechar valores.

Aunque también, puestos a simplificar el código, yo pasaría de los arreglos tipo C y consideraría el uso de contenedores. Como ventaja principal que no te tienes que preocupar del número de elementos en el contenedor. Hablando del número de elementos... ¿Compruebas en algún punto que no se intentan meter más de 20 elementos en la lista?

Código C++:
Ver original
  1. std::vector<persona> lista;

Por cierto, nota que en C++ no hace falta poner "struct" a la hora de declarar elementos de tipo "persona". Aunque compile no es necesario en C++... al no ser necesario podemos decir que no aporta absolutamente nada al código, luego lo mejor es eliminarlo para tener un código lo más limpio posible. Otro detalle respecto a este punto es que en C++, como norma general, las clases y estructuras se suelen nombrar con la primera letra en maýusculas. Es una pequeña pijotada pero ayuda a leer mejor el código.

Código C++:
Ver original
  1. void menu(){
  2.   // ...
  3.   menu();
  4. }

¿De verdad es necesario que menu se llame a sí misma de forma recursiva? ¿No conoces los bucles tipo while o do-while?

Código C++:
Ver original
  1. void menu(){
  2.   while(true)
  3.   {
  4.     // ...
  5.   }
  6. }

Y pasando un poco a la chicha del programa:

Código C++:
Ver original
  1. persona getRow(std::string xnom){
  2.     persona p;
  3.     for (int i=0; i< lastP; i++){
  4.         if(lista[i].nom == xnom){
  5.             p = lista[i];
  6.             break;
  7.         }
  8.     }
  9.     return p;
  10. }
  11.  
  12. void updated(){  
  13.   // ...
  14.   p = getRow(xnom);
  15.     std::cout << "\n Persona: " << p.id << " Nombre: " << p.nom << " Apellido: " << p.ape;
  16.     std::cout << "\n ¿Desea algún dato? Aceptar=1/Cancelar=2 :";
  17. }

¿Por qué asumes que el usuario va a introducir un nombre válido? ¿No puede equivocarse?

Por otro lado... si tu idea es simplificar el código... ¿Por qué no dejas a la STL hacer su trabajo?

Código C++:
Ver original
  1. // Lo suyo sería devolver un puntero... si el puntero es nulo es que no se ha encontrado el registro.
  2. persona* getRow(std::string xnom){
  3.     persona* toReturn = nullptr; // inicialización de puntero nulo
  4.  
  5.     auto it = std::find_if(std::begin(lista),std::end(lista),
  6.                                      [&xnom](const presona& p)
  7.                                      { return p.nom == xnom; });
  8.    
  9.     if( it != std::end(lista) )
  10.       toReturn = &(*it); // it
  11.     return p;
  12. }

Aun así tendrías que lidiar con situaciones como... ¿Qué sucede si el usuario únicamente quiere cambiar el apellido? Ahora mismo el programa te va a decir que la persona ya existe y no va a actualizarlo.

Para borrar elementos de la lista tienes problemas similares que deberías corregir.

Más posibles mejoras:

Código C++:
Ver original
  1. bool check(const persona& p){
  2.   int num_reg = std::count_if(std::begin(lista),std::end(lista),
  3.                               [&p](const persona& p2)
  4.                               { return p2.nom == p.nom; });
  5.  
  6.   return num_reg > 0;
  7. }

Código C++:
Ver original
  1. bool create(const persona& p){
  2.   bool toReturn = false;
  3.  
  4.   if(!check(p)){
  5.       // Esta línea...
  6.       lista[lastP] = p;
  7.       // ...con std::vector podría quedar tal que
  8.       lista.push_back(p);
  9.  
  10.       lastP++; // Esto con contenedores no es necesario
  11.       upMaxIdP(); // Si haces caso de lo que te he dicho antes esta línea también sobra
  12.       toReturn = true;
  13.   }
  14.  
  15.   return toReturn;
  16. }

Y bueno aquí tienes algunas guías para mejorar tu código, el resto, dado que hay que tomar decisiones respecto al diseño, es cosa tuya.

PD.: find_if, count_if forman parte de la librería algorithm.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.