Curso de Programación en C/Prog117

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

Prog117

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 #define MAXTITL  41
 6 #define MAXAUTL  31
 7 #define MAXVALL  10
 8 
 9 
10 struct Libro
11 {
12   char Titulo[MAXTITL];
13   char Autor[MAXAUTL];
14   float Valor;
15 };
16 
17 int main( void )
18 {
19   int    i;
20   char   ValSTR[MAXVALL + 1];
21   struct Libro Biblio;
22 
23   printf( "Ingresa el nombre del libro: " );
24 
25 
26   fgets( Biblio.Titulo, MAXTITL - 2, stdin );
27 
28   if( *(Biblio.Titulo + strlen( Biblio.Titulo ) -1 ) != '\n' )
29   {
30     printf( "El nombre que entraste es demasiado largo.\n"
31             "Solo %d chars MAX\n", MAXTITL - 2 );
32     exit(1);
33   }
34   else
35     *(Biblio.Titulo + strlen( Biblio.Titulo ) -1 ) = '\0'; 
36 
37   printf( "Ingresa el nombre del autor: " );
38 
39   fgets( Biblio.Autor, MAXAUTL - 2, stdin );
40 
41   if( *(Biblio.Autor + strlen( Biblio.Autor ) -1 ) != '\n' )
42   {
43     printf( "El nombre que entraste es demasiado largo.\n"
44             "Solo %d chars MAX\n", MAXAUTL - 2 );
45     exit(1);
46   }
47   else
48     *(Biblio.Autor + strlen( Biblio.Autor ) -1 ) = '\0'; 
49 
50   printf( "Ingresa el valor: " );
51   scanf( "%10s", ValSTR );
52 
53   if( strlen( ValSTR ) > MAXVALL -1 )
54   {
55     printf( "El valor que entraste es demasiado largo.\n"
56             "Solo %d chars MAX\n", MAXVALL - 1 );
57     exit(1);
58   }
59 
60   if( ValSTR[0] == '-' )
61   {
62     puts( "No se permiten valores negativos." );
63     exit(1);
64   }
65 
66   for( i = 0; i < strlen( ValSTR ) - 1; i++ )
67   {
68     if( ValSTR[i] < '0' ||  ValSTR[i] > '9' )
69     {
70       if( ValSTR[i] == '.' )
71       {
72         if( strlen( ValSTR ) - i > 3 )
73         {
74           puts( "Se permiten solo 2 decimales después del punto." );
75           exit(1);
76         }
77       }
78       else
79       {
80         puts( "Caracteres ilegales en su valor." );
81         exit(1);
82       }
83     }
84   }
85 
86   Biblio.Valor = atof( ValSTR );
87 
88   printf( "%s por %s: $%.2f\n", Biblio.Titulo,
89           Biblio.Autor, Biblio.Valor );
90   printf( "%s: \"%s\" ($%.2f)\n", Biblio.Autor,
91           Biblio.Titulo, Biblio.Valor );
92   printf( "Listo.\n" );
93 
94   return 0;
95 }

Resultado

[rrc@llawyr CClase]$ gcc -Wall -o Prog117 Prog117.c
[rrc@llawyr CClase]$ ./Prog117
Ingresa el nombre del libro: Mi Libro
Ingresa el nombre del autor: El Autor
Ingresa el valor: 345
Mi Libro por El Autor: $345.00
El Autor: "Mi Libro" ($345.00)
Listo.
[rrc@llawyr CClase]$ ./Prog117
Ingresa el nombre del libro: Mi Otro Libro
Ingresa el nombre del autor: El otro Autor
Ingresa el valor: -34.56
Se permiten valores negativos.
[rrc@llawyr CClase]$ ./Prog117
Ingresa el nombre del libro: Un Otro Libro
Ingresa el nombre del autor: Un Otro Auto
Ingresa el valor: 4567543.34
El valor que entraste es demasiado largo.
Solo 9 chars MAX
[rrc@llawyr CClase]$ ./Prog117
Ingresa el nombre del libro: Otro Libro
Ingresa el nombre del autor: Otro Autor
Ingresa el valor: 34566.456
Se permiten solo 2 numerales después del punto.
[rrc@llawyr CClase]$ ./Prog117
Ingresa el nombre del libro: Otro Libro
Ingresa el nombre del autor: Otra Autora
Ingresa el valor: 345r.56
Caracteres ilegales en su valor.
[rrc@llawyr CClase]$ ./Prog117
Ingresa el nombre del libro: Ultimo Libro
Ingresa el nombre del autor: Ultimo Autor
Ingresa el valor: 435456.43
Ultimo Libro por Ultimo Autor: $435456.44
Ultimo Autor: "Ultimo Libro" ($435456.44)
Listo.
[rrc@llawyr CClase]$ 

Explicación