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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Programa con Punteros en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Programa con Punteros en C  (Leído 3,059 veces)
jack09

Desconectado Desconectado

Mensajes: 4


Ver Perfil
[Ayuda] Programa con Punteros en C
« en: 16 Enero 2013, 13:26 pm »

Hola a todos:

Vereis llevo un par de dias comiendome la cabeza con los punteros y los arrays y no consigo sacar el codigo.

El problema en cuestion: Tengo un array bidimensional (una matriz) y apunto un puntero a un valor, yo lo que quiero es poder desplazar ese valor por la matriz pero no lo consigo. El movimiento tiene que hacerse de uno en uno. Es decir de una casilla en una casilla, no puede ir saltando.

Mi pregunta es: ¿Como puedo desplazar un puntero por un array bidimensional?

Este problema se plantea porque necesito hacer un programa que desplace un "robot" por una cerca y llegue hasta una carga y la absorba para despues llevarla a los almacenes que serian las esquinas de la matriz.

Hasta ahora tengo esto:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void mostrar(int m[3][3]) {
  5. int i, j;
  6.  
  7. for(i=0; i<3; i++){
  8. for(j=0; j<3; j++){
  9. printf("%d ", m[i][j]);
  10. }
  11. printf("\n");
  12. }
  13. printf("\n");
  14. }
  15.  
  16. int main () {
  17. int m[3][3] = {0, 2, 0, 0, 0, 0, 0, 0, 3};
  18. int *pC, *pR;
  19. int i, j;
  20.  
  21. mostrar(m);
  22.  
  23. for(i=0; i<3; i++){
  24. for(j=0; j<3; j++){
  25. if (m[i][j]==2){
  26. pC = &m[i][j];
  27. }
  28. if (m[i][j]==3){
  29. pR = &m[i][j];
  30. }
  31. }
  32. }
  33.  
  34. mostrar(m);
  35.  
  36. }
  37.  

Muchas gracias por adelantado.


« Última modificación: 16 Enero 2013, 21:53 pm por jack09 » En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: [Ayuda] Punteros y Arrays en C
« Respuesta #1 en: 16 Enero 2013, 15:07 pm »

Código
  1. int m[3][3] = {0, 2, 0, 0, 0, 0, 0, 0, 3};

Eso es una matriz unidimensional (aunque los arrays n-dimensionales se almacenen por filas) y no entiendo bien tu pregunta...

Simplemente sigue la aritmética de punteros como haces con los arrays unidimensionales.

Y en tu ejemplo recorres la matriz y cuando encuentras esos valores, asignas sus direcciones a los punteros.

Para recorrer una matriz bidimensional con un puntero...

Código
  1. int main () {
  2. int m[3][3] = { {0, 2, 0},
  3.                        {0, 0, 0},
  4.                        {0, 0, 3}};
  5. int *p;
  6. int i, j;
  7.  
  8. for(i=0; i<3; i++) {
  9.    p = m[i];
  10. for(j=0; j<3; j++){
  11. printf("%d", p[j]);
  12. }
  13. printf("\n");
  14. }
  15.  
  16. return 0;
  17.  
  18. }


En línea

Puede que desees aprender a programar desde 0: www.espascal.es
jack09

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Ayuda] Punteros y Arrays en C
« Respuesta #2 en: 16 Enero 2013, 18:02 pm »

Lo primero gracias por tu ayuda, he estado mirando el ejemplo que me has puesto y me has ayudado a comprender unas cosas que faltaban.

Lo segundo, tal vez no me he expresado bien al hacer la pregunta, lo que quiero hacer, o tengo en mente, es mover el 3 de la matriz de uno en uno hasta el dos y luego sumarselo de tal forma que al final me quede una matriz con todos ceros excepto en la posición del dos, que me quedara un cinco.
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [Ayuda] Punteros y Arrays en C
« Respuesta #3 en: 16 Enero 2013, 19:41 pm »

Pero el 3 esta en la ultima posicion de la matriz, cual seria el movimiento que queres hacer?? despues de encontrar el 3 que posicion seria la siguiente para el recorrido??

Saludos
En línea

Ahorrate una pregunta, lee el man
jack09

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Ayuda] Punteros y Arrays en C
« Respuesta #4 en: 16 Enero 2013, 19:53 pm »

Mi idea era que avanzase hacia arriba hasta llegar al dos y luego se lo "comiera" quedando un cinco solo en la matriz.
En línea

jack09

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Ayuda] Punteros y Arrays en C
« Respuesta #5 en: 16 Enero 2013, 21:52 pm »

Hola a todos:

Muchas gracias  los que lo habéis intentado, he estado toda la tarde y he podido resolver parte del código, os dejo lo dejo puesto para que lo veáis.

Ahora mi problema surge en otro punto, una vez que el robot llega al "2" no se lo come, si no que se pone a saltarlo de un lado a otro.

Cualquier ayuda sera bienvenida. Gracias a todos.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void mostrar(int m[3][3]) {
  5. int i, j;
  6.  
  7. for(i=0; i<3; i++){
  8. for(j=0; j<3; j++){
  9. printf("%d ", m[i][j]);
  10. }
  11. printf("\n");
  12. }
  13. printf("\n");
  14. }
  15. void buscar(int m[3][3], int *Xc, int *Yc, int *X1, int *Y1, int *X2, int *Y2, int *X3, int *Y3, int *X4, int *Y4){
  16. int i,j;
  17.  
  18. for(i=0; i<3; i++){
  19. for(j=0; j<3; j++){
  20. if (m[i][j]==2){
  21. *Xc = i;
  22. *Yc = j;
  23. }
  24. if (m[i][j]==3){
  25. *X1 = i+1;
  26. *Y1 = j;
  27. *X2 = i-1;
  28. *Y2 = j;
  29. *X3 = i;
  30. *Y3 = j+1;
  31. *X4 = i;
  32. *Y4 = j-1;
  33. }
  34. }
  35. }
  36.  
  37. }
  38. int calcularPasos(int Xc, int Yc, int X, int Y){
  39. int XT, YT, steps;
  40.  
  41. if (Xc>=X){
  42. XT = Xc-X;
  43. }else if(X>=Xc){
  44. XT = X-Xc;
  45. }
  46. if (Yc>=Y){
  47. YT = Yc-Y;
  48. }else if(Y>=Yc){
  49. YT = Y-Yc;
  50. }
  51. steps = XT+YT;
  52.  
  53. return steps;
  54. }
  55.  
  56. void movimientoTorre(int steps1, int steps2, int steps3, int steps4, int m[3][3]){
  57. int aux;
  58. int i, j;
  59. int *pCaux, *pRaux, *p1aux, *p2aux, *p3aux, *p4aux;
  60.  
  61. for(i=0; i<3; i++){
  62. for(j=0; j<3; j++){
  63. if (m[i][j]==2){
  64. pCaux = &m[i][j];
  65. }
  66. if (m[i][j]==3){
  67. pRaux = &m[i][j];
  68. p1aux = &m[i+1][j];
  69. p2aux = &m[i-1][j];
  70. p3aux = &m[i][j+1];
  71. p4aux = &m[i][j-1];
  72. }
  73. }
  74. }
  75.  
  76. if(steps1<=steps2 && steps1<=steps3 && steps1<=steps4){
  77. aux = *p1aux;
  78. *p1aux = *pRaux;
  79. *pRaux = aux;
  80. } else if(steps2<=steps1 && steps2<=steps3 && steps2<=steps4){
  81. aux = *p2aux;
  82. *p2aux = *pRaux;
  83. *pRaux = aux;
  84. } else if(steps3<=steps2 && steps3<=steps1 && steps3<=steps4){
  85. aux = *p3aux;
  86. *p3aux = *pRaux;
  87. *pRaux = aux;
  88. } else if(steps4<=steps2 && steps4<=steps3 && steps4<=steps1){
  89. aux = *p4aux;
  90. *p4aux = *pRaux;
  91. *pRaux = aux;
  92. }
  93.  
  94.  
  95. }
  96.  
  97. int main () {
  98. int m[3][3] = { {0, 2, 0},
  99. {0, 0, 0},
  100. {0, 0, 3}};
  101. int Xc, Yc, X1, Y1, X2, Y2, X3, Y3, X4, Y4;
  102. int steps1, steps2, steps3, steps4;
  103.  
  104. //INICIALIZACION
  105. mostrar(m);
  106.  
  107. //BUSCAR
  108. buscar(m, &Xc, &Yc, &X1, &Y1, &X2, &Y2, &X3, &Y3, &X4, &Y4);
  109.  
  110. //CALCULAR PASOS
  111. steps1 = calcularPasos(Xc, Yc, X1, Y1);
  112. steps2 = calcularPasos(Xc, Yc, X2, Y2);
  113. steps3 = calcularPasos(Xc, Yc, X3, Y3);
  114. steps4 = calcularPasos(Xc, Yc, X4, Y4);
  115.  
  116. //REALIZAR MOVIMIENTO
  117. movimientoTorre(steps1, steps2, steps3, steps4, m);
  118.  
  119. //MOSTRAR RESULTADO
  120. mostrar(m);
  121.  
  122. }


PD: edito el titulo del post para que no haya confusiones.
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [Ayuda] Punteros y Arrays en C
« Respuesta #6 en: 16 Enero 2013, 22:33 pm »

Mi idea era que avanzase hacia arriba hasta llegar al dos y luego se lo "comiera" quedando un cinco solo en la matriz.
Pues se lo come:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void mostrar(int m[3][3]) {
  5. int i, j;
  6.  
  7. for(i=0; i<3; i++){
  8. for(j=0; j<3; j++){
  9. printf("%d ", m[i][j]);
  10. }
  11. printf("\n");
  12. }
  13. printf("\n");
  14. }
  15.  
  16. int main () {
  17. int m[3][3] = {0, 2, 0, 0, 0, 0, 0, 0, 3};
  18.  int i, j,i_i,i_f,j_i,j_f;
  19.  
  20. for(i=0; i<3; i++){
  21. for(j=0; j<3; j++){
  22. if (m[i][j]==2){
  23.          i_f=i;j_f=j;
  24.      }
  25. if (m[i][j]==3){
  26.  i_i=i;j_i=j;
  27.      }
  28. }
  29. }
  30. mostrar(m);
  31.  while (i_i!=0){
  32.    if (i_i>i_f){
  33.    m[i_i-1][j_i]+=m[i_i][j_i];m[i_i][j_i]=0;i_i--;
  34.    mostrar(m);
  35.    }
  36.    /***** caso if (i_i<i_f)  ****/
  37.  }
  38.  while (j_i!=0){
  39.    if (j_i>j_f){
  40.    m[i_i][j_i-1]+=m[i_i][j_i];m[i_i][j_i]=0;j_i--;
  41.    mostrar(m);
  42.    }
  43.     /***** if (j_i<j_f)  ****/
  44.  }
  45.  return 0;
  46. }
  47.  
  48.  
Quedaría por implementar los dos casos que marco para hacerlo más general.
Saluditos!.
P.D: ¿Para qué querías los punteros?:
REEDITO:contestaban antes mientras escribía este post.
« Última modificación: 16 Enero 2013, 22:37 pm por leosansan » En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: [Ayuda] Programa con Punteros en C
« Respuesta #7 en: 20 Enero 2013, 02:01 am »

jack09, perdón por no leer el código pero estoy vago xD. Por otra parte la función buscar es una locura.

Ten en cuenta la siguiente frase: "Si algo es difícil es que está mal". Aunque parezca una tontería a mí me ayuda bastante xD.

Lo necesario para este ejercicio es conocer las coordenadas de 2 y 3. Luego podemos tener:

Código
  1. typedef struct {
  2. x,y:unsigned int; // matriz
  3. } Punto;
  4.  

Y tener p2 y p3 de tipo Punto. Buscar significa recorrer la matriz y si encontramos a 2, guardar las coordenadas en p2 y, por el contrario, si encontramos a 3, guardamos las coordenadas en p3:

// No es necesario pasar el tamaño de la segunda dimensión porque se infiere por el tipo int y la longitud de la dimensión 1.

Código
  1. void buscar (int m[3][], Punto *p2, *p3) {
  2.  
  3. int i,j;
  4.  
  5. for (i = 0; i < 3; i++)
  6. for (j = 0; j < 3; j++)
  7. if (m[i][j] == 2) {
  8. p2->x = i;
  9. p2->y = j;
  10. } else if (m[i][j] == 3) {
  11. p3->x = i;
  12. p3->y = j;
  13. }
  14. }
  15.  

Luego, para llegar de 3 a 2 simplemente hay que desplazar p3 hasta p2 teniendo en cuenta las filas y las columnas y que nos acercamos a p2 hasta encontrarnos con él. La primera componente de la matriz identifica a las filas de las mismas y la segunda a las columnas.

No he leído el código de leosansan pero creo que está bien.

¡Suerte!
« Última modificación: 20 Enero 2013, 02:04 am por BatchianoISpyxolo » En línea

Puede que desees aprender a programar desde 0: www.espascal.es
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda]con punteros en asm
ASM
ny0x 4 6,758 Último mensaje 12 Mayo 2009, 21:45 pm
por ny0x
Ayuda punteros. [c++]
Programación C/C++
ninto33 3 3,809 Último mensaje 19 Enero 2011, 01:46 am
por ninto33
Errores con programa (punteros)
Programación C/C++
jamatbar 0 1,361 Último mensaje 10 Diciembre 2011, 18:59 pm
por jamatbar
Error en programa de punteros
Programación C/C++
Error 404: 7 2,722 Último mensaje 24 Mayo 2013, 11:24 am
por leosansan
programa punteros c
Programación C/C++
chicainge 2 1,524 Último mensaje 6 Marzo 2015, 03:01 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines