Hola a todos!
Hoy andaba husmeando entre mis tareas del bachillerato y por ahí me encontré con este programa que resuelve el clásico Cuadro Mágico que para algunos es un problema en matemáticas ya que es muy usual que en algún momento de tus estudios te lo dejaran hacer en algún examen o de tarea. Pero afortunadamente para ti este programa te resuelve el cuadro, dada una cantidad de columnas impares.
Así quedaría este programa que en ciertas ocasiones puede resultar muy útil

En si el codigo es muy corto y esque hay un truco para resolverlo sin importar el numero de columnas y filas que tenga. Pero como sea aquí te dejo el código para que veas como se hace:
Visual Basic.NET
-
Public Class Form1
-
Dim cuadro(1000, 1000) As Integer 'nuestro cuadro tendra capacidad para 1000 filas y 1000 columnas
-
-
Private Sub txtcolumna_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtcolumna.TextChanged
-
If (txtcolumna.Text = "") Then
-
cmd_calcular.Enabled = False
-
Else
-
cmd_calcular.Enabled = True
-
End If
-
End Sub
-
-
Private Sub cmd_calcular_Click(ByVal sender As System.Object, ByVal ee As System.EventArgs) Handles cmd_calcular.Click
-
If (txtcolumna.Text Mod 2 = 0) Then 'si las columnas introducidas son impares, marcamos error
-
MessageBox.Show("Solo puedes introducir un numero de columnas IMPAR")
-
Else 'calculamos cuadro magico
-
Dim col As Integer = Convert.ToInt16(txtcolumna.Text) 'nos aseguramos que sean columnas enteras
-
Dim fil As Integer = col 'como será cuadro, seran las mismas filas que las columnas
-
Dim b As Integer = col \ 2 + 1 'hacemos divicion entera entre 2 a las columnas y le sumamos 1
-
Dim a As Integer = 1 '"a" y "b" serán nuestras variables auxiliares para movernos en el cuadro
-
Dim d, e, f As Integer
-
-
cuadro(a, b) = 1 'siempre el primer paso es igualar a 1 la posicion de la columna de enmedio en la fila 0
-
-
'llenamos el cuadro de numeros
-
For d = 2 To fil * col '"d" será nuestro contador para recorrer todo el cuadro e ir llenandolo de numeros
-
If (b = col) Then 'si ya se llego a la ultima columna, entonces reiniciamos, sino entonces incrementamos la columna
-
b = 1
-
Else
-
b += 1
-
End If
-
-
If (a = 1) Then 'si ya se llego a la primer fila, entonces nos regresamos a la ultima fila, sino entonces decrementamos la fila
-
a = fil
-
Else
-
a -= 1
-
End If
-
-
If (cuadro(a, b)> 0) Then 'se verifica que el espacio no este ocupado
-
e += 1
-
a = e
-
b = f
-
End If
-
-
cuadro(a, b) = d
-
e = a
-
f = b
-
Next
-
-
txtcuadro.Text = ""
-
'imprimimos el cuadro
-
For a = 1 To fil
-
For b = 1 To col
-
txtcuadro.Text &= cuadro(a, b) & ", "
-
Next
-
txtcuadro.Text &= vbNewLine
-
Next
-
-
End If
-
End Sub
-
End Class
y Aquí esta su versión en Pascal:
Pascal
-
uses {cuadro magico}
-
crt; {Angel L¢pez}
-
var
-
x:array [1..50,1..50] of integer;
-
fila,colum,a,b,d,e,f:integer;
-
begin
-
clrscr;
-
writeln('Introduce el total de columnas y filas [numeros impares]');
-
readln(colum); {se coloca el primer numero en la posicion intermedia}
-
writeln;
-
writeln;
-
writeln;
-
fila:=colum;
-
b:=(colum div 2)+1;
-
a:=1;
-
x[a,b]:=1;
-
-
for d:=2 to (fila*colum) do {se llena el cuadro magico con numeros}
-
begin
-
if (b=colum) then
-
b:=1
-
else
-
b:=b+1;
-
-
if (a=1) then
-
a:=fila
-
else
-
a:=a-1;
-
-
if (x[a,b]>0) then {se checa que el espacio no este ocupado}
-
begin
-
e:=e+1;
-
a:=e;
-
b:=f;
-
end;
-
-
x[a,b]:=d;
-
e:=a;
-
f:=b;
-
end;
-
-
for a:=1 to fila do {aqui se imprime el cuadro magico}
-
begin
-
for b:=1 to colum do
-
write(x[a,b]:4);
-
writeln;
-
writeln;
-
end;
-
-
readln;
-
end.
Y aquí te dejo el enlace para que los descargues: