Ayuda con estructuras

Iniciado por eltoffer, 5 Febrero 2011, 01:33 AM

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

eltoffer

Bueno tengo un problema tengo que hacer un menu con diferentes opciones y estructuras, el asunto lo tengo claro y puedo hacerlo solo que me esta rompiendo la cabeza el uso de:

scanf("%d",&opt)
opt=getch();
opt=getche();
opt=getchar();

por que lo digo???? porque cuando me muestra el menu no me respeta la opcion deseada o se la brinca o no hace nada

a ver si me echan una mano

este es mi codigo (parcial) solo necesito que me digan como le hago para que me valga las opciones con esa base del cogido qu.e tengo, no me gustaria cambiar mucho codigo, creo que no esta TAN TAN mal :P

#include<stdio.h>
#include<conio.h>

struct cliente {
char rfc[15];
char nom [30];
char dir[60];
char tel[11];
       };
struct cliente c1;

struct maquinaria {
int num_maq;
char mod[15];
char desc [60];
char fecha_com [15];
char tipo[15];
  };
struct maquinaria m1;

struct renta {
int num_rent;
char fecha_rent[15];
char period[20];
char rfc [15];
int num_maq;
float total_rent;
     };
struct renta r1;

int opt,opt2;

void main (void)
{
do
{
clrscr();
printf("Bienvenido al sistema de registro\n\n");
printf("1.- Manejo de datos del cliente\n2.- Manejo de datos de la maquinaria\n3.- Control de rentas\n4.- Salida\n\nOpcion: ");
[color=red][b] scanf("%d",&opt);
switch(opt)[/b][/color]
case 1:
{
do
{
clrscr();
printf("MANEJO DE DATOS DEL CLIENTE\n\n");
printf("1.- Altas de clientes\n2.- Bajas de clientes\n3.- Cambio de datos de clientes\n4.- Consulta de todo los clientes\n5.- Regresar al menu principal\n\nOpcion:  ");
[color=red][b]opt2=get();
switch(opt2)[/b][/color]
case 1:
{
clrscr();
printf("ALTA DE CLIENTES\n\n");
printf("RFC del cliente: ");
gets(c1.rfc);
printf("Nombre del cliente: ");
gets(c1.nom);
printf("Direccion: ");
gets(c1.dir);
printf("Telefono: ");
gets(c1.tel);
}
break;
case 2:
clrscr();
printf("BAJAS DE CLIENTES\n\n");
break;
case 3:
clrscr();
printf("CAMBIO DE DATOS DE CLIENTES");
break;
case 4:
        clrscr();
printf("CONSULTA DE TODOS LOS CLIENTES");
break;
case 5:
clrscr();
break;
}
while(opt != 5) ;
}
break;
        }
while (opt != 4);
getch();
}



que tengo mal???

negux

aparte de que debe de ser int main y el return 0, no se recomienda el uso de conio.h
creo que se debe al uso del gets, por que en los printf usas \n y eso te lo lee el gets,
usa scanf para leer opt2, algo que hice asi rapido pero no es recomendable es el uso de fflush(stdin);   :-\ antes de cada gets
:S

eltoffer

bueno ya solucione la pate de las opciones ahora tengo porblema con la estructura

clrscr();
printf("MANEJO DE DATOS DEL CLIENTE\n\n");
printf("1.- Altas de clientes\n2.- Bajas de clientes\n3.- Cambio de datos de clientes\n4.- Consulta de todo los clientes\n5.- Regresar al menu principal\n\nOpcion:  ");
scanf("%d", &opt2);
              switch(opt2)
{
                case 1:
{
clrscr();
printf("ALTA DE CLIENTES\n\n");
printf("RFC del cliente: ");
gets(c1.rfc);
                                                    printf("Nombre del cliente: ");
gets(c1.nom);
printf("Direccion: ");
gets(c1.dir);
printf("Telefono: ");
gets(c1.tel);
break;
                  }


en esta parte si escogo 1 me muetra este menu pero en la aprte donde me pediria el RFC no puedo introducir ningun caracter porque me pasa a la siguiente opcion osea NOMBRE y ahi si ya puedo escribir, el rpoblema solo es en el RFC, tengo duda de si se puede usar el gets porque es una variable de tipo entero y no cadena de caracteres, pienso que ese es el problema, pero no se, acabo de aprnder esto de las estructuras

negux

quien es una variable de tipo entero, RFC es caracter, te repito es por el gets y el salto de linea antes, puedes usar fflush(stdin); antes de cada gets, claro que no es recomendablee

Tokes

¿No deberías poner case  '1' (con apóstrofes)?

eltoffer

es cierto me confundi, si es una cadena de caracteres

pero ya probe quitando los saltos de linea y aun asi no me toma en cuenta elo RFC :S que sera????

leogtz

#include<stdio.h>


struct cliente {
char rfc[15];
char nom [30];
char dir[60];
char tel[11];
       };
struct cliente c1;

struct maquinaria {
int num_maq;
char mod[15];
char desc [60];
char fecha_com [15];
char tipo[15];
  };
struct maquinaria m1;

struct renta {
int num_rent;
char fecha_rent[15];
char period[20];
char rfc [15];
int num_maq;
float total_rent;
     };
struct renta r1;

int opt,opt2;

void main (void)
{
do
{

printf("Bienvenido al sistema de registro\n\n");
printf("1.- Manejo de datos del cliente\n2.- Manejo de datos de la maquinaria\n3.- Control de rentas\n4.- Salida\n\nOpcion: ");
        scanf("%d",&opt);
        while(getchar() != '\n');
switch(opt)
{
    case 1:
do
{
printf("MANEJO DE DATOS DEL CLIENTE\n\n");
printf("1.- Altas de clientes\n2.- Bajas de clientes\n3.- Cambio de datos de clientes\n4.- Consulta de todo los clientes\n5.- Regresar al menu principal\n\nOpcion:  ");

scanf("%d", &opt2);
while(getchar() != '\n');
switch(opt2)
case 1:
{

printf("ALTA DE CLIENTES\n\n");
printf("RFC del cliente: ");
gets(c1.rfc);
printf("Nombre del cliente: ");
gets(c1.nom);
printf("Direccion: ");
gets(c1.dir);
printf("Telefono: ");
gets(c1.tel);
}
break;
case 2:
printf("BAJAS DE CLIENTES\n\n");
break;
case 3:
printf("CAMBIO DE DATOS DE CLIENTES");
break;
case 4:
printf("CONSULTA DE TODOS LOS CLIENTES");
break;
case 5:

break;
}
while(opt != 5) ;
}
break;
        }
while (opt != 4);65
getchar();
}







Probé el código, no hacía lo que debía al no limpiar el buffer.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Garfield07

Gets es de uso no recomendado:

gets (buffer);

Peor que:

fgets (buffer, 1024, stdin);


Lo del main, igual...

void main (void)

Peor que:

int main ()


Cita de: Leo Gutiérrez. en  5 Febrero 2011, 09:44 AM

while (opt != 4);65

Y ese 65?

Mmm, el resto del code tiene sus fallillos también, luego lo reescribo, es que ahora mismitoooo...
Suerte!


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

leogtz

Cita de: Sagrini en  5 Febrero 2011, 15:50 PM

Peor que:

int main ()

Y ese 65?


Preguntale a él, no es mi código.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Shell Root

Pero él no lo tiene en su código... XD
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.