Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Poner ceros de forma aleatoria en una matriz

Estas en el tema de Poner ceros de forma aleatoria en una matriz en el foro de C/C++ en Foros del Web. Bien el ejercicio consiste en tener una matriz 10x10 . En esta matriz tiene que haber colocados diez (1) de forma aleatoria y una (A) ...
  #1 (permalink)  
Antiguo 09/11/2013, 08:32
 
Fecha de Ingreso: noviembre-2013
Mensajes: 1
Antigüedad: 10 años, 5 meses
Puntos: 0
Poner ceros de forma aleatoria en una matriz

Bien el ejercicio consiste en tener una matriz 10x10 . En esta matriz tiene que haber colocados diez (1) de forma aleatoria y una (A) de forma aleatoria tambien,
El codigo es de la matriz ya hecha pero no consigo poner los 0 de forma correcta ni la A alguna ayuda??


#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE*fichero;
fichero = fopen("ejemplo1.txt", "w");
int num;
num=rand()%1;
int i,j;
for (i=0;i<=10;i++)
{
for(j=0;j<=10;j++)
{
fprintf(fichero,"%d ",rand()%100<10);
}
fprintf(fichero,"\n");
}

fclose(fichero);
system("Pause");
}
  #2 (permalink)  
Antiguo 09/11/2013, 16:10
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 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

Etiquetas: aleatoria, forma, int, matriz
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:17.