Curso de Programación en C/Prog109

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

Prog109

  1 #include <stdio.h>
  2 #include <stdlib.h> /* for malloc(), free() */
  3 #include <string.h>
  4 
  5 int main( void )
  6 {
  7   double * ptd;
  8 
  9   char NumSTR[10];
 10 
 11   char * endptr;
 12 
 13   int i = 0,
 14       Max,
 15       NumCharsLeidos,
 16       NumEntradas,
 17       NumPuntos,
 18       NumValidosChars,
 19       Numero;
 20 
 21   printf( "¿Cuál es el máximo número de dobles que vamos a guardar? " );
 22 
 23   fgets( NumSTR, 4, stdin );
 24   NumValidosChars = 0;
 25   if( ( NumCharsLeidos = strlen( NumSTR ) )  > 4 )
 26   {
 27     puts( "Entrada ¡INVALIDO!\nDebe ser menor que 99" );
 28     exit( 1 );
 29   }
 30 
 31   if( NumSTR[0] == '0' )
 32   {
 33     puts( "Debemos guardar un mínimo de 1 double" );
 34     exit( 1 );
 35   }
 36 
 37   if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
 38   {
 39     puts( "Entrada ¡INVALIDO!\nDebe ser menor que 99" );
 40     exit( 1 );
 41   }
 42   else
 43     *(NumSTR + NumCharsLeidos - 1) = '\0';
 44 
 45   for( i = 0; i < NumCharsLeidos -1; i++ )
 46     if( ( *(NumSTR + i ) >= '0' && *(NumSTR + i ) <= '9' ) )
 47       NumValidosChars++;
 48 
 49   if( NumCharsLeidos == 1 || NumValidosChars != NumCharsLeidos - 1 )
 50   {
 51     puts( "Entrada ¡INVALIDO!" );
 52     exit( 1 );
 53   }
 54   Max = atoi( NumSTR );
 55 
 56   ptd = (double *)malloc( Max * sizeof( double ) );
 57 
 58   if( ptd == NULL )
 59   {
 60     puts( "Falló la asignación de memoria. Adiós." );
 61     exit( EXIT_FAILURE );
 62   }
 63 
 64   puts( "Ingresa los dobles (q para terminar):" );
 65   
 66   NumEntradas = 0;
 67 
 68   while( ( NumEntradas < Max ) && fgets( NumSTR, 8, stdin ) )
 69   {
 70     NumValidosChars = 0;
 71     NumCharsLeidos = strlen( NumSTR );
 72 
 73     if( NumSTR[0] == 'q' && NumCharsLeidos == 2 )
 74       break;
 75 
 76     if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
 77     {
 78       puts( "Entrada ¡INVALIDO! (Tan Grande - No más que 6 chars)" );
 79       while( getchar() != '\n' );
 80       puts( "Ingresa los dobles:" );
 81       continue;
 82     }
 83     else
 84       *(NumSTR + NumCharsLeidos - 1) = '\0';
 85 
 86     NumPuntos = 0;
 87     
 88     for( i = 0; i < NumCharsLeidos -1; i++ )
 89       if( ( *(NumSTR + i ) >= '0' && *(NumSTR + i ) <= '9' ) ||
 90           (  *(NumSTR) == '-' && i == '0' ) ||
 91           ( *(NumSTR + i ) == '.' && ++NumPuntos < 2 ) )
 92         NumValidosChars++;
 93 
 94     if( NumCharsLeidos == 1 || NumValidosChars != NumCharsLeidos - 1 )
 95     {
 96       puts( "Entrada ¡INVALIDO!" );
 97       puts( "Ingresa los dobles:" );
 98       continue;
 99     }
100     ptd[NumEntradas++] = strtod( NumSTR, &endptr );
101   }
102 
103   printf( "\nAquí son sus %d dobles:\n", Numero = NumEntradas );
104 
105   for( i = 0; i < Numero; i++ )
106   {
107     printf("%7.2f ", ptd[i]);
108 
109     if( i % 7 == 6 )
110       putchar( '\n' );
111   }
112 
113   if( i % 7 != 0 )
114     putchar( '\n' );
115 
116   puts("¡Listo!");
117   free(ptd);
118 
119   return 0;
120 }

Resultado

 
[rrc@llawyr CClase]$ gcc -Wall -o Prog109 Prog109.c 
[rrc@llawyr CClase]$ ./Prog109
¿Cuál es el máximo número de dobles que vamos a guardar? 25
Ingresa los dobles (q para terminar):
q

Aquí son sus 0 dobles:
¡Listo!
[rrc@llawyr CClase]$ ./Prog109
¿Cuál es el máximo número de dobles que vamos a guardar? 25
Ingresa los dobles (q para terminar):
23
-23
23.456
-23.456
Entrada ¡INVALIDO! (Tan Grande - No más que 6 chars)
Ingresa los dobles:
-23.45
123456
-123456
Entrada ¡INVALIDO! (Tan Grande - No más que 6 chars)
Ingresa los dobles:
-12345

Entrada ¡INVALIDO!
Ingresa los dobles:

Entrada ¡INVALIDO!
Ingresa los dobles:
quit
Entrada ¡INVALIDO!
Ingresa los dobles:
8765.2
45.67
-53.4.4
Entrada ¡INVALIDO! (Tan Grande - No más que 6 chars)
Ingresa los dobles:
5.3.2
Entrada ¡INVALIDO!
Ingresa los dobles:
54-3 
Entrada ¡INVALIDO!
Ingresa los dobles:
66
q

Aquí son sus 9 dobles:
  23.00  -23.00   23.46  -23.45 123456.00 -12345.00 8765.20 
  45.67   66.00 
¡Listo!

Explicación