Pascal/Turbo Pascal - Ayuda para crear un cubo mágico y latino!

 
Vista:
Imágen de perfil de Marcelo

Ayuda para crear un cubo mágico y latino!

Publicado por Marcelo (2 intervenciones) el 16/05/2013 02:04:48
Buenos días!
Tengo que entregar un trabajo creado en el compilador lazarus.
Realmente es mi primer año en la carrera de sistemas y no se bien como hacerlo.
Les agradecería que por favor alguien pueda explicarme como hacerlo.
A continuación pondré la actividad:

Definición

Un cuadrado mágico es una cuadrícula de 3 x 3, o de 4 x 4, o de 5 x 5 o, en general, de n x n, en la que se acomodan ciertos números que cumplen con la siguiente regla: la suma de cualquier fila, la suma de cualquier columna y la suma de cualquiera de cualquiera de las dos diagonales es siempre la misma.
Si la condición de mágico no se cumple para las diagonales, entonces se dice que el cuadrado es latino. El origen de los cuadrados mágicos es muy antiguo. Los chinos y los indios los conocían antes del comienzo de la era cristiana.

Propiedades

El orden de un cuadrado mágico es el número de renglones o el número de columnas que tiene. Así un cuadrado de 3 x 3 se dice que es de orden 3.
Al sumar los números de cualquier renglón, cualquier columna o cualquiera de las dos diagonales el resultado es el mismo, y a ese valor se lo denomina constante mágica. Existen diversos métodos para encontrar la constante mágica:

a)Si se conoce el cuadrado mágico basta sumarcualquier renglón o columna o diagonal.

b) Si el cuadrado no se conoce, una manera es sumar todos los númerosque se colocarán en el cuadrado y dividir el resultado entre el orden de éste.Por ejemplo: en un cuadrado mágico de orden 3los números que se colocarán son: 1, 2, 3, 4, 5, 6, 7, 8, 9
Así la constante mágica para un cuadrado de orden N= 3 será (1+2+3+4+5+6+7+8+9)/3 = 15

c) Otra manera de calcular la constante mágica de un cuadrado mágicoes acomodar en la cuadrícula los números que se van a utilizaren su orden natural (no en forma de cuadrado mágico) y sumarlos números de cualquiera de las diagonales; el resultadoserá la constante mágica de ese cuadrado

Problema

Se pide que implemente un programa modularizado que trabaje con cuadrados de N * N, donde N para la implementación como máximo será 5, y disponga de las siguientes funcionalidades:

a) Determinar dado un cuadrado de N*N (cuyos valores ingresa el usuario), si el mismo es un cuadrado mágico o si es un cuadrado latino. En el caso que el cuadrado sea mágico, deberá indicar también la constante mágica.
Por ejemplo para el cuadrado de la figura a) El programa debería indicar “Cuadrado Mágico . Constante mágica : 15
En cambio para el cuadrado de la figura b) El programa debería indicar “Cuadrado Latino”

b) A partir de un número N que ingresa el usuario y tomando como base el cuadrado de origen chino “Lo-Shu” el cual se muestra en la figura de abajo, devuelva un cuadrado mágico de orden 3.
Para obtener otro cuadrado mágico a partir del cuadrado de “Lo-Shu”, se procede así, al número N que ingresa el usuario se lo suma, resta o multiplica con cada uno de los números del cuadrado original, acomodando los resultados en los mismos lugares.
El cuadrado que queda también es mágico.


La verdad es que se que son los arreglos pero necesitaré mas información.
AYUDA POR FAVOR!!!
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda para crear un cubo mágico y latino!

