elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 23:25  


Tema destacado: Entra al canal IRC oficial de #elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros  (Leído 1,032 veces)
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #15 en: 30 Diciembre 2011, 20:37 »

Como ya te comentaron hay que revisar el código completo del programa. En cuanto a utilizar solo funciones parte de la biblioteca estándar de C un problema es el uso (en el fragmento de tu primer mensaje) de getch que no lo es (es parte de la biblioteca conio de Borland).

La operación se debe separar en tres partes: primero debes obtener la entrada, validar que sea un numero y por ultimo verificar que este en el rango valido (en tu caso 1 .. 3 o bien 10).

Para el primer paso puedes utilizar la función fgets, para el segundo la función sscanf y para el tercero una sentencia de selección "switch".

Un saludo


En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
KuraraGNU

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #16 en: 30 Diciembre 2011, 20:40 »

La operación se debe separar en tres partes: primero debes obtener la entrada, validar que sea un numero y por ultimo verificar que este en el rango valido (en tu caso 1 .. 3 o bien 10).

Un saludo

No entiendo por qué queréis que compruebe que sea un número, yo es que de C no se, quizás es por eso que no comprendo, yo soy de programación orientada a objetos, más concretamente de java, pero si el chaval lo que quiere es que simplemente cuando ingreses algo que no sean ni 1 2 3 o 10 salte el mensaje no se por qué hay que validar que sea número, ¿es que no se puede considerar como un char y compararlo como tal en vez de hacer tantas conversiones? Aunque claro, de hacerlo así quizás tenga que cambiar esa condición que ha escrito, ¿no?

Bueno os dejo a vosotros que se ve que sabéis más, yo hice lo que pude, Azn Espero no haber supuesto un impedimento.


En línea

ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #17 en: 30 Diciembre 2011, 20:41 »

el getch a mi me funciona solo con

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

no se por que xD

lo que se me ocurrio es hacer mi menu con switch y con case y agregar un default
En línea
Caster


Desconectado Desconectado

Mensajes: 405


Divide y vencerás


Ver Perfil WWW
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #18 en: 30 Diciembre 2011, 20:43 »


lo que se me ocurrio es hacer mi menu con switch y con case y agregar un default

Default para switch es lo equivalente a else en if, la única es que switch te da muchas más flexibilidad
En línea

"Saber que se sabe lo que se sabe y que no se sabe lo que no se sabe, he aquí el verdadero saber."
(Confucio)

ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #19 en: 30 Diciembre 2011, 20:46 »

Pero es la opcion mas rentble :S aqui el codigo resumido solo deje lo necesario

estructuras.h

Código:
#ifndef ESTRUCTURAS_H_INCLUDED
#define ESTRUCTURAS_H_INCLUDED

typedef struct datosClientes{ //Datos del nodo
   char RUT[10]; //Variable que contiene el rut
   char Nombre[15]; //Variable que contiene Nombre
   char Apellido[15]; ////Variable que contiene el Apellido
   int Telefono; //Variable que contiene el telefono
   char direccionTipo[10]; //Variable que contiene si es pasaje,avenida o calle
   char direccionCalle[25]; //Variable que contiene la calle
   char direccionComuna[15]; //Variable que contiene la comuna
   char numeroCuenta[8]; //Variable que contiene el numero de la cuenta
   int Saldo; //Variable que contiene el saldo
   int Giro; //Variable que contiene el giro
   int Deposito; //Variable que contiene el deposito
} Datos; //Llamado estructura

typedef struct Nodo { //Creacion del nodo
   Datos Cliente;
   struct Nodo *sgte;
} Nodo;
#endif // ESTRUCTURAS_H_INCLUDED

menuPrincipal.c
Código:
#include <estructuras.h>
#include <stdlib.h>

int menu(Nodo *primero)//Creacion Del Menu
   {
        int opcion=0;//Variable que Guarda la opcion del menu
        system("cls");//Se borra la pantalla
        printf("\n\n\nIngrese El Numero De La Opcion Deseada :\n");//Se despliega el menu
        printf("\n\n1.- Ingresar Una Nueva Cuenta");
        printf("\n2.- Mostrar Cuentas Actuales");
        printf("\n3.- Eliminar Una Cuenta");
        printf("\n10.- Salir");
        printf("\n");
        scanf("%d",&opcion); //Se guarda la opcione eljida

        system("cls");//Se limpia la pantalla

        if(opcion == 1)//Si la opcion es 1 se llama a la funcion agregarCuenta
            {
                agregarCuenta(primero);
            }
        if(opcion == 2)//Si la opcion es 2 se llama a la funcion mostrarCuenta
             {
                mostrarCuenta(primero);
             }
        if(opcion == 3) //Si la opcion es 3 se llama a la funcion eliminarCuenta
             {
                eliminarCuentas(primero);
             }
        if(opcion == 10) //Si la opcion es 10 se cierra el programa
             {
                exit(1);
             }
    }

