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

Programa para consultar datos struct

Estas en el tema de Programa para consultar datos struct en el foro de C/C++ en Foros del Web. Hola a todos, saludaros en primer lugar. Quisiera dejaros una duda que tengo, un problema más bien que no sé a qué se está debiendo ...
  #1 (permalink)  
Antiguo 03/06/2015, 05:00
 
Fecha de Ingreso: junio-2015
Ubicación: Murcia
Mensajes: 6
Antigüedad: 8 años, 10 meses
Puntos: 0
Programa para consultar datos struct

Hola a todos, saludaros en primer lugar.

Quisiera dejaros una duda que tengo, un problema más bien que no sé a qué se está debiendo en este programa. No se trata del programa completo si no de un trozo, lo he puesto así para simplificar, puesto que el que hice tiene más funciones que no vienen al caso.


En principio declaro
Código C++:
Ver original
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. using namespace std;
  7.  
  8. main()
  9. {
  10.       struct oficina{
  11.              int numero;
  12.              long CP;
  13.              char nombre[40];
  14.              char direccion[40];
  15.              char ciudad[40];
  16.              char municipio[40];
  17.              };
  18.  
  19.  
  20.              
  21.       struct oficina lista[200];
  22.      
  23.       lista[0].numero = 210;
  24.       lista[0].CP = 30008;
  25.       strcpy(lista[0].nombre, "Murcia");
  26.       strcpy(lista[0].direccion, "Plaza Circular, 6");
  27.       strcpy(lista[0].ciudad, "Murcia");
  28.       strcpy(lista[0].municipio, "MURCIA");
  29.      
  30. //Aque ire declarando mas variables... lista[n], esto es solo una prueba.
  31.  
  32.       int option;
  33.       cout<<"Selecciona operacion\n\n1) Consulta por localidad\n\n2) Consulta por numero de oficina\n\n";
  34.       cin>>option;      
  35.       switch(option)
  36.       {
  37.       case 1:
  38.            
  39.            system("cls");
  40.            char localidad[40];
  41.            cout<<"Introduce nombre de localidad\n"; /*Muestra esto por pantalla y acaba el programa en lugar de continuar (en este ejemplo no hay mas que mostrar por pantalla lo escrito
  42. , en el completo compara si la cadena introducida es igual a algun campo lista[n].ciudad de las variables declaradas y
  43. entonces muestra los datos de la (o las) oficinas que se encuentren en esa localidad, que es el objetivo del programa.*/
  44.            fgets(localidad,30,stdin);
  45.            cout<<localidad;
  46.            
  47.            
  48.  
  49.            break;  
  50.                    
  51.                     }
  52.      
  53.     system("PAUSE");
  54.     return 0;
  55. }
En esta parte el programa en el case 1 debe pedir el nombre de localidad y para que coja posibles espacios (ej. Los Angeles) hago uso de la función fgets, puesto que con el cout solo me tomará hasta que encuentre el caracter ' '.

Pues bien, tanto en el original como en esto que os envío cuando muestra por pantalla lo de introducir localidad no espera a recibir nada por la función fgets y termina la aplicación.

Lo curioso es que en la aplicación completa al principio funcionaba bien, quise poner un switch porque quiero un case2 que permita buscar las oficinas por numero.

¿Sabe alguien si es un error evidente?

Saludos.
  #2 (permalink)  
Antiguo 03/06/2015, 07:23
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Programa para consultar datos struct

Buenas tardes. Bienvenido al foro.

Prueba a limpiar el buffer de lectura.

Código C++:
Ver original
  1. std::cin.ignore( std::numeric_limits< int >::max( ) );

La línea anterior elimina 'n' caracteres del buffer de lectura (la purga terminará si llega a un salto de línea). 'n' viene dado por numeric_limits<>::max( ) y equivale, en este caso, al int más alto que soporte tu sistema, que normalmente será 2^31-1.

