Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/07/2013, 08:09
amchacon
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: Duda con estructura del programa

Indetación: Es muy importante adecentar el código y que se vea limpio y claro. Por ello hay unas normas de estilo básicas:

- Cada llave en una nueva línea.
- Cada vez que se abra una llave, hay que dejar un "margen" de separación. Eso da una sensación visual de código en bloques, por lo cual es muy fácil identificar un if y un for correspondiente:

Código C:
Ver original
  1. if (Patatas == fritas)
  2. {
  3.     printf("Fritas"); // Dejo un margen
  4. }

Por suerte para ti tengo un plugin que me lo ajusta automáticamente:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Datos
  4. {
  5.     int iD,precio;
  6.     char nombre[30];
  7. };
  8. int main(void)
  9. {
  10.     int opcion;
  11.     struct Datos libro;
  12.     FILE *f;
  13.     do
  14.     {
  15.         system("cls");
  16.         printf("MENU.\n");
  17.         printf("1 - Registrar libros.\n");
  18.         printf("2 - Consultar libros.\n");
  19.         printf("3 - Salir.\n");
  20.         printf("Ingrese una opcion[1-3]: ");
  21.         scanf("%d",&opcion);
  22.         system("cls");
  23.         switch(opcion)
  24.         {
  25.         case 1:
  26.             printf("Ingrese la materia: ");
  27.             scanf("%d",&libro.iD);
  28.             printf("\nIngrese autor: ");
  29.             fflush(stdin);
  30.             gets(libro.nombre);
  31.             printf("\nIngrese el precio: ");
  32.             scanf("%d",&libro.precio);
  33.             f=fopen("C:\\alums.dat","a");
  34.             fwrite(&libro,sizeof(Datos),1,f);
  35.             fclose(f);
  36.             printf("\nDatos agregados correctamente.\n");
  37.             system("pause");
  38.             break;
  39.         case 2:
  40.             if((f=fopen("C:\\libro.dat","r"))==NULL)
  41.                 printf("Error.\nNo hay datos agregados.\n");
  42.             else
  43.             {
  44.                 while(fread(&libro,sizeof(Datos),1,f)
  45.                         !=NULL)
  46.                 {
  47.                     printf("Materia: %d",libro.iD);
  48.                     printf("\nAutor: %s",libro.nombre);
  49.                     printf("\nPrecio:%d\n--------------\n",libro.precio);
  50.                 }
  51.                 fclose(f);
  52.             }
  53.             system("pause");
  54.             break;
  55.         }
  56.     }
  57.     while(opcion!=3);
  58.     return 0;
  59. }

Sigamos con la lección, el lenguaje que estás utilizando en ese código es C (no C++). A su vez podemos encontrar una mala práctica:

Código:
fflush(stdin);
Nunca se debe usar fflush en una entrada (el teclado), esto está PROHIBIDO

En su lugar te recomiendo:

Código C:
Ver original
  1. while (getchar() != '\n');

Por otro lado:

Código C:
Ver original
  1. gets(libro.nombre);
Esta función está anticuada y puede presentar problemas (la cadena nombre tiene 30 caracteres, que pasa si el usuario te introduce 40?). En su lugar se recomienda fgets ya que le puedes poner una cantidad máxima de caracteres a leer:

Código C:
Ver original
  1. fgets(libro.nombre,30,stdin); // Lee hasta 30 caracteres desde el teclado (stdin)

Por lo demás, el código está correcto y muy bien (mejor que otros códigos que he visto). Hay algunas cosas que me chirrian como las llamadas a system:

Código C:
Ver original
  1. system("pause");

Pero mientras programes en Windows debería ir bien.

Última edición por amchacon; 05/07/2013 a las 08:15