Curso de Programación en C/Prog109
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!