Curso de Programación en C/Prog122

De WikiCabal
< Curso de Programación en C
Revisión del 19:11 6 jun 2014 de Perseuz (discusión | contribuciones) (Prog122)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Ir a la navegación Ir a la búsqueda

Prog122

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 #define MAXTITL   40
  6 #define MAXAUTL   40
  7 #define MAXVALL   12
  8 #define MAXLIBROS   100
  9 
 10 struct Libro {
 11     char Titulo[MAXTITL];
 12     char Autor[MAXAUTL];
 13     float Valor;
 14 };
 15 
 16 int main( void )
 17 {
 18   struct Libro Biblioteca[MAXLIBROS];
 19 
 20   int   Conteo = 0,
 21         ConteoDelArchivo,
 22         Index,
 23         NumPuntos,
 24         Tamano = sizeof( struct Libro ),
 25         i;
 26 
 27   char  ValSTR[MAXVALL];
 28 
 29   FILE * PLibros;
 30 
 31   if( ( PLibros = fopen( "Libros.dat", "a+b" ) ) == NULL )
 32   {
 33     fputs( "No puedo abrir Libros.dat\n", stderr );
 34     exit( 1 );
 35   }
 36 
 37   rewind( PLibros );
 38 
 39   while( Conteo < MAXLIBROS &&
 40          fread( &Biblioteca[Conteo], Tamano, 1, PLibros ) == 1 )
 41   {
 42     if( Conteo == 0 )
 43       puts( "Los contenidos de Libros.dat ahora:" );
 44     printf( "\t%s por %s: $%.2f\n", Biblioteca[Conteo].Titulo,
 45                                     Biblioteca[Conteo].Autor,
 46                                     Biblioteca[Conteo].Valor );
 47     Conteo++;
 48   }
 49 
 50   ConteoDelArchivo = Conteo;
 51 
 52   if( Conteo == MAXLIBROS )
 53   {
 54     fputs( "El archivo: Libros.dat está lleno.", stderr );
 55     fclose( PLibros );
 56     exit( 2 );
 57   }
 58 
 59   printf( "\nIngresa el nombre del libro: " );
 60   while( Conteo < MAXLIBROS )
 61   {
 62     if( fgets( Biblioteca[Conteo].Titulo, MAXTITL - 2, stdin ) &&
 63                Biblioteca[Conteo].Titulo[0] != '\n' )
 64     {
 65       if( *(Biblioteca[Conteo].Titulo +
 66             strlen( Biblioteca[Conteo].Titulo ) -1 ) != '\n' )
 67       {
 68         fprintf( stderr, "El titulo que entraste es demasiado largo.\n"
 69                 "Solo %d chars MAX\n", MAXTITL - 2 );
 70         fclose( PLibros );
 71         exit(1);
 72       }
 73 
 74       *(Biblioteca[Conteo].Titulo +
 75         strlen( Biblioteca[Conteo].Titulo ) -1 ) = '\0';
 76     }
 77     else
 78       break;
 79 
 80     printf( "Ingresa el nombre del autor: " );
 81     if( fgets( Biblioteca[Conteo].Autor, MAXAUTL - 2, stdin ) &&
 82                Biblioteca[Conteo].Autor[0] != '\n' )
 83     {
 84       if( *(Biblioteca[Conteo].Autor +
 85             strlen( Biblioteca[Conteo].Autor ) -1 ) != '\n' )
 86       {
 87         fprintf( stderr, "El autor que entraste es demasiado largo.\n"
 88                 "Solo %d chars MAX\n", MAXAUTL - 2 );
 89         fclose( PLibros );
 90         exit(1);
 91       }
 92 
 93       *(Biblioteca[Conteo].Autor +
 94         strlen( Biblioteca[Conteo].Autor ) -1 ) = '\0';
 95     }
 96     else
 97     {
 98       fprintf( stderr, "Falta el nombre del autor de \"%s\"\n",
 99                Biblioteca[Conteo].Titulo );
100       fclose( PLibros );
101       exit(1);
102     }
103 
104     NumPuntos = 0;
105     printf( "Ingresa el valor: " );
106     if( fgets( ValSTR, MAXVALL - 2, stdin ) && ValSTR[0] != '\n' )
107     {
108       if( *(ValSTR + strlen( ValSTR ) -1 ) != '\n' )
109       {
110         fprintf( stderr, "El valor que entraste es demasiado largo.\n"
111                 "Solo %d chars MAX\n", MAXVALL - 2 );
112         fclose( PLibros );
113         exit(1);
114       }
115 
116       *(ValSTR + strlen( ValSTR ) -1 ) = '\0';
117 
118       if( ValSTR[0] == '-' )
119       {
120         fputs( "No se permiten valores negativos.", stderr );
121         fclose( PLibros );
122         exit(1);
123       }
124 
125       for( i = 0; i < strlen( ValSTR ) - 1; i++ )
126       {
127         if( ValSTR[i] < '0' ||  ValSTR[i] > '9' )
128         {
129           if( ValSTR[i] == '.' )
130           {
131             if( ++NumPuntos > 1 )
132             {
133               fprintf( stderr, "Se permite solo 1 punto.\n" );
134               fclose( PLibros );
135               exit(1);
136             }
137 
138             if( strlen( ValSTR ) - i > 3 )
139             {
140               fputs( "Se permiten solo 2 decimales después del punto.", stderr );
141               fclose( PLibros );
142               exit(1);
143             }
144           }
145           else
146           {
147             fputs( "Caracteres ilegales en su valor.", stderr );
148             fclose( PLibros );
149             exit(1);
150           }
151         }
152       }
153 
154       Biblioteca[Conteo++].Valor = atof( ValSTR );
155     }
156     else
157     {
158       fprintf( stderr, "Falta el valor de \"%s\"\n", Biblioteca[Conteo].Titulo );
159       fclose( PLibros );
160       exit(1);
161     }
162 
163     if( Conteo < MAXLIBROS )
164       printf( "Ingresa el sigiuente titulo: (<Enter> para terminar): " );
165   }
166 
167   if (Conteo > 0)
168   {
169     puts( "\nAquí es la lista de sus libros:" );
170     for( Index = 0; Index < Conteo; Index++ )
171       printf( "\t\"%s\" por \"%s\": $%.2f\n", Biblioteca[Index].Titulo,
172                                               Biblioteca[Index].Autor,
173                                               Biblioteca[Index].Valor );
174     fwrite( &Biblioteca[ConteoDelArchivo], Tamano, Conteo - ConteoDelArchivo,
175                                                                    PLibros );
176   }
177   else
178     puts( "Lo siento pero no tengo libros nuevos para mostrar." );
179 
180   puts( "\n¡Adios!\n" );
181   fclose( PLibros );
182   return 0;
183 }

Resultado

[rrc@llawyr CClase]$ rm Libros.dat 
rm: remove regular file `Libros.dat'? y
[rrc@llawyr CClase]$ gcc -Wall -o Prog122 Prog122.c
[rrc@llawyr CClase]$ ./Prog122

Ingresa el nombre del libro: 
Lo siento pero no tengo libros nuevos para mostrar.

¡Adios!

[rrc@llawyr CClase]$ ./Prog122

Ingresa el nombre del libro: Libro Uno
Ingresa el nombre del autor: Autor uno
Ingresa el valor: Valor 1
Caracteres ilegales en su valor.
[rrc@llawyr CClase]$ ./Prog122

Ingresa el nombre del libro: Libro Uno
Ingresa el nombre del autor: Autor Uno
Ingresa el valor: 13.55
Ingresa el siguiente titulo: (<Enter> para terminar): Libro Dos
Ingresa el nombre del autor: Autor 2
Ingresa el valor: 52.66
Ingresa el siguiente titulo: (<Enter> para terminar): 

Aquí esta la lista de sus libros:
	"Libro Uno" por "Autor Uno": $13.55
	"Libro Dos" por "Autor 2": $52.66

¡Adios!

[rrc@llawyr CClase]$ ./Prog122
Los contenidos de Libros.dat ahora:
	Libro Uno por Autor Uno: $13.55
	Libro Dos por Autor 2: $52.66

Ingresa el nombre del libro: Libro Tres
Ingresa el nombre del autor: Autor Tres
Ingresa el valor: 62.88
Ingresa el siguiente titulo: (<Enter> para terminar): Libro Cuatro
Ingresa el nombre del autor: Autor Cuatro
Ingresa el valor: 62.44
Ingresa el siguiente titulo: (<Enter> para terminar): 

Aquí esta la lista de sus libros:
	"Libro Uno" por "Autor Uno": $13.55
	"Libro Dos" por "Autor 2": $52.66
	"Libro Tres" por "Autor Tres": $62.88
	"Libro Cuatro" por "Autor Cuatro": $62.44

¡Adios!

[rrc@llawyr CClase]$ ./Prog122
Los contenidos de Libros.dat ahora:
	Libro Uno por Autor Uno: $13.55
	Libro Dos por Autor 2: $52.66
	Libro Tres por Autor Tres: $62.88
	Libro Cuatro por Autor Cuatro: $62.44

Ingresa el nombre del libro: 

Aquí esta la lista de sus libros:
	"Libro Uno" por "Autor Uno": $13.55
	"Libro Dos" por "Autor 2": $52.66
	"Libro Tres" por "Autor Tres": $62.88
	"Libro Cuatro" por "Autor Cuatro": $62.44

¡Adios!

[rrc@llawyr CClase]$ 

Explicación