Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: eltoffer en 5 Febrero 2011, 01:33 am



Título: Ayuda con estructuras
Publicado por: eltoffer en 5 Febrero 2011, 01:33 am
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

Código:
#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???


Título: Re: Ayuda con estructuras
Publicado por: negux en 5 Febrero 2011, 02:47 am
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


Título: Re: Ayuda con estructuras
Publicado por: eltoffer en 5 Febrero 2011, 03:12 am
bueno ya solucione la pate de las opciones ahora tengo porblema con la estructura

Código:
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


Título: Re: Ayuda con estructuras
Publicado por: negux en 5 Febrero 2011, 03:19 am
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


Título: Re: Ayuda con estructuras
Publicado por: Tokes en 5 Febrero 2011, 04:01 am
¿No deberías poner case  '1' (con apóstrofes)?


Título: Re: Ayuda con estructuras
Publicado por: eltoffer en 5 Febrero 2011, 04:53 am
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????


Título: Re: Ayuda con estructuras
Publicado por: leogtz en 5 Febrero 2011, 09:44 am
Código
  1. #include<stdio.h>
  2.  
  3.  
  4. struct cliente {
  5. char rfc[15];
  6. char nom [30];
  7. char dir[60];
  8. char tel[11];
  9.       };
  10. struct cliente c1;
  11.  
  12. struct maquinaria {
  13. int num_maq;
  14. char mod[15];
  15. char desc [60];
  16. char fecha_com [15];
  17. char tipo[15];
  18.  };
  19. struct maquinaria m1;
  20.  
  21. struct renta {
  22. int num_rent;
  23. char fecha_rent[15];
  24. char period[20];
  25. char rfc [15];
  26. int num_maq;
  27. float total_rent;
  28.     };
  29. struct renta r1;
  30.  
  31. int opt,opt2;
  32.  
  33. void main (void)
  34. {
  35. do
  36. {
  37.  
  38. printf("Bienvenido al sistema de registro\n\n");
  39. printf("1.- Manejo de datos del cliente\n2.- Manejo de datos de la maquinaria\n3.- Control de rentas\n4.- Salida\n\nOpcion: ");
  40.        scanf("%d",&opt);
  41.        while(getchar() != '\n');
  42. switch(opt)
  43. {
  44.    case 1:
  45. do
  46. {
  47. printf("MANEJO DE DATOS DEL CLIENTE\n\n");
  48. 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:  ");
  49.  
  50. scanf("%d", &opt2);
  51. while(getchar() != '\n');
  52. switch(opt2)
  53. case 1:
  54. {
  55.  
  56. printf("ALTA DE CLIENTES\n\n");
  57. printf("RFC del cliente: ");
  58. gets(c1.rfc);
  59. printf("Nombre del cliente: ");
  60. gets(c1.nom);
  61. printf("Direccion: ");
  62. gets(c1.dir);
  63. printf("Telefono: ");
  64. gets(c1.tel);
  65. }
  66. break;
  67. case 2:
  68. printf("BAJAS DE CLIENTES\n\n");
  69. break;
  70. case 3:
  71. printf("CAMBIO DE DATOS DE CLIENTES");
  72. break;
  73. case 4:
  74. printf("CONSULTA DE TODOS LOS CLIENTES");
  75. break;
  76. case 5:
  77.  
  78. break;
  79. }
  80. while(opt != 5) ;
  81. }
  82. break;
  83.        }
  84. while (opt != 4);65
  85. }
  86.  
  87.  
  88.  
  89.  
  90.  


Probé el código, no hacía lo que debía al no limpiar el buffer.


Título: Re: Ayuda con estructuras
Publicado por: Garfield07 en 5 Febrero 2011, 15:50 pm
Gets es de uso no recomendado:
Código
  1. gets (buffer);
  2.  
Peor que:
Código
  1. fgets (buffer, 1024, stdin);
  2.  

Lo del main, igual...
Código
  1. void main (void)
  2.  
Peor que:
Código
  1. int main ()
  2.  

Código
  1. while (opt != 4);65
  2.  
Y ese 65?

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


