elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?  (Leído 15,977 veces)
xuhipoint

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« en: 8 Marzo 2014, 04:43 am »

Buenas noches mi nombre es Maria y soy nueva en este foro y en el mundo de la programación, así que discúlpenme si comento algún error. Tengo un problema con mi matriz dinámica, necesito crear un buscaminas pero primero debe crear una matriz dinámica, ya que el usuario va a crear la matriz aleatoriamente, luego el usuario debe ingresar unas coordenadas donde se debe colocar una mina "*". Lo que no se es como hacer para que en la coordenada que ingrese el usuario se coloque la mina, lo que he creado hasta el momento es este código (también me restringen a las librerías iostream y string:
#include<iostream>
#include<string>
using namespace std;

int main()
{
int i,j,matriz;


cin>>matriz;

// creamos la matriz !
double **M = new double* [matriz];
for (i = 0; i < matriz; i++)
M = new double[matriz];

//mostrar matriz
for (i = 0; i < matriz; i++)
{
for (j = 0; j < matriz; j++)
cout << M[j] << " ";
cout << endl;
}
delete [] M;

return 0;
}


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #1 en: 8 Marzo 2014, 05:35 am »

Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

* Lo primero que debes hacer es cambiar el tipo de los elementos de la matriz de double a char ya que en ella almacenaras caracteres.

* Debes liberar primero todas las filas y solo entonces el bloque principal.

* Para almacenar un carácter solo tienes que verificar que los indices sean validos y a continuación utilizar el operador de asignación "M[ f ][ c ] = algun_valor".

Mas o menos así:
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.   int matriz;
  8.   cin >> matriz;
  9.  
  10.   // creamos la matriz !
  11.   char **M = new char *[matriz];
  12.   for (int i = 0; i != matriz; i++)
  13.      M[i] = new char [matriz];
  14.  
  15.   // Asignacion, solo un ejemplo
  16.   for (int i = 0; i != matriz; i++)
  17.      for (int j = 0; j != matriz; j++)
  18.         M[i][j] = '*';
  19.  
  20.   //mostrar matriz
  21.   for (int i = 0; i != matriz; i++){
  22.      for (int j = 0; j != matriz; j++)
  23.         cout << " " << M[i][j];
  24.  
  25.      cout << endl;
  26.   }
  27.  
  28.   for (int i = 0; i != matriz; i++)
  29.      delete[] M[i];
  30.   delete[] M;
  31.  
  32.   return 0;
  33. }

Y si estas aprendiendo C++ puedes utilizar las clases vector y string para implementar la matriz.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
xuhipoint

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #2 en: 8 Marzo 2014, 12:54 pm »

Pero si cambio la matriz a char que pasara con los numeros, porque en una cordenada especifica es donde se debe asignar el asterisco. Y gracias por responder
En línea

xaps

Desconectado Desconectado

Mensajes: 157



Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #3 en: 8 Marzo 2014, 13:59 pm »

Pero si cambio la matriz a char que pasara con los números, porque en una cordenada especifica es donde se debe asignar el asterisco. Y gracias por responder
En una matriz de char puedes almacenar cualquier carácter que exista en la tabla ASCII, por lo tanto también puedes almacenar caracteres numéricos.

Saludos
En línea

"The programmers of tomorrow are the wizards of the future" - Gave Newel
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #4 en: 8 Marzo 2014, 15:41 pm »


Pero si cambio la matriz a char que pasara con los numeros, porque en una cordenada especifica es donde se debe asignar el asterisco. Y gracias por responder


Como te indicó xaps ello no representa mayor problema.

Para que tengas una variante he usado la matriz "cont" como int, así tienes otra variante.

Todo está en saber "jugar" entre char y entero, sumando o restando '0' o su equivalente ascii 48. Te dejo las dos formas para que lo veas.

He aquí una muestra con la matriz donde se han introducido las minas, otra con las sumas de los que le rodean y otra en que me he permitido la licencia de "ocultar" determinadas posiciones. Vamos lo que es el juego del buscaminas:



Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <time.h>
  4.  
  5. using namespace std;
  6.  
  7. void imprimir (char **Matriz,int dim);
  8. void colocar_minas (char **Matriz,int dim);
  9. void borrar (int **M,int dim);
  10. void borrar_char (char **M,int dim);
  11.  
  12. int main(void) {
  13.  srand((unsigned) time(NULL));
  14.  int dim,n;
  15.  char ch=219;
  16.  
  17.  cout << "Introduzca la dimension de la matriz: ";
  18.  cin >> dim;
  19.  char **Matriz = new char *[dim];
  20.  for (int j = 0; j < dim; j++)
  21.    Matriz[j] = new char [dim];
  22.  for (int i = 0; i < dim; i++)
  23.    for (int j = 0; j < dim; j++)
  24.      Matriz[i][j]='0';
  25.  colocar_minas  (Matriz,dim);
  26.  imprimir (Matriz,dim);
  27.  
  28.  for (int i = 0; i < dim; i++)
  29.    for (int j = 0; j < dim; j++){
  30.      n = rand() % 5 ;
  31.      if (n<2 && Matriz[i][j]=='0')
  32.        Matriz[i][j]=ch;
  33.      else if (n==2 || n==3)
  34.        Matriz[i][j]='*';
  35.    }
  36.  imprimir (Matriz,dim);
  37.  
  38.  borrar_char (Matriz,dim);
  39.  return EXIT_SUCCESS;
  40. }
  41.  
  42. void imprimir (char **Matriz,int dim) {
  43.    for (int i = 0; i < dim; i++) {
  44.      cout << "\t\t" ;
  45.      for (int j = 0; j < dim; j++){
  46.        cout << ' '  << Matriz[i][j] << ' ' ;
  47.      }
  48.      cout << "\n\n";
  49.    }
  50.    cout << "\n\n";
  51. }
  52.  
  53.  
  54. void colocar_minas (char **Matriz,int dim){
  55.  int **cont;
  56.  cont = new int *[dim];
  57.  for (int j = 0; j < dim; j++)
  58.    cont[j] = new int [dim];
  59.  for (int i = 0; i < dim; i++)
  60.    for (int j = 0; j < dim; j++)
  61.      cont[i][j]=0;
  62.  int numero,fil,col,k,l,contador=0;
  63.  cout << "\nIntroduzca numero de minas (numero):";
  64.  cin >> numero;
  65.  for (int i = 0; i < numero; i++){
  66.    cout << "\nColocando la mina : "<<i+1<<endl;
  67.    do{
  68.      cout << "Introduzca fila (1-numero): ";
  69.      cin >> fil;
  70.    }while(fil<1 || fil>dim);
  71.    fil=fil-1;
  72.  
  73.    do{
  74.      cout << "Introduzca columna (1-numero): ";
  75.      cin >> col;
  76.    }while(col<1 || col>dim);
  77.    col=col-1;
  78.    Matriz[fil][col]='1';
  79.    cout<<"\tM["<<fil+1<<","<<col+1<<"]="<<Matriz[fil][col]<< "\n\n";
  80.  }
  81.  imprimir (Matriz,dim);
  82.  
  83.  for ( fil = 0 ;fil < dim; fil++) {
  84.    for ( col = 0; col < dim; col++){
  85.    contador=0;
  86.      for ( k = -1; k < 2; k++) {
  87.        for ( l = -1; l < 2; l++){
  88.          if (fil+k < 0 || col+l < 0 || fil+k > dim-1 || col+l > dim-1)
  89.            continue;
  90.          else{
  91.            contador+=(Matriz[fil+k][col+l]-'0');
  92.          }
  93.        }
  94.      }
  95.      cont[fil][col]=contador;
  96.    }
  97.  }
  98.  for ( fil = 0 ;fil < dim; fil++)
  99.    for ( col = 0; col < dim; col++)
  100.      Matriz[fil][col]=cont[fil][col]+48;
  101.  borrar (cont,dim);
  102. }
  103.  
  104. void borrar_char (char **M,int dim) {
  105.  for (int i = 0; i < dim; i++)
  106.    delete[] M[i];
  107.  delete[] M;
  108. }
  109.  
  110. void borrar (int **M,int dim) {
  111.  for (int i = 0; i < dim; i++)
  112.    delete[] M[i];
  113.  delete[] M;
  114. }

Y, como ya te comentarom,  para cuando postees el código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.


¡¡¡¡ Saluditos! ..... !!!!


« Última modificación: 8 Marzo 2014, 15:43 pm por leosansan » En línea

xuhipoint

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #5 en: 8 Marzo 2014, 23:57 pm »

Hola soy yo, otra vez, de verdad disculpenme si soy un poco ignorante es solo que soy de Venezuela y mi pais no vive un buen momento, por lo que se me ha dificultado ir a la universidad y recien estoy aprendiendo. Tengo este proyecto y lo poco que he aprendido ha sido por youtube o libros, asi que tenganme un poquito de paciencia si no entiendo. Hasta el momento he hecho este codigo pero en vez de pedirme solo una coordenada, me las pide toda y no me sale los ceros y los asteriscos sino solo astericos. Este es el codigo que hice hasta el momento, quizas ustedes puedan ver en que me he equivocado. Y MUCHAS GRACIAS A TODOS LOS QUE ME HAN RESPONDIDO ME HAN AYUDADO A AVANZAR UN POCO MAS EN MI PROYECTO.
En línea

xuhipoint

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #6 en: 8 Marzo 2014, 23:58 pm »

Código
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.   int matriz,bomba='*',valor;
  8.   cin >> matriz;
  9.  
  10.   // creamos la matriz !
  11.   char **M = new char *[matriz];
  12.   for (int i = 0; i != matriz; i++)
  13.      M[i] = new char [matriz];
  14.  
  15.  
  16.   for (int i = 0; i != matriz; i++){
  17.      for (int j = 0; j != matriz; j++)
  18.         M[i][j] = '0';
  19.  
  20.         for (int a=0; a<matriz; a++)
  21. {
  22.    for (int b=0; b<matriz; b++)
  23.    {
  24.        cout << endl << "Posicion [ " << a << " ] [ " << b << " ]" << endl;
  25.        cout <<  "Ingrese un valor : ";
  26.        cin >> valor;
  27.        M[a][b] = bomba;
  28.    }
  29. }
  30.  
  31.   //mostrar matriz
  32.   for (int i = 0; i != matriz; i++){
  33.      for (int j = 0; j != matriz; j++)
  34.         cout << " " << M[i][j];
  35.  
  36.      cout << endl;
  37.   }
  38. }
  39.   for (int i = 0; i != matriz; i++)
  40.      delete[] M[i];
  41.   delete[] M;
  42.  
  43.   return 0;
  44. }
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #7 en: 9 Marzo 2014, 04:14 am »


Tienes mal la introducción de los puntos.Tienes que"captar" las coordenadas a y b donde colocas las bombas, no darle valor a M[a] ya que sabes que es '*'.

Algo parecido a lo que te propuse en mi código:


Código
  1. ................
  2. cout << "\nIntroduzca numero de minas (numero):";
  3.  cin >> numero;
  4.  for (int i = 0; i < numero; i++){
  5.    cout << "\nColocando la mina : "<<i+1<<endl;
  6.    do{
  7.      cout << "Introduzca fila (1-numero): ";
  8.      cin >> fil;
  9.    }while(fil<1 || fil>dim);
  10.    fil=fil-1;
  11.  
  12.    do{
  13.      cout << "Introduzca columna (1-numero): ";
  14.      cin >> col;
  15.    }while(col<1 || col>dim);
  16.    col=col-1;
  17.    Matriz[fil][col]='*';
  18.    cout<<"\tM["<<fil+1<<","<<col+1<<"]="<<Matriz[fil][col]<< "\n\n";
  19. ...............................................
  20.  

donde fil=a y col=b. Ya sabes que Matriz[fil][col]='*'.



¡¡¡¡ Saluditos! ..... !!!!



En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #8 en: 9 Marzo 2014, 21:27 pm »

Hola María. Compatriota!!!, entiendo tu situación pues también soy de Vzla y es triste la situación que vivimos. Los poderosos explotando a los débiles  >:(, no importa el lado político en que se midan.

Ok, vamos por partes. Una primera recomendación sería declarar las variables contador i, j al principio del main(), y no dentro de cada ciclo. Así:

int i, j;

y de este modo ya puedes escribir

for (i = 0; i < dim; i++)

sin tener que poner "int" dentro del for. Me tomé el atrevimiento de cambiar el nombre "matriz" por "dim" porque me pareció más acorde con el significado o intención de esa variable, que es representar la dimensión de la matriz.

En esta primera parte del programa pides al usuario el tamaño o dimensión del tablero, y luego creas la matriz dinámicamente. Al principio la matriz se rellena toda con ceros, luego el programa te va pidiendo que le indiques dónde van las minas. Le indicas un '1' para decir que hay una mina en la posición indicada, o un '0' para decir que no hay mina.

Ahora creo que señalaste el problema de que es muy fastidioso preguntar por todas las casilla si sólo van 2 ó 3 bombas. Primero recuerda que el programa te tiene que pedir todas las coordenadas, ya que las minas podrían en cualquier parte. Sin embargo, si terminaste de declarar las minas antes de recorrer toda la matriz, introduce un 'x' ó un 'q' para terminar el ciclo. Eso se hace con la parte:

else if ( c == 'q' || c == 'Q' || c == 'x' || c == 'Q' )
   listo = 1;

La otra forma de trabajar sería que el programa no te pregunte por todas y cada de una de las casillas sino que te pida coordenada i, coordenada j, y valor. Ahora, yo creo que esta segunda opción sería incluso más fastidiosa (!?).

Otra manera más sería que el programa rellenara las minas aleatoriamente, también podemos hacerlo así, depende de los requerimientos de diseño, de cómo lo quieres hacer y si profesor ha puesto alguna clase de límites o condiciones.

La siguiente parte del código es donde se imprime la matriz, indicando con '*' donde hay bomba, y '0' donde no hay.

Ahora, por otra parte el programa de leosansan está muy completo, aunque no se si lo has leído, si quieres basarte en él, o si lo pudiste entender.

Unas preguntas o comentarios:
  • ¿Trabajas en Windows o Linux?
  • ¿Te permiten usar getch()?
  • Si es en Windows, ¿te permiten usar la biblioteca conio?
  • ¿Se puede usar simplemente C en lugar de C++? Me parece que la complejidad del programa no exige C++ (no lleva clases)
  • Finalmente quiero comentar que para mí la matriz puede ser de char, o de int, indistintamente. Al fin y al cabo almacena números (ceros o unos).

Aquí el código de la primera parte, que es simplemente la correción de unos pequeños detalles del que hiciste:
Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.   int dim, bomba='*', valor;
  9.   int i, j;      /* <-- declara aqui, no dentro del ciclo */
  10.   char c;
  11.   char listo;
  12.  
  13.   cout << time(NULL);
  14.   return 0;
  15.  
  16.   cout << "Tamano de la matriz: ";
  17.   cin >> dim;
  18.   cout << endl;
  19.  
  20.   /* creamos la matriz, y rellenamos con ceros */
  21.   char **M = new char *[dim];
  22.   for (i = 0; i != dim; i++)
  23.      M[i] = new char [dim];
  24.  
  25.   for (i = 0; i < dim; i++)
  26.      for (j = 0; j < dim; j++)
  27.         M[i][j] = '0';
  28.  
  29.   /* poniendo posiciones de las minas */
  30.   listo = 0;
  31.   for (i = 0; i < dim && listo == 0; i++) {
  32.      for (j = 0; j < dim && listo == 0; j++) {
  33.         cout << endl << "Posicion [ " << i << " ] [ " << j << " ]: ";
  34.         cin >> c;
  35.         if ( c == '1' )
  36.            M[i][j] = '1';
  37.         else if ( c == 'q' || c == 'Q' || c == 'x' || c == 'Q' )
  38.            listo = 1;
  39.      }
  40.   }
  41.  
  42.   // mostrar matriz
  43.   cout << endl << "La matriz es:" << endl;
  44.   for (i = 0; i != dim; i++) {
  45.      for (j = 0; j != dim; j++)
  46.         if ( M[i][j] == '1')
  47.            cout << "*\t";
  48.         else
  49.            cout << "0\t";
  50.      cout << endl;
  51.   }
  52.  
  53.   // destruye la matriz
  54.   for (i = 0; i != dim; i++)
  55.     delete[] M[i];
  56.   delete[] M;
  57.  
  58.   return 0;
  59. }
« Última modificación: 9 Marzo 2014, 23:17 pm por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?
« Respuesta #9 en: 9 Marzo 2014, 22:35 pm »

Hola María. Compatriota!!!, entiendo tu situación pues también soy de Vzla y es triste la situación que vivimos. Los poderosos explotando a los débiles  >:(, no importa el lado político en que se midan.


Soy CANARION, o sea de GRAN CANARIA, hermanos de ustedes los venezolanos.

Para empezar, prefiero personalmente usar la asignación dinámica de memoria para otras situaciones y usar, como en este caso, arrrays de longitud variable. Yo en este caso usaría:


Código
  1. ..........................
  2. /* creamos la matriz, y rellenamos con ceros */
  3. char M[dim][dim];
  4. for (i = 0; i < dim; i++)
  5. for (j = 0; j < dim; j++)
  6. M[i][j] = '0';
  7. ................................
  8.  

Y me dejaría de tantas historias, asignación, borrado de memoria.......

Pero, sólo un pero, busca "buscaminas" en google y así entenderás el por qué de mi código, lo de las bombas y demás.


¡¡¡¡ Saluditos! ..... !!!!


En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con Clickear en coordenadas especificas VB6
Programación Visual Basic
revenge1252 1 2,990 Último mensaje 10 Julio 2010, 20:08 pm
por BlackZeroX
Memoria dinamica matriz
Programación C/C++
programacion_c 1 1,841 Último mensaje 25 Abril 2012, 00:23 am
por david_BS
[BATCH] ¿Cómo ubicar la ventana en coordenadas específicas?
Scripting
cyberalejo17 4 7,621 Último mensaje 27 Abril 2014, 05:08 am
por cyberalejo17
Coordenadas de Matriz en Console C++
Programación C/C++
BrendiisFox 1 2,315 Último mensaje 30 Julio 2015, 09:05 am
por joecarl
Como imprimir coordenadas de una matriz???
.NET (C#, VB.NET, ASP)
omar_tijoux 0 2,186 Último mensaje 26 Octubre 2016, 03:12 am
por omar_tijoux
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines