Curso de Programación en C/Prog122
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]$