Tengo un programa en C, y como todo programa tiene un menu, mi menu tiene la opcion 1,2,3 y 10 salir. Quiero que al ingresar un numero distintos de esos o una letra salga un mensaje avisando de ello y que el programa corra. Tengo este codigo
if (opcion>3 && opcion<1 && opcion != 10)
{
printf("\n Porfavor ingrese un valor valido (1-3 o 10), presione una tecla para salir:");
getch();
menu();
}
pero al ingresar letras se cae :/
Aparte solo debo usar librerias Standar de C
Añado "else", que significa si no se elige ninguna de las opcines anteriores.
if (condición)
{
//Código
}else {
//código
}
En vez de && tienes que usar or que supongo que será || no se c
|Demon|: Si pongo solo un if y que si se cumple se salga creo que no es necesario el else
KuraraGNU: con el || se vuelve a caer al ingresar una letra
Cita de: ZedGe en 30 Diciembre 2011, 20:12 PM
|Demon|: Si pongo solo un if y que si se cumple se salga creo que no es necesario el else
KuraraGNU: con el || se vuelve a caer al ingresar una letra
No entiendo, ¿un if aparte solo para la opcion de salir?
es que mira, si es distinto de esos números por ejemplo entra el IF y si pongo en el if que retorne al menú que es otra función se saldrá del menu, en caso de que no entre al IF hará inmediatamente lo que esta bajo el IF entonces no es necesario poner un else
Si quieres hago el código entero con el else y demás, pero esperaba que lo hiciese el autor del post, yo sólo te dije que poniendo && no vas bien, porque estás diciendo que cuando ocurra que sea menor que 1 y mayor que tres y distinto de 10 salte la función, ya me dirás tú a mi qué número hay que sea A LA VEZ menor que 1 y mayor que 3, es por eso que en vez de && tienes que usar || (que es or), porque cuando ingreses un número que o bien sea menor que uno, o mayor que tres o distinto de 10 te salte eso, y los números que cumplen eso son todos menos el 1 2 3 y el 10. Si quieres te busco documentación para que te aclares si con mi explicación no te vale ^-^
Cita de: ZedGe en 30 Diciembre 2011, 20:12 PMcon el || se vuelve a caer al ingresar una letra
Pues tiene que ser que lo que pones dentro de la función está mal, no se que hace la función
getch(); pero te tiene que salir todo lo que hayas puesto dentro. Quizás la propia función
menu(); está mal, no puedo verlo sólo con ese código. Ponle una pausa después del mensaje y verás como al menos eso se ve y será problema de las otras funciones.
Es muy fácil de explicar, si escribes "&&" estás buscando un número que cumpla las tres condiciones, pero si pones ||(o or) estás haciendo referencia a un número que con que cumpla una sola condición de las expuestas pueda entrar en el If.
En cuanto a como usar if, es mejor que crees un if general (para todo el programa) diciéndole, que si cumple la condición siga con su ejecución o si no es correcta la opción ("else") vuelva el menu, me explico:
if (condicion)
{
//Aquí el codigo principal del programa
}else {
//y aqui el codigo que nos diste tu antes
}
Saludos
Cita de: KuraraGNU en 30 Diciembre 2011, 20:20 PM
Si quieres hago el código entero con el else y demás, pero esperaba que lo hiciese el autor del post, yo sólo te dije que poniendo && no vas bien, porque estás diciendo que cuando ocurra que sea menor que 1 y mayor que tres y distinto de 10 salte la función, ya me dirás tú a mi qué número hay que sea A LA VEZ menor que 1 y mayor que 3, es por eso que en vez de && tienes que usar || (que es or), porque cuando ingreses un número que o bien sea menor que uno, o mayor que tres o distinto de 10 te salte eso, y los números que cumplen eso son todos menos el 1 2 3 y el 10. Si quieres te busco documentación para que te aclares si con mi explicación no te vale ^-^
Porfavor, lo puse con || al hacerlo como no funciono puse && xD pero el problema es el mismo, al poner una letra queda en un bucle infinito entre el menu y el printf, de verdad no lo entiendo por que al poner una letra y leeerlo como int lo pasa a un numero i ese numero no esta dentro de las condiciones
asi tengo el codigo
if (opcion>3 || opcion<1 || opcion != 10)
{
rintf("\n Porfavor ingrese un valor valido (1-8), presione una tecla para salir:");
getch();
menu(primero);//primero es una lista enlazada no tiene importancia aca
}
Al ingresar la letra sale este printf en una nueva ventana (ventana de c en blanco con ese mensaje), al apretar enter deberia entrar al menu, pero presiono enter muestra el menu en 1 segundo y vuelve a mostrar el mensaje.
Cita de: ZedGe en 30 Diciembre 2011, 20:25 PM
asi tengo el codigo
if (opcion>3 || opcion<1 || opcion != 10)
{
rintf("\n Porfavor ingrese un valor valido (1-8), presione una tecla para salir:");
getch();
menu(primero);//primero es una lista enlazada no tiene importancia aca
}
Al ingresar la letra sale este printf en una nueva ventana (ventana de c en blanco con ese mensaje), al apretar enter deberia entrar al menu, pero presiono enter muestra el menu en 1 segundo y vuelve a mostrar el mensaje.
Entonces tengo que ver el código entero, porque tiene pinta que lo que ocurre es que ese enter que presionas lo toma como entrada para el propio menu, que no se qué hace, creo que en c tienes que tener un recolector de basura, sino se queda lo que has escrito por teclado almacenado y siempre que haga falta que entres algo por teclado cojerá lo que ya has puesto, ¿es c o c++? Mira yo con solo esa parte no te puedo ayudar.
Citar¿es c o c++?
Fíjate en el título del post
Déjanos el código completo por favor.
Saludos
El problema del codigo es que es demasiado no hara mucho spam? xD
como hago para ponerle barras al codigo para que esto no sea tan extenso?
lee la opcion asi, luego la conviertes a entero
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 :xD
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).
Un saludo
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
Cita de: rir3760 en 30 Diciembre 2011, 20:35 PM
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, ^-^ Espero no haber supuesto un impedimento.
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
Cita de: ZedGe en 30 Diciembre 2011, 20:41 PM
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
Pero es la opcion mas rentble :S aqui el codigo resumido solo deje lo necesario
estructuras.h
#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
#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
#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);
}
}
(http://strawhatsubs.files.wordpress.com/2010/04/facepalm1.jpg)
No leiste lo que dije
Cita de: Leyer en 30 Diciembre 2011, 20:56 PM
(http://strawhatsubs.files.wordpress.com/2010/04/facepalm1.jpg)
No leiste lo que dije
Lo de usar un char y pasarlo a int?? lo probe pero tampoco salio bien
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.
Cita de: Leyer en 30 Diciembre 2011, 20:34 PM
char option[2];
printf("Opcion: ");
scanf("%s",option);
int opt=atoi(option);
if(opt>3&&opt>10||opt==0)printf("fuera");
Cita de: Leyer en 30 Diciembre 2011, 20:34 PMPD: 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.
La Salucion es:
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
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 ^-^
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:
#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