/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda con matrices, ingresada una coordenada mostrarla

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
rodowushu



Registrado: 09 May 2011
Mensajes: 18

MensajePublicado: 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 Smile jaja

Les mando un saludo gracias!
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 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

MensajePublicado: 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
Código:
system(PAUSE);
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
Código:
while (1)
q hace esa condicion???

2) y aca tmb
Código:
if (abs(i - a) <= 1 && abs(j - b) <= 1)


q hace el
Código:
(abs(i - a) <= 1
.

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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com