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

Problema con estructura

Estas en el tema de Problema con estructura en el foro de C/C++ en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include<iostream> #include<stdio.h> #include <stdlib.h> #include <time.h>     using namespace std ;   struct clientes     {   ...
  #1 (permalink)  
Antiguo 22/11/2012, 17:40
 
Fecha de Ingreso: agosto-2012
Ubicación: Alcalá
Mensajes: 37
Antigüedad: 12 años, 3 meses
Puntos: 0
Problema con estructura

Código C++:
Ver original
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. struct clientes
  10.     {
  11.         char nombre [50];  
  12.         int numero_unidades;
  13.         float precio;
  14.         char estado; //p: pagado, m: moroso, a: atrasado
  15.     }c1;
  16.    
  17. void leer_clientes (clientes c1)
  18. {
  19.  
  20.  
  21.     cout<<"Introduzca el nombre del cliente: ";
  22.     cin.getline(c1.nombre, 50);
  23.     cout<<"Introduzca el numero de unidades: ";
  24.     cin>>c1.numero_unidades;
  25.     cout<<"Introduzca el precio: ";
  26.     cin>>c1.precio;
  27.     cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  28.     cin>>c1.estado;
  29.    
  30. }
  31. void escribe_clientes (clientes c1)
  32. {
  33.      cout <<"Nombre del cliente: "<<c1.nombre<<endl;
  34.      cout <<"Numero de unidades: "<<c1.numero_unidades<<endl;
  35.      cout <<"Precio: "<<c1.precio<<" €"<<endl;
  36.      cout <<"Estado: ";
  37.      switch (c1.estado)
  38.        {
  39.         case 'p': cout <<"pagado"; break;
  40.         case 'm': cout <<"moroso"; break;
  41.         case 'a': cout <<"atrasado"; break;                
  42.        }
  43.      cout<<endl;
  44.      
  45. }
  46.  
  47. int main()
  48. {  
  49.    
  50.    
  51.      leer_clientes (c1);
  52.      escribe_clientes (c1);
  53.  
  54.    
  55.     system("PAUSE");
  56.     return EXIT_SUCCESS;
  57.  
  58. }

No sé cuál es el fallo. Compila bien, me pide los 4 datos (nombre, número unidades, precio y estado) pero luego no lo escribe, sale malamente..

Alguna idea? Gracias :)
  #2 (permalink)  
Antiguo 22/11/2012, 18:46
 
Fecha de Ingreso: noviembre-2012
Mensajes: 24
Antigüedad: 12 años
Puntos: 3
Respuesta: Problema con estructura

Como sugerencia no uses variables globales, porque lleva a errores ante un descuido.

El problema lo tenias en la funcion escribe_clientes, la cual te quedaria asi:
Código C++:
Ver original
  1. void escribe_clientes (clientes & c1);

El '&' significa que envia una referencia y no una copia. Ademas de eso modifica el codigo para no usar variables globales.

Saludos.
  #3 (permalink)  
Antiguo 22/11/2012, 18:55
Avatar de cotolon  
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 12 años
Puntos: 10
Respuesta: Problema con estructura

El problema es que cuando pasas

la estructura c1 a leer_clientes, manda una copia, y esta copia se le asigna al "parametro c1" (el c1 de la función) Por lo tanto cuando llenas los datos, se los llenas a c1 parámetro y no a c1 de main.

Hay 2 formas, (no sé si más, pero te muestro las 2). La primera es con punteros y la segunda es tal como lo tienes pero devolviendo (con return) un dato tipo cliente. Te dejo el código:

Código C++:
Ver original
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. struct clientes
  10.     {
  11.         char nombre [50];
  12.         int numero_unidades;
  13.         float precio;
  14.         char estado; //p: pagado, m: moroso, a: atrasado
  15.     }c1;
  16.  
  17. /* FORMA POR REFERENCIA (con puntero): */
  18.  
  19. /*void leer_clientes (clientes *c1)
  20. {
  21.     cout<<"Introduzca el nombre del cliente: ";
  22.     cin.getline(c1->nombre, 50);
  23.     cout<<"Introduzca el numero de unidades: ";
  24.     cin>>c1->numero_unidades;
  25.     cout<<"Introduzca el precio: ";
  26.     cin>>c1->precio;
  27.     cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  28.     cin>>c1->estado;
  29. }*/
  30.  
  31. /* FORMA POR VALOR */
  32.  
  33. clientes leer_clientes (clientes c1) //Retornas un datos tipo cliente
  34. {
  35.     cout<<"Introduzca el nombre del cliente: ";
  36.     cin.getline(c1.nombre, 50);
  37.     cout<<"Introduzca el numero de unidades: ";
  38.     cin>>c1.numero_unidades;
  39.     cout<<"Introduzca el precio: ";
  40.     cin>>c1.precio;
  41.     cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  42.     cin>>c1.estado;
  43.     return c1; //regresamos los datos del cliente
  44. }
  45. void escribe_clientes (clientes c1)
  46. {
  47.      cout <<"Nombre del cliente: "<<c1.nombre<<endl;
  48.      cout <<"Numero de unidades: "<<c1.numero_unidades<<endl;
  49.      cout <<"Precio: "<<c1.precio<<" €"<<endl;
  50.      cout <<"Estado: ";
  51.      switch (c1.estado)
  52.        {
  53.         case 'p': cout <<"pagado"; break;
  54.         case 'm': cout <<"moroso"; break;
  55.         case 'a': cout <<"atrasado"; break;
  56.        }
  57.      cout<<endl;
  58. }
  59.  
  60. int main()
  61. {
  62.      //leer_clientes (&c1); //<- Forma Referencia con puntero
  63.      c1 = leer_clientes(c1); //<- Forma por Valor sin puntero
  64.      escribe_clientes (c1);
  65.  
  66.  
  67.     system("PAUSE");
  68.     return EXIT_SUCCESS;
  69.  
  70. }
  #4 (permalink)  
