Autor
|
Tema: Modulo distinguir letras de numeros (Leído 5,715 veces)
|
grandanh
Desconectado
Mensajes: 10
|
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
|
|
|
En línea
|
|
|
|
Gh057
Desconectado
Mensajes: 1.190
|
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.
|
|
|
En línea
|
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
grandanh
Desconectado
Mensajes: 10
|
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.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Un ejemplo sencillo: #include <iostream> using std::cin; using std::cout; using std::endl; int main() { cout << "Introduce un numero: "; int num; if (cin >> num) cout << "OK" << endl; else cout << "Entrada no valida" << endl; return 0; }
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
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
fary
|
Aquí te dejo un ejemplo que he hecho, funciona solo con números de una cifra: #include <iostream> using namespace std; int main() { char _numero = NULL; cout << "Introduce un numero: "; cin >> _numero; int numero = (int)(_numero-0x30); if (numero < 0x0 || numero > 0x9) { cout << endl <<"Error, el digito intrucido no es un numero" << endl; return 1; } cout << "El numero introducido es: " << numero << endl; return 0; }
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
grandanh
Desconectado
Mensajes: 10
|
Aquí te dejo un ejemplo que he hecho, funciona solo con números de una cifra: #include <iostream> using namespace std; int main() { char _numero = NULL; cout << "Introduce un numero: "; cin >> _numero; int numero = (int)(_numero-0x30); if (numero < 0x0 || numero > 0x9) { cout << endl <<"Error, el digito intrucido no es un numero" << endl; return 1; } cout << "El numero introducido es: " << numero << endl; return 0; }
Gracias, pero necesitamos que funcione con números de más cifras. Un ejemplo sencillo: #include <iostream> using std::cin; using std::cout; using std::endl; int main() { cout << "Introduce un numero: "; int num; if (cin >> num) cout << "OK" << endl; else cout << "Entrada no valida" << endl; return 0; }
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: 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.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:/********** FUNCION COMPRUEBA ENTERO *************/ int comprobar_cadena_como_numero (char cadena[100]){ for (int i=0;cadena[i];i++){ if (cadena[i]<'0' || cadena[i]>'9'){ return 1; } } return 2; } /********************************************************/ .................... cout<<"Select song:"<<endl; char buscado_char[100]; cin>>buscado_char; if (comprobar_cadena_como_numero(buscado_char)==2){ buscado=atoi(buscado_char);//si es un numero entero tiene que hacer todo esto encontrado=findIdSong(collection, buscado); } else cout<<"Error: Unknown song "<<buscado<<endl; ........................................
¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
Sefean
Desconectado
Mensajes: 3
|
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: #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: 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. #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.
|
|
« Última modificación: 14 Febrero 2014, 22:56 pm por Sefean »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:#include <iostream> #include <vector> #include <fstream> #include <cstdlib> #include <cstring> 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[10]; int longitud=0; 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(); longitud=strlen(opcion); if (longitud>=2 ) opcion[0]='a'; if (opcion[0]!='1' && opcion[0]!='2' && opcion[0]!='3' && opcion[0]!='4' && opcion[0]!='5' && opcion[0]!='6' && opcion[0]!='7' && opcion[0]!='8' && opcion[0]!='9' && opcion[0]!='0' && opcion[0]!='q'){ cout<<"Error: Unknown option"<<endl; } switch (opcion[0]){ case '1': addSong(collection); break; case '2': editSong(collection); break; case '3': deleteSong(collection); break; case '4': showCollection(collection); break; } }while(opcion[0]!='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,aux=0;; for(unsigned int i=0;i<collection.songs.size();i++){ printSong(collection.songs[i]); } char buscado_char[100]; cout<<"Select song:"<<endl; cin>>buscado_char; for (int i=0;buscado_char[i];i++){ aux++; if (buscado_char[i]<'0' || buscado_char[i]>'9'){ break; } } if (strlen(buscado_char)==aux){ buscado=atoi(buscado_char); encontrado=findIdSong(collection, buscado); if(aux==2){ 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); } } } /********** FUNCION COMPRUEBA ENTERO *************/ int comprobar_cadena_como_numero (char cadena[100]){ for (int i=0;cadena[i];i++){ if (cadena[i]<'0' || cadena[i]>'9'){ return 1; } } return 2; } /********************************************************/
¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Decifrador de numeros a letras [JAVA]
Java
|
diegoak
|
1
|
4,488
|
16 Marzo 2005, 16:27 pm
por diegoak
|
|
|
Como pasar de letras a numeros
Programación Visual Basic
|
kakinets
|
2
|
2,780
|
2 Julio 2005, 21:05 pm
por maxnet
|
|
|
For con números, muy bonito, pero con letras??
« 1 2 »
Programación Visual Basic
|
lipman
|
17
|
5,892
|
3 Mayo 2007, 20:30 pm
por Tyrz
|
|
|
Redes ONOXXXX letras y numeros
Hacking Wireless
|
josemanuelsurf
|
6
|
16,160
|
7 Julio 2011, 14:37 pm
por frakc/kcdtv
|
|
|
Combinaciones letras o numeros
« 1 2 »
.NET (C#, VB.NET, ASP)
|
luis456
|
11
|
8,988
|
8 Febrero 2014, 11:43 am
por luis456
|
|