Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   cubo magico o caja magica (https://www.clubdelphi.com/foros/showthread.php?t=77039)

Andres202010 15-12-2011 20:29:30

cubo magico o caja magica
 
hola a todos, soy nuevo en esto de la programacion, estudio informatica, y estaba buscando la solucion a este ejercicio q me dieron de tarea, la verdad q no tngo ni idea de como hacerlo, es en matrices y delphi...
Ejemplo. Se tiene que llenar una matriz nxn, siempre y cuando sea impar, con numeros del 1 a n, dependiendo del tamaño de la matriz, un nro en cada espacio, donde no tiene q repetirse ningun numero, y donde la suma de los elementos de cualquier fila sea el mismo resultado que la suma de los elementos de cualquier columna, incluso los elementos de la diagonal principal y secundaria obtienen el mismo resultado.
Si alguien me puede ayudar estare muy agradecido...
Si falta algun dato mas solo pregunten,
muchas gracias.

Ñuño Martínez 15-12-2011 20:43:58

Coje una hoja de papel y haz el ejercicio a mano. Cuando lo hayas terminado, intenta analizar el proceso que has seguido, buscando pasos concretos, repeticiones, etc. Ahora reproduce ese análisis en un diagrama de flujo y ya sólo te falta escribir el programa.

Lo sé, suena a perogrullada, pero es que es así como se hace. ;)

[edito] Acabo de caer en que estamos en el foro OOP, y eso cambia un poco las cosas.

Lo de hacerlo a mano y sacar el proceso, sigue siendo igual. Lo que cambia es que, tras eso, antes del diagrama de flujo, deberás identificar los objetos implicados (supongo que a parte de la matriz poco más necesitarás), con sus métodos y propiedades, y ya después sí, el diagrama de flujo, etc...

roman 15-12-2011 21:11:47

Cita:

Empezado por Andres202010 (Mensaje 421262)
hola a todos, soy nuevo en esto de la programacion, estudio informatica, y estaba buscando la solucion a este ejercicio q me dieron de tarea, la verdad q no tngo ni idea de como hacerlo, es en matrices y delphi...
Ejemplo. Se tiene que llenar una matriz nxn, siempre y cuando sea impar, con numeros del 1 a n, dependiendo del tamaño de la matriz, un nro en cada espacio, donde no tiene q repetirse ningun numero, y donde la suma de los elementos de cualquier fila sea el mismo resultado que la suma de los elementos de cualquier columna, incluso los elementos de la diagonal principal y secundaria obtienen el mismo resultado.
Si alguien me puede ayudar estare muy agradecido...
Si falta algun dato mas solo pregunten,
muchas gracias.

Esto se resuelve en dos pasos:

1. Buscar o deducir el algoritmo para hacerlo de forma manual (no sé si esto es a lo que se refiere Ñuño).
2. Traducir tal algoritmo a código.

A mi juicio, el primer paso es el más difícil pero google puede ayudar un poco:

http://es.wikipedia.org/wiki/Cuadrado_m%C3%A1gico

En particular, el método siamés luce bastante sencillo e incluso viene codificado en python que, aunque lo desconozcas, puede darte idea de cómo hacerlo en delphi.

// Saludos

Casimiro Noteví 15-12-2011 21:18:57

Cita:

Empezado por Ñuño Martínez (Mensaje 421266)
[edito] Acabo de caer en que estamos en el foro OOP, y eso cambia un poco las cosas.

Lo pasamos a varios, y asunto solucionado :)

roman 15-12-2011 22:45:03

Y bueno, tengo algo de tiempo libre, a ver si jala esto:

Código Delphi [-]
type
  TMatriz = array of array of Integer;

function CuadradoMagico(N: Integer): TMatriz;
var
  D, I, J: Integer;

begin
  // Nos aseguramos que N sea impar
  if not Odd(N)then
    raise Exception.CreateFmt('%d no es un número impar', [N]);

  // Fijamos la dimensión de la matriz
  SetLength(Result, N, N);

  // Limpiamos la matriz
  for I := 0 to N - 1 do
    for J := 0 to N - 1 do
      Result[I, J] := 0;

  // Posición inicial
  I := 0; J := (N - 1) div 2;

  for D := 1 to N*N do
  begin
    Result[I, J] := D;

    // Si la casilla de arriba a la derecha ya está ocupada, bajamos de fila
    if Result[(((I - 1) mod N) + N) mod N, (J + 1) mod N] <> 0 then
      Inc(I)
    else
    // Vamos a la casilla de arriba a la derecha. Si nos salimos del cuadrado
    // entonces nos colocamos en el extremo opuesto
    begin
      I := (((I - 1) mod N) + N) mod N;
      J := (J + 1) mod N;
    end;
  end;
end;

Ejemplo de uso, usando un StringGrid para mostrar los resultados:

Código Delphi [-]
var
  N, I, J: Integer;
  M: TMatriz;

begin
  N := StrToIntDef(Edit1.Text, 3);
  M := CuadradoMagico(N);

  StringGrid1.RowCount := N;
  StringGrid1.ColCount := N;

  for I := 0 to N - 1 do
    for J := 0 to N - 1 do
      StringGrid1.Cells[J, I] := IntToStr(M[I, J]);
end;

// Saludos

Andres202010 16-12-2011 03:21:42

muchas gracias por responder, y perdon por poner la peticion en cualquier sitio, busque la categoria mas adecuada pero no la encontre, asi que la puse en OPPP, pido disculpas, y agradecer nuevamente a las personas que respondieron :P


La franja horaria es GMT +2. Ahora son las 15:32:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi