Aprés dix ans d'étude en algorithmie, je vous propose la solution.
Note: affichage dans "debug.print".
Source / Exemple :
Option Explicit
Option Base 1
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Fabien le 4/12/02
' Le carré magique
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub main()
Dim Saisie As String
Dim PairImpair As Single
Dim ValCote As Integer
Dim NbrCaseTotal As Integer
Dim Affect As Integer
Dim i As Integer
Dim j As Integer
Dim z As Integer
Dim TabMagique() As Integer
Dim TabAffiche As String
Dim Resultligne As Integer
Dim ResultColonne As Integer
Dim x As Integer
'+++++++++++++++++++++++
' Saisie
'+++++++++++++++++++++++
Let Saisie = InputBox("Rentrez le nombre de case de votre ", "Longueur")
Do
Do While Not IsNumeric(Saisie)
Let Saisie = InputBox("Que des chiffre, pas de lettre!", "Erreur")
Loop
Let ValCote = CInt(Saisie)
Let PairImpair = ValCote Mod 2
If PairImpair = 0 _
Then
Let Saisie = InputBox(" le nombre de case de votre carré doit être impair", "Longueur")
End If
Loop Until PairImpair = 1
'++++++++++++++++++++++++
' Init de "TabMagique"
'++++++++++++++++++++++++
ReDim TabMagique(ValCote, ValCote)
Let NbrCaseTotal = ValCote * ValCote
Let i = 1
Let j = 1
'remise à 0 de toutes les cases
For i = 1 To ValCote
For j = 1 To ValCote
Let TabMagique(i, j) = 0
Next j
Next i
Let i = 0
Let j = 0
'positionement du premier chiffre
Let i = (ValCote + 1) / 2 'calcul de l'indice colonne
Let j = ((ValCote + 1) / 2) - 1 ' calcul de l'indice ligne
Let TabMagique(i, j) = 1
Let Affect = 1
'+++++++++++++++++++++++++++++++++++++++
' Calcul
'+++++++++++++++++++++++++++++++++++++++
For z = 2 To NbrCaseTotal ' je commence à 2 car j'ai déja placé le 1
Let i = i + 1
Let j = j - 1
' on sort à gauche
If i < 1 _
Then
Let i = ValCote
Else
End If
'on sort à droite
If i > ValCote _
Then
Let i = 1
Else
End If
'on sort dessus
If j < 1 _
Then
Let j = ValCote
Else
End If
' au cas ou il y est deja une valeur dans la case visée
If TabMagique(i, j) > 0 _
Then
Let i = i - 1
Let j = j - 1
Do While i < 1 Or i > ValCote Or j < 1
'on sort à gauche
If i < 1 _
Then
Let i = ValCote
Else
End If
'on sort à droite
If i > ValCote _
Then
Let i = 1
Else
End If
'on sort dessus
If j < 1 _
Then
Let j = ValCote
Else
End If
Loop
End If
' affectation de la case
Let Affect = Affect + 1
Let TabMagique(i, j) = Affect
Next z
'+++++++++++++++++++++++++++++++++++++++
' Affichage
'+++++++++++++++++++++++++++++++++++++++
Debug.Print
Debug.Print
For j = 1 To ValCote
Let TabAffiche = ""
For i = 1 To ValCote
Let TabAffiche = TabAffiche + "|" + CStr(Format(TabMagique(i, j), String(5, "@"))) + " "
Next i
Let i = 1
Debug.Print TabAffiche
Debug.Print String(ValCote * 8, "--")
Next j
End Sub
Conclusion :
Version non final.(Beta 182.3.0)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.