Agenda C++ (Modificaciones)

Iniciado por Exorcista12, 26 Mayo 2014, 04:21 AM

0 Miembros y 1 Visitante están viendo este tema.

Exorcista12

Saludos a todos, he desarrollado este código pero no puedo hacerlo funcionar bien quizás la lógica que aplico es errónea, como podría hacer que el código funcione de manera correcta?

Tuve que Desarrollar una pequeña agenda con la siguiente estructura:

id_registro
Nombre
Apellido
Celular

y desarrollar las siguientes funciones para la administración:

ingresarRegistro()
eliminarRegistro()
modificarRegistro()
imprimirTodoRegistro()

Adjunto el código que llevo al momento. De antemano muchas Gracias a los que deseen ayudarme.



#include <iostream>
#include <cstring>

using namespace std;


struct Persona {

char Nombre[65];
char apellido[65];
char numcel[65];


}plantilla[100];


void ingresarRegistro();
void imprimirRegistro();
void modificarRegistro();
void eliminarRegistro();

int camb=0;
int copiar;


int main() {

   int opc;

   do{

               cout<<"MENU"<<endl;
      cout<<"1.Agregar Registro"<<endl;
               cout<<"2.Eliminar Registro"<<endl;
               cout<<"3.Modificar Registro"<<endl;
               cout<<"4.Imprimir Registro"<<endl;
               cout<<"5.Salir"<<endl;
      
               cin>>opc;
   
      switch(opc){
      case 1:
         ingresarRegistro();
         break;
      case 2:
         eliminarRegistro;
         
         break;
      case 3:
         modificarRegistro();
         
         break;
                           
                case 4:
                       imprimirRegistro();
                       
                       break;
                     
      }
   }while(opc!=5);

   return 0;
}
   
int cont=0;

void ingresarRegistro(){

 
   int r,f;
   
   r=cont++;
   
   
   if (camb==1)
   {
               r--;
               f=r+1;
             
   cout<< "Agregue el nombre del nuevo contacto: ";
   cin>> plantilla[f].Nombre;
   cout<<endl;
   
   cout<< "Agregue el apellido del nuevo contacto: ";
   cin>> plantilla[f].apellido;
   cout<<endl;
   
   cout<< "Agregue el numero movil del nuevo contacto: ";
   cin>> plantilla[f].numcel;
   cout<<endl;
                                   strcpy(plantilla[r].Nombre,plantilla[f].Nombre);
                                   strcpy(plantilla[r].apellido,plantilla[f].apellido);
                                   strcpy(plantilla[r].numcel,plantilla[f].numcel);
                                   copiar++;
                                       
   }
   
   cout<< "Agregue el nombre del nuevo contacto: ";
   cin>> plantilla[r].Nombre;
   cout<<endl;
   
   cout<< "Agregue el apellido del nuevo contacto: ";
   cin>> plantilla[r].apellido;
   cout<<endl;
   
   cout<< "Agregue el numero movil del nuevo contacto: ";
   cin>> plantilla[r].numcel;
   cout<<endl;

}

// Imprime 20 valores inecesarios

void imprimirRegistro(){
 
  int tr, a, r;
   
     cout<< "Lista de Contactos: ";
     cout<< endl;
     
     if (cont==0)
     {
              cout<< "Lista de contactos vacia.";
              cout<<endl;
             
              } else {
     
   
     for(a=0;a<r+1;a++)
  {
     tr=a;
     
     cout<< tr+1<< ". ";
     cout<< plantilla[a].Nombre;
     cout<<endl;
    }
     
    }
   
}

void modificarRegistro(){
   
   int a, tr,val, mod,g,r,rep;
   
cout<< "Lista de Contactos: ";
     cout<< endl;
     
     if (cont==0)
     {
              cout<< "Lista de contactos vacia.";
              cout<<endl;
         
              } else {
     
   
     for(a=0;a<r+1;a++)
     
  {
     tr=a;
     
     cout<< tr+1<< ". ";
     cout<< plantilla[a].Nombre;
     cout<<endl;
    }
                    }
     
                    cout<<"Seleccione el numero del contacto que desea modificar: ";
                    cin>>val;
                    mod=val-1;
                    g=r+1;
                 
                    int op1;
                   
                   if (val<=g)
                    {
                             
                    do
                    {
                 
                    cout<<"Contacto:"<<endl;
                    cout<<"1. Nombre: "<<plantilla[mod].Nombre<<endl;
                    cout<<"2. Apellido: "<<plantilla[mod].apellido<<endl;
                    cout<<"3. Numero Movil: "<<plantilla[mod].numcel<<endl;
                    cout<<"4. Menu anterior."<<endl;
                    cout<<"Seleccione la opcion que desea modificar: ";
                    cin>>op1;
                    switch (op1)
                    {
                           case 1:
                                cout<< "Modifique el nombre del contacto: ";
                                cin>> plantilla[mod].Nombre;
                                cout<<endl;
                                break;
                           case 2:
                                cout<< "Modifique el apellido del contacto: ";
                                cin>> plantilla[mod].apellido;
                                cout<<endl;
                                break;
                           case 3:
                                cout<< "Modifique el numero de movil del contacto: ";
                                cin>> plantilla[mod].numcel;
                                cout<<endl;
                                break;
                           case 4:
                                rep=1;
                                break;
                           }
                    }while (rep==0);
                    }else {cout<<"El contacto no existe."<<endl;
                         
                    rep=0;

                    }
}

void eliminarRegistro(){
   
   int del;
  int delm;
  int h;
  int rsp2;
  int copiar;
  int a1;
  int r, tr, a;
 
   
        cout<< "Lista de Contactos: ";
     cout<< endl;
     
     if (cont==0)
     {
              cout<< "Lista de contactos vacia.";
              cout<<endl;
             
              } else {
     
   
     for(a=0;a<r+1;a++)
     
  {
     tr=a;
     
     cout<< tr+1<< ". ";
     cout<< plantilla[a].Nombre;
     cout<<endl;
    }
                    }
                   
                    cout<<"Seleccione el numero del contacto que desea eliminar: ";
                    cin>>del;
                    delm=del-1;
                    h=r+1;
                     
                    if (del<=h)
                    {
                             
                               cout<< "Estas seguro que deseas borar el contacto selecionado?"<<endl;
                               cout<< "Nombre: "<<plantilla[delm].Nombre<<endl;
                               cout<< "Apellido: "<<plantilla[delm].apellido<<endl;
                               cout<< "Numero Movil: "<<plantilla[delm].numcel<<endl;
                                cout<< "1.Si                    2.No"<<endl;
                               
                               cin>>rsp2;
                               cout<<endl;
                               
                               if (rsp2==1)
                               {
                               
                               strcpy(plantilla[delm].Nombre,"\0");
                               strcpy(plantilla[delm].apellido,"\0");
                               strcpy(plantilla[delm].numcel,"\0");
                               
                               copiar=delm;
                               for (a1=delm;a1<r+1;a1++)
                               {
                                   strcpy(plantilla[copiar].Nombre,plantilla[copiar+1].Nombre);
                                   strcpy(plantilla[copiar].apellido,plantilla[copiar+1].apellido);
                                   strcpy(plantilla[copiar].numcel,plantilla[copiar+1].numcel);
                                   copiar++;
                                   
                               }
                               r=cont-2;
                               camb=1;
                               
                               
                               } else {
                               }
                               
                    }else {cout<<"El contacto no existe."<<endl;
                           
                           }
}



eferion

La próxima vez, te lo pido por favor, usa las etiquetas GeSHi para que el código quede legible.

Más o menos así:

Código (cpp) [Seleccionar]

#include <iostream>
#include <cstring>

using namespace std;


struct Persona {

char Nombre[65];
char apellido[65];
char numcel[65];


}plantilla[100];


void ingresarRegistro();
void imprimirRegistro();
void modificarRegistro();
void eliminarRegistro();

int camb=0;
int copiar;


int main() {

    int opc;

   do{

                cout<<"MENU"<<endl;
      cout<<"1.Agregar Registro"<<endl;
                cout<<"2.Eliminar Registro"<<endl;
                cout<<"3.Modificar Registro"<<endl;
                cout<<"4.Imprimir Registro"<<endl;
                cout<<"5.Salir"<<endl;
     
                cin>>opc;
   
      switch(opc){
      case 1:
         ingresarRegistro();
         break;
      case 2:
         eliminarRegistro;
         
         break;
      case 3:
         modificarRegistro();
         
         break;
                           
                 case 4:
                        imprimirRegistro();
                       
                        break;
                     
      }
   }while(opc!=5);

   return 0;
}
   
int cont=0;

