• Martes 7 de Mayo de 2024, 00:21

Autor Tema:  problema con mi agena  (Leído 1488 veces)

tig0

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
problema con mi agena
« en: Miércoles 26 de Agosto de 2009, 20:24 »
0
hola, tengo un problemilla con este programa, que no se porque no puedo meter mas de 2 o 3 entradas porque me tira un error el ejecutable y no entiendo por que, creo que deberia tirar bien pero no se, a ver si alguien me dice qué es lo que estoy haciendo mal xDDD
Código: C++
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. int contador=0;
  7.  
  8. class datos {
  9.       private:
  10.               string numeros;
  11.               char nomape[40];
  12.               char dir[50];
  13.               char poblacion[10];
  14.               int tel, telfijo;
  15.       public:
  16.              datos();
  17.              void mostrardatos(void);
  18.              }*per[40];
  19.  
  20. datos::datos(){
  21.                cout << "n introduce nombre y apellidos "<<endl;
  22.                cin.getline (nomape, sizeof(nomape));
  23.                cout << "n introduce direccion "<<endl;
  24.                cin.getline (dir, sizeof(dir));
  25.                cout << "n introduce poblacion "<<endl;
  26.                cin.getline (poblacion, sizeof(poblacion));
  27.                cout << "n introduce telefonos, primero fijo 2 movil "<<endl;
  28.                getline (cin, numeros);
  29.                stringstream (numeros) >> telfijo;
  30.                getline (cin, numeros);
  31.                stringstream (numeros) >> tel;
  32.                }
  33. void datos::mostrardatos(void){
  34.                       cout << "nombre : " << nomape<<endl;
  35.                       cout << "direccion : "<<dir<<endl;
  36.                       cout << "poblacion : "<<poblacion<<endl;
  37.                       cout << "Tel fijo : "<<telfijo << " tel movil : "<<tel<<endl;
  38.                       }
  39.  
  40. int main () {
  41.     int opcion;
  42.     string mystr;
  43.     loop:
  44.     int contemp=0;
  45.     cout << "introduce opcion, 1=grabar, 2=mostrar, 0=salir "<<endl;
  46.     cin >> opcion;
  47.     cin.get();
  48.     switch (opcion){
  49.            case 0:
  50.                 break;
  51.            case 1:
  52.                 cout << "introduce entradas "<<endl;
  53.                 cin>>contemp;
  54.                 cin.get();
  55.                 for (int n=0;n<contemp;n++){
  56.                     per[(n+contador)]=new datos;
  57.                     contador++;} goto loop;
  58.            case 2:
  59.                 for (int n=0;n<contador;n++){
  60.                     per[n]->mostrardatos();} goto loop;
  61.            default:
  62.                    cout << "opcion erronea"<<endl;
  63.                    goto loop;}
  64.     cin.get();
  65.     return 0;
  66. }
  67.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: problema con mi agena
« Respuesta #1 en: Miércoles 26 de Agosto de 2009, 21:06 »
0
En este bucle:
Código: C++
  1. for (int n=0;n<contemp;n++){
  2.                     per[(n+contador)]=new datos;
  3.                     contador++;} goto loop;
  4.  

Tanto n como contador son incrementados en cada pasada por lo cual el elemento sera 0, 2, 4, 6, etc.

Sinceramente veo muchas cosas extrañas, como usar goto en C++, usar contador como una variable global, contemp y contador ahi juntos ... en fin, en el bucle de mostrar usas contador como limite (¿Para que usar contemp entonces?) y si accedes a todos los elementos, por logica el elemento 1 es un puntero invalido (nulo si hay suerte).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

tig0

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: problema con mi agena
« Respuesta #2 en: Miércoles 26 de Agosto de 2009, 23:02 »
0
entonces que tendria que ser, per[n]=new datos?
ves muchas cosas extañas porque empece a programar hace 3 semanas y hay muchas cosas que no se como hacerlas e intento apañarmelas como puedo XDDD
Lo del goto lo hice porque no se me ocurria como volver patras, el contemp lo estaba usando porque lo queria usar de limite para el bucle, para que por ejemplo cuando ya has introducido los datos, si quiere añadir mas elementos, que no los reemplace por los que habia. porque si hago per[n]=new datos entonces no se joderia el per[0]?

Esque a veces estoy muy confuso, porque solo he podido seguir un tutorial de c++, que esta en ingles, y me deja muchas cosas en el aire. Entonces arreglando ese bucle podria hacer que no me petara?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: problema con mi agena
« Respuesta #3 en: Miércoles 26 de Agosto de 2009, 23:13 »
0
Si, de esta manera tiene mas logica:

Código: C++
  1. cin >> contador;
  2. cin.get();
  3. for (int n = 0; n < contador; n++)
  4. {
  5.   per[n] = new datos;
  6.   //sigue
  7.  

Tampoco es lo ideal tener un array de punteros de tamaño fijo (per), si llegan a poner 45 entradas tenes problemas por ejemplo ...

En cuanto al goto lo podes reemplazar por un bucle for facilmente, todos los case tienen que tener su break al igual que el primero sino sigue la ejecucion y eso no es lo que queres:

Código: C++
  1. for (bool salir = false; !salir;)
  2. ...
  3.   case 0:
  4.     salir = true;
  5.   break;
  6.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

tig0

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: problema con mi agena
« Respuesta #4 en: Jueves 27 de Agosto de 2009, 12:42 »
0
hola, lo he reescrito y weno, aunque esta mejor definido ahora me peta a la 5 o 6 entrada que hago. te pego el codigo que he hecho esta vez.

Código: C++
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. void incr(void);
  7. void mostrar(void);
  8.  
  9.  
  10. class datos {
  11.       private:
  12.               string numeros;
  13.               char nomape[40];
  14.               char dir[50];
  15.               char poblacion[10];
  16.               int tel, telfijo;
  17.       public:
  18.              datos();
  19.              void lista(void);
  20.              }*per[40];
  21. int contador=0;
  22.  
  23. datos::datos(){
  24.                cout << "n introduce nombre y apellidos "<<endl;
  25.                cin.getline (nomape, sizeof(nomape));
  26.                cout << "n introduce direccion "<<endl;
  27.                cin.getline (dir, sizeof(dir));
  28.                cout << "n introduce poblacion "<<endl;
  29.                cin.getline (poblacion, sizeof(poblacion));
  30.                cout << "n introduce telefonos, primero fijo 2 movil "<<endl;
  31.                getline (cin, numeros);
  32.                stringstream (numeros) >> telfijo;
  33.                getline (cin, numeros);
  34.                stringstream (numeros) >> tel;
  35.                }
  36. void datos::lista(void){  
  37.                       cout << "nombre : " << nomape<<endl;
  38.                       cout << "direccion : "<<dir<<endl;
  39.                       cout << "poblacion : "<<poblacion<<endl;
  40.                       cout << "Tel fijo : "<<telfijo << " tel movil : "<<tel<<endl;
  41.                       }
  42. void incr(void){
  43.      per[contador]=new datos;
  44.      contador++;}
  45.  
  46. void mostrar(void){
  47.      for (int n=0;n<contador;n++){
  48.          per[n]->lista();}}
  49.          
  50. int main () {
  51.     int opcion;
  52.     bool salir=false;
  53.     while (salir!=true){
  54.           cout << "n Que desea hacer? 1 = Grabar, 2 = Mostrar, 0 = salir" <<endl;
  55.           cin >> opcion;
  56.           cin.get();
  57.           switch (opcion){
  58.                  case 0:
  59.                       salir=true;
  60.                       break;
  61.                  case 1:
  62.                       incr();
  63.                       break;
  64.                  case 2:
  65.                       mostrar();
  66.                       break;
  67.                  default:
  68.                          cout << "n Opcion Erronea "<<endl;
  69.                          break;
  70.                          }
  71.                  }
  72.           cin.get();
  73.           return 0;
  74.           }
  75.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: problema con mi agena
« Respuesta #5 en: Jueves 27 de Agosto de 2009, 13:18 »
0
Yo no tengo problemas aunque el tamaño para la poblacion es infimo, para sacar en claro cuando falla aumenta ese tamaño a 20 por ejemplo, agrega esto justo despues del main asi no hace falta entrar los datos a mano todas las veces:
Código: C++
  1. freopen("in.txt", "r", stdin);
  2.  

Y crea un archivo llamado in.txt (si logras que falle lo subis) con este estilo (sigue el formato de entrada de tu agenda):
1
Bart Simpson
Evergreen Terrace 742
Springfield
123
456
1
Juan Perez
Calle Falsa 123
Desconocido
999
666
2
0

Agrega los 1 y los datos hasta que de error.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

tig0

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: problema con mi agena
« Respuesta #6 en: Viernes 28 de Agosto de 2009, 14:21 »
0
perdon, ya se cual ha sido el problema xDDDDD
ha sido un error muy estupido, al meter los datos para probar el programa no estaba controlando la cantidad de caracteres que introducia, y poblacion tiene 9, le he metido mas caracteres y eso es lo que estaba haciendo que petara xDDDDDDDDDDDDD
weno gracias tio por haberme ayudado ^^

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: problema con mi agena
« Respuesta #7 en: Viernes 28 de Agosto de 2009, 15:49 »
0
De nada  B)

Citar
Yo no tengo problemas aunque el tamaño para la poblacion es infimo, para sacar en claro cuando falla aumenta ese tamaño a 20 por ejemplo

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.