Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: grandanh en 14 Febrero 2014, 17:57 pm



Título: Modulo distinguir letras de numeros
Publicado por: grandanh en 14 Febrero 2014, 17:57 pm
Hola, estoy haciendo un programa y le pido al usuario que ingrese un valor de tipo int. El problema es que si el usuario introduce una letra,  el programa no va. Me gustaría que me ayudarais a hacer un modulo que en el caso de que el usuario introduzca una letra le envíe un mensaje de error, pero que no vuelva a pedirle el int,

Gracias :D


Título: Re: Modulo distinguir letras de numeros
Publicado por: Gh057 en 14 Febrero 2014, 18:07 pm
Hola grandanh, sería como una excepción... el manejo de excepciones en C no está implementado como en Java, puedes hacer módulo que verifique mediante una rutina if...  o con el operador ternario ? si es inválido el ingreso cierre la aplicación... en realidad dicho modulo lo implementaría con una rutina do ... while para forzar la ejecucción en un bucle hasta que el ingreso sea el correcto, pero no es lo que consultabas... Saludos.


Título: Re: Modulo distinguir letras de numeros
Publicado por: rir3760 en 14 Febrero 2014, 18:13 pm
estoy haciendo un programa y le pido al usuario que ingrese un valor de tipo int. El problema es que si el usuario introduce una letra,  el programa no va.
Lo primero que debes indicar es el lenguaje de programación que estas utilizando.

En el caso de C debes verificar el valor de retorno de la función de conversión (scanf/fscanf directamente o bien fgets + sscanf o strtol), en el caso de C++ puedes verificar el resultado de la operación "cin >> variable".

Y en ambos casos debe descartar la linea si esta no es valida (un bucle en C e ignore/sync en C++).

Un saludo


Título: Re: Modulo distinguir letras de numeros
Publicado por: grandanh en 14 Febrero 2014, 18:18 pm
Creía que el foro era solo de C++, fallo mío.

Dices que puedo verificar el resultado, pero como lo verificaría para diferencia de letras o numero/s?

gracias.


Título: Re: Modulo distinguir letras de numeros
Publicado por: rir3760 en 14 Febrero 2014, 18:23 pm
Un ejemplo sencillo:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. int main()
  7. {
  8.   cout << "Introduce un numero: ";
  9.  
  10.   int num;
  11.   if (cin >> num)
  12.      cout << "OK" << endl;
  13.   else
  14.      cout << "Entrada no valida" << endl;
  15.  
  16.   return 0;
  17. }

Pero le falta verificar si el resto de la linea solo es espacio blanco (para evitar que entradas como "123JKL" se tomen como validas).

Un saludo


Título: Re: Modulo distinguir letras de numeros
Publicado por: fary en 14 Febrero 2014, 18:36 pm
Aquí te dejo un ejemplo que he hecho, funciona solo con números de una cifra:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    char _numero = NULL;
  8.  
  9.    cout << "Introduce un numero: ";
  10.    cin >> _numero;
  11.  
  12.    int numero = (int)(_numero-0x30);
  13.  
  14.    if (numero < 0x0 || numero > 0x9)
  15.    {
  16.        cout << endl <<"Error, el digito intrucido no es un numero" << endl;
  17.  
  18.        return 1;
  19.    }
  20.  
  21.    cout << "El numero introducido es: " << numero << endl;
  22.    return 0;
  23. }
  24.  


Título: Re: Modulo distinguir letras de numeros
Publicado por: grandanh en 14 Febrero 2014, 18:42 pm
Aquí te dejo un ejemplo que he hecho, funciona solo con números de una cifra:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    char _numero = NULL;
  8.  
  9.    cout << "Introduce un numero: ";
  10.    cin >> _numero;
  11.  
  12.    int numero = (int)(_numero-0x30);
  13.  
  14.    if (numero < 0x0 || numero > 0x9)
  15.    {
  16.        cout << endl <<"Error, el digito intrucido no es un numero" << endl;
  17.  
  18.        return 1;
  19.    }
  20.  
  21.    cout << "El numero introducido es: " << numero << endl;
  22.    return 0;
  23. }
  24.  

Gracias, pero necesitamos que funcione con números de más cifras.

Un ejemplo sencillo:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. int main()
  7. {
  8.   cout << "Introduce un numero: ";
  9.  
  10.   int num;
  11.   if (cin >> num)
  12.      cout << "OK" << endl;
  13.   else
  14.      cout << "Entrada no valida" << endl;
  15.  
  16.   return 0;
  17. }

Pero le falta verificar si el resto de la linea solo es espacio blanco (para evitar que entradas como "123JKL" se tomen como validas).

Un saludo

Ese módulo funciona a la perfección, pero cuando tratamos de llevarlo a nuestro código no funciona correctamente, aquí te dejo el módulo en cuestión:

Código:
void editSong(Collection &collection){
 
  int  buscado, encontrado, eleccion, cont=0, numero;
   
   for(unsigned int i=0;i<collection.songs.size();i++){
     printSong(collection.songs[i]);
   }
   
   cout<<"Select song:"<<endl;
   if(cin>>buscado){ //si es un numero tiene que hacer todo esto
      encontrado=findIdSong(collection, buscado);
      if(encontrado==-1){
cout<<"Error: Unknown song "<<buscado<<endl;
    }
    else{
      do{
  cout<<"Edit (1-Title, 2-Artist, 3-Album, 4-Genre, 5-Url):"<<endl;
  cin>>eleccion;
  cin.get();
  switch(eleccion){
    case 1:
      cout<<"Title: ";
      getline(cin, collection.songs[buscado-1].title);
      break;
    case 2:
      cout<<"Artist: ";
      getline(cin, collection.songs[buscado-1].artist);
      break;
    case 3:
      cout<<"Album: ";
      getline(cin, collection.songs[buscado-1].album);
      break;
    case 4:
      cout<<"Genre: ";
      getline(cin, collection.songs[buscado-1].genre);
      break;
    case 5:
      cout<<"Url: ";
      getline(cin, collection.songs[buscado-1].url);
      break;
    default: cout<<"Error: Unknow option"<<endl;
  }
  }while(eleccion!=1 && eleccion!=2 && eleccion!=3 && eleccion!=4 && eleccion!=5);
}
   }
   else{ //si no es un numero mostrar este mensaje de error y vovler a mostrar el menu (otro módulo)
     cout<<"No results"<<endl;
   }
}

Si quieres que te enseñe el código entero dímelo, pero es bastante mas largo.


Título: Re: Modulo distinguir letras de numeros
Publicado por: leosansan en 14 Febrero 2014, 20:48 pm

Creo que presuponer que si cin no es uno tiene que ser menos uno, no sé yo.

De todas formas tal como te apuntaba rir3760 el método tiene entre otros el inconveniente que si se introduce una cadena como 12as el cin toma el 12 como número.

Creo más seguro declarar otra variable buscado_char como char y comprobar en una función, más que nada para que sea más modular el código, que todos sus caracteres son numéricos. Esto se puede hacer con la función isdigit o a pelo:


Código
  1. /**********    FUNCION COMPRUEBA ENTERO   *************/
  2. int comprobar_cadena_como_numero (char cadena[100]){
  3.    for (int i=0;cadena[i];i++){
  4.      if (cadena[i]<'0' || cadena[i]>'9'){
  5.            return 1;
  6.        }
  7.    }
  8.    return 2;
  9. }
  10. /********************************************************/
  11.  ....................
  12.  cout<<"Select song:"<<endl;
  13.  char buscado_char[100];
  14.  cin>>buscado_char;
  15.  if (comprobar_cadena_como_numero(buscado_char)==2){
  16.    buscado=atoi(buscado_char);//si es un numero entero tiene que hacer todo esto
  17.    encontrado=findIdSong(collection, buscado);
  18.    }
  19.  else
  20.    cout<<"Error: Unknown song "<<buscado<<endl;
  21.  ........................................
  22.  

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:


Título: Re: Modulo distinguir letras de numeros
Publicado por: Sefean en 14 Febrero 2014, 22:54 pm
Hola, soy el compañero de practicas del creador del tema, lo que pasa que ahora estoy solo por eso me he creado esta cuenta.

Hemos estado probando todo lo que nos habéis sugerido (y alguna que otra cosa mas) y no conseguimos hacer que funcione, así que tras probar mil cosas me he dado cuenta que al ejecutar este programilla:
Código:
#include <iostream>

using namespace std;

int main(){

int numero;

cout<<"Numero: "<<endl;
cin>>numero;
cout<<"N: "<<numero<<endl;

return 0;
}

Si en lugar de introducir un número introduces una letra, siempre recibes el valor 0, así que lo he intentado poner en mi código a ver si funcionaba, pero sigue fallando:

Código:
void editSong(Collection &collection){
  
  int encontrado, eleccion, buscado;  
  
   for(unsigned int i=0;i<collection.songs.size();i++){
     printSong(collection.songs[i]);
   }
  
   cout<<"Select song:"<<endl;
   cin>>buscado;
   if (buscado!=0){
   encontrado=findIdSong(collection, buscado);
   if(encontrado==-1){
cout<<"Error: Unknown song "<<buscado<<endl;
    }
    else{
      do{
 cout<<"Edit (1-Title, 2-Artist, 3-Album, 4-Genre, 5-Url):"<<endl;
 cin>>eleccion;
 cin.get();
 switch(eleccion){
   case 1:
     cout<<"Title: ";
     getline(cin, collection.songs[buscado-1].title);
     break;
   case 2:
     cout<<"Artist: ";
     getline(cin, collection.songs[buscado-1].artist);
     break;
   case 3:
     cout<<"Album: ";
     getline(cin, collection.songs[buscado-1].album);
     break;
   case 4:
     cout<<"Genre: ";
     getline(cin, collection.songs[buscado-1].genre);
     break;
   case 5:
     cout<<"Url: ";
     getline(cin, collection.songs[buscado-1].url);
     break;
   default: cout<<"Error: Unknow option"<<endl;
   break;
 }
 }while(eleccion!=1 && eleccion!=2 && eleccion!=3 && eleccion!=4 && eleccion!=5);
}
   }
   else{ //si no es un numero mostrar este mensaje de error y vovler a mostrar el menu
     cout<<"No results"<<endl;
   }
}

Aquí os dejo mi código entero por si a algún alma caritativa quiere echarle un ojo.

Código:
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

typedef struct
{
  int id; // El identificador de una nueva cancion debe ser igual a idNextSong
  string title;
  string artist;
  string album;
  string genre;
  string url;
} Song;

typedef struct
{
  vector<Song> songs;
  int idNextSong;  // Cada vez que se anyada una cancion a la coleccion, incrementar idNextSong
} Collection;


// Función para inicializar los valores de la colección
Collection createCollection();

//rellenar datos cancion
Song demandSong();

//comprobar cancion
bool isSongInCollection(const Collection &collection, Song song);

//añadir cancion
bool addSong(Collection &collection);

//imprimir canciones
void printSong(Song song);

//buscar y mostrar canciones
bool showCollection(const Collection &collection);

//encontrar ir
int findIdSong(const Collection &collection, int id);

//editar la cancion
void editSong(Collection &collection);

//borrar la cancion
void deleteSong(Collection &collection);

//prueba
bool Comprobarnumero(int numero);

// Implementar resto de funciones

int main()
{
  Collection collection=createCollection();
  
  
  char opcion;
  
    do{
      cout<<"--------------------------------"<<endl;
      cout<<"----------- MiniTunes ----------"<<endl;
      cout<<"--------------------------------"<<endl;
      cout<<"1- Add song"<<endl;
      cout<<"2- Edit song"<<endl;
      cout<<"3- Delete song"<<endl;
      cout<<"4- Show collection"<<endl;
      cout<<"5- Manage playlist"<<endl;
      cout<<"6- Import iTunes JSON data"<<endl;
      cout<<"7- Export playlist to XSPF"<<endl;
      cout<<"8- Save data"<<endl;
      cout<<"9- Load data"<<endl;
      cout<<"0- Play playlist"<<endl;
      cout<<"q- Quit"<<endl;
      cout<<"Option: ";
      cin>>opcion;
      cin.get();
  
      if (opcion!='1' && opcion!='2' && opcion!='3' && opcion!='4' && opcion!='5' && opcion!='6' && opcion!='7' && opcion!='8' && opcion!='9' && opcion!='0' && opcion!='q'){
cout<<"Error: Unknown option"<<endl;
      }    
      switch (opcion){
case '1':
 addSong(collection);
 break;
case '2': editSong(collection);
 break;
case '3':
 deleteSong(collection);
 break;
case '4':
 showCollection(collection);
 break;
      }
  }while(opcion!='q');
 
  return 0;
}

Collection createCollection()
{
  Collection collection;
  collection.idNextSong=1;

  return collection;
}

Song demandSong(){
  
  Song song;
  
  cout<<"Title: ";
  getline(cin, song.title);  
  cout<<"Artist: ";
  getline(cin, song.artist);
  cout<<"Album: ";
  getline(cin, song.album);
  cout<<"Genre: ";
  getline(cin,song.genre);
  cout<<"Url: ";
  getline(cin, song.url);
  
  
  return song;
}

bool isSongInCollection(const Collection &collection, Song song){
  
  bool repetida=false;
  unsigned int i;
  
  for(i=0;i<collection.songs.size() && !repetida;i++){
    if(song.title==collection.songs[i].title && collection.songs[i].artist==song.artist){
      repetida=true;
    }
  }
  return repetida;  
    
}

bool addSong(Collection &collection){

  bool repetida;
  
   Song song=demandSong();
  

   repetida=isSongInCollection(collection, song);
   if (repetida==true){
     cout<<"The song "<<song.title<<" is already in the collection"<<endl;
   }
   else {
  song.id=collection.idNextSong;
  collection.songs.push_back(song);
     collection.idNextSong++;
   }
return repetida;
}

void printSong(Song song){  
    cout<<song.id<<" | "<<song.title<<" | "<<song.artist<<" | "<<song.album<<" | "<<song.genre<<endl;      
}

bool showCollection(const Collection &collection){
  
  string buscado;
  bool encontrado;
  int aux=0;
  
  cout<<"Search: "<<endl;
  getline(cin, buscado);
  

    for(unsigned int i=0;i<collection.songs.size();i++){
    
      encontrado=false;
    
      if (collection.songs[i].title.find(buscado)!=string::npos){
encontrado=true;
      }
      else if(collection.songs[i].artist.find(buscado)!=string::npos){
encontrado=true;
      }
      else if(collection.songs[i].album.find(buscado)!=string::npos){
encontrado=true;
      }
      else if(collection.songs[i].genre.find(buscado)!=string::npos){
encontrado=true;
      }
      if (encontrado==true){
printSong(collection.songs[i]);
aux++;
}
    }
 
  if(aux==0){
    cout<<"No results"<<endl;
  }

 return encontrado;
}

int findIdSong(const Collection &collection, int id){
  
  int encontrado=-1;

  
   for(unsigned int k=0;k<=collection.songs.size();k++){
  if(id==collection.songs[k].id){
      encontrado=k+1;
      }
   }
  
    return encontrado;
}

