Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Nikol_ en 30 Octubre 2019, 23:10 pm



Título: MATRICES
Publicado por: Nikol_ en 30 Octubre 2019, 23:10 pm
Holaa
Estuve intentando rellenar una matriz con un caracter aleatorio, necesito que este caracter se posicione aleatoriamente en una matriz 5X10 solo tres veces.
La idea es que se pueda imprimir la matriz vacía exceptuando 3 posiciones que van a ser ocupadas aleatoriamente con una 'E'.
 Es en lenguaje C y solo con bibliotecas stdio.h, stdlib.h, time.h. Espero que alguien pueda ayudarme con esto, no logro entender bien en que me estoy equivocando o quizas me faltan algo, no soy bueno con matrices.
 Muchas gracias de antemano!

Código:
int main(){
    char matriz[5][10];
    int i;
    int j;

    srand((unsigned)time(NULL));
    i = rand()%5;
    j = rand()%10;

    for(i = 0; i<5; i++){
      for(j = 0; j<10; j++){
        matriz[i][j]= 'E';
        printf("|%c",matriz[i][j]);
        }
        printf("|\n");
    }


    return 0;

}



Título: Re: MATRICES
Publicado por: CalgaryCorpus en 31 Octubre 2019, 00:08 am
Haz un ciclo de 3 vueltas y calcula i y j como lo estas haciendo y luego asigna la posicion indicada por i y j. El ciclo dentro del ciclo que tienes, eliminalo.

Lo malo que tiene esto es que es posible que se repita i y j de una iteracion a otra.
Una posible solucion es iterar hasta que el lugar indicado por i y j este vacio, por 3 veces.


Título: Re: MATRICES
Publicado por: K-YreX en 31 Octubre 2019, 00:15 am
Lo que estás haciendo es generar dos números aleatorios: el primero en el intervalo [0,4] para la i y el segundo en el intervalo [0,9] para la j.
Luego estás haciendo un bucle para recorrer toda la matriz (empezando i y j en 0 por lo que los valores aleatorios ya los has perdido) y estás asignando una "E" a cada casilla de la matriz.

Como lo que quieres es generar 3 posiciones aleatorias y supongo que no sirve que la misma posición se repita 3 veces, deberás primero generar un valor aleatorio para i y para j, poner una "E" en esa posición y después volver a generar un valor aleatorio para cada variable y comprobar que esa posición no tenga ya una "E".

Lo primero: si no asignas ningún valor a la matriz te saldrá "basura" es decir caracteres aleatorios. Lo mejor es que inicialices toda la matriz con el mismo carácter (el que prefieras... un 0, un -, un *,... lo único importante es que sea un carácter, es decir, entre comillas simples y que no sea la E lógicamente).

Después de eso puedes hacer un bucle que se repita mientras no se hayan generado 3 posiciones aleatorias diferentes. Y eso cómo se sabe? Bueno pues en pseudocódigo sería algo así (el pseudocódigo no es lenguaje C, sirve para que entiendas el proceso que has de seguir pero una vez que lo entiendas debes implementar el mismo comportamiento en C).
Código:
INICIO
    MIENTRAS posicionesGeneradas < 3 HACER
        i := generarAleatorio(0,4) // creas una i aleatoria entre 0 y 4
        j := generarAleatorio(0,9) // creas una j aleatoria entre 0 y 9
        SI matriz[i][j] != 'E' ENTONCES // si esa posicion aleatoria no tiene una E...
            matriz[i][j] = 'E' // se la pones
            posicionesGeneradas := posicionesGeneradas + 1 // e incrementas el numero de posiciones en las que ya has puesto una E
        FIN SI
    FIN MIENTRAS
FIN
De esta manera si se genera una i y una j aleatorias pero ya habías asignado una 'E' ahí, no cuenta entonces y vuelve a calcularlo otra vez hasta que tengas 3 posiciones de la matriz con una 'E'.

EDIT: Repito, lo que está escrito en pseudocódigo no funciona si lo copias y lo pegas tal cual. La función <generarAleatorio(0,4)> por ejemplo no existe en C. Es para que entiendas lo que tienes que hacer y luego lo hagas como se hace en C (que en este caso es usando <rand() % 5>.