Publicado por ramon (2158 intervenciones) el 26/05/2013 13:29:13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
{A ver si esto te sirve}
 
 
 program cuadradomagico;
 uses
   crt;
   const
     max = 6;
  type
    cuadro = array[1..max,1..max] of integer;
    linea = array[1..(max * max)] of integer;
 
   var
     magic : cuadro;
     numer : linea;
     magi : integer;
 
  procedure rellena(cual : integer);
  var
    t : integer;
    max0 : integer;
    begin
       magi := 0;
       fillchar(numer,sizeof(linea),0);
       max0 := cual;
      for t := 1 to (max0 * max0) do
      begin
      numer[t] := t;
      magi := magi + t;
      end;
      magi := magi div max0;
    end;
 
  procedure presentacuadro(x1, y1, cual : integer);
  var
    u, i : integer;
    max5 : integer;
  begin
      max5 := cual;
      gotoxy(x1, y1 - 3);write('Cuadro Magico De ',cual,'X',cual);
      gotoxy(x1,y1 - 2);write('El Numero Magico Es : ',magi);
      for u := 1 to max5 do
      begin
        for i := 1 to max5 do
        begin
          gotoxy(x1 + (i * 4),y1 + u * 2);write(magic[i,u]);
        end;
      end;
  end;
 
  procedure cubomagino4x4;
  var
    tem, temp, c1, c2 : integer;
    t, u, i, max5 : integer;
   begin
      max5 := 4;
      rellena(max5);
      u := 1;
      i := 1;
      for t := 1 to (max5 * max5) do
      begin
          magic[i,u] := numer[t];
          i := i + 1;
          if i > max5 then
          begin
             u := u + 1;
             i := 1;
          end;
      end;
      c2 := 1;
      for c1 := 1 to max5 div 2 do
      begin
        temp := magic[c1,c2];
        magic[c1,c2] := magic[(max5 + 1) - c1,(max5 + 1) - c2];
        magic[(max5 + 1) - c1,(max5 + 1) - c2] := temp;
        tem := magic[(max5 + 1) - c1,c2];
        magic[(max5 + 1) - c1,c2] := magic[c1,(max5 + 1) - c2];
        magic[c1,(max5 + 1) - c2] := tem;
        c2 := c2 + 1;
      end;
   end;
 
   procedure cubomagico5x5;
   var
     i, pa, g, u, t, c1, c2, max5 : integer;
     temp : array[1..9,1..9] of integer;
  begin
      fillchar(temp,sizeof(temp),0);
      max5 := 5;
      rellena(max5);
      c2 := 1;
      c1 := 5;
      t := 1;
      g := 1;
    repeat
          for u := 0 to 4 do
          begin
             temp[c1 + u,c2] := numer[t];
             c2 := c2 + 1;
             t := t + 1;
          end;
            c1 := c1 - 1;
            g := g + 1;
            c2 := g;
     until t > (max5 * max5);
     for c1 := 1 to 2 do
     begin
         for c2 := 1 to 9 do
         begin
            if temp[c2,c1] <> 0 then
            begin
            temp[c2,c1 + 5] := temp[c2,c1];
            temp[c2,c1] := 0;
            end;
            if temp[c2,10 - c1] <> 0 then
            begin
            temp[c2,(10 - c1) - 5] := temp[c2,10 - c1];
            temp[c2,10 - c1] := 0;
            end;
            if temp[c1,c2] <> 0 then
            begin
               temp[c1 + 5,c2] := temp[c1,c2];
               temp[c1,c2] := 0;
            end;
            if temp[10 - c1,c2] <> 0 then
            begin
               temp[(10 - c1) - 5,c2] := temp[10 - c1,c2];
               temp[10 - c1,c2] := 0;
            end;
         end;
     end;
     u := 1;
     i := 1;
     for c1 := 1 to 9 do
     begin
       for c2 := 1 to 9 do
       begin
           if temp[c2,c1] <> 0 then
           begin
              magic[i,u] := temp[c2,c1];
              i := i + 1;
              if i > max5 then
              begin
                 i := 1;
            u := u + 1;
              end;
           end;
         end;
      end;
    end;
 
   procedure cuadromagico3x3;
   var
     i, pa, g, u, t, c1, c2, max3 : integer;
     temp : array[1..9,1..9] of integer;
   begin
      fillchar(temp,sizeof(temp),0);
      max3 := 3;
      rellena(max3);
      c2 := 1;
      c1 := 3;
      t := 1;
      g := 1;
    repeat
          for u := 0 to 2 do
          begin
             temp[c1 + u,c2] := numer[t];
             c2 := c2 + 1;
             t := t + 1;
          end;
            c1 := c1 - 1;
            g := g + 1;
            c2 := g;
     until t > (max3 * max3);
     temp[3,4] := temp[3,1];
     temp[3,1] := 0;
     temp[3,2] := temp[3,5];
     temp[3,5] := 0;
     temp[4,3] := temp[1,3];
     temp[1,3] := 0;
     temp[2,3] := temp[5,3];
     temp[5,3] := 0;
     u := 1;
     i := 1;
     for c1 := 1 to 5 do
     begin
       for c2 := 1 to 5 do
       begin
           if temp[c2,c1] <> 0 then
           begin
              magic[i,u] := temp[c2,c1];
              i := i + 1;
              if i > max3 then
              begin
                 i := 1;
            u := u + 1;
              end;
           end;
         end;
      end;
   end;
 
   procedure menu;
   var
     sal : boolean;
     tec : char;
   begin
       sal := false;
     repeat
        clrscr;
        writeln('  ****** Menu General Cuadrado Magico ******');
        writeln;
        writeln('        1 = Cuadrado Magico 3x3');
        writeln('        2 = Cuadrado Magico 4x4');
        writeln('        3 = Cuadrado Magico 5x5');
        writeln('        4 = Salir');
        writeln;
        writeln('  >>>>>> Elija Opcion <<<<<<<<');
        repeat
           tec := readkey;
        until tec in['1','2','3','4'];
        clrscr;
     case tec of
  '1' : begin
          fillchar(magic,sizeof(cuadro),0);
          cuadromagico3x3;
          presentacuadro(10,6,3);
          readkey;
        end;
  '2' : begin
          fillchar(magic,sizeof(cuadro),0);
          cubomagino4x4;
          presentacuadro(10,6,4);
          readkey;
        end;
  '3' : begin
          fillchar(magic,sizeof(cuadro),0);
          cubomagico5x5;
          presentacuadro(10,6,5);
          readkey;
        end;
  '4' : sal := true;
    end;
     until sal = true;
   end;
 
 
 
  begin
      menu;
  end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Marcelo

Ayuda para crear un cubo mágico y latino!

Publicado por Marcelo (2 intervenciones) el 28/05/2013 21:56:41
No podrías mandarme el archivo?, es que cuando lo intento ejecutar en el lazarus me saltan estos errores:
Opciones cambiadas, recompila limpiando con -B
project1.lpr(85,19) Hint: Local variable "temp" does not seem to be initialized
project1.lpr(82,8) Note: Local variable "pa" not used
project1.lpr(154,19) Hint: Local variable "temp" does not seem to be initialized
project1.lpr(151,8) Note: Local variable "pa" not used
El proyecto "project1" se ha construido correctamente

Y si no te molesta podrías comentar que hace cada parte? me gustaría entenderlo.
Creo que olvidaste el punto b), dice:
A partir de un número N que ingresa el usuario y tomando como base el cuadrado de origen chino “Lo-Shu” , devuelva un cuadrado mágico de orden 3.

Muchísimas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar