Autor Tema: lenguajeC C generar lista números aleatorios buscar veces que se repite dígito  (Leído 2370 veces)

sebass4114

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Hola, mi tarea de la escuela se trata de hacer un programa que genera una lista de 100 números a partir de un número semilla utilizando srand. Es un juego en el que tienes que buscar las veces que se repite un número en dicha lista e ingresar la cantidad. El número a buscar es aleatorio entre 1 y 9. Mi programa tiene un error, se supone que la computadora contaría las veces que aparece el número en la lista para comparar la respuesta con la del usuario y determinar si es correcta o no, pero no sé cómo hacer eso por eso mi programa siempre dice que está mal, aún cuando se ingresa el número correcto.

Adjunto mi código (por favor ignoren los comentarios, los puse para recordar que era cada cosa y también cuando estaba haciendo pruebas)

Código: [Seleccionar]
#include <stdlib.h>
#include <stdio.h>
#include<string.h>
 int main()
 {
 int i, j, x, k;
 int t=40;
 int total,n;
 float h;
 int c = 1, d = 1;
 unsigned llave;
  char lista2[100], numero;
 printf("instrucciones: \n");
 printf("El juego trata sobre encontrar todas las veces que se repite un mismo numero en una lista de 100 numeros entre 1 y 9, \n para comenzar a jugar, eliges un numero entre 1 y 9, la computadora generará una lista aleatoria de números y luego \n aparecera el numero que tienes que buscar, la lista y el numero a encontrar son diferentes dependiendo del numero que \n elijas al principio, tienes 40 segundos para encontrar todas las veces que se repite, cuando termines ingresas cuantos encontraste en el apartado al final, ganas si respondes antes de que termine el tiempo y pierdes si se te acaban los 40 segundos" );
  printf("\n");
  printf( "Para continuar introduce un numero entre 1 y 9: " );
 scanf( "%u", &llave );
 srand( llave );
 for ( i = 1; i <= 100; i++ ) {
printf( "%10d", 1 + ( rand() % 9 ) );
 if ( i % 5 == 0 ) {
 printf( "\n" );
 }
 }
   
  printf("encuentra todos los \n");
 for ( j = 1; j <= 1; j++ ) {
 printf( "%10d", 1 + ( rand() % 9 ) );
 if ( j % 5 == 0 ) {
 printf( "\n" );
 }
 }
  //printf("\n dame el nombre\n");
    lista2[0]='\0';
gets(lista2);
fflush(stdin);
// printf("\n cual letra se va a encontrar\n");
// scanf("%c",&numero);
numero=k;
total=0;
for(n=0;n<strlen(lista2);n++)
{
if(numero==lista2[n])
total++;
}
// printf("\n la letra - %c se encontro %i veces en el nombre: %s\n", numero,total,lista2);

  switch(j)
  {
  case'&j':
  h=h+1;
  break;
default:
h=h+0;
break;
  }
  printf( "\n" );
printf("cuantos hay? \n");
scanf( "%u", &k );
if (k== total){
printf("correcto :)");
}
else{
printf("NO ES CIERTO");
}
 return 0;
 }

 
« Última modificación: 13 de Abril 2022, 18:36 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 985
    • Ver Perfil
Re: Buscar las veces que se repite un número en una lista
« Respuesta #1 en: 14 de Junio 2021, 01:03 »
Cuando generas el número que hay que encontrar, que por cierto no hace falta que esté dentro de un bucle, y aún menos en uno diseñado para que se repita una sola vez..

el caso es que cuando generas el número a buscar, lo muestras en pantalla pero no lo guardas en ningún sitio:

