Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: laura_55 en 19 Mayo 2014, 04:23 am



Título: Duda acerca de matriz en c++
Publicado por: laura_55 en 19 Mayo 2014, 04:23 am
Hola a todos mi nombre es Laura y soy nueva por aquí, espero que todos estén bien. Mi duda es la siguiente yo quiero crear una matriz con ciertos elementos. Luego de llenarla quiero poder un elemento de mi matriz posición por posición según lo que ingrese el usuario, sea norte, sur, este, oeste, para así ir acumulando un puntaje. Yo cree el siguiente código pero no me funciona y no se que estoy haciendo mal. Disculpen la molestias y entiendan que soy principiante por lo que debo de tener los errores mas estúpidos, solo les muestro el norte porque mi código esta hecho un desastre y es muy largo, y como siempre se repite lo mismo quiero saber que tengo mal y así poder arreglarlo en los demás. Gracias de antemano, y sean un poco pacientes todavía soy principiante.

Código
  1. #include <iostream>
  2. #include <string>
  3. char matriz[20][20];
  4. using namespace std;
  5. //----------------------------------------------------------------------
  6. float Puntaje(int x, int y){
  7. float Pts;
  8. if (matriz[x][y]=='$'){
  9. Pts=1.0;
  10. }else if (matriz[x][y]=='%'){
  11. Pts=1.5;
  12. }else if (matriz[x][y]=='&'){
  13. Pts=2.0;
  14. }
  15. return Pts;
  16. }
  17. //----------------------------------------------------------------------
  18. void Mover_posicion( int fil, int col, char matriz[][20]){
  19. bool estado=false;
  20. int i,j,c,pasos,x,y,l,m,Ac;
  21. string mov;
  22. do{
  23. for( i=0;i<fil;i++){
  24. for( j=0;j<col;j++){
  25. if(matriz[i][j]=='I'){
  26. x=i;
  27. y=j;
  28. }
  29. if(matriz[i][j]=='F'){
  30. l=i;
  31. m=j;
  32. }
  33. }
  34.    }
  35.    cin>>mov>>pasos;
  36.  
  37.    for(c=0;c<pasos;c++){
  38. if(mov=="N"){
  39.  
  40.    if((x-pasos) < 0){
  41. Ac=Ac + Puntaje(x,y);
  42.    if(matriz[x][y]==matriz[l][m]){
  43.  for (i = 0; i < fil; i++){
  44.        for ( j = 0; j < col; j++)
  45.           cout << matriz[i][j] << " ";
  46.        cout << endl;  
  47.    }
  48. }else{  
  49.         matriz[x][y] = matriz[x][y];
  50.            matriz[x][y] = '#';
  51.  
  52.             if(matriz[i][j]=='I'  && matriz[x][y]!='|'  ){
  53.  
  54. for (x = 0; x < fil; x++){
  55.        for ( y = 0; y < col; y++)
  56.           cout << matriz[x][y] << " ";
  57.           cout << endl;
  58.  
  59.         }
  60.         }else if(matriz[x--][y]!='|'){
  61.  
  62. for (i = 0; i < fil; i++)
  63.    {
  64.        for ( j = 0; j < col; j++)
  65.           cout << matriz[i][j] << " ";
  66.        cout << endl;  
  67.    }
  68.    }
  69. }
  70. }
  71. x--;
  72. }  
  73. }
  74. if(matriz[x][y]==matriz[l][m]){
  75. estado=true;
  76. }
  77.  
  78.  
  79.    }while(estado!=true);
  80.    cout<<"Ha llegado"<<"su acumulado es:"<<Ac<<endl;
  81. }
  82. //----------------------------------------------------------------------
  83. int main(){
  84. int fil,col,i,j;
  85.  
  86. cout<<"Ingrese filas y columnas"<<endl;
  87. cin>>fil>>col;
  88.  
  89. for( i=0;i<fil;i++){
  90. for( j=0;j<col;j++){          
  91. do{
  92.        cin >> matriz[i][j];
  93.  
  94. }while(matriz[i][j]!='I' && matriz[i][j]!='F' && matriz[i][j]!='$' && matriz[i][j]!='&' && matriz[i][j]!='|' && matriz[i][j]!='%');
  95. }
  96. }    
  97. Mover_posicion( fil, col, matriz);
  98. }


Título: Re: Duda acerca de matriz en c++
Publicado por: Blaster en 19 Mayo 2014, 05:29 am
Mi duda es la siguiente yo quiero crear una matriz con ciertos elementos. Luego de llenarla quiero poder un elemento de mi matriz posición por posición según lo que ingrese el usuario, sea norte, sur, este, oeste, para así ir acumulando un puntaje.

Podrias explicar de forma mas clara que es lo que quieres hacer exactamente; la función Mover_posicion carece totalmente de consistencia que intentas hacer con ella

Saludos 


Título: Re: Duda acerca de matriz en c++
Publicado por: laura_55 en 19 Mayo 2014, 05:53 am
lo siento si no se entiende, estoy comenzando. Lo que yo intente hacer fue que según la coordenada que ingrese es el usuario (norte, sur, este, oeste) se mueva el carácter
I tantas veces como lo indico el usuario. Ej si el usuario ingresa N 2, el carácter debería moverse nos espacios al norte y en su camino ir colocando el #. Yo trate de colocar el x-- para que fuera de posición en posición y así poder ir acumulando los puntos que hace la acción puntaje. Cambien le coloque un do while para que se saliera cuando la posición de I fuera igual  a F, se saliera y me escribiera el mensaje de ha llegado y de cuanto es mi acumulado. Lo siento si mi código es un desastre solo que parece que las matrices y yo no nos llevamos. No se, si estoy responde a tu pregunta


Título: Re: Duda acerca de matriz en c++
Publicado por: vangodp en 19 Mayo 2014, 06:32 am
http://foro.elhacker.net/programacion_cc/ayuda_con_programa_urgente-t404470.0.html
Voy a echar un ojo y después pongo algo que valga, aquí te dejo este enlace para que veas unos ejemplos muy buenos, porque así con prisa me ha salido to mal.  :-(



Título: Re: Duda acerca de matriz en c++
Publicado por: Blaster en 19 Mayo 2014, 19:08 pm
Lo que yo intente hacer fue que según la coordenada que ingrese es el usuario (norte, sur, este, oeste) se mueva el carácter I tantas veces como lo indico el usuario. Ej si el usuario ingresa N 2, el carácter debería moverse nos espacios al norte y en su camino ir colocando el #.

Te dejo un sencillo codigo que hace exactamente lo que pides, que es mover un elemento de la matriz hacia arriba la cantidad de posiciones que el usuario indique y rellenar el hueco dejado con '#'

Código
  1. if (mov == 'N' && x-pasos >= 0){
  2.   matriz[x-pasos][y] = matriz[x][y];
  3.  for (i = 0;  i < pasos; i++ )
  4.      matriz[x-i][y] = '#';
  5.   }

Yo trate de colocar el x-- para que fuera de posición en posición y así poder ir acumulando los puntos que hace la acción puntaje. Cambien le coloque un do while para que se saliera cuando la posición de I fuera igual  a F, se saliera y me escribiera el mensaje de ha llegado y de cuanto es mi acumulado.

Que quieres hacer con estos caracteres I F  $  &  | % y con la condición de do while no entiendo a que quieres llegar

Saludos


Título: Re: Duda acerca de matriz en c++
Publicado por: laura_55 en 20 Mayo 2014, 02:10 am
Bueno con el do while del int main lo que quiero es que el usuario llene la matriz solo con los caracteres  I F  $  &  | % . Y el do while de la acción mover posición lo que hace es que cuanto la posición donde esta el carácter I es igual a F mi variable estado se vuelve verdad por lo que se sale y me imprime el mensaje ha llegado con el acumulado de los puntos de las posiciones por donde paso el carácter I. No se, si eso responde a tu pregunta, pero eso es lo que intento hacer y gracias por tratar de ayudarme a todos.


Título: Re: Duda acerca de matriz en c++
Publicado por: eferion en 20 Mayo 2014, 09:19 am
... lo que hace es que cuanto la posición donde esta el carácter I es igual a F mi variable estado se vuelve verdad ...

Posición del carácter I igual a F ????

¿¿¿???

Perdón por el comentario, pero te explicas como un libro cerrado


Título: Re: Duda acerca de matriz en c++
Publicado por: laura_55 en 20 Mayo 2014, 11:59 am
si, lo siento de verdad trata de explicar lo mejor que puedo pero las palabras no salen como debería. Lo que trato de decir es que a medida que mi carácter va subiendo y en el numero de pasos que indico llega al caracter F, es decir,  la posición  del carácter I pasa a ser la misma que el F. El se sale y no pide mas paso, para eso es el do while. Espero que me entienda, ya se que no debo ser profesora explico pésimo.


Título: Re: Duda acerca de matriz en c++
Publicado por: eferion en 20 Mayo 2014, 12:06 pm
A ver si me entero.

* Tienes una matriz con valores determinados, entre ellos al menos una I y una F.

* Se elige una I y se le van pidiendo al usuario una serie de pasos. Cada paso desplaza I por la matriz.

* Si en uno de los pasos resulta que I va a estar ubicada en la posición donde se encuentra una F el programa deja de pedir más pasos

¿Es así?

Si estoy en lo cierto, tengo algunas dudas:

* Solo hay una I y una F o puede haber varias de cada una??

* Si se desplaza I por la matriz... que valor se pone en el espacio que queda vacío? Si I está en (1,0) y se mueve a (2,0), qué valor se pone en (1,0)??

Si no estoy en lo cierto, deberías replantearte un pequeño esfuerzo adicional para que se entienda el problema.

Un saludo.


Título: Re: Duda acerca de matriz en c++
Publicado por: laura_55 en 20 Mayo 2014, 12:35 pm
 En cuanto a tus preguntas:
*El usuario solo va a ingresar una I y una F.
*Cuando se mueve se le coloca a la posición anterior el carácter #.
Y de verdad discúlpenme si no se entiende lo que trato de explicar.


Título: Re: Duda acerca de matriz en c++
Publicado por: eferion en 20 Mayo 2014, 13:41 pm
Varias cosas:

* Tabula el código... es imposible leer un código que no está correctamente tabulado.

* Pon nombres con sentido a las variables. 'fil' y 'col' dan a entender que son índices para la fila y la columna... cuando realmente están indicando el total de filas y columnas... nuevamente lo que prima aquí es que el código sea lo más legible posible para evitar problemas.

* No uses variables globales, no sucede en este caso concreto, pero dan problemas. Es mejor pasar la matriz como parámetro.

* Cúrrate un poquito la interfaz de usuario. El sistema para rellenar la matriz es espantoso... si pones un carácter no válido no te avisa, no sabes qué está pasando... poner mensajes de error ante entradas incorrectas te ayuda a ver también que el programa hace lo que debe... si no pones mensajes no sabes si se está tragando información incorrecta.

Respecto a este punto... cómo sabes cuándo has dejado de rellenar la matriz y el programa te está pidiendo los movimientos?? sencillamente, con tu código, es imposible saberlo.

Queda más bonito algo del tipo:

Código
  1. const int FILAS = 20;
  2. const int COLS = 20;
  3.  
  4. // ...
  5.  
  6. int main( )
  7. {
  8.  int num_filas, num_columnas;
  9.  
  10.  do
  11.  {
  12.    cout << "Numero de filas: ";
  13.    cin >> num_filas;
  14.    if ( num_filas < 1 || num_filas > FILAS )
  15.      cout << "Valor incorrecto." << endl;
  16.  } while ( num_filas < 1 || num_filas > FILAS );
  17.  
  18.  do
  19.  {
  20.    cout << "Numero de columnas: ";
  21.    cin >> num_columnas;
  22.    if ( num_columnas < 1 || num_columnas > COLS )
  23.      cout << "Valor incorrecto." << endl;
  24.  } while ( num_columnas < 1 || num_columnas > COLS );
  25.  
  26.  // ...
  27. }

Es más código pero si algo funciona mal puedes ver qué es simplemente "jugando" con tu aplicación.

* Procura reducir el ámbito de las variables al mínimo posible:

Código
  1. int i,j,c,pasos,x,y,l,m,Ac;

Tienes esta línea al inicio de 'Mover_posicion'. No es necesario... si vas a usar un índice en un for puedes declarar la variable dentro del for:

Código
  1. for ( int i=0; i < 20; i++ )
  2. {
  3. }

Reutilizar variables dentro de una misma función es algo que hay que realizar con sumo cuidado para evitar meteduras de pata.

* Reutiliza código. Usas en varios puntos, por ejemplo, el código que imprime la matriz en pantalla. Saca ese código a una función y evita duplicarlo... por un lado, si ese código tiene errores, solo tendrás que corregirlos en un sitio, por otro, todas las invocaciones funcionarán igual.

Código
  1. void PintaMatriz( char matriz[][COLS], int filas, int columnas )
  2. {
  3.  for ( int i = 0; i < filas; i++)
  4.  {
  5.    for ( int j = 0; j < columnas ; j++)
  6.      cout << matriz[i][j] << " ";
  7.    cout << endl;
  8.  }
  9. }

* Cuidado con las asignaciones. La siguiente instrucción de tu programa no hace nada. ¿Metedura de pata o despiste?

Código
  1. matriz[x][y] = matriz[x][y];

* Controla el rango de valores de las variables:

Código
  1.  cout<<"Ingrese filas y columnas"<<endl;
  2.  cin>>fil>>col;

¿Qué sucede si pongo 1000 y 244? Que el programa fallará al intentar escribir fuera de la matriz de 20x20 que has definido.

* Inicializa las variables:

Código
  1.  int c,pasos,x,y,l,m,Ac;
  2.  
  3.  // ...
  4.  Ac=Ac + Puntaje(x,y); // Que valor tiene Ac aqui???

Código
  1. float Puntaje(int x, int y)
  2. {
  3.  float Pts;
  4.  if (matriz[x][y]=='$')
  5.    Pts=1.0;
  6.  else if (matriz[x][y]=='%')
  7.    Pts=1.5;
  8.  else if (matriz[x][y]=='&')
  9.    Pts=2.0;
  10.  
  11.  return Pts; // Cuantos puntos vale '|' ??
  12. }

* No tienes ningún chequeo que impida introducir varios 'I' o 'F' así como tampoco compruebas que, obligatoriamente, se haya introducido una 'I' y una 'F' en la matriz.

* No compruebas que con 'pasos' te puedas salir de la matriz.

Tienes bastantes fallos en la aplicación. Te he indicado un poco lo que he ido viendo.

Dale un repaso al código, corrige las cosillas y seguimos revisando.