[ Foro de Pascal ]

generar matriz

28-Apr-2014 09:44
Invitado (FranciscoLuis99)
5 Respuestas

hola a todos.
estoy realizando un ejercicio y bueno al ver que me bloque en la forma en que lo pensaba hacer, acudo a su generosa y estupenda ayuda para ver opciones de solucion al mismo.
se trata de generar la siguiente matriz.


1     3     7    12    16
      4     8    13
            9
      5   10   14
2     6    11   15   17


la matriz como veran debe ser impar, pero bueno esa es una parte que ya tengo controlada,
mi idea era la siguiente, ir recorriendo cada columna y en cada una de ellas ir generando por filas los numeros como se muestra en ele ejemplo, el problema que tengo es cuando intento generar los numeros de abajo, es decir, yo lo gro generar sin problema esto:


1   3   7   12  16
    4   8   13
        9



el problema que tengo es al intentar para cada columna al mismo tiempo ir generando la parte:

   
      5   10   14
  2   6   11   15   17


pense inicialmente en un for decreciente pero por ningun lado me resulto

espero por favor me ayuden, agradecido por toda la ayuda que puedan ofrecerme,lo he intentado pero llevo horas intentando la parte de abajo y nada.


28-Apr-2014 21:55
Nacho Cabanes (+83)

No entiendo. Eso no es una matriz. Una matriz es rectangular y eso tiene "huecos".

¿Tienes que escribir esa secuencia o tienes que crear una matriz que contenga esos datos y que en los "huecos" tenga ceros o algún otro valor prefijado? ¿La matriz debe ser de 5x5 o debe comportarse bien con cualquiera otra matriz, como 7x7, extrapolando esa lógica de relleno?

Si debes rellenar una matriz de tamaño arbitrario, yo lo haría por columnas: la primera columna tiene 1, (tamaño-2) ceros, y luego 2; la siguiente tiene 3, 4, (tamaño-4) ceros, y luego 5 y 6, y así sucesivamente hasta que no hay espacios, momento en el que hay que empezar a "añadir ceros".


28-Apr-2014 23:47
Invitado (FranciscoLuis99)

Nacho, lo que debe realizarse es crear una matriz que contenga esos datos pero que en los huecos en impresión se vean tal cual, sin ceros para dar la apariencia o formato del ejemplo, y efectivamente debe extrapolarse para otras dimensiones impares.gracias


29-Apr-2014 03:00
Luis Torres (+18)

Lo primero que tienes que hacer es dibujar o modelar varias matrices cuadradas de orden impar y estudiar muy bien la forma en la que van decreciendo y luego creciendo el número de espacios en blanco. Yo hice el estudio y me dí cuenta de que en el centro no hay ningún espacio en blanco, o sea que hay cero espacios en blanco; la posición del centro se obtiene ade la siguiente manera: n div 2 + 1, donde n es el orden de la matriz. Otra conclusión a la que llegué fue que el número de espacios en blanco de la primera columna es: n - 2, y va disminuyendo en 2 para la columna siguiente.
Con el análisis anterior ahora sé que mi primera columna tendrá n-2 espacios en blanco, la segunda (n-2)-2, la tercera (n-2)-2-2,..., la central tendrá 0, y luego los espacios en blanco volverán a crecer sumándo 2 al anterior hasta culminar con n-2 espacios en blanco.
Con esta "base teórica" construí un código, que será difícil de seguir, porque surgieron muchos errores que fueron corregidos sobre la marcha. Pero aquí te lo dejo, de todas maneras:


program generarMatrizMariposa;
uses Crt;
var
  M: array[1..19,1..19] of integer;
  n,i,j,posx: integer;
  num, mitad, espacios: integer;
  
BEGIN
 clrscr;
 repeat
   write('Introduzca el orden de la matriz: ');
   readln(n);
   if (n mod 2 = 0) then
     writeln('El orden de la matriz debe ser impar.');
 until (n mod 2 <> 0);  
 espacios:= n - 2;
 mitad:= n div 2 + 1;
 num:= 1;
 posx:= 1;
 clrscr;
 for j:=1 to n do
   begin
     for i:=1 to n do
	   begin
	     if (i<(mitad - espacios div 2)) or (i>(mitad + espacios div 2)) or ((i=mitad) and (j=mitad)) then
		   begin
		     gotoxy(posx,i);
		     writeln(num:4);
			 num:= num + 1;
		   end
		 else
           begin
		     gotoxy(posx,i);
             writeln('':4);
           end;		   
	   end;
	 if j < mitad then
	      espacios:= espacios - 2
     else if j >= mitad then
             espacios:= espacios + 2;
     posx:= posx + 4;			 
   end;
 
 readln;
END.  


Saludos.


29-Apr-2014 12:46
Invitado (FranciscoLuis99)

hola luis, impecable explicacion y mas aun con el codigo, muchas veces tenerlo es tranquilidad por que fijate que estuve intentando varias maneras de hacerlo y en tu solucion de codigo encontre que no iba tan perdido, asi que tu codigo me ayudo inmensamente y te lo agradezco eres genial tio.un abrazo de gratitud


29-Apr-2014 18:18
Invitado (FranciscoLuis99)

hola luis, una sola cuestion que estoy lgo confundido, podrias explicarme por favor que haces en :
if (i<(mitad - espacios div 2)) or (i>(mitad + espacios div 2)) or ((i=mitad) and (j=mitad)) then

gracias compañero por tu generosa ayuda






(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.)