[Curso] Introducción a la programación en C (IX)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

[Curso] Introducción a la programación en C (IX)

Mensaje por m0skit0 »

<< Anterior Siguiente >>

- "Creo que ha dicho 'Bienaventurados los queseros'".
- "¿Por qué precisamente los queseros?"
- "Hombre, no hay que tomarlo literalmente, se refiere a todos los fabricantes de productos lácteos."

(La Vida de Brian)

Más bucles y otras cosas interesantes

Una alternativa al bucle while es el bucle for. Lo introduzco para que sepáis de qué va, pero su funcionalidad es la misma que el while. De hecho cualquier bucle for se puede escribir como un while y viceversa.

Código: Seleccionar todo

for (inicialización; condición de repetición; incremento)


Por ejemplo:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
    int i, limite;

    printf("Introduce el limite: ");
    scanf("%d", &limite);

   // i = 0 inicializa i a cero antes de comenzar el bucle
   // El bucle continuará mientras i < limite
   // i++ incrementa i en 1 a cada vuelta del bucle
   for(i=0; i<limite; i++)
      printf("%d ", i);
   
   printf("\n");
    return 0;
}

No creo que haya mucho que explicar sobre esto. Cualquier duda, no dudéis en preguntar.

Me gustaría introducir una función bastante interesante: el generador de números pseudo-aleatorios. Se llaman pseudo-aleatorios porque para un ordenador no existe nada aleatorio, y estos números se generan mediante algunos cálculos para hacer parecer que son pura suerte. Os dejo un ejemplo comentado:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[])
{
    int dado_maquina, dado_humano;

   printf("Vamos a jugar a los dados... ¿Te atreves a jugar contra mí?\n");
   printf("Tú tiras primero. Presiona una tecla para tirar el dado.\n");
   getchar();
   
   // Iniciamos el generador de números aleatorios con el tiempo de la computadora
   srand(time(NULL));

   // rand() nos devuelve un número pseudo-aleatorio entre 0 y una constante.
   // Para reducirlo entre dos números de nuestra elección basta con usar un módulo (el resto de la división)
   // y una suma.
   // En este caso sacamos un número entre 1 y 6, ambos incluídos.
   dado_humano = (rand() % 6) + 1;
   printf("Tu tirada ha sido: %d\n", dado_humano);

   printf("Ahora tiro yo... Espero tu permiso para tirar.\n");
   getchar();
   
   srand(time(NULL));
   dado_maquina = (rand() % 6) + 1;
   printf("Mi tirada ha sido: %d\n", dado_maquina);

   if (dado_maquina > dado_humano)
      printf("Eres un mortal sin mucha suerte\n");
   else if (dado_maquina == dado_humano)
      printf("Vaya coincidencia...\n");
   else
      printf("Eres un mortal con bastante suerte... En la próxima versión no será tan fácil.\n");

    return 0;
}


Y ahora os toca a vosotros practicar:

1) Escribir un programa que simule el sorteo de lotería. En nuestro caso, el billete de lotería consta de 5 cifras.
2) Reescribir el juego de adivinar el número secreto, sólo que esta vez sea la computadora la que genere un número secreto por sí misma.
3) Modificar el ejemplo del juego de dado puesto arriba para que siempre gane la computadora. ¿Es esto posible?

Descarga en PDF (cortesía de Dark Pallacus):
lección IX_C.pdf.rar


<< Anterior Siguiente >>
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por arisma »

1.-

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <time.h>

int main(int argc, char* argv[])
{
   int i;

   srand(time(NULL));

   printf("Décimo ganador: ");
   for (i = 0; i < 5; i++)
      printf("%d", (rand() % 10));

   return 0;
}


2.-

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <time.h>

