Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Programa C++ repite codigo

Estas en el tema de Programa C++ repite codigo en el foro de C/C++ en Foros del Web. Hola, estoy haciendo este programa con C++ Cita: 1. Escribir un programa que almacene en un array los nombres y números de teléfono de 2 ...
  #1 (permalink)  
Antiguo 23/06/2013, 05:56
Avatar de Aleix_1379  
Fecha de Ingreso: junio-2013
Mensajes: 3
Antigüedad: 10 años, 10 meses
Puntos: 0
Programa C++ repite codigo

Hola, estoy haciendo este programa con C++
Cita:
1. Escribir un programa que almacene en un array los nombres y números de teléfono
de 2 personas. El programa debe leer los datos introducidos por el usuario y
guardarlos en memoria. Después debe ser capaz de buscar el nombre correspondiente
a un número de teléfono y el teléfono correspondiente a una persona. Ambas
opciones deben se accesibles a través de un menú, así como la opción de salir del
programa. El menú debe tener esta forma, más o menos:
a) Buscar por nombre
b) Buscar por número de teléfono
c) Salir
Pulsa una opción:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <string.h>
  3.  
  4. #define MAX 31
  5. #define MP 2
  6.  
  7. using namespace std;
  8. /*-----------------------------------------------------------------------------------------------------------------*/
  9. struct persona {
  10.     char nom[MAX],tel[MAX];
  11.     persona ();
  12. } t[MP];
  13. /*-----------------------------------------------------------------------------------------------------------------*/
  14. char menu ();
  15. void cercar_per_nom ();
  16. void cercar_per_telefon ();
  17. void mostrar_persona (persona p);
  18. void no_trobat (const char p1[],char p2[]);
  19. /*-----------------------------------------------------------------------------------------------------------------*/
  20. int main()
  21. {
  22.     char x;
  23.     do
  24.     {
  25.         x = menu ();
  26.         switch (x)
  27.         {
  28.         case 'a':
  29.             cercar_per_nom ();
  30.             break;
  31.  
  32.         case 'b':
  33.             cercar_per_telefon ();
  34.             break;
  35.         }
  36.     }
  37.     while (x != 'c');
  38.     return 0;
  39. }
  40. /*-----------------------------------------------------------------------------------------------------------------*/
  41. persona::persona()
  42. {
  43.     int i;
  44.     for (i = 0; i < MP; i++)
  45.     {
  46.         cout << "Introdueix el nom i telefon " << " i == " <<i << " < " << MP << " : ";
  47.         cin >> t[i].nom >> t[i].tel;
  48.     }
  49. }
  50. /*-----------------------------------------------------------------------------------------------------------------*/
  51. char menu ()
  52. {
  53.     char x;
  54.     do
  55.     {
  56.         cout << "a) Cercar per nom\nb) Cercar per numero de telefon\nc) Sortir" << endl;
  57.         cin.get(x);
  58.     }
  59.     while (x < 'a' || x > 'c');
  60.     return x;
  61. }
  62. /*-----------------------------------------------------------------------------------------------------------------*/
  63. void cercar_per_nom ()
  64. {
  65.     int i;
  66.     char nom[MAX];
  67.     cout << "Introdueix el nom que vols cercar: ";
  68.     cin >> nom;
  69.     i = 0;
  70.     while (i < MP && strcmp (nom,t[i].nom) != 0) i++;
  71.     if (i == MP) mostrar_persona (t[i]);
  72.     else no_trobat ("nom",nom);
  73.     cin.get();
  74. }
  75. /*-----------------------------------------------------------------------------------------------------------------*/
  76. void cercar_per_telefon()
  77. {
  78.     int i;
  79.     char tel[MAX];
  80.     cout << "Introdueix el telefon pel que vols cercar: ";
  81.     cin >> tel;
  82.     i = 0;
  83.     while (i < MP && strcmp (tel,t[i].tel) != 0) i++;
  84.     if (i == MP) mostrar_persona (t[i]);
  85.     else no_trobat ("telefon",tel);
  86.     cin.get();
  87. }
  88. /*-----------------------------------------------------------------------------------------------------------------*/
  89. void mostrar_persona (persona p)
  90. {
  91.     cout << "Nom: " << p.nom << " Telefon: " << p.tel;
  92. }
  93. /*-----------------------------------------------------------------------------------------------------------------*/
  94. void no_trobat (const char p1[],char p2[])
  95. {
  96.     cout << "No s'ha trobat cap persona amb el " << p1 << " : " << p2;
  97. }
  98. /*-----------------------------------------------------------------------------------------------------------------*/
Primero intento llenar el array con un bucle pero cuando acaba vuelve a empezar.
  #2 (permalink)  
Antiguo 23/06/2013, 08:09
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Programa C++ repite codigo

Esto está mal, es decir está bien pero no funcionará tal como esperas. Para cada declaracion de la estructura 'persona' se ejecuta la llamada a la funcion 'persona()' (el segundo campo de tu struct es una llamada a la funcion); como se da el caso que tienes declarado un array de 2 estructuras pues se ejecuta dos veces la funcion 'persona()' ok?

Código:
#define MP 2

struct persona {
    char nom[MAX],tel[MAX];
    persona ();
} t[MP];
Al hacer t[MP] la aplicacion ejecuta lo siguiente: inicia la carga de t[0], reserva MAX bytes para 'nom' en t[0], reserva MAX bytes para 'tel' en t[0], ejecuta 'persona()', inicia la carga de t[1], reserva MAX bytes para 'nom' en t[1], reserva MAX bytes para 'tel' en t[1] y ejecuta 'persona()'. Si declaras el array con 5 structs veras que la funcion se ejecuta 5 veces.

Lo ideal para eso es llamar a la funcion de inicio desde el main; de momento entras los nombres disponibles manualmente y mas adelante seguramente haras un archivo a modo de agenda. Esta funcion que te carga los datos iniciales no puede estar dentro del struct a menos que el struct sea una clase. Si aun no has trabajado con clases puedes quitar la funcion del struct y llamarla desde el main (o si pones una opcion de recargar):

Código:
typedef struct {
    char nom[MAX];
    char telefon[MAX];
} AGENDA;

AGENDA agenda[MP];


void carrega_agenda() {
    for (int i = 0; i < MP; i++)
    {
        cout << "Introdueix el nom i telefon " << " i == " <<i << " < " << MP << " : ";
        cin >> t[i].nom >> t[i].tel;
    }
}


int main() {
    carrega_agenda();

    do {
        ...
    } while...
    
    return 0;
}
Y ya que estas trabajando en c++ tal vez te interese echar un vistazo (ademas de a las clases) a los vectores, te permitira usar una lista de personas no limitada.

Saludos
vosk
  #3 (permalink)  
Antiguo 23/06/2013, 09:00
Avatar de Aleix_1379  
Fecha de Ingreso: junio-2013
Mensajes: 3
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Programa C++ repite codigo

Gracias, me ha funcionado, el otro problema era que el menú aparecía 2 veces, cuando hacia C esto me pasaba cunado no limpiaba el buffer, en C++ lo he hecho así:
Código C++:
Ver original
  1. cout << "Nombre y teléfono: ";
  2. cin >> t[i].nom >> t[i].tel;
  3. cin.sync();

Si es así, ¿deberia usar cin.sync(); después de cada cin >> ?

Gracias
  #4 (permalink)  
Antiguo 23/06/2013, 13:57
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Programa C++ repite codigo

Es una opcion, pero sync no solo se aplica al buffer de entrada. En c++ puedes limpiar el buffer de entrada igual que en C, o puedes usar la version de c++ (a fin de cuentas es lo mismo: leer hasta que no quede nada):

Código:
void fflush_stdin_c() {
    char c;
    while ((c = getchar()) != EOF && c != '\n');
}

void fflush_stdin_cpp_versio1() {
    char c;
    while((c = cin.get() ) != EOF && c != '\n');
}

void fflush_stdin_cpp_versio2() {
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Si buscas un poco por ahi seguro que encuentras mas variantes para el flush de stdin.

Saludos
vosk
  #5 (permalink)  
Antiguo 23/06/2013, 14:53
Avatar de Aleix_1379  
Fecha de Ingreso: junio-2013
Mensajes: 3
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Programa C++ repite codigo

Gracias ;)
  #6 (permalink)  
Antiguo 24/06/2013, 04:12
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Programa C++ repite codigo

C++ no necesita limpiar el buffer.
  #7 (permalink)  
Antiguo 24/06/2013, 08:44
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Programa C++ repite codigo

Buena observacion :))

Etiquetas: int, programa, repite, string, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:58.