0
    #include <stdio.h>
    #include <windows.h>
    #include <time.h> 
        int semillitaRandom(int _nombres,int* a) {
        time_t seconds;
        time(&seconds);
        *a=(rand()%_nombres);
        }
    

       int main () {
        int _nombres,i,j,k;
        printf("\nIngrese el tamaño del vector para cargar nombres:\n");
        scanf("%i",&_nombres);
        char vector[_nombres][10];
        int* _al;
        printf("\n Ingrese los nombres para el vector:\n");
        for (k=0;k<_nombres;k++)
        {
            fflush(stdin);
            gets(vector[k]);
        }
        int _filas,_columnas;
        printf("\nIngrese la cantidad de filas:\n");
        scanf("%i",&_filas);
        printf("\nIngrese la cantidad de columnas:\n");
        scanf("%i",&_columnas);
        char* punteroMatriz[_filas][_columnas];
        printf("\n Matriz nombres:\n");
        for (i=0;i<_filas;i++)
        {
            for (j=0;j<_columnas;j++)
            {
                semillitaRandom(_nombres,&_al);
                punteroMatriz[i][j]=vector[(int)_al];
                printf("%s | ",punteroMatriz[i][j]);
            }
            printf("\n");
        } 
        }

En este caso el problema se basa en crear un vector que contenga nombres ingresados por el usuario, luego ese vector transformarlo en matriz y que dentro de la matriz se llene con números aleatorios (del tamaño de la cantidad de nombres ingresados) para que con los números aleatorios apunte directamente a posiciones del vector y los imprima como matriz.

Este es el código que tengo creado, por alguna razón la matriz me brinda siempre el mismo resultado, creo que hay un problema en mis punteros para el aleatorio.

NgNL
  • 18
  • 5
  • 1
    Hace mucho que no uso C, pero me parece que el problema es que jamás llamas a `srand` para inicializar los números aleatorios. La variable `seconds` la asignas pero no haces nada con ella. Si quieres aleatoriedad en base a la hora, deberías llamar `srand` una sola vez al principio y ya, salvo que necesites algo diferente. Además, `_al` es un puntero a int, y a `semillitaRandom` le pasas la dirección donde está almacenado el puntero, para luego asignarle un valor aleatorio. O sea, *la dirección de memoria* es el valor aleatorio. Y luego usas `_al` como índice del vector con un cast a `int`! – Andrew Jul 04 '20 at 07:34
  • Si quieres un índice aleatorio, deberías hacer que `_al` sea `int`, eliminar `semillitaRandom` y simplemente llamar `_al = rand() % _nombres` y luego hacer `vector[_al]`. Por último, la forma de llamar las variables me parece muy poco clara, deberías poner algo más representativo, y sin `_ `. – Andrew Jul 04 '20 at 07:38

1 Answers1

6

Tienes muchos errores en tu código, desde un indentado confuso hasta fallos lógicos pasando por errores de concepto.

  1. La función semillitaRandom no establece ninguna semilla de números pseudo-aleatorios, las rutinas de incluyen una función para establecer la semilla del motor de números pseudo-aleatorios: srand.

  2. La función semillitaRandom tiene establecido un retorno de tipo int pero no devuelve nada, así que es incorrecta.

  3. No puedes usar variables cuyo nombre empiece por guion bajo (_), el estándar de C reserva ese tipo de nombres para los compiladores (traducción y resaltado míos):

    7.1.3 Identificadores reservados

    • Todos los identificadores que empiecen por un guion bajo y una letra mayúscula o minúscula están siempre reservados para cualquier uso, excepto esos identificadores que sean léxicamente idénticos a palabras clave.
    • Todos los identificadores que empiecen por un guion bajo están siempre reservados para ser usados como identificadores en el ámbito de un archivo tanto en el espacio de nombres ordinario como en el de etiquetas.

    Por lo que tus variables _nombres, _al, _filas y _columnas no cumplen con los criterios del estándar. Lee este hilo para saber más.

  4. Las variables deben tener un nombre auto-explicativo, nombres como i, j o k no dan ninguna pista de cuál es la misión de esas variables.

  5. No es necesario pre-declarar las variables de indizado de bucles for, estas variables se pueden declarar en el propio bucle.

  6. Favorece el pre-incremento frente al post-incremento, lee este artículo para saber más.

  7. Las formaciones1 deben tener un tamaño conocido en tiempo de compilación, si usas una variable como tamaño (una variable es un valor conocido en tiempo de ejecución) estás usando una formación de tamaño variable (FTV, en inglés: VLA: Variable Lenght Array) que es una extensión no estándar de compilador que puede dar lugar a problemas o ejecuciones erráticas, así que tus formaciones vector y punteroMatriz son incorrectas. Lee estos hilos para saber más.

  8. Si quieres almacenar números, no uses formaciones de caracteres, la formación bidimensional punteroMatriz debería ser de enteros (int).

  9. En las funciones que no reciben parámetros deben llevar void en la lista de argumentos, así que la función main es incorrecta.

  10. La función main debe devolver un valor, lee este hilo para saber más.

Los puntos anteriores son lo que has hecho mal a nivel conceptual y a nivel de programación. Si corriges el primer punto tendrás números aleatorios, si corriges el resto de puntos tu código funcionará en lugar de explotar.


  • 1También conocidas como arreglos o en inglés array.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • #6 Interesante, aunque entiendo que hablamos de nanosegundos de diferencia, algo que hoy en día difícilmente haga una diferencia. Creo que es mucho más importante la legibilidad y mantenibilidad del código a la hora de elegir una u otra. En mi experiencia, posincremento es muchísimo más común (especialmente en bucles), y cuando se usa preincremento, es porque la variable está dentro de una fórmula y uno necesita específicamente que sea así. – Andrew Jul 04 '20 at 21:45
  • los numeros aleatorios ya los consegui gracias por el comentario, corregi las variables para que tengan unos nombres mas intuitivos, y uso char en mi puntero matriz debido a que la base del ejercicio es devolver nombres ingresados, no numeros – NgNL Jul 04 '20 at 22:35
  • @Andrew la legibilidad y mantenibilidad del código no varía **nada** usando pre-incremento respecto a post-incremento. La ganancia no surge de los nanosegundos de ejecución (que sólo se dará en caso de variables aritméticas) si no en que en código genérico el pre-incremento es notablemente mejor ¿Por qué usar una opción que puede ser peor o inocua frente a una opción que puede ser mejor o inocua? – PaperBirdMaster Jul 05 '20 at 10:24
  • @NgNL si la base del ejercicio es devolver números, tu pregunta no se entiende en absoluto, te animo a redactarla de nuevo. – PaperBirdMaster Jul 05 '20 at 10:25