Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con estructura del programa

Estas en el tema de Duda con estructura del programa en el foro de C/C++ en Foros del Web. Hola a todos, soy nuevo por estos rumbos xD , bueno, a mi me gusta mucho la programacion, y algun dia poder ser uno de ...
  #1 (permalink)  
Antiguo 04/07/2013, 19:36
 
Fecha de Ingreso: julio-2013
Ubicación: Estado de Mexico
Mensajes: 1
Antigüedad: 10 años, 10 meses
Puntos: 0
Pregunta Duda con estructura del programa

Hola a todos, soy nuevo por estos rumbos xD , bueno, a mi me gusta mucho la programacion, y algun dia poder ser uno de los mejoer (sueños vagos) y e estado practicando, pero si me a costado mucho trabajo, y la verdad me tope con un programa que, no me sale :(
Aun no comprendo bien la estructura de c++ y actualmente tomo cursos, solo queria que me dieran una pequeña ayuda, para ver en que estoy fallando y poder mejorar.
Bueno, mi programa se supone debe hacer lo siguiente:

Realizar un programa que contenga un menu:
1.Registrar libros
2.Consulta
3.Salir
en el numero 1 se debera poder registrar libros
(materia, autor, editorial y precio )
regresar al menu presionando cualquier tecla
en el 2 consultar los libros que se registraron por materia
y el valor de ellos de la materia escogida
y 3 salir

Y bueno, esto es lo que llevo, pero esta muy mal :(
Código:
#include <stdio.h>
#include <stdlib.h>
struct Datos{
int iD,precio;
char nombre[30];};
int main(void) {
int opcion;struct Datos libro;
FILE *f;
do{
system("cls");
printf("MENU.\n");
printf("1 - Registrar libros.\n");
printf("2 - Consultar libros.\n");
printf("3 - Salir.\n");
printf("Ingrese una opcion[1-3]: ");
scanf("%d",&opcion);
system("cls");
switch(opcion){
case 1: printf("Ingrese la materia: ");
scanf("%d",&libro.iD);
printf("\nIngrese autor: ");
fflush(stdin);
gets(libro.nombre);
printf("\nIngrese el precio: ");
scanf("%d",&libro.precio);
f=fopen("C:\\alums.dat","a");
fwrite(&libro,sizeof(Datos),1,f);
fclose(f);
printf("\nDatos agregados correctamente.\n");
system("pause");
break;
case 2: if((f=fopen("C:\\libro.dat","r"))==NULL)
printf("Error.\nNo hay datos agregados.\n");
else{
while(fread(&libro,sizeof(Datos),1,f)
!=NULL){
printf("Materia: %d",libro.iD);
printf("\nAutor: %s",libro.nombre);
printf("\nPrecio:%d\n--------------\n",libro.precio);}
fclose(f);}
system("pause");
break;}
}while(opcion!=3);
return 0;}
Agradeceria mucho si alguien me pudiera ayudar, para ver en que estoy mal, o que me falta, muchas gracias de antemano :)
  #2 (permalink)  
Antiguo 05/07/2013, 08:09
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 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
  #3 (permalink)  
Antiguo 05/07/2013, 11:55
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda con estructura del programa

Ademas de todo lo que te ha comentado amchacon, acostumbrate ya desde el principio a implementar controles de error para cualquier cosa que no sea invariable, para eso las funciones suelen retornar o manejar 'algo' que indique el exito o el fracaso de la operacion; p.ej. en el caso de 'fopen' retorna nulo cuando no consigue abrir el archivo, sabiendo esto immediatamente despues de llamar a fopen tienes que comprovar si fue valida:

Código C:
Ver original
  1. if((f = fopen("C:\\alums.dat", "a"))) {
  2.     fwrite(&libro, sizeof(Datos), 1, f);
  3.     fclose(f);
  4. }
  5. else {
  6.     //error, aqui 'f' es nulo con lo que no puedes usar ninguna funcion que requiera 'f'
  7.     //informa al usuario que se produjo un error
  8. }

Saludos
vosk
  #4 (permalink)  
Antiguo 06/07/2013, 15:51
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: Duda con estructura del programa

Ya que estamos agrego algo yo también. Usá espacios entre los operadores lógicos (+ - * /), el igual (= o ==), comas (,) y podes dejar líneas en blanco para mejorar la legibilidad.


Etiquetas: funcion, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:54.