Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/11/2013, 16:10
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: Poner ceros de forma aleatoria en una matriz

Antes de nada, indenta bien el codigo para que ves bien lo que estas haciendo; será mas fácil para ti y para quien pueda leerlo.

Una forma de resolverlo consiste en crear la matriz en memoria, un array de enteros a los que les asignas los valores que quieres, y al final lo vuelcas al archivo.

Primero declaras el tamaño de la matriz, de momento te lo pongo como defines, pero puees cambiarlo:

Código C:
Ver original
  1. #define MATRIZ_W 10
  2. #define MATRIZ_H 10
  3. #define MATRIZ_S (MATRIZ_W * MATRIZ_H)

Ahora vas dentro del main, declaras la propia matriz segun los tamaños definidos y reseteas a 0 todos los elementos:

Código C:
Ver original
  1. char matriz[MATRIZ_S];
  2. memset(matriz, '0', sizeof(matriz));

Ok, ahora tienes una matriz de 10x10 declarada de forma lineal donde todos los elementos valen 0. Te habras fijado en que declaro la matriz como lista de chars: todas las letras y los numeros textuales te caben en el tipo char.

Ahora viene la parte aleatoria. Te gustará saber la ecuacion de videojuego mas famosa (al menos antes lo era :) ) para acceder a una celda de una matriz linea identificada por una coordenada:

Código C:
Ver original
  1. celda = (anchura de la matriz * coordenada y) + coordenada x

Eso significa que si quieres acceder a la coordenada (4,2), en realidad tendras que acceder a la posicion (MATRIZ_W*2)+4 de la matriz lineal.

Sabiendo eso ya puedes comenzar a generar coordenadas aleatorias; una vez tienes la coordenada, primero te aseguras que contiene un 0 (significa que no ha sido modificada desde el reseteo inicial) y le asignas un 1 o una A, lo que convenga. La otra solucion consiste en crear una nueva matriz donde guardaras las coordenadas que ya has modificado para usarla como contraste para cada nueva celda que quieras modificar. En cualquier caso si quieres guardar 10 elementos de forma aleatoria significa que tendras que hacer 10 o mas ciclos. Para eso necesitas un bucle que solicite coordenadas aleatorias no modificadas hasta que hayas cumplido un total de 10 asignaciones correctas:

Código C:
Ver original
  1. int q, w, c, z;
  2.  
  3. z = 0;
  4. srand(time(0));
  5. while(z < 10) {
  6.     q = rand() % 10;
  7.     w = rand() % 10;
  8.     c = (MATRIZ_W * w) + q;
  9.  
  10.     if(matriz[c] == '0') {
  11.         matriz[c] = '1';
  12.         z++;
  13.     }
  14. }

Bien ahora ya tienes los '1' repartidos aleatoriamente por dentro de la matriz; solo te queda hacer lo mismo para guardar una 'a' en una coordenada aleatoria no modificada (es lo mismo, por eso no te pongo el codigo).

Y finalmente solo te queda volcarlo al archivo.

Saludos
vosk

Última edición por vosk; 09/11/2013 a las 16:15