Citar
  printf("encuentra todos los \n");
 for ( j = 1; j <= 1; j++ ) {
printf( "%10d", 1 + ( rand() % 9 ) );
 if ( j % 5 == 0 ) {
 printf( "\n" );
 }

Tú luego intentas contar las coincidencias del número a buscar, como si lo tuvieras guardado en la variable "numero", pero ahí no está.

Citar
numero=k;
   total=0;
   for(n=0;n<strlen(lista2);n++)
   {
      if(numero==lista2[n])
      total++;
   }

No está en ningún sitio. En "número" has asignado lo que tiene "k", pero "k" no tiene nada en ese momento.
Total, que el número a buscar, deberías guardarlo en "numero" al generarlo. Luego lo muestras y posteriormente podrás comparar para buscar repeticiones en la lista.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

sebass4114

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: Buscar las veces que se repite un número en una lista
« Respuesta #2 en: 14 de Junio 2021, 01:47 »
Gracias por responder
Olvidé mencionar que el programa debe repetirse hasta que se introduzca una X pero no sé como programar eso, intenté con un if después del srand pero no hace nada
Código: [Seleccionar]
srand( llave );
 if(llave==x){
 return 0;
 }
 else{
(el else abarca el resto del codigo)

Y sobre la variable numero, la hice específicamente para guardar el numero a encontrar pero tampoco sé como asignarle dicho valor, desconozco cual es el comando correcto para eso
Me disculpo si mi programación es muy confusa o contra intuitiva

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 985
    • Ver Perfil
Re: Buscar las veces que se repite un número en una lista
« Respuesta #3 en: 14 de Junio 2021, 13:09 »
De hecho ahora me fijo que tampoco guardas los números en la lista (en el array)

A ver, limpiando un poco variables y líneas de código que no se usan, el programa podría quedar así:

Código: [Seleccionar]
#include <stdlib.h>
#include <stdio.h>

 int main()
 {
    int k;
    int t=40;
    int total = 0;
    int llave;
    int lista2[100], numero;
   
    printf("instrucciones: \n");
    printf("El juego trata sobre encontrar todas las veces que se repite un mismo numero en una lista de 100 numeros entre 1 y 9, \n para comenzar a jugar, eliges un numero entre 1 y 9, la computadora generará una lista aleatoria de números y luego \n aparecera el numero que tienes que buscar, la lista y el numero a encontrar son diferentes dependiendo del numero que \n elijas al principio, tienes 40 segundos para encontrar todas las veces que se repite, cuando termines ingresas cuantos encontraste en el apartado al final, ganas si respondes antes de que termine el tiempo y pierdes si se te acaban los 40 segundos" );
    printf("\n");
    printf( "Para continuar introduce un numero entre 1 y 9: " );
    scanf( "%d", &llave );
   
    srand( llave );
    for ( int i = 1; i <= 100; i++ )
    {
        lista2[i] = 1 + ( rand() % 9 ); //Guardamos numero generado en lista
    printf("%10d", lista2[i]); //Lo mostramos en pantalla
        if ( i % 5 == 0 )
        {
            printf( "\n" );
        }
    }
   
    //Generamos numero a buscar
    numero = 1 + ( rand() % 9 );
    //Mostramos en pantalla
    printf("Encuentra todos los %d \n", numero);
   
    //Contamos cuantas veces se repite el numero en la lista
for(int i=0; i<100; i++)
{
if(numero==lista2[i])
    total++;
}

    printf("cuantos hay? \n");
    scanf( "%u", &k );
    if (k == total)
    {
    printf("correcto :)\n");
    }
    else
    {
    printf("NO ES CIERTO\n");
    printf("Hay %d\n", total);
    }
     return 0;
}


Faltaría hacer lo que mencionas de que se repita hasta que introduzca una x.

Bueno, yo la verdad es que en lenguaje C no me manejo bien, nunca lo he estudiado, soy más de Java y C#.

He hecho un intento usando un bucle while, pidiendo el valor de la llave como un "char".
Si es una 'x' no se ejecuta el programa, de lo contrario, generamos números random con él (internamente, un char viene a ser lo mismo que un int).

Sin embargo, no funciona bien, solo deja introducir el valor de llave la primera vez, las siguientes iteraciones ya no pide el valor.
Da igual si limpio el buffer con fflush(), sigue fallando.

A ver si alguien que sepa más de C nos dice cómo solucionarlo:

Código: [Seleccionar]
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int k;
    int t = 40;
    int total = 0;
    char llave = ' ';
    int lista2[100], numero;

    while (llave != 'x')
    {
       
        printf("instrucciones: \n");
        printf("El juego trata sobre encontrar todas las veces que se repite un mismo numero en una lista de 100 numeros entre 1 y 9, \n para comenzar a jugar, eliges un numero entre 1 y 9, la computadora generará una lista aleatoria de números y luego \n aparecera el numero que tienes que buscar, la lista y el numero a encontrar son diferentes dependiendo del numero que \n elijas al principio, tienes 40 segundos para encontrar todas las veces que se repite, cuando termines ingresas cuantos encontraste en el apartado al final, ganas si respondes antes de que termine el tiempo y pierdes si se te acaban los 40 segundos");
        printf("\n");
        printf("Para continuar introduce un numero entre 1 y 9(x para salir): ");
        fflush(stdin);
        scanf("%c", &llave);
        if (llave != 'x')
        {
            srand(llave);
            for (int i = 1; i <= 100; i++)
            {
                lista2[i] = 1 + (rand() % 9); //Guardamos numero generado en lista
                printf("%10d", lista2[i]); //Lo mostramos en pantalla
                if (i % 5 == 0)
                {
                    printf("\n");
                }
            }

            //Generamos numero a buscar
            numero = 1 + (rand() % 9);
            //Mostramos en pantalla
            printf("Encuentra todos los %d \n", numero);

            //Contamos cuantas veces se repite el numero en la lista
            for (int i = 0; i < 100; i++)
            {
                if (numero == lista2[i])
                    total++;
            }

            printf("cuantos hay? \n");
            scanf("%d", &k);

            if (k == total)
            {
                printf("correcto :)\n");
            }
            else
            {
                printf("NO ES CIERTO\n");
                printf("Hay %d\n", total);
            }
           
            system("pause");
        }
    }
    return 0;
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

sebass4114

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: Buscar las veces que se repite un número en una lista
« Respuesta #4 en: 18 de Junio 2021, 18:29 »
Muchas gracias, me sirvió mucho, aunque lo que mencionas del valor de la llave, de que sólo se puede introducir una vez a mí no me sucedió, se podía introducir uno diferente cada vez que se reinicia el programa, de cualquier forma te agradezco mucho

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".