También te hubiese valido algo tal que:

Código C++:
Ver original
  1. std::cin.ignore( 1000000 );

pero implica introducir valores directamente en el código y esa es una práctica a evitar.
En cualquier caso lo suyo sería homogeneizar un poco el sistema, podrías usar únicamente cin.

Código C++:
Ver original
  1. // Equivalente a fgets(localidad,30,stdin);
  2. cin.read( localidad, 30 );

No se qué grado de libertad tienes, pero yo quitaría los char[] y usaría std::string en su lugar.

Y, como remate final, en C++ la palabra clave "struct" no es necesaria cuando vas a declarar una variable:

Código C++:
Ver original
  1. // Aquí si tienes que usar struct
  2. struct oficina{
  3.              int numero;
  4.              long CP;
  5.              char nombre[40];
  6.              char direccion[40];
  7.              char ciudad[40];
  8.              char municipio[40];
  9.              };
  10.  
  11.  
  12. // Pero aquí no            
  13. oficina lista[200];

Un saludo
  #3 (permalink)  
Antiguo 04/06/2015, 02:12
 
Fecha de Ingreso: junio-2015
Ubicación: Murcia
Mensajes: 6
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Programa para consultar datos struct

He probado copiar la primera sentencia que posteas justo antes del fgets y se me queda colgado, sin hacer nada. Ya no me saca del programa pero se queda "sin hacer nada". ¿Insinúas que es necesario limpiar el búfer antes de llevar la cadena a esa variable? ¿Por qué no basta con hacer la asignación?

A lo que comentas de no usar char[] y usar std::string... soy novato en C++ y no conozco esto. ¿Puedes comentar por encima qué diferencias y que pros obtengo con ese cambio?

Saludos y mil gracias.

Última edición por Srgy; 04/06/2015 a las 02:31
  #4 (permalink)  
Antiguo 04/06/2015, 04:11
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Programa para consultar datos struct

Cita:
Iniciado por Srgy Ver Mensaje
He probado copiar la primera sentencia que posteas justo antes del fgets y se me queda colgado, sin hacer nada. Ya no me saca del programa pero se queda "sin hacer nada". ¿Insinúas que es necesario limpiar el búfer antes de llevar la cadena a esa variable? ¿Por qué no basta con hacer la asignación?
Porque en el buffer se puede quedar basura... por ejemplo un salto de línea que se haya podido quedar ahí o alguna tecla que haya pulsado el usuario mientras tanto.

El buffer de entrada almacena todas las teclas que pulses, aunque no estés llamando en ese momento a las funciones de lectura. El buffer está a nivel del sistema operativo, él almacena ahí lo que vas haciendo y luego el programa va consultando bajo demanda.

Cita:
Iniciado por Srgy Ver Mensaje
A lo que comentas de no usar char[] y usar std::string... soy novato en C++ y no conozco esto. ¿Puedes comentar por encima qué diferencias y que pros obtengo con ese cambio?
string es una clase de C++. Internamente gestiona un char[], lo que sucede es que es capaz de redimensionar ese char* sin que tú tengas que preocuparte de ello, por lo que SIEMPRE te va caber lo que intentes almacenar en dicha clase... y sin preocuparte por la gestión de la memoria dinámica!!!

Aparte de eso, al ser una clase, incorpora una serie de métodos que hacen más sencillo su uso respecto a un char*.

Un saludo
  #5 (permalink)  
Antiguo 04/06/2015, 09:05
 
Fecha de Ingreso: junio-2015
Ubicación: Murcia
Mensajes: 6
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Programa para consultar datos struct

Queda claro, pero aún así creo que no lo estoy haciendo de modo correcto. Que el programa funcione a veces correctamente y otras no me da que pensar.

Sigo pensando que esa variable que tengo como localidad me está dando problemas por no depurarse cada vez que hago un ciclo. Es un programa que estoy haciendo para practicar las struct y las cadenas de caracteres (que siempre me dan una batalla...)


Código HTML:
#include <cstdlib>
#include <iostream>
#include <ctype.h>
#include <string.h>
#include <conio.h>

using namespace std;

main()
{
      int centinela=0; //variable que se hace 1 si localidad tiene coincidencia caracter a caracter
      char pass='0';
      char localidad[40];
      int num_of=0000;
       
       system("color 4F");
          struct oficina{
           int numero;
           long CP, tlf;
           char nombre[50];
           char ciudad[50];
           char direccion[60];
           char ciudad2[30];
           char municipio[30];
           };
    
    struct oficina lista[100];
    
    lista[0].numero = 210;
    lista[0].CP = 30008;
    lista[0].tlf = 968244316;
    strcpy(lista[0].nombre, "Murcia");
    strcpy(lista[0].direccion, "Plaza Circular, 6");
    strcpy(lista[0].ciudad, "Murcia");
    strcpy(lista[0].municipio, "MURCIA");
    
   //hay otras tantas variables de este tipo, no las pongo por no ocupar todo ese espacio.    
    
    
      int option=0;
      
      do{
      system("cls");
      cout<<"\n  BASE DE DATOS OFICINAS BSCAM MURCIA. Selecciona operacion\n\n\n\n\t1) Consulta por localidad\n\n\t2) Consulta por numero de oficina\n\n";
      cin>>option;
      cin.ignore(256,'\n');
           
      switch(option)
      {
      case 1: 
           do{      
          
           system("cls");          
           cout<<"Introduce nombre de localidad\n";
           gets(localidad);
           cin.ignore(256,'\n');
  
           
    //hacer minuscula lo introducido para comparar
    for(int i=0; i<strlen(localidad)-1; i++)
      localidad[i] = tolower(localidad[i]);
  
 
   
    for(int i=0; i<100; i++)
     { //For
      
         //hacer minuscula el campo .ciudad del struct para compararlo a localidad
         for(int z=0; z <strlen(localidad)-1; z++)
              {
              lista[i].ciudad[z] = tolower(lista[i].ciudad[z]);
              lista[i].ciudad2[z] = tolower(lista[i].ciudad2[z]);
              }
         //comparar los campos para comprobar si hay coincidencias en alguna struct
         for(int z=0; z <strlen(localidad)-1; z++)
           { //for de comparacion
           if((localidad[z] == lista[i].ciudad[z])||(localidad[z] == lista[i].ciudad2[z]))
           centinela = 1;
           else
              { //else
              centinela = 0;   

              break;
           } //else END
           } // for comparacion OFF

        //si la comparación ha sido existosa, se muestra el dato
        if(centinela ==1)
                   { //comparación OK
                            //hacer mayúsculas el campo .ciudad       
                            for(int z=0; z <strlen(lista[i].ciudad); z++)
                            {lista[i].ciudad[z] = toupper(lista[i].ciudad[z]);}
                            //Muestra de la información coincidente con la busqueda
                            {cout<<"_____________________________\n>>Oficina BS "<<toupper(lista[i].numero)<<"\n\n"<<lista[i].direccion<<"\n"<<lista[i].nombre<<"\n"<<"Telefono: "<<lista[i].tlf<<" CP:"<<lista[i].CP<<"\n("<<lista[i].ciudad<<") Municipio: "<<lista[i].municipio<<"\n";
                            }                 
                   } //comparación OK END
         else; //si no hay coincidencia, no hace nada de lo anterior y sigo comprobando con el for

      }//For END
     
           cout<<"\nDesea buscar otra oficina? (puse 'r') o desea volver a menu (pulse cualquier tecla";    
           cin>>pass;
           }while(pass =='r');
           
           break;
           
     case 2:
          
          num_of=0;
          centinela=0;
     
          do{
              system("cls");
               cout<<"Introduce numero de oficina...";
               cin>>num_of;
             
          for(int i=0;i<154;i++)
                    { if(lista[i].numero == num_of)
                       {
                       cout<<"Aqui muestro la oficina que coincide con el criterio de busqueda"<<toupper(lista[i].numero)<<"\n\n"<<lista[i].direccion<<"\n"<<lista[i].nombre<<"\n"<<"Telefono: "<<lista[i].tlf<<" CP:"<<lista[i].CP<<"\n("<<lista[i].ciudad<<") Municipio: "<<lista[i].municipio<<"\n";
                       centinela = 1;
                       } }
           if(centinela == 0)cout<<"\nEl numero no concuerda con ninguna oficina listada\n";
           
           cout<<"\nDesea buscar otra oficina? (puse 'r') o desea volver a menu?\n(pulse cualquier tecla)";    
           cin>>pass;
           }while(pass =='r');
           
       
          break;
          }//do
      
      }while(option != 3);//do-while principal
    system("PAUSE");
    return 0;
}
¿Como lo veis?

Suelo tener un error cuando en el case 1 me pregunta si deseo repetir ('r'), pasan cosas raras ahí, jeje.

PD. Perdón por el tochazo de librerías, aun no me aclaro con cuales me son útiles para estas funciones de caracteres y cuales no. .

A algun forero ya le he leído que alguna en concreto (la conio) no le gusta nada de nada, estaría bien saber su punto de vista y si conviene evitarlas.
  #6 (permalink)  
Antiguo 04/06/2015, 15:16
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Programa para consultar datos struct

Te enumero las cosas que veo:

El buffer hay que limpiarlo antes de leer

Código C++:
Ver original
  1. //Mal
  2. cin>>option;
  3. cin.ignore(256,'\n');
  4.  
  5. //Bien
  6. cin.ignore(256,'\n');
  7. cin>>option;

Se supone que tu intención es leer el dato que el usuario vaya a introducir en ese momento... no basura que ya esté almacenada en el buffer de entrada. Lo más normal es, primero limpiar el buffer y después realizar la lectura... como la lectura es bloqueante y el buffer estará vacío, el programa se quedará esperando a que el usuario introduzca un dato.

Las estructuras es mejor definirlas fuera de las funciones.

Si la estructura la defines dentro de una función, únicamente podrás crear variables de ese tipo dentro de la función, fuera de esa función la estructura, simplemente, no existirá.