Antiguo 23/11/2012, 16:10
 
Fecha de Ingreso: agosto-2012
Ubicación: Alcalá
Mensajes: 37
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Problema con estructura

He ejecutado sin problemas el código tal como me lo indicabas en tu post cotolon; o sea en la forma por valor.
Luego he intentado hacer lo mismo con el otro método, por referencia, que también me indicabas el código, pero no se ejecuta, compila bien pero al ejecutar la ventanita de ms dos se abre y se cierra inmediatamente, no sé se cambié sin querer algo:

Código C++:
Ver original
  1. #include<iostream>
  2.     #include<stdio.h>
  3.     #include <stdlib.h>
  4.     #include <time.h>
  5.      
  6.      
  7.     using namespace std;
  8.      
  9.     struct clientes
  10.         {
  11.             char nombre [50];
  12.             int numero_unidades;
  13.             float precio;
  14.             char estado; //p: pagado, m: moroso, a: atrasado
  15.         }c1;
  16.      
  17.     /* FORMA POR REFERENCIA (con puntero): */
  18.      
  19.     void leer_clientes (clientes *c1)
  20.     {
  21.         cout<<"Introduzca el nombre del cliente: ";
  22.         cin.getline(c1->nombre, 50);
  23.         cout<<"Introduzca el numero de unidades: ";
  24.         cin>>c1->numero_unidades;
  25.         cout<<"Introduzca el precio: ";
  26.         cin>>c1->precio;
  27.         cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  28.         cin>>c1->estado;
  29.     }
  30.      
  31.     /* FORMA POR VALOR
  32.      
  33.     clientes leer_clientes (clientes c1) //Retornas un datos tipo cliente
  34.     {
  35.         cout<<"Introduzca el nombre del cliente: ";
  36.         cin.getline(c1.nombre, 50);
  37.         cout<<"Introduzca el numero de unidades: ";
  38.         cin>>c1.numero_unidades;
  39.         cout<<"Introduzca el precio: ";
  40.         cin>>c1.precio;
  41.         cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  42.         cin>>c1.estado;
  43.         return c1; //regresamos los datos del cliente
  44.     }*/
  45.     void escribe_clientes (clientes c1)
  46.     {
  47.          cout <<"Nombre del cliente: "<<c1.nombre<<endl;
  48.          cout <<"Numero de unidades: "<<c1.numero_unidades<<endl;
  49.          cout <<"Precio: "<<c1.precio<<" €"<<endl;
  50.          cout <<"Estado: ";
  51.          switch (c1.estado)
  52.            {
  53.             case 'p': cout <<"pagado"; break;
  54.             case 'm': cout <<"moroso"; break;
  55.             case 'a': cout <<"atrasado"; break;
  56.            }
  57.          cout<<endl;
  58.     }
  59.      
  60.     int main()
  61.     {
  62.          leer_clientes (&c1); //<- Forma Referencia con puntero
  63.         // c1 = leer_clientes(c1); //<- Forma por Valor sin puntero
  64.          escribe_clientes (c1);
  65.      
  66.      
  67.         system("PAUSE");
  68.         return EXIT_SUCCESS;
  69.      
  70.     }

Además comentaros que he intentado poner la declaración de la estructura dentro de main, simplemente la cambie de lugar:

Código C++:
Ver original
  1. #include<iostream>
  2.     #include<stdio.h>
  3.     #include <stdlib.h>
  4.     #include <time.h>
  5.      
  6.      
  7.     using namespace std;
  8.      
  9.    
  10.      
  11.     /* FORMA POR REFERENCIA (con puntero): */
  12.      
  13.     /*void leer_clientes (clientes *c1)
  14.     {
  15.         cout<<"Introduzca el nombre del cliente: ";
  16.         cin.getline(c1->nombre, 50);
  17.         cout<<"Introduzca el numero de unidades: ";
  18.         cin>>c1->numero_unidades;
  19.         cout<<"Introduzca el precio: ";
  20.         cin>>c1->precio;
  21.         cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  22.         cin>>c1->estado;
  23.     }*/
  24.      
  25.     /* FORMA POR VALOR */
  26.      
  27.     clientes leer_clientes (clientes c1) //Retornas un datos tipo cliente
  28.     {
  29.         cout<<"Introduzca el nombre del cliente: ";
  30.         cin.getline(c1.nombre, 50);
  31.         cout<<"Introduzca el numero de unidades: ";
  32.         cin>>c1.numero_unidades;
  33.         cout<<"Introduzca el precio: ";
  34.         cin>>c1.precio;
  35.         cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  36.         cin>>c1.estado;
  37.         return c1; //regresamos los datos del cliente
  38.     }
  39.     void escribe_clientes (clientes c1)
  40.     {
  41.          cout <<"Nombre del cliente: "<<c1.nombre<<endl;
  42.          cout <<"Numero de unidades: "<<c1.numero_unidades<<endl;
  43.          cout <<"Precio: "<<c1.precio<<" €"<<endl;
  44.          cout <<"Estado: ";
  45.          switch (c1.estado)
  46.            {
  47.             case 'p': cout <<"pagado"; break;
  48.             case 'm': cout <<"moroso"; break;
  49.             case 'a': cout <<"atrasado"; break;
  50.            }
  51.          cout<<endl;
  52.     }
  53.      
  54.     int main()
  55.     {
  56.         struct clientes
  57.         {
  58.             char nombre [50];
  59.             int numero_unidades;
  60.             float precio;
  61.             char estado; //p: pagado, m: moroso, a: atrasado
  62.         }c1;
  63.          //leer_clientes (&c1); //<- Forma Referencia con puntero
  64.          c1 = leer_clientes(c1); //<- Forma por Valor sin puntero
  65.          escribe_clientes (c1);
  66.      
  67.      
  68.         system("PAUSE");
  69.         return EXIT_SUCCESS;
  70.      
  71.     }

pero me da algunos errores de compilacion:

27 `clientes' does not name a type
39 variable or field `escribe_clientes' declared void
39 `clientes' was not declared in this scope
40 expected `,' or `;' before '{' token
64 `leer_clientes' undeclared (first use this function)
65 `escribe_clientes' cannot be used as a function

que no entiendo...
Gracias :)
  #5 (permalink)  
Antiguo 23/11/2012, 20:02
Avatar de cotolon  
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 12 años
Puntos: 10
Respuesta: Problema con estructura

Extraño que no te haya compilado, con respecto a la declaración de la estructura se refería a declarar la estructura "c1" dentro de main, de está forma:

Código C++:
Ver original
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. struct clientes
  10.     {
  11.         char nombre [50];
  12.         int numero_unidades;
  13.         float precio;
  14.         char estado; //p: pagado, m: moroso, a: atrasado
  15.     }; //<- Aqui ya no esta c1
  16.  
  17.  
  18. clientes leer_clientes (clientes c1) //Retornas un datos tipo cliente
  19. {
  20.     cout<<"Introduzca el nombre del cliente: ";
  21.     cin.getline(c1.nombre, 50);
  22.     cout<<"Introduzca el numero de unidades: ";
  23.     cin>>c1.numero_unidades;
  24.     cout<<"Introduzca el precio: ";
  25.     cin>>c1.precio;
  26.     cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
  27.     cin>>c1.estado;
  28.     return c1; //regresamos los datos del cliente
  29. }
  30. void escribe_clientes (clientes c1)
  31. {
  32.      cout <<"Nombre del cliente: "<<c1.nombre<<endl;
  33.      cout <<"Numero de unidades: "<<c1.numero_unidades<<endl;
  34.      cout <<"Precio: "<<c1.precio<<" €"<<endl;
  35.      cout <<"Estado: ";
  36.      switch (c1.estado)
  37.        {
  38.         case 'p': cout <<"pagado"; break;
  39.         case 'm': cout <<"moroso"; break;
  40.         case 'a': cout <<"atrasado"; break;
  41.        }
  42.      cout<<endl;
  43. }
  44.  
  45. int main()
  46. {
  47.      //Declaramos la estructura c1
  48.      struct clientes c1;    
  49.  
  50.      c1 = leer_clientes(c1); //<- Forma por Valor sin puntero
  51.      escribe_clientes (c1);
  52.  
  53.  
  54.     system("PAUSE");
  55.     return EXIT_SUCCESS;
  56.  
  57. }

Etiquetas: estructura, int
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 22:59.