void ingresarRegistro(){

   
    int r,f;
   
    r=cont++;
   
   
    if (camb==1)
    {
                r--;
                f=r+1;
               
    cout<< "Agregue el nombre del nuevo contacto: ";
    cin>> plantilla[f].Nombre;
    cout<<endl;
   
    cout<< "Agregue el apellido del nuevo contacto: ";
    cin>> plantilla[f].apellido;
    cout<<endl;
     
    cout<< "Agregue el numero movil del nuevo contacto: ";
    cin>> plantilla[f].numcel;
    cout<<endl;
                                    strcpy(plantilla[r].Nombre,plantilla[f].Nombre);
                                    strcpy(plantilla[r].apellido,plantilla[f].apellido);
                                    strcpy(plantilla[r].numcel,plantilla[f].numcel);
                                    copiar++;
                                       
    }
   
    cout<< "Agregue el nombre del nuevo contacto: ";
    cin>> plantilla[r].Nombre;
    cout<<endl;
   
    cout<< "Agregue el apellido del nuevo contacto: ";
    cin>> plantilla[r].apellido;
    cout<<endl;
     
    cout<< "Agregue el numero movil del nuevo contacto: ";
    cin>> plantilla[r].numcel;
    cout<<endl;

}

// Imprime 20 valores inecesarios

void imprimirRegistro(){
   
   int tr, a, r;
   
      cout<< "Lista de Contactos: ";
      cout<< endl;
     
      if (cont==0)
      {
               cout<< "Lista de contactos vacia.";
               cout<<endl;
               
               } else {
     
     
      for(a=0;a<r+1;a++)
   {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
     }
     
     }
   
}

void modificarRegistro(){
   
    int a, tr,val, mod,g,r,rep;
   
cout<< "Lista de Contactos: ";
      cout<< endl;
     
      if (cont==0)
      {
               cout<< "Lista de contactos vacia.";
               cout<<endl;
           
               } else {
     
     
      for(a=0;a<r+1;a++)
     
   {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
     }
                     }
     
                     cout<<"Seleccione el numero del contacto que desea modificar: ";
                     cin>>val;
                     mod=val-1;
                     g=r+1;
                   
                     int op1;
                     
                    if (val<=g)
                     {
                             
                     do
                     {
                   
                     cout<<"Contacto:"<<endl;
                     cout<<"1. Nombre: "<<plantilla[mod].Nombre<<endl;
                     cout<<"2. Apellido: "<<plantilla[mod].apellido<<endl;
                     cout<<"3. Numero Movil: "<<plantilla[mod].numcel<<endl;
                     cout<<"4. Menu anterior."<<endl;
                     cout<<"Seleccione la opcion que desea modificar: ";
                     cin>>op1;
                     switch (op1)
                     {
                            case 1:
                                 cout<< "Modifique el nombre del contacto: ";
                                 cin>> plantilla[mod].Nombre;
                                 cout<<endl;
                                 break;
                            case 2:
                                 cout<< "Modifique el apellido del contacto: ";
                                 cin>> plantilla[mod].apellido;
                                 cout<<endl;
                                 break;
                            case 3:
                                 cout<< "Modifique el numero de movil del contacto: ";
                                 cin>> plantilla[mod].numcel;
                                 cout<<endl;
                                 break;
                            case 4:
                                 rep=1;
                                 break;
                            }
                     }while (rep==0);
                     }else {cout<<"El contacto no existe."<<endl;
                         
                     rep=0;

                     }
}

void eliminarRegistro(){
   
    int del;
   int delm;
   int h;
   int rsp2;
   int copiar;
   int a1;
   int r, tr, a;
   
   
         cout<< "Lista de Contactos: ";
      cout<< endl;
     
      if (cont==0)
      {
               cout<< "Lista de contactos vacia.";
               cout<<endl;
             
               } else {
     
     
      for(a=0;a<r+1;a++)
     
   {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
     }
                     }
                     
                     cout<<"Seleccione el numero del contacto que desea eliminar: ";
                     cin>>del;
                     delm=del-1;
                     h=r+1;
                     
                     if (del<=h)
                     {
                             
                                cout<< "Estas seguro que deseas borar el contacto selecionado?"<<endl;
                                cout<< "Nombre: "<<plantilla[delm].Nombre<<endl;
                                cout<< "Apellido: "<<plantilla[delm].apellido<<endl;
                                cout<< "Numero Movil: "<<plantilla[delm].numcel<<endl;
                                 cout<< "1.Si                    2.No"<<endl;
                               
                                cin>>rsp2;
                                cout<<endl;
                               
                                if (rsp2==1)
                                {
                               
                                strcpy(plantilla[delm].Nombre,"\0");
                                strcpy(plantilla[delm].apellido,"\0");
                                strcpy(plantilla[delm].numcel,"\0");
                               
                                copiar=delm;
                                for (a1=delm;a1<r+1;a1++)
                                {
                                    strcpy(plantilla[copiar].Nombre,plantilla[copiar+1].Nombre);
                                    strcpy(plantilla[copiar].apellido,plantilla[copiar+1].apellido);
                                    strcpy(plantilla[copiar].numcel,plantilla[copiar+1].numcel);
                                    copiar++;
                                   
                                }
                                r=cont-2;
                                camb=1;
                               
                               
                                } else {
                                }
                               
                     }else {cout<<"El contacto no existe."<<endl;
                           
                            }
}


