Curso de Programación en C/Prog118

De WikiCabal
Ir a la navegación Ir a la búsqueda

Prog118

  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   int   Conteo = 0,
 20         Index,
 21         NumPuntos,
 22         i;
 23   char  ValSTR[MAXVALL];
 24 
 25   printf( "Ingresa el nombre del libro: " );
 26   while( Conteo < MAXLIBROS )
 27   {
 28     if( fgets( Biblioteca[Conteo].Titulo, MAXTITL - 2, stdin ) &&
 29                Biblioteca[Conteo].Titulo[0] != '\n' )
 30     {
 31       if( *(Biblioteca[Conteo].Titulo +
 32             strlen( Biblioteca[Conteo].Titulo ) -1 ) != '\n' )
 33       {
 34         printf( "El titulo que entraste es demasiado largo.\n"
 35                 "Solo %d chars MAX\n", MAXTITL - 2 );
 36         exit(1);
 37       }
 38 
 39       *(Biblioteca[Conteo].Titulo +
 40         strlen( Biblioteca[Conteo].Titulo ) -1 ) = '\0';
 41     }
 42     else
 43       break;
 44 
 45     printf( "Ingresa el nombre del autor: " );
 46     if( fgets( Biblioteca[Conteo].Autor, MAXAUTL - 2, stdin ) &&
 47                Biblioteca[Conteo].Autor[0] != '\n' )
 48     {
 49       if( *(Biblioteca[Conteo].Autor +
 50             strlen( Biblioteca[Conteo].Autor ) -1 ) != '\n' )
 51       {
 52         printf( "El autor que entraste es demasiado largo.\n"
 53                 "Solo %d chars MAX\n", MAXAUTL - 2 );
 54         exit(1);
 55       }
 56 
 57       *(Biblioteca[Conteo].Autor +
 58         strlen( Biblioteca[Conteo].Autor ) -1 ) = '\0';
 59     }
 60     else
 61     {
 62       printf( "Faltan el nombre del autor de \"%s\"\n",
 63                Biblioteca[Conteo].Titulo );
 64       exit(1);
 65     }
 66 
 67     NumPuntos = 0;
 68     printf( "Ingresa el valor: " );
 69     if( fgets( ValSTR, MAXVALL - 2, stdin ) && ValSTR[0] != '\n' )
 70     {
 71       if( *(ValSTR + strlen( ValSTR ) -1 ) != '\n' )
 72       {
 73         printf( "El valor que entraste es demasiado largo.\n"
 74                 "Solo %d chars MAX\n", MAXVALL - 2 );
 75         exit(1);
 76       }
 77 
 78       *(ValSTR + strlen( ValSTR ) -1 ) = '\0';
 79 
 80       if( ValSTR[0] == '-' )
 81       {
 82         puts( "No se permiten valores negativos." );
 83         exit(1);
 84       }
 85 
 86       for( i = 0; i < strlen( ValSTR ) - 1; i++ )
 87       {
 88         if( ValSTR[i] < '0' ||  ValSTR[i] > '9' )
 89         {
 90           if( ValSTR[i] == '.' )
 91           {
 92             if( ++NumPuntos > 1 )
 93             {
 94               fprintf( stderr, "Se permite solo 1 punto.\n" );
 95               exit(1);
 96             }
 97 
 98             if( strlen( ValSTR ) - i > 3 )
 99             {
100               puts( "Se permiten solo 2 decimales después del punto." );
101               exit(1);
102             }
103           }
104           else
105           {
106             puts( "Caracteres ilegales en su valor." );
107             exit(1);
108           }
109         }
110       }
111 
112       Biblioteca[Conteo++].Valor = atof( ValSTR );
113     }
114     else
115     {
116       printf( "Faltan el valor de \"%s\"\n", Biblioteca[Conteo].Titulo );
117       exit(1);
118     }
119 
120     if( Conteo < MAXLIBROS )
121       printf( "Ingresa el siguiente titulo: (<Enter> para terminar): " );
122   }
123 
124   if (Conteo > 0)
125   {
126     puts( "Aquí está la lista de tus libros:" );
127     for (Index = 0; Index < Conteo; Index++)
128       printf( "\t\"%s\" por \"%s\": $%.2f\n", Biblioteca[Index].Titulo,
129             Biblioteca[Index].Autor, Biblioteca[Index].Valor);
130   }
131   else
132     puts( "Lo siento pero no tengo libros para mostrar." );
133 
134   return 0;
135 }

Resultado

[rrc@llawyr CClase]$ gcc -Wall -o Prog118 Prog118.c
[rrc@llawyr CClase]$ ./Prog118
Ingresa el nombre del libro: 
Lo siento pero no tengo libros para mostrar.
[rrc@llawyr CClase]$ ./Prog118
Ingresa el nombre del libro: Libro 118
Ingresa el nombre del autor: 
Faltan el nombre del autor de "Libro 118"
[rrc@llawyr CClase]$ gcc -Wall -o Prog118 Prog118.c
[rrc@llawyr CClase]$ ./Prog118
Ingresa el nombre del libro: Libro 1
Ingresa el nombre del autor: Autor 1
Ingresa el valor: 
Faltan el valor de "Libro 1"
[rrc@llawyr CClase]$ ./Prog118
Ingresa el nombre del libro: Libro 1
Ingresa el nombre del autor: Autor 1
Ingresa el valor: 34
Ingresa el siguiente titulo: (<Enter> para terminar): 
Aquí está la lista de tus libros:
    "Libro 1" por "Autor 1": $34.00
[rrc@llawyr CClase]$ ./Prog118
Ingresa el nombre del libro: Libro 1
Ingresa el nombre del autor: Autor 1
Ingresa el valor: 45.33
Ingresa el siguiente titulo: (<Enter> para terminar): Libro 2
Ingresa el nombre del autor: Autor 2
Ingresa el valor: 53
Ingresa el siguiente titulo: (<Enter> para terminar): 
Aquí es la lista de sus libros:
    "Libro 1" por "Autor 1": $45.33
    "Libro 2" por "Autor 2": $53.00
[rrc@llawyr CClase]$ 

Explicación