int main(int argc, char* argv[])
{
   int nSec, nLeido, i;


   srand(time(NULL));
   nSec = rand() % 11;

   i = 1; //Ahora lo voy a usar como contador de intentos

   /* Ponemos el primer scanf fuera ya que existe la posibilidad de que inicialicemos nSec(por defecto = 0)
      con el valor del número a adivinar, en dicho caso no preguntaria al usuario ninguna vez el número a adivinar */

   printf("Introduce el número que crees que es: ");
   scanf("%i", &nLeido);

   while ( nSec != nLeido && i < 5) {
      i++; // i = i + 1;
      printf("Número de intento %i, introduce otro número: ", i);
      scanf("%i", &nLeido);
   }

   if (nSec == nLeido) printf("MUY BIEN!, Lo has adivinado...\n");
   else
      printf("La proxima vez será, ejecuta el programa de nuevo...\n");

   return 0;
}




3- En un principio cambiaría sólo lo siguiente

Spoiler:

Código: Seleccionar todo

int dado_maquina, dado_humano, diferencia; // Añado una variable de tipo entero más

...

/* Nunca va a sacar 6 el humano. Se notará, así que puede cambiarse de forma que en caso de empate gane la maquina
Como si fuera la banca */
dado_humano = (rand() % 5) + 1;

...

//Siempre va a ser superior en una cantidad aleatoria entre 1 y la diferencia hasta 6 del humano(para no pasarnos)
diferencia = 6 - dado_humano;
dado_maquina = ((rand() % diferencia) +1) + dado_humano;


Con lo que usando tu fuente sería
Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[])
{
    int dado_maquina, dado_humano, diferencia;

   printf("Vamos a jugar a los dados... ¿Te atreves a jugar contra mí?\n");
   printf("Tú tiras primero. Presiona una tecla para tirar el dado.\n");
   getchar();
   
   // Iniciamos el generador de números aleatorios con el tiempo de la computadora
   srand(time(NULL));

   // rand() nos devuelve un número pseudo-aleatorio entre 0 y una constante.
   // Para reducirlo entre dos números de nuestra elección basta con usar un módulo (el resto de la división)
   // y una suma.
   // En este caso sacamos un número entre 1 y 6, ambos incluídos.
   dado_humano = (rand() % 5) + 1;
   printf("Tu tirada ha sido: %d\n", dado_humano);

   printf("Ahora tiro yo... Espero tu permiso para tirar.\n");
   getchar();
   
   srand(time(NULL));
   diferencia = 6 - dado_humano;
   dado_maquina = ((rand() % diferencia) +1) + dado_humano;
   printf("Mi tirada ha sido: %d\n", dado_maquina);

   if (dado_maquina > dado_humano)
      printf("Eres un mortal sin mucha suerte\n");
   else if (dado_maquina == dado_humano)
      printf("Vaya coincidencia...\n");
   else
      printf("Eres un mortal con bastante suerte... En la próxima versión no será tan fácil.\n");

   getchar();
    return 0;
}
Última edición por arisma el 21 Dic 2009, 12:19, editado 4 veces en total.

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por m0skit0 »

arisma escribió:Te refieres a que modifiquemos para que el suyo sea seis siempre y el nuestro hasta cinco?

Bueno, intentando que no se note xDDD Si la compu siempre saca 6, está más claro que el agua xD
Imagen

Avatar de Usuario
Mirlo_PJ
Enteradillo
Enteradillo
Mensajes: 45
Registrado: 14 Oct 2009, 19:52

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por Mirlo_PJ »


Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[]){
    int NumLoto, i;

   printf("Quieres conocer el numero premiado de hoy\n");
   getchar();
   
   srand(time(NULL));
   for(i=1; i <6; i++){
      NumLoto = (rand() % 99);
      printf("Numero %d: %d\n",i,NumLoto );
      
   }
   printf("Gracias por jugar a Loco Loto.\n");
   getchar();
   
    return 0;
}


Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[]){
   int NumSecre, NumHum;
   
   printf("Adivina mi numero\n");
   getchar();
   
   NumHum=0;
   srand(time(NULL));
   NumSecre = (rand() % 99);
   
   while(NumHum != NumSecre){
      
      system ("clear");
      printf("Adivina el número: ");
      scanf("%d", &NumHum);
      
      if (NumHum < NumSecre){
         printf("\nTe quedaste corto.\n");
         sleep(1);
      }else if(NumHum > NumSecre){
         printf("\nTe as pasao.\n");
         sleep(1);
      }
      
   }
   printf("Te costo XDDD.\n");
   getchar();
   
    return 0;

}


Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[])
{
    int dado_maquina, dado_humano;

   printf("Vamos a jugar a los dados... ¿Te atreves a jugar contra mí?\n");
   printf("Tú tiras primero. Presiona una tecla para tirar el dado.\n");
   getchar();
   srand(time(NULL));
   dado_humano = (rand() % 6) + 1;
   if (dado_humano == 6) dado_humano--;
   printf("Tu tirada ha sido: %d\n", dado_humano);

   printf("Ahora tiro yo... Espero tu permiso para tirar.\n");
   getchar();
   
   srand(time(NULL));
    dado_maquina = (rand() % 6) + 1;
   while(dado_maquina <= dado_humano){
    srand(time(NULL));
    dado_maquina = (rand() % 6) + 1;
   }
   printf("Mi tirada ha sido: %d\n", dado_maquina);

   if (dado_maquina > dado_humano)
      printf("Eres un mortal sin mucha suerte\n");
   else if (dado_maquina == dado_humano)
      printf("Vaya coincidencia...\n");
   else
      printf("Eres un mortal con bastante suerte... En la próxima versión no será tan fácil.\n");

    return 0;

}


Esperando revisión profe
Última edición por Mirlo_PJ el 16 Dic 2009, 21:23, editado 1 vez en total.
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por m0skit0 »

1º)

Código: Seleccionar todo

char* Billete;

Sobra.

Código: Seleccionar todo

NumLoto = (rand() % 99);

Cada número de la lotería es entre 0 y 9 (ambos incluídos), no entre 0 y 98.

2º)

Código: Seleccionar todo

NumSecre = (rand() % 99);

Repito el enunciado del juego de adivinación de números:

m0skit0 escribió:"Crear un programa en el que un usuario A introduce un número secreto entre 0 y 10 y otro usuario B debe adivinarlo en 5 intentos máximo. El programa sólo se debe detener si el usuario B acertó o si ha gastado los 5 intentos de manera fallida"

Por tanto tu generador de número secreto está mal.

Código: Seleccionar todo

NumHum=0;
while(NumHum != NumSecre){

¿Y si el número secreto generado es 0? A lo mejor te interesa usar el bucle do...while (que no hemos visto). Mira aquí: http://www.carlospes.com/curso_de_lengu ... entras.php. Aparte, si miras el enunciado verás que sólo tiene 5 intentos máximo, no infinitos.

3º)

Código: Seleccionar todo

while(dado_maquina <= dado_humano){
    srand(time(NULL));
    dado_maquina = (rand() % 6) + 1;
}

Es válida la solución, pero puedes hacerlo de una forma más fácil y con menos coste de proceso.

Código: Seleccionar todo

else if (dado_maquina == dado_humano)
      printf("Vaya coincidencia...\n");
else
      printf("Eres un mortal con bastante suerte... En la próxima versión no será tan fácil.\n");

Esto te sobra, pues jamás se van a cumplir estas condiciones puesto que has modificado el programa para que nunca pasen.
Imagen

Avatar de Usuario
Mirlo_PJ
Enteradillo
Enteradillo
Mensajes: 45
Registrado: 14 Oct 2009, 19:52

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por Mirlo_PJ »

Mirlo_PJ escribió:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[]){
    int NumLoto, i;

   printf("Quieres conocer el numero premiado de hoy\n");
   getchar();
   
   srand(time(NULL));
   for(i=1; i <6; i++){
      NumLoto = (rand() % 9)+1;
      printf("Numero %d: %d\n",i,NumLoto );
      
   }
   printf("Gracias por jugar a Loco Loto.\n");
   getchar();
   
    return 0;
}


Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[]){
   int NumSecre, NumHum;
   
   printf("Adivina mi numero\n");
   getchar();
   
   NumHum=0;
   srand(time(NULL));
   NumSecre = (rand() % 99);
   
   while(NumHum != NumSecre){
      
      system ("clear");
      printf("Adivina el número: ");
      scanf("%d", &NumHum);
      
      if (NumHum < NumSecre){
         printf("\nTe quedaste corto.\n");
         sleep(1);
      }else if(NumHum > NumSecre){
         printf("\nTe as pasao.\n");
         sleep(1);
      }
      
   }
   printf("Te costo XDDD.\n");
   getchar();
   
    return 0;

}


Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[])
{
    int dado_maquina, dado_humano;

   printf("Vamos a jugar a los dados... ¿Te atreves a jugar contra mí?\n");
   printf("Tú tiras primero. Presiona una tecla para tirar el dado.\n");
   getchar();
   srand(time(NULL));
   dado_humano = (rand() % 6) + 1;
   if (dado_humano == 6) dado_humano--;
   printf("Tu tirada ha sido: %d\n", dado_humano);

   printf("Ahora tiro yo... Espero tu permiso para tirar.\n");
   getchar();
   
   dado_maquina = dado_humano +1;
   
   printf("Mi tirada ha sido: %d\n", dado_maquina);

   if (dado_maquina > dado_humano) printf("Eres un mortal sin mucha suerte\n");

    return 0;

}


Esperando revisión profe
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por m0skit0 »

1º)

Código: Seleccionar todo

NumLoto = (rand() % 9)+1;

Sigue estando mal. Esto genera entre 1 y 9. Necesitas que genere entre 0 y 9 ;)

Código: Seleccionar todo

for(i=1; i <6; i++){

Esto no es un error, pero un consejo: intenta siempre empezar a contar por 0 y no por 1, así te vas acostumbrando para el futuro xD

¿Qué tal si también lo modificas para que escriba el número premiado de golpe, en vez de ir diciendo cada número por separado? Por ejemplo, si el número aleatorio generado es 32501, pues que diga: "El número premiado es el 32501"; en vez de "Numero 1: 3", "Numero 2: 2", etc...

2º)

Sigues en las mismas... Además, no hay que dar pistas acerca del número que introduce el usuario :twisted:

3º)

Bueno, éste ya pinta bastante mejor. Lo has hecho como yo había pensado, muy bien :oki: Sólo un pequeño fallo: el dado de la máquina siempre será 1 punto más que el dado del jugador, y eso se terminaría notando. Intenta encontrar una mezcla entre la solución que propusiste antes y esta nueva.

Código: Seleccionar todo

if (dado_maquina > dado_humano)

Te sobra, pues justo antes haces: dado_maquina = dado_humano + 1;, por tanto la condición (dado_maquina > dado_humano) siempre va a ser cierta ;)

Un retillo más: no uses la variable dado_maquina.
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por m0skit0 »

Bueno arisma, ya que no te dignas a hacer el tercero, te comento sobre los 2 primeros:

1º)

Como veo que tú ya controlas un poco, sólo te voy a marcar las líneas que tienes mal.

Código: Seleccionar todo

int tirada = 0;

Esto... xD

Código: Seleccionar todo

printf("%d", (rand() % 9);

Dos errores en una sola línea :twisted:

2º)

Código: Seleccionar todo

nSec = rand() % 10;

Entre 0 y 10.

¿Y usando el bucle do...while?
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por arisma »

Jajajaja, xD

No es que no me digne, es que estoy menos con el ordena y mucho más ocupado en el trabajo.

El tercero ya lo he puesto.

Sobre el primero, ahora lo quito. En un principio iba a hacerla de otra forma y no la he quitado. :adora:

La otra linea(la de los 2 errores), esto vale me comí un ')' hasta que lo compilé pero no copié el nuevo fuente.

En el segundo, quieres que lo haga con do while?

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (IX)

Mensaje por m0skit0 »

arisma escribió:El tercero ya lo he puesto.

Me encanta :adora:

arisma escribió:La otra linea(la de los 2 errores), esto vale me comí un ')' hasta que lo compilé pero no copié el nuevo fuente.

¿Y el otro error?

arisma escribió:En el segundo, quieres que lo haga con do while?

Por tocar las pelotas :juasjuas:
Imagen

Responder