Duda solo ingresar numeros

Iniciado por meaf75, 10 Abril 2016, 17:53 PM

0 Miembros y 2 Visitantes están viendo este tema.

meaf75

Hola, estoy desarrollando una tarea y en esta me pide  ingresar un numero (todo bien hasta ahi) pero digamos la persona que esta usando el programa ingresa una letra le deberia decir: ingrese un numero pero en vez de eso cuando ingreso una letra me manda un error y se cierra, no se como poner que el valor a ingresar tiene que ser un numero y no una letra y si es una letra que lo devuelva al paso anterior hasta que ingrese un numero

NOB2014

#1
Hola, meaf75. -
No tengo todavía mucha autoridad para responderte pero fíjate si este código te soluciona en parte tu problema, el único error es que si ingresas 12a te toma como válido el 12, tú dirás. -

#include <stdio.h>
#include <limits.h>

int main( void ){
int numero = 0, ch, ok;

do{
printf("\n Ingresa un numero entero (maximo %u)....: ", UINT_MAX);
ok = scanf("%d", &numero) == 1 && numero >= 1 && numero <= UINT_MAX;

while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

printf( "\n Ingreso...: %d", numero );

return 0;
}


Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

meaf75

Huy me explicas jaja voy en primer semestre y no entiendo mucho lo que hay ahi

LaiaxanIV

El código que ha subido NOB2014 está en C. Tiene que estar en c o en c++?
Si es en C, ya te explico el código.

meaf75

Pues yo estoy trabajado en pseint pero aprendiendo en c++ lo puedo pasar a pseint

LaiaxanIV

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main(){
string n;
bool notnum = false;
cout << "Ingresa un numero"  << endl;
while(cin >> n){
for(int i = 0; i < n.size() && !notnum; ++i){
notnum = (n[i]< 48 || n[i]> 57);
}
if(notnum) cout << "Por favor, ingresa un numero correcto" << endl;
else cout << "Numero correcto" << endl;
}
}


Mirate esto a ver si lo entiendes, si no enviame MP y te explico.

HardForo

#6
El ultimo codigo que se posteó (de @LaiaxanIV) esta escencialmente bien creo que por un boolean mal te queda en bucle infinito:

Citar
Ingresa un numero
uu
Por favor, ingresa un numero correcto
yy
Por favor, ingresa un numero correcto
55  <-- es correcto
Por favor, ingresa un numero correcto    <--  se vuelve a preguntar

Lo he modificado:

Código (cpp) [Seleccionar]

#include <iostream>
#include <stdlib.h>
using namespace std;

/*
Lee un integer por teclado (C++)
*/
int readint(string msg){
string str_num;
bool notnum = true;

cout << msg;
cin >> str_num;

while(notnum){
for(int i = 0; i < str_num.size();  i++){
notnum = (str_num[i]< 48 || str_num[i]> 57);

if(notnum){
cout << msg;
cin >> str_num;
break;
}
}
}

return atoi(str_num.c_str());
}


int main(){
int n;
n = readint("Ingresa un numero: ");
printf("Perfecto! el numero ingresado fue: %d",n);

return 0;
}


Ahora funciona bien y te aclaro que si el numero fuera un numero decimal (float) deberia aceptarse tambien el punto(.)
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

HardForo

He intentado traducir el codigo del compañero (que he modificado ligeramente) de C++ a C pero me explota!

Alguien podria hacerlo por mi para ver en que fallo ?  en C++ me funciona pero en C tengo un problema al pasar un string y querer utilizarlo como const char *

Ojala me iluminen  ;D
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

crack81

Hola mirate este ejemplo, en vez de que la funcion readInt  lea, valide y regrese la conversion de string a entero

Mejor me cree una funcion para validar si un array de char en C seria valido para poder convertilo en un entero

Mi funcion lo unico que hace es recorrer la cadena y usando las funciones isdigit que viene en la bibilioteca ctype de C comprobamos que cada caracter es un entero valido

Si encontramos algo raro la funcion retorna un cero(false) sino regresa un uno(True)

ejemplo:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


int isInteger(char possibleNumber[]){

    while(*possibleNumber){
        if(!isdigit(*possibleNumber))return 0;
        possibleNumber++;
    }
    return 1;
}

int main()
{
    //Primer ejemplo
    char number[]="352353";

    if(isInteger(number))
        printf("%s","Es numero valido");
    else
        printf("%s","no es un numero valido");

    //Segundo ejemplo
    char number2[20];
    printf("%s","\n\nIngrese un valor valido\n");
    scanf("%s",number2);


    if(isInteger(number2))
       printf("%s","Es numero valido");
    else
       printf("%s","no es un numero valido");

    return 0;
}
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

DanFire


int ingressaNumero() {

   int l(0);
   do {
       cout<< "Ingrese un numero : ";
       cin>>l;
       if (cin.fail()) {
           cout << "Te he pedido un numero , "
                << "no tonterias!" << endl;

           cin.clear();

           cin.ignore(numeric_limits<streamsize>::max(), '\n');
           l=-1;
       }
   } while(l<0);

   return l;


}




no te olvides de incluir <limits>
#include <iostream>
using namespace std;