void editSong(Collection &collection){
  
  int encontrado, eleccion, buscado;  
  
   for(unsigned int i=0;i<collection.songs.size();i++){
     printSong(collection.songs[i]);
   }
  
   cout<<"Select song:"<<endl;
   cin>>buscado;
   if (buscado!=0){
   encontrado=findIdSong(collection, buscado);
   if(encontrado==-1){
cout<<"Error: Unknown song "<<buscado<<endl;
    }
    else{
      do{
 cout<<"Edit (1-Title, 2-Artist, 3-Album, 4-Genre, 5-Url):"<<endl;
 cin>>eleccion;
 cin.get();
 switch(eleccion){
   case 1:
     cout<<"Title: ";
     getline(cin, collection.songs[buscado-1].title);
     break;
   case 2:
     cout<<"Artist: ";
     getline(cin, collection.songs[buscado-1].artist);
     break;
   case 3:
     cout<<"Album: ";
     getline(cin, collection.songs[buscado-1].album);
     break;
   case 4:
     cout<<"Genre: ";
     getline(cin, collection.songs[buscado-1].genre);
     break;
   case 5:
     cout<<"Url: ";
     getline(cin, collection.songs[buscado-1].url);
     break;
   default: cout<<"Error: Unknow option"<<endl;
   break;
 }
 }while(eleccion!=1 && eleccion!=2 && eleccion!=3 && eleccion!=4 && eleccion!=5);
}
   }
   else{ //si no es un numero mostrar este mensaje de error y vovler a mostrar el menu
     cout<<"No results"<<endl;
   }
}


void deleteSong(Collection &collection){
  
  int buscado_del, encontrado3=0;
  char sino;
  
    for(unsigned int i=0;i<collection.songs.size();i++){
     printSong(collection.songs[i]);
   }
  
    cout<<"Select song: "<<endl;
    cin>>buscado_del;
    
  
    encontrado3=findIdSong(collection, buscado_del);
    if(encontrado3==-1){
      cout<<"Error: Unknown song "<<buscado_del<<endl;
    }
    else{
      cout<<"Delete "<<collection.songs[buscado_del-1].id<<" | "<<collection.songs[buscado_del-1].title<<" | ";
      cout<<collection.songs[buscado_del-1].artist<<" | "<<collection.songs[buscado_del-1].album<<" | "<<collection.songs[buscado_del-1].genre<<"? (Y/N)"<<endl;
      cin>>sino;
      cin.get();
      if(sino=='N'){
cout<<"Song not deleted"<<endl;
      }
      else{
collection.songs.erase(collection.songs.begin()+buscado_del-1);
      }
    }
}

PD: ¿Cómo hacéis para que el código os salga en colores en el foro?

Gracias.


Título: Re: Modulo distinguir letras de numeros
Publicado por: leosansan en 15 Febrero 2014, 05:43 am

PD: ¿Cómo hacéis para que el código os salga en colores en el foro?


Elige las etiquetas de C++ en lugar de las de C.

Lo de las opciones ya funciona, aunque creo que te faltan por implementar otras funciones:


Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. #include <cstdlib>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. typedef struct
  10. {
  11.  int id; // El identificador de una nueva cancion debe ser igual a idNextSong
  12.  string title;
  13.  string artist;
  14.  string album;
  15.  string genre;
  16.  string url;
  17. } Song;
  18.  
  19. typedef struct
  20. {
  21.  vector<Song> songs;
  22.  int idNextSong;  // Cada vez que se anyada una cancion a la coleccion, incrementar idNextSong
  23. } Collection;
  24.  
  25.  
  26. // Función para inicializar los valores de la colección
  27. Collection createCollection();
  28.  
  29. //rellenar datos cancion
  30. Song demandSong();
  31.  
  32. //comprobar cancion
  33. bool isSongInCollection(const Collection &collection, Song song);
  34.  
  35. //añadir cancion
  36. bool addSong(Collection &collection);
  37.  
  38. //imprimir canciones
  39. void printSong(Song song);
  40.  
  41. //buscar y mostrar canciones
  42. bool showCollection(const Collection &collection);
  43.  
  44. //encontrar ir
  45. int findIdSong(const Collection &collection, int id);
  46.  
  47. //editar la cancion
  48. void editSong(Collection &collection);
  49.  
  50. //borrar la cancion
  51. void deleteSong(Collection &collection);
  52.  
  53. //prueba
  54. bool Comprobarnumero(int numero);
  55.  
  56. // Implementar resto de funciones
  57.  
  58. int main()
  59. {
  60.  Collection collection=createCollection();
  61.  
  62.  
  63.  char opcion[10];
  64.  int longitud=0;
  65.  
  66.    do{
  67.      cout<<"--------------------------------"<<endl;
  68.      cout<<"----------- MiniTunes ----------"<<endl;
  69.      cout<<"--------------------------------"<<endl;
  70.      cout<<"1- Add song"<<endl;
  71.      cout<<"2- Edit song"<<endl;
  72.      cout<<"3- Delete song"<<endl;
  73.      cout<<"4- Show collection"<<endl;
  74.      cout<<"5- Manage playlist"<<endl;
  75.      cout<<"6- Import iTunes JSON data"<<endl;
  76.      cout<<"7- Export playlist to XSPF"<<endl;
  77.      cout<<"8- Save data"<<endl;
  78.      cout<<"9- Load data"<<endl;
  79.      cout<<"0- Play playlist"<<endl;
  80.      cout<<"q- Quit"<<endl;
  81.      cout<<"Option: ";
  82.      cin>>opcion;
  83.      cin.get();
  84.      longitud=strlen(opcion);
  85.      if (longitud>=2 )
  86.        opcion[0]='a';
  87.      if (opcion[0]!='1' && opcion[0]!='2' && opcion[0]!='3' && opcion[0]!='4' &&
  88.          opcion[0]!='5' && opcion[0]!='6' && opcion[0]!='7' && opcion[0]!='8' && opcion[0]!='9' && opcion[0]!='0' && opcion[0]!='q'){
  89. cout<<"Error: Unknown option"<<endl;
  90.      }
  91.      switch (opcion[0]){
  92. case '1':
  93.  addSong(collection);
  94.  break;
  95. case '2': editSong(collection);
  96.  break;
  97. case '3':
  98.  deleteSong(collection);
  99.  break;
  100. case '4':
  101.  showCollection(collection);
  102.  break;
  103.      }
  104.  }while(opcion[0]!='q');
  105.  
  106.  return 0;
  107. }
  108.  
  109. Collection createCollection()
  110. {
  111.  Collection collection;
  112.  collection.idNextSong=1;
  113.  
  114.  return collection;
  115. }
  116.  
  117. Song demandSong(){
  118.  
  119.  Song song;
  120.  
  121.  cout<<"Title: ";
  122.  getline(cin, song.title);
  123.  cout<<"Artist: ";
  124.  getline(cin, song.artist);
  125.  cout<<"Album: ";
  126.  getline(cin, song.album);
  127.  cout<<"Genre: ";
  128.  getline(cin,song.genre);
  129.  cout<<"Url: ";
  130.  getline(cin, song.url);
  131.  
  132.  
  133.  return song;
  134. }
  135.  
  136. bool isSongInCollection(const Collection &collection, Song song){
  137.  
  138.  bool repetida=false;
  139.  unsigned int i;
  140.  
  141.  for(i=0;i<collection.songs.size() && !repetida;i++){
  142.    if(song.title==collection.songs[i].title && collection.songs[i].artist==song.artist){
  143.      repetida=true;
  144.    }
  145.  }
  146.  return repetida;
  147.  
  148. }
  149.  
  150. bool addSong(Collection &collection){
  151.  
  152.  bool repetida;
  153.  
  154.   Song song=demandSong();
  155.  
  156.  
  157.   repetida=isSongInCollection(collection, song);
  158.   if (repetida==true){
  159.     cout<<"The song "<<song.title<<" is already in the collection"<<endl;
  160.   }
  161.   else {
  162.   song.id=collection.idNextSong;
  163.   collection.songs.push_back(song);
  164.     collection.idNextSong++;
  165.   }
  166. return repetida;
  167. }
  168.  
  169. void printSong(Song song){
  170.    cout<<song.id<<" | "<<song.title<<" | "<<song.artist<<" | "<<song.album<<" | "<<song.genre<<endl;
  171. }
  172.  
  173. bool showCollection(const Collection &collection){
  174.  
  175.  string buscado;
  176.  bool encontrado;
  177.  int aux=0;
  178.  
  179.  cout<<"Search: "<<endl;
  180.  getline(cin, buscado);
  181.  
  182.  
  183.    for(unsigned int i=0;i<collection.songs.size();i++){
  184.  
  185.      encontrado=false;
  186.  
  187.      if (collection.songs[i].title.find(buscado)!=string::npos){
  188. encontrado=true;
  189.      }
  190.      else if(collection.songs[i].artist.find(buscado)!=string::npos){
  191. encontrado=true;
  192.      }
  193.      else if(collection.songs[i].album.find(buscado)!=string::npos){
  194. encontrado=true;
  195.      }
  196.      else if(collection.songs[i].genre.find(buscado)!=string::npos){
  197. encontrado=true;
  198.      }
  199.      if (encontrado==true){
  200. printSong(collection.songs[i]);
  201. aux++;
  202. }
  203.    }
  204.  
  205.  if(aux==0){
  206.    cout<<"No results"<<endl;
  207.  }
  208.  
  209. return encontrado;
  210. }
  211.  
  212. int findIdSong(const Collection &collection, int id){
  213.  
  214.  int encontrado=-1;
  215.  
  216.  
  217.   for(unsigned int k=0;k<=collection.songs.size();k++){
  218.   if(id==collection.songs[k].id){
  219.      encontrado=k+1;
  220.      }
  221.   }
  222.  
  223.    return encontrado;
  224. }
  225.  
  226. void editSong(Collection &collection){
  227.  
  228.  int encontrado, eleccion, buscado,aux=0;;
  229.  
  230.   for(unsigned int i=0;i<collection.songs.size();i++){
  231.     printSong(collection.songs[i]);
  232.   }
  233.  char buscado_char[100];
  234.   cout<<"Select song:"<<endl;
  235.   cin>>buscado_char;
  236.   for (int i=0;buscado_char[i];i++){
  237.      aux++;
  238.      if (buscado_char[i]<'0' || buscado_char[i]>'9'){
  239.            break;
  240.        }
  241.    }
  242.    if (strlen(buscado_char)==aux){
  243.  
  244.   buscado=atoi(buscado_char);
  245.   encontrado=findIdSong(collection, buscado);
  246.  
  247.   if(aux==2){
  248. cout<<"Error: Unknown song "<<buscado<<endl;
  249.    }
  250.    else{
  251.      do{
  252.  cout<<"Edit (1-Title, 2-Artist, 3-Album, 4-Genre, 5-Url):"<<endl;
  253.  cin>>eleccion;
  254.  cin.get();
  255.  switch(eleccion){
  256.    case 1:
  257.      cout<<"Title: ";
  258.      getline(cin, collection.songs[buscado-1].title);
  259.      break;
  260.    case 2:
  261.      cout<<"Artist: ";
  262.      getline(cin, collection.songs[buscado-1].artist);
  263.      break;
  264.    case 3:
  265.      cout<<"Album: ";
  266.      getline(cin, collection.songs[buscado-1].album);
  267.      break;
  268.    case 4:
  269.      cout<<"Genre: ";
  270.      getline(cin, collection.songs[buscado-1].genre);
  271.      break;
  272.    case 5:
  273.      cout<<"Url: ";
  274.      getline(cin, collection.songs[buscado-1].url);
  275.      break;
  276.    default: cout<<"Error: Unknow option"<<endl;
  277.    break;
  278.  }
  279.  }while(eleccion!=1 && eleccion!=2 && eleccion!=3 && eleccion!=4 && eleccion!=5);
  280. }
  281.   }
  282.   else{ //si no es un numero mostrar este mensaje de error y vovler a mostrar el menu
  283.     cout<<"No results"<<endl;
  284.   }
  285. }
  286.  
  287.  
  288. void deleteSong(Collection &collection){
  289.  
  290.  int buscado_del, encontrado3=0;
  291.  char sino;
  292.  
  293.    for(unsigned int i=0;i<collection.songs.size();i++){
  294.     printSong(collection.songs[i]);
  295.   }
  296.  
  297.    cout<<"Select song: "<<endl;
  298.    cin>>buscado_del;
  299.  
  300.  
  301.    encontrado3=findIdSong(collection, buscado_del);
  302.    if(encontrado3==-1){
  303.      cout<<"Error: Unknown song "<<buscado_del<<endl;
  304.    }
  305.    else{
  306.      cout<<"Delete "<<collection.songs[buscado_del-1].id<<" | "<<collection.songs[buscado_del-1].title<<" | ";
  307.      cout<<collection.songs[buscado_del-1].artist<<" | "<<collection.songs[buscado_del-1].album<<" | "<<collection.songs[buscado_del-1].genre<<"? (Y/N)"<<endl;
  308.      cin>>sino;
  309.      cin.get();
  310.      if(sino=='N'){
  311. cout<<"Song not deleted"<<endl;
  312.      }
  313.      else{
  314. collection.songs.erase(collection.songs.begin()+buscado_del-1);
  315.      }
  316.    }
  317. }
  318. /**********    FUNCION COMPRUEBA ENTERO   *************/
  319. int comprobar_cadena_como_numero (char cadena[100]){
  320.    for (int i=0;cadena[i];i++){
  321.      if (cadena[i]<'0' || cadena[i]>'9'){
  322.            return 1;
  323.        }
  324.    }
  325.    return 2;
  326. }
  327. /********************************************************/
  328.  

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Modulo distinguir letras de numeros
Publicado por: Sefean en 20 Febrero 2014, 10:43 am
Muchas gracias, no funciona exactamente como necesitabamos pero gracias a lo que has puesto hemos conseguido modificarlo para que funcione como nos exigian, muchas gracias.


Título: Re: Modulo distinguir letras de numeros
Publicado por: Atap en 25 Febrero 2014, 00:08 am
Hola a todos, sé que el problema ya está solucionado, pero aún así me gustaría dar mi propia idea por si alguien ve el tema y le puede servir >_<. Mi ejemplo es en C, pues es el lenguaje que estudio actualmente:

Código
  1. void main()
  2. {
  3.    int numero = 0;
  4.  
  5.    int minimo = 1;  // Esta variable y la siguiente pueden establecerse como constantes tambien.
  6.  
  7.    int maximo = 1000;
  8.  
  9.    do
  10.   {
  11.  
  12.      printf("Introduce un numero (mayor a %d y menor a %d): ");
  13.      scanf("%d", &numero);
  14.      fflush(stdin);
  15.  
  16.   }while(numero < minimo || numero > maximo);
  17.  
  18. }
  19.  
  20.  

Como podemos apreciar, si es la validación de un numero y conocemos sus limites, podemos hacer una tecnica sencilla de validación de datos como esta. Como también se puede apreciar, utilizar una estructura de bucle while, do-while, o un bucle for con una sentencia if, es el truco para hacer una buena validación.

Espero haberles ayudado, también quiero decir que es mi primer post, mucho gusto a todos xD.