Ahora, con respecto a tus dudas:

* C++ dispone de una clase "string", esta clase es mucho más potente y segura que char*, te recomiendo sustituirlo:

Código (cpp) [Seleccionar]

struct Persona
{
  string nombre;
  string apellido;
  string numcel;
};


* No uses variables globales, intenta evitar su uso ya que dan más problemas que beneficios. Es preferible pasar los valores como argumentos de la función.

En tu caso, por ejemlo, puedes valerte del contenedor "vector" para controlar el tamaño de la plantilla:

Código (cpp) [Seleccionar]


int main( )
{
  std::vector< Persona > plantilla;

  // nuevo elemento
  Persona nuevo;
  nuevo.nombre = "Carlos";
  nuevo.apellido = "Sastre";
  plantilla.push_back( nuevo );

  // Numero de elementos
  int numElementos = plantilla.size( );
}


* No tiene ningún sentido que uses varias variables para lo mismo:

Código (cpp) [Seleccionar]

void imprimirRegistro()
{
  int tr, a, r;
   
  cout<< "Lista de Contactos: ";
  cout<< endl;
     
  if (cont==0)
  {
    cout<< "Lista de contactos vacia.";
    cout<<endl;
  }
  else
  {
    for(a=0;a<r+1;a++)
    {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
    }
  }
}


tr = a?? para qué? eso sobra.

y si te das cuenta, r no se inicializa nunca... aunque claro, con ese nombre que no significa nada tampoco parece algo obvio.

Y no es la única vez en la que haces esto:

Código (cpp) [Seleccionar]

                     cout<<"Seleccione el numero del contacto que desea modificar: ";
                     cin>>val;
                     mod=val-1;
                     g=r+1; // Antes de este punto, r no esta inicializada


Además, qué siginifica mod??? y g??? y r??? usa nombres que tengan relación con el uso que vaya a recibir la variable, tu código será mucho más legible... eso y tabularlo con criterio.

* Reutiliza código. Tanto en modificarRegistro como en eliminarRegistro imprimes la plantilla... algo que ya está hecho en imprimirRegistro. Quita ese código duplicado y llama a ésta función:

Un ejemplo de cómo quedaría la función eliminarRegistro usando la clase vector y reutilizando código:

Código (cpp) [Seleccionar]

void eliminarRegistro( std::vector< Persona >& plantilla )
{
  imprimirRegistro( plantilla );

  if ( !plantilla.empty( ) )
  {
    int indice;
    cout<<"Seleccione el numero del contacto que desea eliminar: ";
    cin>> indice;

    if ( indice > 0 && indice <= plantilla.size( ) )
    {
      cout<< "Estas seguro que deseas borar el contacto selecionado?"<<endl;
      cout<< "Nombre: "<<plantilla[ indice - 1 ].Nombre<<endl;
      cout<< "Apellido: "<<plantilla[ indice - 1 ].Apellido<<endl;
      cout<< "Numero Movil: "<<plantilla[ indice - 1 ].Numcel<<endl;
      cout<< "1.Si                    2.No"<<endl;

      int respuesta;
      cin>>respuesta;

      if (respuesta == 1 )
      {
        auto it = plantilla.begin( ) + indice - 1;
        plantilla.erase( it );
      }
    }
    else
    {
      cout<<"El contacto no existe."<<endl;
    }
  }
}


Exorcista12

#2

Saludos y gracias por responder, la parte del código que mencionaste me presentan dudas:
Este tiene que ir dentro de la función main?? Si es así en que parte del código debe ir porque si pudiste ver mi código utiliza una especie de menú que accede a cada función que he creado, este código en que opción va?? o funciona de manera independiente?. Gracias

Código (cpp) [Seleccionar]

   std::vector< Persona > plantilla;
  // nuevo elemento
  Persona nuevo;
  nuevo.Nombre = "Carlos";
  nuevo.apellido = "Sastre";
  plantilla.push_back( nuevo );

eferion

Es un simple código de ejemplo para que vieses cómo funciona el contenedor. No tienes que ponerlo en ninguna parte de tu código.