• Viernes 8 de Noviembre de 2024, 20:55

Autor Tema:  que pasa con mis estructuras y scanf?????  (Leído 1942 veces)

dantito

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
que pasa con mis estructuras y scanf?????
« en: Martes 12 de Octubre de 2010, 02:22 »
0
Hola a todos, y gracias por tomarse un tiempo en leer este problema que tengo; Lo que pasa es que estoy haciendo un proyecto para un curso de la universidad, es en lenguaje C++, mi idea es hacer un software de ayuda para un restaurante, consiste en un menú de tres opciones estoy recién en la primera opción que es entrar los platos preparados para el menú del día, todo hasta ahí esta bien, el problema es que no me pide que ingrese los platos, hice las estructuras correctamente a mi parecer. Bueno para que vean aca esta lo que avance del código.

#include<stdio.h>
#include<conio.h>
#include<string.h>
/*ESTRUCTURA DEL MENU*********************************************************
*****************************************************************************/
struct entrada
{
   char nombre_de_la_entrada [16];
   float precio_de_la_entrada;
};struct entrada ent[3];

struct menu
{
   char nombre_del_plato_principal [21];
   float precio_del_plato_principal;
}; struct menu pri[8];

/*DECLARACION DE PROTOTIPOS DE FUNCIONES**************************************
*****************************************************************************/
void menu_principal ();
void menu_del_dia ();
void ventas_del_dia ();
void boleta_o_factura ();

/*INGRESAR CLAVE *************************************************************
*****************************************************************************/
void main ()
{
   int clave;
   clrscr ();
   printf("INGRESE NUMERO DE CLAVE: "); scanf("%d",&clave);
   while (clave!=1234)
   {
      clrscr();
      printf("CLAVE INCORRECTA, PRUEBE DE NUEVO*************");
      printf("nINGRESE NUMERO DE CLAVE: "); scanf("%d",&clave);
   }
   menu_principal ();
}

/*MENU PRINCIPAL**************************************************************
*****************************************************************************/
void menu_principal ()
{
   char opcion;
   clrscr ();
   printf("BIENVENIDO AL MENU PRINCIPALn");
   printf("n[1] INGRESAR MENU DEL DIA");
   printf("n[2] INICIAR LAS VENTAS DEL DIA");
   printf("n[3] RELLENAR BOLETA O FACTURAn");
   printf("nELIJA UNA OPCION: n"); scanf("%d", &opcion);

   switch (opcion)
   {
      case 1: menu_del_dia (); break;
      case 2: ventas_del_dia (); break;
      case 3: boleta_o_factura (); break;
      default: printf("ELIJA UNA OPCION (1, 2, 3)"); break;
   }
}

/*INGRESAR MENU DEL DIA*******************************************************
*****************************************************************************/
void menu_del_dia ()
{
   int n,i,j;
   char c;
   clrscr ();
   printf("CANTIDAD DE ENTRADAS DIFERENTES?: "); scanf("%d",&n);
   for (i=0; i<=n; i++)
   {
      printf("NOMBRE DE LA ENTRADA %d: ", i+1);
      for (j=0; (c=getchar())!='n'; j++)
         ent.nombre_de_la_entrada[j]=c;
      printf("nPRECIO DE LA ENTRADA %d: ", i+1);
      scanf("%f",&ent.precio_de_la_entrada);
   }

   printf("CANTIDAD DE PLATOS PRINCIPALES DIFERENTES?: "); scanf("%d",&n);
   for (i=0; i<=n; i++)
   {
      printf("nNOMBRE DEL PLATO PRINCIPAL %d: ", i+1);
      for (j=0; (c=getchar())!='n'; j++)
         pri.nombre_del_plato_principal[j]=c;
      printf("nPRECIO DEL PLATO PRINCIPAL %d: ", i+1);
      scanf("%f",&pri.precio_del_plato_principal);
   }

   getch();
}

/*INICIAR LAS VENTAS DEL DIA**************************************************
*****************************************************************************/
void ventas_del_dia ()
{
   clrscr();
   printf("aca pondremos los datos de los clientes del restaurant");
}

/*RELLENAR BOLETA O FACTURA***************************************************
*****************************************************************************/
void boleta_o_factura ()
{
   clrscr();
   printf("aca se rellena la boleta o factura del cliente");
}


Como verán creo que el problema esta en scanf, bueno utilizo turbo C++ 4.5; utilicé la librería string pensando que ese sería el problema pero es igual; Espero que puedan ayudarme se los agradeceré mucho.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: que pasa con mis estructuras y scanf?????
« Respuesta #1 en: Martes 12 de Octubre de 2010, 20:32 »
0
Bueno, unas observaciones antes de ir al punto, recomiendo que utilices otro compilador ya que Turbo C++ ya esta obsoleto, consiguete el Visual Studio C++ Express o el Code::blocks con mingw, los dos son gratuitos. Ademas utiliza las etiquetas [ code] [ /code] sin espacios en los corchetes para encerrar tu codigo, de esa menera queda mas legible

Dicho eso continuamos.

No entiendo porque estas leyendo las opciones de los nombres de los platillos entradas por medo de getchar(), cuando deberias usar fgets() para leer la linea completa, en lugar de letra por letra, ademas debes de validar la cantidad de entradas/platillos que vas a leer, ya que no lo haces, y no debes leer mas de 3 entradas/ 8 platillos, ya que corromperias la memoria, el compilador no te marcara error si tratas de leer 20 platillos, pero solo tienes espacio para 8 platillos, si tratas de leer mas platillos, lo que sucede es que guarda la informacion en la memoria que esta despues de tus variables, encimandolas, corrompiendo tu codigo, y muy probablemente hara que tu programa se congele y deje de funcionar.

A continuacion te dejo un pequeño bloque de codigo como ejemplo de las correcciones que deberias hacer hacer en tu codigo, tu trabajo seria implementar esas correcciones en el resto de tu programa:

Código: C++
  1.  
  2.     // Valida tus entradas para no leer mas de tres ni menos de una
  3.     do
  4.     {
  5.         printf("CANTIDAD DE ENTRADAS DIFERENTES? (1-3): "); scanf("%d",&n);
  6.     } while ((n < 1) || n > 3);
  7.     // Los arreglos comienzan en cero, por lo tanto un arreglo de 3 debe
  8.     // de ir de cero a 2 (i < n) y no de cero a tres como lo tenias (i <=n)
  9.     for (i=0; i < n; i++)
  10.     {
  11.         printf("NOMBRE DE LA ENTRADA %d: ", i+1);
  12.         // Usa fgets para leer las cadenas, el segundo parametro debe ser
  13.         // igual al tamaño que hayas asignado a tu cadena, en este caso 16
  14.         fgets(ent[i].nombre_de_la_entrada, 16, stdin);
  15.         //for (j=0; (c=getchar())!='n'; j++)
  16.         //    ent[i].nombre_de_la_entrada[j]=c;
  17.         printf("nPRECIO DE LA ENTRADA %d: ", i+1);
  18.         scanf("%f",&ent[i].precio_de_la_entrada);
  19.     }
  20.  
  21.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

dantito

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: que pasa con mis estructuras y scanf?????
« Respuesta #2 en: Lunes 18 de Octubre de 2010, 01:07 »
0
Gracias por responder profesor. Con lo de tus sugerencias, todos en clases usamos ese compilador o el borland, la profesora no nos hablo de otro, creo que para el visual c++ seria otra manera de escribir el lenguaje no estoy muy seguro pero lo provare de todas maneras;
por otro lado vi que utilizad fgets, creo que eso es para archivos ya guardados en el disco duro, yo por el momento solo quiero hacer el programa asi nomas para que se ejecute y no guarde nada ya que eso no nos enseñaron en clases, pero es muy buena idea, como te digo, no estoy muy seguro voy a revisar mi libro y seguire los pasos indicados por ti, de ahi te aviso que tal me va, lo bueno es que el proyecto tengo que entregarlo a fin de año, por mientras seguire investigando y agregando cosas.
Gracias por tu atención y te mantendre al tanto.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: que pasa con mis estructuras y scanf?????
« Respuesta #3 en: Lunes 18 de Octubre de 2010, 03:17 »
0
Cita de: "dantito"
por otro lado vi que utilizad fgets, creo que eso es para archivos ya guardados en el disco duro

No necesariamente, fgets es para leer cadenas de archivos, pero el archivo del que leemos es un archivo especial, que se llama stdin, que en español significa entrada estandar, la entrada estandar es el teclado, o sea que cuando utilizas stdin como nombre de archivo, leeras del teclado y no del disco duro, de hecho, la funcion getchar() tambien lee del archivo stdin, pero funciona de manera diferente.

De manera similar, existe un archivo especial llamado stdout, que significa salida estandar, y representa la salida por pantalla, cuando utilizas printf, lo que hace es utilizar este archivo especial para mandar la salida por pantalla. si tu utilizaras fprintf (stdout, "Hola"), seria equivalente a la funcion printf("Hola");.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

dantito

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: que pasa con mis estructuras y scanf?????
« Respuesta #4 en: Miércoles 3 de Noviembre de 2010, 16:38 »
0
amigo. hola espero ke todo este bien, lo que pasa ahora es que mi problema sigue igual, ejecuto y no pasa nada, hice un video pa ke veas lo ke pasa, esta detallado y bien explicado, el codigo ahora esta asi, hice las modificaciones ke me pediste.

[/code]
#include<stdio.h>
#include<conio.h>
#include<string.h>
/*ESTRUCTURA DEL MENU*********************************************************
*****************************************************************************/
struct entrada
{
   char nombre_de_la_entrada [16];
   float precio_de_la_entrada;
};struct entrada ent[3];

struct menu
{
   char nombre_del_plato_principal [21];
   float precio_del_plato_principal;
}; struct menu pri[8];

/*DECLARACION DE PROTOTIPOS DE FUNCIONES**************************************
*****************************************************************************/
void menu_principal ();
void menu_del_dia ();
void ventas_del_dia ();
void boleta_o_factura ();

/*INGRESAR CLAVE *************************************************************
*****************************************************************************/
void main ()
{
   int clave;
   clrscr ();
   printf("INGRESE NUMERO DE CLAVE: "); scanf("%d",&clave);
   while (clave!=1234)
   {
      clrscr();
      printf("CLAVE INCORRECTA, PRUEBE DE NUEVO*************");
      printf("nINGRESE NUMERO DE CLAVE: "); scanf("%d",&clave);
   }
   menu_principal ();
}

/*MENU PRINCIPAL**************************************************************
*****************************************************************************/
void menu_principal ()
{
   char opcion;
   clrscr ();
   printf("BIENVENIDO AL MENU PRINCIPALn");
   printf("n[1] INGRESAR MENU DEL DIA");
   printf("n[2] INICIAR LAS VENTAS DEL DIA");
   printf("n[3] RELLENAR BOLETA O FACTURAn");
   printf("nELIJA UNA OPCION: n"); scanf("%d", &opcion);

   switch (opcion)
   {
      case 1: menu_del_dia (); break;
      case 2: ventas_del_dia (); break;
      case 3: boleta_o_factura (); break;
      default: printf("ELIJA UNA OPCION (1, 2, 3)"); break;
   }
}

/*INGRESAR MENU DEL DIA*******************************************************
*****************************************************************************/
void menu_del_dia ()
{
   int n,i;
   clrscr ();
   do
   {
   printf("CANTIDAD DE ENTRADAS DIFERENTES?: "); scanf("%d",&n);
   }
   while   ((n<1)||(n>3));
   for (i=0; i<=n; i++)
   {
      printf("NOMBRE DE LA ENTRADA %d: ", i+1);
      fgets (ent.nombre_de_la_entrada, 16, stdin);

      printf("nPRECIO DE LA ENTRADA %d: ", i+1);
      scanf("%f",&ent.precio_de_la_entrada);
   }

   do
   {
   printf("CANTIDAD DE PLATOS PRINCIPALES DIFERENTES?: "); scanf("%d",&n);
   }
   while ((n<1)||(n>8));

   for (i=0; i<=n; i++)
   {
      printf("nNOMBRE DEL PLATO PRINCIPAL %d: ", i+1);
      fgets (pri.nombre_del_plato_principal, 21, stdin);

      printf("nPRECIO DEL PLATO PRINCIPAL %d: ", i+1);
      scanf("%f",&pri.precio_del_plato_principal);
   }

   getch();
}

/*INICIAR LAS VENTAS DEL DIA**************************************************
*****************************************************************************/
void ventas_del_dia ()
{
   clrscr();
   printf("aca pondremos los datos de los clientes del restaurant");
}

/*RELLENAR BOLETA O FACTURA***************************************************
*****************************************************************************/
void boleta_o_factura ()
{
   clrscr();
   printf("aca se rellena la boleta o factura del cliente");
}
[/code]

el video lo puedes encontrar como codigo c++ y usuario dantitooh, en youtube, espero ke me puedas ayudar.