| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
rodowushu
Registrado: 09 May 2011 Mensajes: 18
| Publicado: 17/01/2012 7:21 pm | | | Título: Ayuda con matrices, ingresada una coordenada mostrarla |
| Hola comunidad!, tengo una consulta, resulta q tengo el siguiente ejercicio: Generar una matriz de 4x8. Permitir al usuario ingresar una coordenada valida. Luego rellenar esa celda y las que le rodean con "X" y el resto con "." ejemplo: col 0 col1 col2 col3 col4 col5 col6 col7 Fila 0: . . x x x . . . Fila1: . . x x x . . . Fila2: . . x x x . . . Fila3: . . . . . . . .
Tengo q hacerlo aplicando funciones, pero antes queria probarlo asi.
Como podria mejorarlo?, mi problema es q la X se genera en todas las filas. y no se como hacer para q me salgan solamente al rededor de la coord.
el codigo es el siguiente:
| Código: | #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char mat[4][8]; int i,j,n,m; printf("Ingrese una fila entre 0 y 3, y una columna entre 0 y 7\n"); scanf("%d %d",&m,&n); while(m>3 || m<0 || n>7 || n<0){ printf("Fuera de Rango, ingresa de nuevo\n"); scanf("%d %d",&m,&n); } for(i=0; i<4; i++){ if(i==m){ printf("fila: %d = .\n",i); } else{ printf("fila: %d = .\n",i); } for(j=0; j<8; j++){ if(j==n || j==n+1 || j==n-1){ mat[m][n] = 'X'; printf("col: %d = %c\n",j,mat[m][n]); } else{ printf("col: %d = .\n",j); } } } system("PAUSE"); return 0; }
|
je creo q tmb esta algo "tramposo" y ese es el problema jaja
Les mando un saludo gracias! |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 6586 Ubicación: Mexico
| Publicado: 18/01/2012 4:37 am | | | Título: |
| Lo primero que debes hacer es cambiar la definición de la función principal a "int main(void) ..." ya que tu programa no procesa (mediante "argc" y "argv") los argumentos pasados mediante linea de comandos.
También se debe eliminar la llamada a función 'system("pause")' a menos que se este utilizando uno de los pocos IDEs que no incluyen pausa de forma automática como Dev-C++. Pero en ese caso lo mejor es cambiar a otro entorno ya que ese "problema" lo es del IDE, no del programa.
Un detalle importante es que no necesitas del array ya que lo único que haces con los valores (los caracteres 'X' y '.') es imprimirlos.
En cuanto al programa la forma mas fácil es procesando cada celda de la matriz mediante dos bucles. En cada iteración del bucle interno verificas si la diferencia entre la celda procesada y la indicada por el usuario es igual o menor que uno (tanto en fila como columna, eso es lo que falta en tu programa). Si es así imprimes una 'X', caso contrario un '.'.
Un ejemplo de ello es (C estándar):
| Código: | #include <stdio.h> #include <stdlib.h>
#define NUM_FILAS 4 #define NUM_COLS 8
int main(void) { int a; int b; int i; int j; while (1){ puts("Ingresa la fila y columna:"); scanf("%d %d",&a, &b); if (a >= 0 && a < NUM_FILAS && b >= 0 && b < NUM_COLS) break; else puts("Fuera de Rango!"); } for (i = 0; i < NUM_FILAS; i++){ printf("Fila %2d: ", i); for (j = 0; j < NUM_COLS; j++) if (abs(i - a) <= 1 && abs(j - b) <= 1) putchar('x'); else putchar('.'); putchar('\n'); } return EXIT_SUCCESS; } |
Un saludo _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | Volver arriba | |  | rodowushu
Registrado: 09 May 2011 Mensajes: 18
| Publicado: 18/01/2012 9:11 am | | | Título: |
| muchas gracias! por tu respuesta, antes de seguir te quiero aclarar algo.
1º)Si estoy usando el Dev-C++, es por eso que al final lleva la funcion y tmb
| Código: | int main(int argc, char *argv[])
|
que viene con el programa cuando lo abris y de vago no los cambio, segun yo, no le hace nada al programa je, nose le hara o no.
2º) Si lo habia pensado asi como lo hiciste salvo sin el array, pero justamente tenemos q manejar array bidimensionales es por eso q lo hice.
hay 2 cosas q no entiendo.
1). q hace este codigo?
| Código: | [code]while (1)[/code]{ puts("Ingresa la fila y columna:"); scanf("%d %d",&a, &b); if (a >= 0 && a < NUM_FILAS && b >= 0 && b < NUM_COLS) break; else puts("Fuera de Rango!"); }
|
osea si no te permite ingresar un valor fuera de rango pero el q hace esa condicion???
2) y aca tmb
| Código: | if (abs(i - a) <= 1 && abs(j - b) <= 1) |
q hace el .
eso no entiendo.
Otra cosa si no es molesstia como quedaria el codigo modificado con lo q te dije?.
Gracias!, un saludo!! |
| | Volver arriba | |  | | rodowushu
Registrado: 09 May 2011 Mensajes: 18
| Publicado: 18/01/2012 5:19 pm | | | Título: |
| *EDITADO:
ya entendi q hace cada codigo del programa, era cuestion de sentarme a leer numas, gracias por el aporte y el tiempo, si me sale mi codigo lo publico sino ya publicaremos las dudas tambien, un saludo!!.
Gracias!! |
| | Volver arriba | |  | rodowushu
Registrado: 09 May 2011 Mensajes: 18
| Publicado: 18/01/2012 7:02 pm | | | Título: |
| volviendo resignado, definitivamente no entiendo como puedo hacerlo por array. probe varias veces, ya queme los libros y nada, me estanque. si me pudisen ayudar como lo haria, le agradeceria.
aqui ta mi codigo, casi no tiene modificaciones con el anterior.
| Código: | #include <stdio.h> #include <stdlib.h>
#define fila 4 #define columna 8 int main(void) { char mat[fila][columna]; int i,j,fil,col; printf("Ingrese una fila entre 0 y 3, y una columna entre 0 y 7\n"); scanf("%d %d",&fil,&col); while(fil>fila || fil<0 || col>columna || col<0){ printf("Fuera de Rango, ingresa de nuevo\n"); scanf("%d %d",&fil,&col); } for(i = 0; i < fila; i++){ printf("fila %d: ", i); for(j = 0; j < columna; j++){ if(mat[i][j]==fil && mat[i][j]==col){ putchar ('X');} else putchar ('.'); } putchar ('\n'); } system("PAUSE"); return 0; }
|
un saludo, gracias! |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 6586 Ubicación: Mexico
| Publicado: 18/01/2012 8:35 pm | | | Título: |
| Problemas hay varios, los mas importantes son:
* Primero debes almacenar cada uno de los valores (los caracteres '.' y 'x') en el array, cosa que no haces. Al no hacerlo y utilizar el array sus valores son no definidos o "basura".
* Al procesar el array debes verificar que tanto la fila como la columna tengan una diferencia máxima de 1 (valor absoluto) en relación a la entrada del usuario. Si es así almacenas 'x' en el array y caso contrario almacenas '.'.
Un ejemplo sobre como realizar esa verificación se encuentra en el programa de ejemplo que publique. La función "abs" retorna el valor absoluto de su único argumento.
Si no puedes (o debes) utilizar esa función puedes sustituirla por la condición:
| Código: | if ( (i - a == -1 || i - a == 0 || i - a == 1) && (j - b == -1 || i - b == 0 || i - b == 1) ) ... |
* Por ultimo la validación que realizas para la fila y celda:
| Código: | while (fil>fila || fil<0 || col>columna || col<0){ printf("Fuera de Rango, ingresa de nuevo\n"); scanf("%d %d",&fil,&col); } |
No es correcta ya que si el usuario introduce los mismos valores (4 para la fila y 8 para la columna) tratarías de acceder al elemento "mat[4][8]" el cual no existe (el ultimo elemento es "mat[3][7]").
Eso hay que cambiarlo a:
| Código: | while (fil >= fila || fil < 0 || col >= columna || col < 0) { printf("Fuera de Rango, ingresa de nuevo\n"); scanf("%d %d",&fil,&col); } |
Para que así el bucle termine cuando los valores ingresados estén en el rango valido.
Un saludo _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | Volver arriba | |  | | rodowushu
Registrado: 09 May 2011 Mensajes: 18
| Publicado: 19/01/2012 8:53 pm | | | Título: |
| SOLUCIONADO:
Gracias rir por tu aporte me quedo mas claro como es la cosa. aqui esta el codigo, aplicando funciones, pero me quedaron otras dudas.
| Código: | #include <stdio.h> #include <stdlib.h>
#define fila 4 #define columna 8
void cargar(int* a, int* b); int mostrar(int* x, int* y);
int main(void) { char mat[fila][columna]; int i,j,fil,col; cargar(&fil,&col); printf("Los valores cargados fueron: %d %d\n",fil,col); /* es para orientarme nada mas :)*/ matriz(&mat[fila][columna]); for(i = 0; i < fila; i++){ printf("fila %d: ", i); for(j = 0; j < columna; j++){ if(abs(i-fil) <= 1 && abs(j-col) <= 1) printf("%c", mat[fila][columna]); else putchar('.'); } putchar ('\n'); } system("PAUSE"); return 0; }
void cargar(int* a, int*b){ int fil, col; printf("Ingrese una fila entre 0 y 3, y una columna entre 0 y 7\n"); scanf("%d %d",&fil,&col); while(fil > fila || fil<0 || col > columna || col<0){ printf("Fuera de Rango, ingresa de nuevo\n"); scanf("%d %d",&fil,&col); } *a = fil; *b = col; } int matriz(int* A){ int i,j; for(i = 0; i < fila; i++){ for(j = 0; j < columna; j++); *A= 'X'; } return *A; }
|
1) resulta q la condicion:
| Código: | while(fil > fila || fil<0 || col > columna || col<0) |
es valida si ingresas un 4 o un 8 lo toma dentro del rango, es mas modifique como me dijiste y ahi si me saltaba el mensaje de error, cosa q me parecio q tendria q haber sido al contrario.
2) No sabia como poner la condicion de cargar la matriz con 'x' o con '.', asi que cargue la matriz con 'x' directamente, q creo q es valido hacerlo, y en la condicion de comparacion lo puse diractamente asi:
| Código: | if(abs(i-fil) <= 1 && abs(j-col) <= 1) printf("%c", mat[fila][columna]); else putchar('.'); | .
3) en vez de poner a la salida del if
| Código: | printf("%c", mat[fila][columna]); |
ponia directamente | Código: | puts(mat[fila][columna]); | , y me arrojaba cualquier valor. Eso a que se debe?.
Gracias! un saludo |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |