Página 1 de 10

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

Publicado: 14 Dic 2009, 02:12
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 >>

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

Publicado: 14 Dic 2009, 16:05
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;
}

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

Publicado: 14 Dic 2009, 17:57
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

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

Publicado: 15 Dic 2009, 21:15
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

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

Publicado: 16 Dic 2009, 15:21
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.

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

Publicado: 16 Dic 2009, 21:27
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

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

Publicado: 16 Dic 2009, 22:26
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.

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

Publicado: 16 Dic 2009, 22:36
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?

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

Publicado: 17 Dic 2009, 15:32
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?

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

Publicado: 17 Dic 2009, 19:15
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: