Inicio > Pascal > elrata > CUADRADO LATINO EN PASCAL

CUADRADO LATINO EN PASCAL

Experto:
Usuario:
Fecha: 30/06/2008
Valoración: (5,00 sobre 5) Categoría: Pascal
30/06/2008
wentworth_vp, usuario preguntando en Pascal
Usuario
saludos a todos...
quien le pueda intersar:
Necesito generar una matriz de orden n x n (igual numero de filas y columnas) con un patron por filas llamado cuadradro latino, para el que no lo conoce, es asi:
1  2  3  4                          n-3   n-2   n-1   n
4  1  2  3                          n      n-3   n-2   n-1
3  4  1  2                          n-1   n      n-3   n-2
2  3  4  1                          n-2   n-1   n      n-3
A la izquierda en ejemplo para una matriz 4 x 4, a la derecha el comportamiento por filas que tiene la matriz. Me interesa crear el procedimiento general, claro con limite, supongase maximo para una matriz 15 x 15, pero necesito q el programa imprima la matriz a partir del orden ingresado por el usuario.
Me cuesta trabajar con estos proyectos bidimensionales de matrices en general, mi vago aporte es:
1ero. pedir el orden al usuario.
2do. Apartir de ese orden crear un doble ciclo dejando el ciclo filas afuera del que recorre las columnas para hacer el llenado horizontalmente primero (por filas).
3ro. Pensaba en la posibilida de crear una variable que fuera aumentando su valor, como especie de contador dentro del ciclo interno, el de las columnas, que de alguna manera lo utilizara para restarcelo al n (orden definido por el usuario), e ir llenando las casillas con esa resta, pero noc nada mas, algo asi como:
for j:=1 to n do
begin {for filas}
for i:=1 to n do
u:=? (*posible constante que se inicializara al cambiar de fila*)
Matriz[j,i] :=n-u
Es todo lo que tengo en mente, agradezco de antemano cualquier ayuda...
30/06/2008
wentworth_vp, experto respondiendo en Pascal
Experto
Bueno, te hice asi... rapidamente.... sin funciones ni procedimientos... pero eso se puede agregar facilmente........
pero espero te sirva la resolucion....

Var
  mat:Array [1..15, 1..15] of byte;
  n:Integer;
  des:Integer;
  i,j:Integer;
Begin
  Write('Ingrese el valor de N. :');
  ReadLn(n);
  { Generacion de Matriz }
  des:=n-1;
  for i:=1 to n do
   Begin
    for j:=1 to n do
      Begin
        mat[i,j]:=n - des;
        if (j<>n)
          then des:= des - 1;
        if (des < 0) then des:=n-1;
      End;
   End;

  { Imprime Matriz }
  for i:=1 to n do
   Begin
    for j:=1 to n do
      write(mat[i,j]:4, ' ');
    writeLn;
   End;
End.

Saludos
Gabriel
30/06/2008
wentworth_vp, usuario preguntando en Pascal
Usuario
Gracias por tu rapida respuesta... veras aun no lo he probado, esta no esmi maquina y tengo que sperar ir a mi casa a donde tengo el programa instaladao para probarlo. Viendolo trataba de entender el funcionamiento de la variable "des" :
Begin
  mat[i,j]:=n - des; (* 1era asignacion*)
  if (j<>n)
     then des:= des - 1;
     if (des < 0) then des:=n-1;
End;
Luego de que raliza la 1era asignación, porqué luego evaluo si j es difernte de n y des < 0¿?... Me cuesta aveces entender nomesclaturas que no sean mias, por eso en la medida de las posibilidades podrias, si podrias explicarme literalmente el funcionamiento del proceso... Muchas gracias igual por el previo aporte...
30/06/2008
wentworth_vp, experto respondiendo en Pascal
Experto
jajaja, no, todo bien, yo tampoco fui muy claro con las nomenclaturas.....
el des, es una variable de desplazamiento
Lo que intennte hacer es.... por ejemplo... la 1er fila ir de n - (n-1) hasta n
Pero... en la segunda linea... lo que hago es arracancar con el desplazamiento de la linea anterior..... y a partir de alli, sigo restando, verificando que no se ponga negativo.
n-3   n-2   n-1   n
Luego, en la primer columna pongo el desplazamiento obtenido en la ultima columna de la fila anterior
n      n-3   n-2   n-1
lo mismo aqui
n-1   n      n-3   n-2
y aqui
n-2   n-1   n      n-3

Me explico?
30/06/2008
wentworth_vp, usuario preguntando en Pascal
Usuario
perfecto, voy a ponerlo en practica, muchisimas gracias!!!
30/06/2008
wentworth_vp, usuario preguntando en Pascal
Usuario
Excelente. Una fantástica solución.
Enlaces patrocinados