Curso de Programación en C/Prog109

De WikiCabal
Saltar a: navegación, buscar

Prog109

#include <stdio.h>
#include <stdlib.h> /* for malloc(), free() */
#include <string.h>

int main( void )
{
  double * ptd;

  char NumSTR[10];

  char * endptr;

  int i = 0,
      Max,
      NumCharsLeidos,
      NumEntradas,
      NumPuntos,
      NumValidosChars,
      Numero;

  printf( "¿Cuál es el máximo número de dobles que vamos a guardar? " );

  fgets( NumSTR, 4, stdin );
  NumValidosChars = 0;
  if( ( NumCharsLeidos = strlen( NumSTR ) )  > 4 )
  {
    puts( "Entrada ¡INVALIDO!\nDebe ser menor que 99" );
    exit( 1 );
  }

  if( NumSTR[0] == '0' )
  {
    puts( "Debemos guardar un mínimo de 1 double" );
    exit( 1 );
  }

  if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
  {
    puts( "Entrada ¡INVALIDO!\nDebe ser menor que 99" );
    exit( 1 );
  }
  else
    *(NumSTR + NumCharsLeidos - 1) = '\0';

  for( i = 0; i < NumCharsLeidos -1; i++ )
    if( ( *(NumSTR + i ) >= '0' && *(NumSTR + i ) <= '9' ) )
      NumValidosChars++;

  if( NumCharsLeidos == 1 || NumValidosChars != NumCharsLeidos - 1 )
  {
    puts( "Entrada ¡INVALIDO!" );
    exit( 1 );
  }
  Max = atoi( NumSTR );

  ptd = (double *)malloc( Max * sizeof( double ) );

  if( ptd == NULL )
  {
    puts( "Falló la asignación de memoria. Adiós." );
    exit( EXIT_FAILURE );
  }

  puts( "Ingresa los dobles (q para terminar):" );
  
  NumEntradas = 0;

  while( ( NumEntradas < Max ) && fgets( NumSTR, 8, stdin ) )
  {
    NumValidosChars = 0;
    NumCharsLeidos = strlen( NumSTR );

    if( NumSTR[0] == 'q' && NumCharsLeidos == 2 )
      break;

    if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
    {
      puts( "Entrada ¡INVALIDO! (Tan Grande - No más que 6 chars)" );
      while( getchar() != '\n' );
      puts( "Ingresa los dobles:" );
      continue;
    }
    else
      *(NumSTR + NumCharsLeidos - 1) = '\0';

    NumPuntos = 0;
    
    for( i = 0; i < NumCharsLeidos -1; i++ )
      if( ( *(NumSTR + i ) >= '0' && *(NumSTR + i ) <= '9' ) ||
          (  *(NumSTR) == '-' && i == '0' ) ||
          ( *(NumSTR + i ) == '.' && ++NumPuntos < 2 ) )
        NumValidosChars++;

    if( NumCharsLeidos == 1 || NumValidosChars != NumCharsLeidos - 1 )
    {
      puts( "Entrada ¡INVALIDO!" );
      puts( "Ingresa los dobles:" );
      continue;
    }
    ptd[NumEntradas++] = strtod( NumSTR, &endptr );
  }

  printf( "\nAquí son sus %d dobles:\n", Numero = NumEntradas );

  for( i = 0; i < Numero; i++ )
  {
    printf("%7.2f ", ptd[i]);

    if( i % 7 == 6 )
      putchar( '\n' );
  }

  if( i % 7 != 0 )
    putchar( '\n' );

  puts("¡Listo!");
  free(ptd);

  return 0;
}

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