Código C++:
Ver original
  1. struct oficina{
  2.     int numero;
  3.     long CP, tlf;
  4.     string nombre;
  5.     string ciudad;
  6.     string direccion;
  7.     string ciudad2;
  8.     string municipio;
  9. };
  10.  
  11.  
  12. main()
  13. {

Respeta la firma del main

La firma (la declaración) del main debería tener una forma tal que:

Código C++:
Ver original
  1. int main( int, char** )

Es altamente recomendable respetar esta firma por varias razones:
  • Las funciones SIEMPRE han de indicar el valor de retorno. El main no debería ser una excepción
  • El valor de retorno del main puede ser aprovechado por otros programas para saber si tu programa se ha ejecutado correctamente
  • Si no indicas los argumentos te va a resultar imposible arrancar tu aplicación con parámetros

Igualmente, lo lógico es acabar el main con el return correspondiente. La forma más correcta de indicar ese return es:

Código C++:
Ver original
  1. return EXIT_SUCCESS;

EXIT_SUCCESS es una constante definida en la librería stdlib.h. Como te comenté en una respuesta anterior, hay que intentar no poner valores "a pelo" en el código.

Cuidado con el cin.ignore

Cuando diseñas un programa tienes que intentar pensar que lo va a usar un mono. ¿Por qué? porque no puedes dar nada por sentado. No debes esperar que el usuario siempre te responda lo que tú quieres:
  • Si le pides un número te puede introducir un texto
  • Si le pides una opción entre la 'a' y la 'd' el usuario puede introducir la 'j'
  • El usuario puede hacer uso del teclado incluso cuando no se lo estés pidiendo, llenando el buffer de entrada de guarrería
  • ...

Atendiendo al tercer punto, si por la razón que sea el buffer del teclado tiene más de 256 caracteres la limpieza que has programado simplemente no será suficiente. En situaciones normales no pasará nada, pero debes tenerlo en cuenta.

Comparaciones

Código C++:
Ver original
  1. for(int z=0; z <strlen(localidad)-1; z++)
  2. { //for de comparacion
  3.   if((localidad[z] == lista[i].ciudad[z])||(localidad[z] == lista[i].ciudad2[z]))

Si tu idea es comparar dos variables de tipo char*, es preferible usar la función strcmp. Como norma general, si una función de la librería estándar hace lo que necesitas es preferible usarla. Motivos:
  • La STL será, en el peor de los casos tan óptima como tu solución. Lo lógico es que tienda a ser más óptima.
  • Reduces la cantidad de código a de tu programa, lo que reduce el mantenimiento
  • La STL se suele probar hasta la saciedad, por lo que suele tener menos errores que tu código.

Dicho esto, el bucle anterior podría quedar reducido a:

Código C++:
Ver original
  1. if( strcmp( localidad, lista[i].ciudad ) == 0 || strcmp( localidad, lista[i].ciudad2 ) == 0 )
  2.   centinela = 1;
  3. else
  4.   centinela = 0;

Fíjate que hemos sustituido un for y un if por únicamente un if

Para chequeos SI/NO es preferible usar el tipo bool

En C++ tienes de forma nativa el tipo bool. Este tipo permite almacenar dos valores diferentes: true y false.

Este tipo viene a sustituir los usos típicos de C en los que se partía de una variable "int" que únicamente almacenaba 0 (false) o 1 (true). En tu caso, centinela debería ser bool:

Código C++:
Ver original
  1. bool centinela = false;
  2.  
  3. //comparar los campos para comprobar si hay coincidencias en alguna struct
  4. if( strcmp( localidad, lista[i].ciudad ) == 0 || strcmp( localidad, lista[i].ciudad2 ) == 0 )
  5.   centinela = true;
  6.            
  7. //si la comparación ha sido existosa, se muestra el dato
  8. if(centinela)

Por cierto, como habrás podido ver en este ejemplo, no es necesario declarar las variables al inicio del programa. También las puedes declarar entre medias del código.

Los números no se pueden convertir... a mayúsculas

Código C++:
Ver original
  1. cout<<"Aqui muestro la oficina que coincide con el criterio de busqueda"<<toupper(lista[i].numero)

Ese toupper ahí no puede ser bueno... y no es el único caso.

Cuidado con los rangos

Código C++:
Ver original
  1. for(int i=0;i<154;i++)
  2. {
  3.   if(lista[i].numero == num_of)

Este es uno de los problemas que aparecen por poner valores "a pelo" en el código.

Si lista es un arreglo de 100 elementos... ¿por qué el for llega hasta 153?

Divide el código en funciones

Hacer un programa completo en una sola función únicamente está indicado para programas cortos (10 líneas, 20 quizás). Conforme el programa se vuelve más completo y complejo es imprescindible dividir el código en funciones.

Cada función tiene que tener una utilidad muy concreta y la idea que se persigue con esto es:
  • Que el código quede estructurado. Una función aisla su código del resto del programa
  • Permite reutilizar código de una forma muy sencilla
  • Permite modificar el funcionamiento del programa con grán facilidad. Si, por ejemplo, tienes que buscar un dato en una lista y tienes diferentes algoritmos de búsqueda en funciones diferentes, puedes cambiar el motor de búsqueda utilizado simplemente llamando a una función u otra en vez de reescribir el algoritmo.

En tu caso, un código que repites mucho es pasar los textos a minúsculas. Podrías tener una función tal que:

Código C++:
Ver original
  1. void AMinusculas( char* cadena )
  2. {
  3.   for( int i=0; i < strlen(cadena); ++i )
  4.     cadena[i] = tolower( cadena[i] );
  5. }

Aunque, bueno, también podríamos hacer uso de la STL:

Código C++:
Ver original
  1. #include <algorithm>
  2.  
  3. void AMinusculas( char* cadena )
  4. {
  5.   std::transform( cadena, &cadena[strlen(cadena)], cadena, ::tolower);
  6. }

El resultado al final va a ser el mismo.

Usa la clase string

Como te comenté, su uso proporciona bastantes ventajas, entre ellas un código más legible:

Código C++:
Ver original
  1. #include <string>
  2.  
  3. struct oficina{
  4.     int numero;
  5.     long CP, tlf;
  6.     string nombre;
  7.     string ciudad;
  8.     string direccion;
  9.     string ciudad2;
  10.     string municipio;
  11. };
  12.  
  13. // ...
  14.  
  15. lista[0].numero = 210;
  16. lista[0].CP = 30008;
  17. lista[0].tlf = 968244316;
  18. lista[0].nombre = "Murcia"; // Para copiar un texto se puede usar el operador de asignación
  19. lista[0].direccion = "Plaza Circular, 6";
  20. lista[0].ciudad = "Murcia";
  21. lista[0].municipio = "MURCIA";
  22.  
  23. // ... pasar a minúsculas puede ser más sencillo (basa
  24. void AMinusculas( string& cadena )
  25. {
  26.   std::transform( cadena.begin(), cadena.end(), cadena.begin(), ::tolower );
  27. }
  28.  
  29. // comparar dos cadenas es bastante sencillo:
  30. //comparar los campos para comprobar si hay coincidencias en alguna struct
  31. if(  localidad == lista[i].ciudad || localidad == lista[i].ciudad2 )

Puede que haya alguna cosilla más, pero ya son pequeñas tonterías.

Un saludo.
  #7 (permalink)  
Antiguo 05/06/2015, 00:35
 
Fecha de Ingreso: junio-2015
Ubicación: Murcia
Mensajes: 6
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Programa para consultar datos struct

Gracias, eso me clarifica bastante, si bien tengo aún las siguientes dudas:

- ¿Que diferencias tengo entre declarar la variable "localidad" como char o char*. Lo digo porque sustituyendo...

Código:
if((localidad[z] == lista[i].ciudad[z])||(localidad[z] == lista[i].ciudad2[z]))
teniendo declarada como char, por la función srtcmp me da error en compilación. Si cambio la declaración a char* entonces me da error la lectura con el

Código:
gets(localidad);


Otra cosa es que cuando hago la limpieza del búfer

Código:
cin.ignore(256,'\n');
hay que presionar dos veces enter para que tome el valor, lo cual puede llevar al usuario a no saber esto y creer que el programa se ha "colgado".

Código:
   system("cls");          
   cout<<"Introduce nombre de localidad\n";
   cin.ignore(256,'\n');
   gets(localidad);
Así, al abrir el programa, en la primera selección del switch (1 o 2), tengo que hacer lo siguiente...

-pulso 1 (por ejemplo) y enter . El programa no hace nada.
-Vuelvo a pulsar 1 y enter. El programa entra en el case 1.

He tenido, por tanto, que hacer dos veces esa operación de selección, lo cual no deja de ser algo raro.

Respecto a lo de las clases, aún no he entrado en eso. Me está costando algo entender el concepto de clase de C++. Ví algo de C en su día, y esto me pilla de nuevas. Pero vamos, que asumo que este programa sería mucho más sencillo de realizar mediante el uso de clases. Todo llegará.

Disculpa por el asedio de dudas y de nuevo mil gracias, con estos consejos voy empezando a tener claras algunas cosas.

Saludos.
  #8 (permalink)  
Antiguo 05/06/2015, 03:19
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Programa para consultar datos struct

Cita:
Iniciado por Srgy Ver Mensaje
- ¿Que diferencias tengo entre declarar la variable "localidad" como char o char*. Lo digo porque sustituyendo...

Código:
if((localidad[z] == lista[i].ciudad[z])||(localidad[z] == lista[i].ciudad2[z]))
teniendo declarada como char, por la función srtcmp me da error en compilación. Si cambio la declaración a char* entonces me da error la lectura con el

Código:
gets(localidad);
El tipo char únicamente permite almacenar un carácter (8 bits con signo), mientras que el tipo char* es un array de tipo char, lo que te permite almacenar un número indeterminado de caracteres.

La firma de strcmp, tal y como puedes consultar por ejemplo aquí, indica que esta función espera recibir dos punteros a char, es decir, dos char*. Si esta función recibe cualqueir otro tipo de dato, te arrojará un error.

La firma de gets, como puedes consultar aquí, también espera recibir un char*, por lo que no termino de entender ese error que comentas.


Cita:
Iniciado por Srgy Ver Mensaje
Otra cosa es que cuando hago la limpieza del búfer

Código:
cin.ignore(256,'\n');
hay que presionar dos veces enter para que tome el valor, lo cual puede llevar al usuario a no saber esto y creer que el programa se ha "colgado".

Código:
   system("cls");          
   cout<<"Introduce nombre de localidad\n";
   cin.ignore(256,'\n');
   gets(localidad);
Así, al abrir el programa, en la primera selección del switch (1 o 2), tengo que hacer lo siguiente...

-pulso 1 (por ejemplo) y enter . El programa no hace nada.
-Vuelvo a pulsar 1 y enter. El programa entra en el case 1.

He tenido, por tanto, que hacer dos veces esa operación de selección, lo cual no deja de ser algo raro.
El problema aquí es que cin.ignore va a eliminar todo lo que haya en el buffer hasta que se encuentre un salto de línea... si no encuentra el salto de línea y el contenido del buffer no supera los 256 caracteres, cin se quedará esperando a que introduzcas más caracteres hasta completar uno de los dos requisitos.

Una opción más limpia para limpiar el buffer (lo siento, ayer escribí con prisas y me la salté) es usar cin.clear():

Código:
   system("cls");          
   cout<<"Introduce nombre de localidad\n";
   cin.clear();
   gets(localidad);
Cita:
Iniciado por Srgy Ver Mensaje
Respecto a lo de las clases, aún no he entrado en eso. Me está costando algo entender el concepto de clase de C++. Ví algo de C en su día, y esto me pilla de nuevas. Pero vamos, que asumo que este programa sería mucho más sencillo de realizar mediante el uso de clases. Todo llegará.
Cada persona tiene su propia curva de aprendizaje. No te agobies :)

Cita:
Iniciado por Srgy Ver Mensaje
Disculpa por el asedio de dudas y de nuevo mil gracias, con estos consejos voy empezando a tener claras algunas cosas.
Si no fuese para ayudar, no tendría sentido que estuviese en este foro.

Un saludo
  #9 (permalink)  
Antiguo 05/06/2015, 04:30
 
Fecha de Ingreso: junio-2015
Ubicación: Murcia
Mensajes: 6
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Programa para consultar datos struct

No entiendo bien lo de char.

Cuando declaro un

Código:
char a = 'b';
Estoy declarando un caracter (e inicializándolo en este caso a valor 'b'), y este sí que tiene 8 bits (2^8 = 256, donde entra todo caracter ASCII).

Ahora bien si yo hago

Código:
char a[20];
Estoy declarando un array de caracteres. Es por eso que no sé que diferencia existe entre esto y el char* que propones. Imagino por el operador * que se refiere a punteros. Pero no veo la diferencia.

Etiquetas: char, consultar, funcion, int, numero, programa, 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 01:16.