Curso de Programación en C/Prog108

De WikiCabal
Saltar a: navegación, buscar

Prog108

// Archivo Prog108.h
extern int ContarLosTiros;
int Tira_n_Dados(int, int );

// Archivo Prog108a.c
#include <stdio.h>
#include <stdlib.h>              /* Prototipo para srand()        */
#include <time.h>                /* Prototipo para time()         */
#include <string.h>              /* Prototipo para strlen()       */
#include "Prog108.h"             /* Prototipo para roll_n_Dados()
                                    y para ContarLosTiros       */

int main(void)
{
  int Dados,
      Lados = 0,
      NumCharsLeidos,
      NumValidosChars,
      Tira,
      i;

  char NumSTR[10];

  srand( (unsigned int)time( 0 ) ); /* random semilla      */
  printf( "Ingreso el número de lados de los dados, 0 para terminar: " );

  while( fgets( NumSTR, 9, stdin ) )
  {
    NumValidosChars = 0;
    NumCharsLeidos = strlen( NumSTR );

    if( NumSTR[0] == '0' )
      break;

    if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
    {
      puts( "Entrada ¡INVALIDA!" );
      while( getchar() != '\n' );
      printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
      continue;
    }
    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 ¡INVALIDA!" );
      printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
      continue;
    }
    Lados = atoi( NumSTR );

    printf( "¿Cuantos dados? " );
    fgets( NumSTR, 9, stdin );
    NumValidosChars = 0;
    NumCharsLeidos = strlen( NumSTR );

    if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
    {
      puts( "Entrada ¡INVALIDA! por returno" );
      while( getchar() != '\n' );
      printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
      continue;
    }
    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( "\nEntrada ¡INVALIDA!" );
      printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
      continue;
    }

    Dados = atoi( NumSTR );
    if( Dados < 1 )
    {
      puts( "\nNúmero de dados ¡INVALIDA!" );
      printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
      continue;
    }

    Tira = Tira_n_Dados( Dados, Lados );
    printf( "Tiraste %d usando %d dados de %d lados.\n", Tira, Dados, Lados );
    printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
  }
  printf( "La función rollem() se usó %d veces.\n", ContarLosTiros );
  puts( "¡Buen suerte!\n" );

  return 0;
}

// Archivo Prog108b.c
#include "Prog108.h"
#include <stdio.h>
#include <stdlib.h>             /* Prototipo para rand()   */

int ContarLosTiros  = 0;

static int rollem( int Lados )
{
    int Tira;

    Tira = rand() % Lados + 1;
    ++ContarLosTiros;             /* contar usos de función */
    return Tira;
}

int Tira_n_Dados( int Dados, int Lados )
{
  int d;
  int total = 0;

  for( d = 0; d < Dados; d++ )
    total += rollem( Lados );

  return total;
}

Resultado

 
[rrc@llawyr CClase]$ gcc -Wall -o Prog108 Prog108a.c Prog108b.c 
[rrc@llawyr CClase]$ ./Prog108
Ingreso el número de lados de los dados, 0 para terminar: 6
Cuantos dados? 2
Tiraste 5 usando 2 dados de 6 lados.
Ingreso el número de lados de los dados, 0 para terminar: 6
Cuantos dados? 2
Tiraste 9 usando 2 dados de 6 lados.
Ingreso el número de lados de los dados, 0 para terminar: 6
Cuantos dados? 2
Tiraste 3 usando 2 dados de 6 lados.
Ingreso el número de lados de los dados, 0 para terminar: 6
Cuantos dados? 2
Tiraste 6 usando 2 dados de 6 lados.
Ingreso el número de lados de los dados, 0 para terminar: 6
Cuantos dados? 2
Tiraste 12 usando 2 dados de 6 lados.
Ingreso el número de lados de los dados, 0 para terminar: 0
La función rollem() se usó 10 veces.
¡Buen suerte!
[rrc@llawyr CClase]$ 

Explicación