int  main() //Funcion Main
   {
    Nodo *primero = crearNodo();  //Se crea un nuevo nodo llamado primero
    primero= NULL; //Este nodo apuntara a la lista completa
    menu(primero); //Se pasa como parametro al Menu y se llama
    return 0;
   }

eliminar.c

Código:
#include <estructuras.h>
#include <stdlib.h>
#include <stdio.h>

void eliminarCuentas(Nodo *primero)//Funcion para eliminar una cuenta completamente
   {
     system("cls");
     int opcion;
     int encontrado=0; //Variable que nos servira para saber si encuentra o no coincidencia
     printf("\n\n\nIngrese El Numero De La Opcion Deseada :\n");//Menu para seleccionar parametro por el cual buscar la cuenta
     printf("\n\n1.- Eliminar Por RUT");
     printf("\n10.- Salir");
     printf("\n");
     scanf("%d",&opcion);//Lectura de la opcion elegida por el usuario
     system("cls");

     if(primero==NULL)//Si no existen cuentas se informa de aquello
               {
                 system("cls");
                 printf("\n\n\n\n\n\t\t\tNO HAY CUENTAS REGISTRADAS");
                 getch();
                 eliminarCuentas(primero);
               }

     Nodo *apuntado = crearNodo(); //Se crea un nodo para ir recorriendo la lista
     Nodo *datoBuscado = crearNodo(); //Se crea un nodo que contendra los datos buscados
     Nodo *anterior = crearNodo(); //Se crea un nodo para recorrer la lista un nodo mas atras

     if(opcion == 1) //Se inicia la opcion 1
        {
           printf("\n\n\t\t     ELIMINAR UNA CUENTA POR EL RUT DEL TITULAR");
           printf("\n\t\t\t------------------------------------");
           printf("\n\t\t\t------------------------------------\n\n");
           printf("INGRESE RUT DEL TITULAR DE LA CUENTA A ELIMINAR:"); //Se le pide al usuario que ingrese el RUT de la cuenta a eliminar
           scanf("%s",datoBuscado->Cliente.RUT);fflush(stdin);//Se guarda este valor en el auxiliar datoBuscado
           anterior=NULL; //A anterior le asignamos el valor NULL para ir un paso atras
           apuntado=primero;//A apuntado le asignamos el primer nodo de la lista

           while(apuntado!=NULL)//MIENTRAS apauntado sea distinto de NULL (Existen Datos)
                 {
                   if(strcmp(apuntado->Cliente.RUT,datoBuscado->Cliente.RUT)==0) //SI el dato de la cuenta apuntado es igual al ingresado por el usuario
                     {
                       if(anterior==NULL) //SI anterior es igual a nulo (si solo existe un cliente ingresado)
                         {
                           system("cls");
                           primero=apuntado->sgte;//El inicio de la lista sera el siguiente al antiguo primer nodo
                           printf("\n\n\n\n\n\n\n\t\t\t\tBORRANDO CLIENTE");
                           getch();
                           encontrado=1;//Se le asigna un 1 (se encontro coincidencia)
                           eliminarCuentas(primero); //se retorna al menu
                         }
                       else  //SI NO: Si el dato no esta en el primer nodoCuenta
                          {
                            system("cls");
                            anterior->sgte=apuntado->sgte; //El siguiente de anterior apuntara al siguiente de apuntado en caso de que el dato este en el medio
                            printf("\n\n\n\n\n\n\n\t\t\t\tBORRANDO CUENTA");
                            getch();
                            encontrado=1;//Se le asigna un 1 (se encontro coincidencia)
                            eliminarCuentas(primero); //se retorna al menu
                          }
                     }
                  anterior=apuntado;//Si el dato no esta en el primer Nodo la lista se hace avanzar
                  apuntado=apuntado->sgte; //anterior sera igual al primer Nodo y apuntado avanzara un Nodo
                }//cierra While

              if(encontrado == 0) //Si no se encontro una coincidencia
                {
                  system("cls");
                  printf("\n\n\n\n\n\n\n\t\tNO SE ENCONTRO EL RUT DEL TITULAR DE LA CUENTA A ELIMINAR");
                  getch();
                  encontrado=1;//Se le asigna un 1 (se encontro coincidencia)
                  eliminarCuentas(primero); //se retorna al menu
                }
           }//Cierra opcion 1

          if(opcion == 10) //SI opcion es igual a 10 el programa volvera al menu principal
            {
                menu(primero);
            }
   }

