[ Foro de Pascal ]

marco en matriz

24-Jan-2014 11:43
Invitado (Carlos Jurado)
10 Respuestas

Hola de nuevo, gracias por toda su ayuda, es que necesito realizar el marco para una matriz de la siguiente forma:


     8  X    X    X   X    X   X   X    X
     7  X    X    X   X    X   X   X    X
     6  X    X    X   X    X   X   X    X
     5  X    X    X   X    X   X   X    X
     4  X    X    X   X    X   X   X    X
     3  X    X    X   X    X   X   X    X
     2  X    X    X   X    X   X   X    X
     1  X    X    X   X    X   X   X    X
        a    b    c   d    e   f   g    h


Me podrian por favor  ayudar en como poder hacer dicha matriz es que no se como hacerlo , cualquier ayuda me seria muy util y les agradezco su tiempo y el apoyo que nos dan para aprender.


24-Jan-2014 13:25
Nacho Cabanes (+83)

No acabo de entender la pregunta...

¿Tienes una matriz de 8x8 y quieres escribir los números del 8 al 1 al principio de cada fila, y las letras de la "a" a la "h" en la parte inferior?


24-Jan-2014 18:48
Luis Torres (+18)

En realidad vendría a ser una matriz de 9x9 y el caracter que está en la fila 9 columna 1 es el espacio en blanco. De ser así, este sería el código:


program Matriz;

var
 mat: array[1..9,1..9] of char;
 i,j,valor: integer;
 carNum: string;
 car: char;

BEGIN
 for i:=1 to 9 do
  for j:=1 to 9 do
   begin
     if (j=1) and (i<>9) then
      begin
       valor:= 9-i;
       str(valor,carNum);
       car:=carNum[1];
       mat[i,j]:= car;
      end
     else if (j=1) and (i=9) then
       mat[i,j]:= ' '
          else  if (i<>9) then
           mat[i,j]:= 'X'
                else
                  mat[i,j]:= chr(j+95);
   end;


 for i:=1 to 9 do
  begin
    for j:=1 to 9 do
     write(mat[i,j],' ');
    writeln;
  end;

 readln;
END.


Se podría hacer de una manera más sencilla, pero no quise cambiarlo. Saludos.


24-Jan-2014 19:35
Invitado (Carlos Jurado)

Gracias Luis, era lo que pedia y te lo agradezco muchiismo, se nota que sabes programar muy bien, me gustaria contactar contigo si es posible, y antes tambien preguntarte cual es esa otra forma mas sencilla, seria muy positivo para mi y quiza para el resto de compañeros , sino te importa claro.
muy agradecido.


24-Jan-2014 20:13
Luis Torres (+18)

Mira, la verdad, no dispongo de mucho tiempo. Esta semana estuve libre, pero de unos días vuelvo a estar muy ocupado. Quise venir aquí porque este foro es muy bueno y, me ha aclarado muchas dudas.
A continuación te dejo el código modificado, más sencillo:


program Matriz2;

var
 mat: array[1..9,1..9] of char;
 i,j,valor: integer;

BEGIN
 for i:=1 to 9 do
  for j:=1 to 9 do
   begin
     if (j=1) and (i<>9) then
      begin
       mat[i,j]:= chr(57-i);
      end
     else if (j=1) and (i=9) then
       mat[i,j]:= ' '
          else  if (i<>9) then
           mat[i,j]:= 'X'
                else
                  mat[i,j]:= chr(j+95);
   end;


 for i:=1 to 9 do
  begin
    for j:=1 to 9 do
     write(mat[i,j],' ');
    writeln;
  end;

 readln;
END.

24-Jan-2014 20:38
Invitado (Carlos Jurado)

Hola luis, me podrias explicar dentro del for j, cuando esta en 1 vale, pero por donde entra el j cuando hace la segunda pasada y el resto de ellas por que no se si estoy equivocado pero en ese caso solo el for lo estas utilizando solo para una sola pasada y el resto de pasadas no las utilizas y me dejas con la duda si eso es correcto u optimo, ademas no entiendo por que es necesario en este caso hacer:


   for i:=1 to 9 do
               for j:=1 to 9 do
               begin
                 if (j=1) and (i<>9) then
                    begin
                       mat[i,j]:= chr(57-i);


es decir por que conviertes lo que son numeros en caracteres, osea por que haces que mat[i,j]:= '8'
no podria tomarse directamente asi:


  for i:=1 to 9 do
    for j:=1 to 9 do
      begin
         if (j=1) and (i<>9) then
           begin
            mat[i,j]:= 9-i;  de tal forma que en este caso mat[i,j]:= 8 


pero como numero

gracias por cualquier explicacion que me puedas brindar al caso y bueno lo de tu tiempo no lo sabia pero si gustas te dejo mi correo por si cuando quieras miramos cosas, el profesor nacho nos da la opcion de ponerlo y luego el lo quita por seguridad, pero bueno eso ya lo que me digas tu luis, yo hasta hace pocos dias entre a este foro y he aprendido muchiismo, estoy muy enganchado ahora aqui, ademas por que el profesor nacho da unas explicaciones y soluciones unicas


25-Jan-2014 02:19
Luis Torres (+18)

No entendí muy bien tu pregunta (la primera parte). En cuanto a la razón por la que convierto los números a caracteres numéricos ascii, es porque la matriz contiene X's y letras desde la 'a' a la 'h', entonces tuve que declarar el arreglo como una matriz de caracteres (char). Si trato de meter un número entero en una varable char generará un error, así que todo lo debo transformar a caracteres. Dentro de la tabla ascii hay caracteres númericos, y eso facilita las cosas. Si ves arriba y contabilizas el número de filas y columnas te darás cuenta que hay 9 filas y 9 columnas, de ahí que se toman ambos ciclos for del 1 al 9.
Lo mejor es que sigas colocando tus dudas en este foro, el profesor Nacho está entrando todos los días, así que no tendrás ningún problema en que él te de una respuesta profesional. Yo estaré muy ocupado y no quiero comprometerme. A veces tú ayudas a la gente y al final se convierten en tus enemigos.
Saludos.


26-Jan-2014 20:48
Invitado (Carlos Jurado)

Hola profesor nacho y compañero luis.
Ante todo no se por que dices eso al final luis :'A veces tú ayudas a la gente y al final se convierten en tus enemigos. ', de todas formas respeto tu opinion y sin mas queria preguntaros por la cuestion que en el mensaje anterior a tu codigo plante y es que no me gustaria quedar con esa duda, la referente a que haces un for interno :


  for j:=1 to 9 do
   begin
     if (j=1) and (i<>9) then
      begin
       mat[i,j]:= chr(57-i);
      end
     else if (j=1) and (i=9) then
       mat[i,j]:= ' '
          else  if (i<>9) then
           mat[i,j]:= 'X'
                else
                  mat[i,j]:= chr(j+95);
   end;


mi pregunta si hago un seguimiento y espero este en lo correcto es que solo entraria a este for cuando j:=1, en los demas casos creo a mi punto de ver no se y por favor me lo corrigen si estoy errado, que solo se realizan las demas iteraciones, es decir a partir de j:=2 hasta j:=9 , si es correcto mi seguimiento, os pido el favor si hay forma de hacerle alguna modificacion para no desperdiciar esas iteraciones, se que no son muchas pero si hay una forma me gustaria saberlo por inquietud y aprender.

Por otra parte es que quise llevar el mismo ejercicio al caso de hacer una variente utilizando variables type definidas por el usuario:


program marco_matriz;
uses crt;

type  tpDecision = ( libre, aceptado, letra );
         tpElementosDecision = array[1..8, 'a'..'h'] of tpDecision;


procedure mostrarMatriz(elemts: tpElementosDecision);
var f, valor: integer; c: char;
begin
  for f:= 8 downto 1 do
    begin
	 for c:='a' to 'h' do
	      begin
                     if elemts[f,c] = letra then 
			  write('M ')
                        else 
				 if elemts[f,c] = aceptado then
				  write('X ')
				  else
				   write('O '); //letra O
		    	   end;		  
		writeln;
       end;
end;


bien con esto independientemente de lo que hace el minijuego optengo

para una entrada como:


1 a // 1 es la fila y a la columna del marciano.

       O    O    O   O  O   O   O    O
       O    O    O   O  O   O   O    O
       O    O    X    X   X   X    X    X
       O    O    O   O  O   O   O    O
       X     X    X    X   X   X    X    X
       X     X    X    X   X   X    X    X
       X     X    X    X   X   X    X    X
       M    X    X    X   X   X    X    X


pues bien de igual forma con dicho procedimiento he intentado en base al ejemplo de luis hacer lo mismo, pero he hecho no se cuantos intentos hoy y no he podido, quiza si me pudieran hechar una mano de como deberia hacer para que con el mismo procedimiento que repìto me da el resultado esperado tal como esta, como podria ser para que el resultado saliera con el marco:

para una entrada como:


1 a // 1 es la fila y a la columna del marciano.

  8     O    O    O   O  O   O   O    O
  7     O    O    O   O  O   O   O    O
  6     O    O    X    X   X   X    X    X
  5     O    O    O   O  O   O   O    O
  4     X     X    X    X   X   X    X    X
  3     X     X    X    X   X   X    X    X
  2     X     X    X    X   X   X    X    X
  1     M    X    X    X   X   X    X    X
        a     b    c     d   e   f     g     h


como veias lo unico que quiero es dentro de ese procedimiento lograr que pueda imprimir en pantalla el marco numerico de cada fila y el marco caracter de las columnas tal como se ve.

agredezco muchisimo vuestra ayuda, pues es algo que quise hacer a manera personal intentando aplicar lo que luis hizo en el primer planteamiento, es decir ahora usando el procedimiento que os puse en este nuevo hilo.


28-Jan-2014 00:40
Nacho Cabanes (+83)

Con lo de "A veces tú ayudas a la gente y al final se convierten en tus enemigos", imagino que Luis se refiere a la sensación que en algún momento hemos tenido todos los que intentamos ayudar: puede ocurrir que malinterpretes alguna pregunta, guíes a alguien en una dirección que no era la correcta para lo que realmente quería, y resultes ser "el malo de la película" por haberle hecho perder tiempo. Y es algo muy desmotivador.

Por eso muchas veces mi primera respuesta es "¿te refieres a esto o a esto otro?", de modo que pueda saber mejor hacia dónde dirigir la respuesta (y hacer que mi escaso tiempo libre cunda un poco más).

Volviendo a tu pregunta, ocurre lo que imaginaba (mira mi primera respuesta en este hilo): no querías dibujar una matriz de 9x9 caracteres, sino una matriz de 8x8 con un marco adicional alrededor, formado por una columna inicial de números y una fila inferior de letras.

Pero no es difícil: partiendo de tu base, basta con mostrar un número al principio de cada fila, y una última fila adicional de las letras, algo como:


procedure mostrarMatriz(elemts: tpElementosDecision);
var f, valor: integer; c: char;
begin
  for f:= 8 downto 1 do
    begin
        write(f, ' ');   (* Número de fila *)
	 for c:='a' to 'h' do
	      begin
                     if elemts[f,c] = letra then 
			  write('M ')
                        else 
				 if elemts[f,c] = aceptado then
				  write('X ')
				  else
				   write('O '); //letra O
		    	   end;		  
		writeln;
       end;
       write('  a b c d e f g h');   (* Pie, con códigos de columnas *)
end;



28-Jan-2014 11:56
Invitado (Carlos Jurado)

Gracias profesor Nacho, muy acertada tu respuesta, ya solucione el problema, en parte a tus excelentes explicaciones como las de Luis.

profesor disculpa es que aun me queda de este hilo la gran duda respecto a la tambien correcta respuesta del compañero Luis, especificamente en el for interno que realiza:


 ...
  for j:=1 to 9 do
   begin
     if (j=1) and (i<>9) then
      begin
       mat[i,j]:= chr(57-i);
      end
      else if (j=1) and (i=9) then
       mat[i,j]:= ' '
          else  if (i<>9) then
           mat[i,j]:= 'X'
                else
                  mat[i,j]:= chr(j+95);
   end;


al hacer un seguimiento del programa y espero este en lo correcto, se estaria solo entrando a este for j:=1 to 9 , cuando j:=1, en los demas casos solo se realizan las demas iteraciones sin tener un efecto significativo dentro del programa, es decir a partir de j:=2 hasta j:=9 , si es correcto mi seguimiento, habria alguna forma de hacerle alguna modificacion para no desperdiciar esas iteraciones, se que no son muchas pero si hay una forma me gustaria saberlo por inquietud y aprender.

mil gracias, por lo demas de este hilo es la unica inquietud que me queda,...gracias.


28-Jan-2014 12:31
Nacho Cabanes (+83)

Para no tener que hacer tantas comprobaciones, la alternativa es la que te he mostrado: el número del principio se muestra siempre, al principio de cada fila, y las letras del pie se muestra tras todas las iteraciones.

Aun así, incluyo una versión comentada de la propuesta de Luis, para que sea más fácil de leer, por si alguna parte de la lógica de esa solución no te resulta clara:


 ...
  for columna:=1 to 9 do
   begin
     if (columna=1) and (fila<>9) then  (* Primera columa de los datos: número *)
      begin
       matriz[fila,columna]:= chr(57-fila);  (* Número desde 9, descendiendo *)
      end
      else if (columna=1) and (fila=9) then
       matriz[fila,columna]:= ' ' (* Espacio en la esquina inferior izqda*)
          else  if (fila<>9) then
           matriz[fila,columna]:= 'X' (* Datos fuera del marco *)
                else
                  matriz[fila,columna]:= chr(columna+95); (* Letras, última fila *)
   end;






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)