Título: Re: Ayuda con estructuras
Publicado por: leogtz en 5 Febrero 2011, 20:36 pm

Peor que:
Código
  1. int main ()
  2.  
Y ese 65?


Preguntale a él, no es mi código.


Título: Re: Ayuda con estructuras
Publicado por: Shell Root en 5 Febrero 2011, 20:58 pm
Pero él no lo tiene en su código... XD


Título: Re: Ayuda con estructuras
Publicado por: leogtz en 5 Febrero 2011, 21:00 pm
Bueno, echenle la culpa a que tuve que quitarle los tags en su código y a que tengo los dedos entumidos al estar a -12°.  :silbar:


Título: Re: Ayuda con estructuras
Publicado por: eltoffer en 5 Febrero 2011, 22:50 pm
bueno lo que bice (no se si sea correcto) le puse un getchar despues de los gets y solo asi me respeta el pedir los datos y ya funciona bien el bucle, tambien tenia mal las llaves

asi quedo a ver si estoy bien o mal
Código:
#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;

int main()
{
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: ");
scanf("%d",&opt);
switch(opt)
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:  ");
scanf("%d",&opt2);
switch(opt2)
{
                case 1:
{
                  clrscr();
printf("ALTA DE CLIENTES\n\n");
printf("RFC del cliente: ");
gets(c1.rfc);
                     getchar();
printf("Nombre del cliente: ");
gets(c1.nom);
                     getchar();
printf("Direccion: ");
gets(c1.dir);
                     getchar();
printf("Telefono: ");
gets(c1.tel);
                     getchar();
                   break;
                  }
                  case 2:
{
                  clrscr();
printf("BAJA DE CLIENTES\n\n");
                     getch();
                  break;
                  }
                  case 3:
{
                  clrscr();
printf("CAMBIO DE DATOS DE CLIENTES\n\n");
                  break;
                  }
                  case 4:
{
                  clrscr();
printf("CONSULTA DE TODOS LOS CLIENTES\n\n");
                   break;
                  }
                  defalut:
                  break;
               }
            }
while(opt2 != 5);
break;
         }
   }
while (opt != 4);
}


Título: Re: Ayuda con estructuras
Publicado por: Garfield07 en 5 Febrero 2011, 22:53 pm
Pero es que no has leido mi post o que?

Gets es de uso no recomendado:
Código
  1. fgets (buffer, 1024, stdin);
  2.  
Vamos a ver, usando gets puedo causar un desbordamiento de BoF en segundos... Al compilar gcc te dice que es inseguro. Que?


Título: Re: Ayuda con estructuras
Publicado por: eltoffer en 5 Febrero 2011, 23:42 pm
Pero es que no has leido mi post o que?

Gets es de uso no recomendado:
Código
  1. fgets (buffer, 1024, stdin);
  2.  
Vamos a ver, usando gets puedo causar un desbordamiento de BoF en segundos... Al compilar gcc te dice que es inseguro. Que?

Disculpa pero no conozco esa instruccion, como decia estoy comenzando en esto de programacion y no se como y donde usar esa opcion, mi logica me indica que seria en lugar del gets pero lo que esta entre parentecis no entiendo, gracias


Título: Re: Ayuda con estructuras
Publicado por: eltoffer en 5 Febrero 2011, 23:49 pm
bueno gracias a lo que puso leo guitierrez pude quitar los getchar() sustituyendolo por la instruccion while(getchar() != '\n'); y ya quedo ya solo me falta establecer las matrices para poder almacenar los datos

Pero podrian explicarme porque tenog que poner esa instrucicon y CUANDO ponerla, me gustaria comprender eso, siempre he tenido porblemas con eso del getch y sus variantes, gracias


Título: Re: Ayuda con estructuras
Publicado por: Garfield07 en 5 Febrero 2011, 23:53 pm
Disculpa pero no conozco esa instruccion, como decia estoy comenzando en esto de programacion y no se como y donde usar esa opcion, mi logica me indica que seria en lugar del gets pero lo que esta entre parentecis no entiendo, gracias
Fgets (variable, tam variable, stdin)
Stdin lo puedes cambiar por un file, pero para pantalla stdin...
Suerte!