En línea
Leyer


Desconectado Desconectado

Mensajes: 772


[]


Ver Perfil WWW
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #20 en: 30 Diciembre 2011, 20:56 »



No leiste lo que dije
En línea

ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #21 en: 30 Diciembre 2011, 20:58 »



No leiste lo que dije


Lo de usar un char y pasarlo a int?? lo probe pero tampoco salio bien
En línea
KuraraGNU

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #22 en: 30 Diciembre 2011, 21:01 »

Leyer tiene razón, no puedes hacer

scanf("%d",&opcion)

Porque en el caso de meter una letra saltaría un error del programa y no lo estás controlando, por eso tienes que pasarlo a numero una vez recogido, pero no en la misma recolección, cambia tu código por lo que puso él, o cambia el tipo de dato que recoje "opcion" (Yo creo que es lo mejor, pero no se por qué tipo deberías cambiarlo, no se qué es lo que devuelve una tecla si un número, un char o un que, cuando yo he programado devuelve un código numérico que luego hay que parsear a lo que quieras usar). Yo lo siento no se mucho de c.


Código
char option[2];
printf("Opcion: ");
scanf("%s",option);
int opt=atoi(option);
if(opt>3&&opt>10||opt==0)printf("fuera");


PD: 2 paginas en esta boludes

Lo siento, es que como sólo pegó parte del código yo dije lo que veía mal en esa parte del código u.u espero no haber parecido muy tonta.
En línea

ZedGe

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #23 en: 30 Diciembre 2011, 21:30 »

La Salucion es:

Código:
char opcion[2];//Variable que Guarda la opcion del menu
 

Las opciones siguen siendo 1,2,3,10, pero al ingresar una letra o uno distinto hace lo que quiera que es volver al menu... Gracias a todos =D
En línea
KuraraGNU

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #24 en: 30 Diciembre 2011, 21:34 »

Es una de las posibles soluciones sí, es la que más me gustaba a mi, pero lo que dijo Leyer también debería de funcionar. ¿Ves? El problema estaba en la recogida de datos Azn
En línea

rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« Respuesta #25 en: 30 Diciembre 2011, 23:11 »

Si nos enfocamos solo en el menú las operaciones a realizar son:

1) Leer un entero de la entrada estándar, para ello basta con scanf.

2) Descartar el resto de la linea, necesario ya que si scanf no puede realizar una conversión los caracteres se mantienen en el bufer de la entrada estándar.

3) Discriminar el numero mediante una sentencia de selección.

Un programa de ejemplo, lo mas sencillo posible es:
Código
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
  int opcion;
  int ch;
  int ok;
 
  do {
     puts(" 1) Opcion A");
     puts(" 2) Opcion B");
     puts(" 3) Opcion C");
     puts("10) Salir");
 
     /* 1) Tratamos de leer un numero */
     ok = 1;
     if (scanf("%d", &opcion) != 1){
        puts("Entrada no valida!");
        ok = 0;
     }
 
     /* 2) Descartamos el resto de la linea */
     while ((ch = getchar()) != EOF && ch != '\n')
        ;
 
     /* 3) Si es un numero se selecciona la operacion */
     if (ok)
        switch (opcion){
        case 1:
           puts("La opcion seleccionada es la A");
           break;
        case 2:
           puts("La opcion seleccionada es la B");
           break;
        case 3:
           puts("La opcion seleccionada es la C");
           break;
        case 10:
           puts("La opcion seleccionada es terminar");
           break;
        default:
           puts("Numero fuera del rango valido!");
           break;
        }
  }while (opcion != 10);
 
  return EXIT_SUCCESS;
}

Por cierto utilizar scanf y similares tiene sus limitaciones, Si se necesita una validación a prueba de fallos se debe recurrir a las funciones strtol, strtoul o strtod.

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines