4
Ejemplo: Adivina el Numero Veamos este ejemplo sencillo que ilustra como un simple programa puede darnos una sensación de interacción distinta. Se trata de un programa determinista con algo de in-determinismo, mas bien con un pseudo-in-determinismo, esto es logrado con el uso de un algoritmo pseudo-aleatorio que generara un numero supuestamente aleatorio. El algoritmo pseudo-aleatorio se encuentra implementado en la libreria stdlib.h , por lo que deberemos incluirla en la cabecera de nuestro programa: #include <stdlib.h> esta libreria incluye la función pseudo-aleatoria rand(), esta devuelve un numero entero int pseudo-aleatorio, si queremos que esta función devuelva un numero entero entre 0 y 49 podemos usar el operador residuo %, tal como se muestra: /*Asigna en la variable a un numero entre 0 y 49*/ a=rand()%50; En nuestro caso si queremos que se genere un numero entre 1 y 50 lo que haremos es sumarle 1 a dicho resultado quedando: /*Asigna en la variable a un numero entre 1 y 50*/ a=rand()%50 + 1; El pequeño problema que ocurre al usar rand es que siempre nuestro programa iniciara en el mismo numero aleatorio, debido a que la función rand en realidad es una función matemática que genera dicho numero en base a una semilla, es como una funcion caótica de la cual el valor de la salida es inesperado para pequeños cambios de la entrada, esto quiere decir que si nosotros colocamos una semilla distinta cada vez que nuestro programa se ejecuta, esta función se encargará de generar números distintos cada vez. Para lograr incorporar la semilla a la ejecución del programa se dispone de la función srand() la que debe recibir un numero entero distinto cada

Ejemplo

Embed Size (px)

Citation preview

Page 1: Ejemplo

Ejemplo: Adivina el Numero

Veamos este ejemplo sencillo que ilustra como un simple programa puede darnos una sensación de interacción distinta.Se trata de un programa determinista con algo de in-determinismo, mas bien con un pseudo-in-determinismo, esto es logrado con el uso de un algoritmo pseudo-aleatorio que generara un numero supuestamente aleatorio.

El algoritmo pseudo-aleatorio se encuentra implementado en la libreria stdlib.h , por lo que deberemos incluirla en la cabecera de nuestro programa:

#include <stdlib.h>  

esta libreria incluye la función pseudo-aleatoria rand(), esta devuelve un numero entero int pseudo-aleatorio, si queremos que esta función devuelva un numero entero entre 0 y 49 podemos usar el operador residuo %, tal como se muestra:

/*Asigna en la variable a un numero entre 0 y 49*/a=rand()%50;

En nuestro caso si queremos que se genere un numero entre 1 y 50 lo que haremos es sumarle 1 a dicho resultado quedando:

/*Asigna en la variable a un numero entre 1 y 50*/a=rand()%50 + 1;

El pequeño problema que ocurre al usar rand es que siempre nuestro programa iniciara en el mismo numero aleatorio, debido a que la función rand en realidad es una función matemática que genera dicho numero en base a una semilla, es como una funcion caótica de la cual el valor de la salida es inesperado para pequeños cambios de la entrada, esto quiere decir que si nosotros colocamos una semilla distinta cada vez que nuestro programa se ejecuta, esta función se encargará de generar números distintos cada vez.Para lograr incorporar la semilla a la ejecución del programa se dispone de la función srand() la que debe recibir un numero entero distinto cada vez que se ejecute el programa, la forma de lograr esto es recurrir a algún elemento distinto que exista entre cada ejecución del programa, podemos identificar al menos 2 seguramente existirán mas como por ejemplo el ID del proceso que corresponde a la ejecución del programa es único para cada ejecución y es asignado por el Sistema Operativo a la hora de ejecutar dicho proceso, esto podríamos usarlo usando la función getpid, en nuestro caso vamos a usar la otra opcion que aparentemente es mas evidente y se refiere al tiempo en que el proceso se ejecuta, obviamente estos tiempos son distintos para 2 procesos distintos.Para capturar el tiempo vamos a incluir la librería time.h, y la función time(), asi incorporamos a nuestro programa:

#include <time.h>

Page 2: Ejemplo

 

y para la funcion que devuelve un entero relacionado al tiempo de ejecucion del proceso:

b=time(NULL);

si juntamos esta funcion con srand la linea a usar en nuestro programa seria:

srand(time(NULL));

Bien hasta aquí deberíamos tener clara la generación de los números aleatorios que se usaran para el presente jueguito quedando la primera parte de nuestro programa asi:

#include <stdio.h> #include <stdlib.h> #include <time.h>  int main(){  int a; srand ( time(NULL) );  a=rand()%50 + 1;  printf("Se inicia el juego..!\n");  ... } 

Luego de pintar el mensaje "Se inicia el juego..!" nuestro proceso tiene almacenado en la variable a un numero pseudo-aleatorio que le pediremos a nuestro usuario que adivine.

Para esto usaremos un lazo repetitivo while, el cual comparara el numero ingresado por teclado b el cual se inicializa en "0" en:

b=c=0;

Usaremos una variable mas con identificador c, la cual nos servirá de contador de iteraciones del lazo repetitivo, esta variable también se inicia en 0 en la instrucción anterior.

Para cada iteracion que se realice el programa hara lo siguiente:

Page 3: Ejemplo

/*Imprimir el intento en el que nos encontramos*/ printf("intento %i\n",c); /*Pedir el ingreso de un nuevo numero b*/ printf("Ingrese 1 numero:"); /*Leer el numero b*/ scanf("%i",&b);  /*Mostrar el mensaje de ayuda al usuario: si es mayor o menor que el numero a */ if(a>b) printf("Es mayor\n"); else printf("Es menor\n"); /*Incrementar el contador*/ c++;

Y finalmente cuando el numero ingresado por teclado b sea igual al numero seudo-aleatorio a pintaremos el mensaje:

printf("%i Exito!! numero encontrado en el intento %i\n",a,c);

El cual indica el numero de pasos necesitados para adivinar el numero pseudo-aleatorio que la computadora calculo.

El programa completo de este jueguito queda como se muestra a continuación:

 #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(){  int a,b,c;  srand ( time(NULL) ); a=rand()%50 + 1;  printf("Se inicia el juego..!\n");  b=c=0; while(a!=b){ printf("intento %i\n",c);  printf("Ingrese 1 numero:"); scanf("%i",&b);  if(a>b) printf("Es mayor\n"); else printf("Es menor\n");  c++; } 

Page 4: Ejemplo

printf("%i Exito!! numero encontrado en el intento %i\n",a,c); return 0;}

(cc) Comunidad ACM-ICPC-UNI/Rommel Romero Navarrete