Diferencia entre revisiones de «Curso de Programación en C/Prog108»

De WikiCabal
Ir a la navegación Ir a la búsqueda
(Prog108)
 
(Sin diferencias)

Revisión actual del 05:42 15 jul 2012

Prog108

  1 // Archivo Prog108.h
  2 extern int ContarLosTiros;
  3 int Tira_n_Dados(int, int );
  4 
  5 // Archivo Prog108a.c
  6 #include <stdio.h>
  7 #include <stdlib.h>              /* Prototipo para srand()        */
  8 #include <time.h>                /* Prototipo para time()         */
  9 #include <string.h>              /* Prototipo para strlen()       */
 10 #include "Prog108.h"             /* Prototipo para roll_n_Dados()
 11                                     y para ContarLosTiros       */
 12 
 13 int main(void)
 14 {
 15   int Dados,
 16       Lados = 0,
 17       NumCharsLeidos,
 18       NumValidosChars,
 19       Tira,
 20       i;
 21 
 22   char NumSTR[10];
 23 
 24   srand( (unsigned int)time( 0 ) ); /* random semilla      */
 25   printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
 26 
 27   while( fgets( NumSTR, 9, stdin ) )
 28   {
 29     NumValidosChars = 0;
 30     NumCharsLeidos = strlen( NumSTR );
 31 
 32     if( NumSTR[0] == '0' )
 33       break;
 34 
 35     if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
 36     {
 37       puts( "Entrada ¡INVALIDA!" );
 38       while( getchar() != '\n' );
 39       printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
 40       continue;
 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 ¡INVALIDA!" );
 52       printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
 53       continue;
 54     }
 55     Lados = atoi( NumSTR );
 56 
 57     printf( "¿Cuantos dados? " );
 58     fgets( NumSTR, 9, stdin );
 59     NumValidosChars = 0;
 60     NumCharsLeidos = strlen( NumSTR );
 61 
 62     if( *(NumSTR + NumCharsLeidos - 1) != '\n' )
 63     {
 64       puts( "Entrada ¡INVALIDA! por returno" );
 65       while( getchar() != '\n' );
 66       printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
 67       continue;
 68     }
 69     else
 70       *(NumSTR + NumCharsLeidos - 1) = '\0';
 71 
 72     for( i = 0; i < NumCharsLeidos -1; i++ )
 73       if( ( *(NumSTR + i ) >= '0' && *(NumSTR + i ) <= '9' ) )
 74         NumValidosChars++;
 75 
 76     if( NumCharsLeidos == 1 || NumValidosChars != NumCharsLeidos - 1 )
 77     {
 78       puts( "\nEntrada ¡INVALIDA!" );
 79       printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
 80       continue;
 81     }
 82 
 83     Dados = atoi( NumSTR );
 84     if( Dados < 1 )
 85     {
 86       puts( "\nNúmero de dados ¡INVALIDA!" );
 87       printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
 88       continue;
 89     }
 90 
 91     Tira = Tira_n_Dados( Dados, Lados );
 92     printf( "Tiraste %d usando %d dados de %d lados.\n", Tira, Dados, Lados );
 93     printf( "Ingreso el número de lados de los dados, 0 para terminar: " );
 94   }
 95   printf( "La función rollem() se usó %d veces.\n", ContarLosTiros );
 96   puts( "¡Buen suerte!\n" );
 97 
 98   return 0;
 99 }
100 
101 // Archivo Prog108b.c
102 #include "Prog108.h"
103 #include <stdio.h>
104 #include <stdlib.h>             /* Prototipo para rand()   */
105 
106 int ContarLosTiros  = 0;
107 
108 static int rollem( int Lados )
109 {
110     int Tira;
111 
112     Tira = rand() % Lados + 1;
113     ++ContarLosTiros;             /* contar usos de función */
114     return Tira;
115 }
116 
117 int Tira_n_Dados( int Dados, int Lados )
118 {
119   int d;
120   int total = 0;
121 
122   for( d = 0; d < Dados; d++ )
123     total += rollem( Lados );
124 
125   return total;
126 }

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