La N.S.C.Des carrés magiques en Logo
suite

 

Le texte en noir est d'Alain Wespiser.

Définition des carrés magiques : un carré magique se présente sous la forme d'un tableau carré dans lequel les nombres naturels à partir de 1 à N sont placés de telle façon que les sommes des lignes, des colonnes et des diagonales soient toutes égales. J'appelle carré magique parfait quand tous les N nombres sont utilisés une fois et une seule. Les carrés magiques parfaits n'apparaissent qu'à la somme 30, il y en a 7040. Dans le programme ils sont noyés dans les autres.

Le programme offre les choix de : lire à l'écran ou d'imprimer les résultats ; entre celui d'afficher les carrés ou le nombre de ceux-ci pour une somme. Dans tous les cas le nombre total est affiché.

Je pense qu'il faudrait mettre un avertissement au démarrage sur le temps de calcul. Même sur un Pentium 4, pour la somme de 15, je pense que le temps de calcul doit être d'une demi heure ; alors sur un engin plus vieux. Il faudrait même mettre une somme maximum qui interrompe le programme automatiquement ; je suggère 15. ATTENTION : ce test d'arrêt ne figure peut-être pas dans la version ci-dessous !

Quelques précisions sur le programme. Il s'agit de carrés 4x4. Sur les 16 nombres, 7 sont des variables , les 9 autres sont calculés à partir des variables.Tous les nombres doivent être compris entre 0 et la somme. Il (le programme) utilise plein de variables provisoires, certaines sont sommes, imprim, tmp, affich ...


Le ae entrelacé doit correspondre à la lettre grecque mu (µ ? Papy Logo n'a pas étudié cette langue)...

 

.EFT ;;ainsi que le fait remarquer l'auteur, ceci n'est plus guère indispensable. Mais, sur un gros
;;programme comme celui-ci, avec ses nombreuses variables, ce n'est pas totalement inutile.
;;Particulièrement si l'on imagine que l'utilisateur a fait tourner d'autres procédures juste avant
;;de lancer celles-ci.
RECYCLE ;;tant qu'à faire, autant le faire entièrement !

POUR COMMENTAIRE
Ce programme, NBR_POSI.LOG, calcule le nombre de cm positifs quelque soit la somme. Pour avoir les différentes options, voir CM1-1 et CM1-2.

CM lance le programme ; CM1-1 et CM1-2 donne les différentes options ; CM1* lance CM-A et donne le temps de calcul ;
CM1æ lance CM1* et imprime uniquement dans l'option "nombre de cm ; CM-A calcule et contrôle DBA et C, elle possède la condition d'arrêt ; CM-A2 complète CM-A dans les options "affiche les cm" ; CM-M calcule et contrôle M et P ; CM-F calcule et contrôle F et K ; CM-G calcule et contrôle G , J N et O ; CM-H calcule et contrôle H , E L et I ; IMP donne les coordonnées d'impression ; IMP1 imprime les cm ; IMP20 contrôle la coordonnée d'impression :colonnes ; IMP30 contrôle la coordonnée d'impression :lignes ; IMP35 imprime dans les options "affiche les cm ; IMP40 relance le programme après chaque impression de cm.
;;Je ne conseil pas trop les * et µ dans un nom de procédure ; le * signifie surtout multiplier en informatique.
;;Le trait d'union (-) [touche 6] passe très bien ici même si notre convention, en informatique, opterait plus pour
;;le blanc souligné (_) [touche 8].
FIN

POUR CM ;;carré magique, donc !
ME 28
VT
EC [Ce programme, NBR_POSI.LOG, calcule le nombre de cm positifs. Il peut donner soit :]
EC "
EC [1 - le nombre de cm]
EC [2 - afficher tous les cm]
SOIT "CHOIX LISCAR
EC :CHOIX
SI EGAL? :CHOIX "1 [DONNE "AFFICHE "N CM1-1][DONNE "AFFICHE "O CM1-2]
FIN

POUR CM1-1
EC "
EC [Vous voulez connaître le nombre de cm pour :]
EC "
EC [ 1 - une seule somme ]
EC [ 2 - de la somme ? … ?? ] ;;Pourquoi ce choix : un CM ne devrait-il pas tourner autour que
;;d'une seule somme (le résultat des additions verticale, horizontales et diagonales), non ?...

SOIT "SOMMES LISCAR
EC :SOMMES
EC "
SI EGAL? "1 :SOMMES [EC [Ecrivez la somme puis appuyer sur entrée] SOIT "NOMBRE LL ][EC [Ecrivez la première somme puis appuyez sur entrée] SOIT "PETIT LL EC [Ecrivez la deuxième somme puis appuyer sur entrée] SOIT "GRAND LL]
EC "
EC [Souhaitez vous l'imprimer ? (O,N)] ;;Et pourquoi pas (O, N) en respectant
;;les conventions typographiques ? Ce respect aurait-il une incidence sur les procédures concernées ?

SOIT "IMPRIM LISCAR
EC :IMPRIM
EC "
EC [Voulez vous connaître le temps de calcul (O,N)]
SOIT "TMP LISCAR
SI ET EGAL? :SOMMES "1 EGAL? :IMPRIM "N [VT CM1* PREM :NOMBRE SOMME PREM :NOMBRE 1]
SI ET EGAL? :SOMMES "2 EGAL? :IMPRIM "N [VT CM1* PREM :PETIT SOMME PREM :GRAND 1]
SI ET EGAL? :SOMMES "1 EGAL? :IMPRIM "O [VT CM1æ PREM :NOMBRE SOMME PREM :NOMBRE 1]
SI ET EGAL? :SOMMES "2 EGAL? :IMPRIM "O [VT CM1æ PREM :PETIT SOMME PREM :GRAND 1]
FIN

POUR CM1-2
EC "
EC [Vous voulez afficher le nombre de cm pour :]
EC "
EC [ 1 - une seule somme ]
EC [ 2 - de la somme ? … ?? ] ;;voir plus haut et, aussi : pourquoi ces 2 procédures,
;;en quoi sont-elles si dissemblables ? Ces questions ne sont pas forcément adressées
;;au concepteur du programme, mais, aussi, aux lecteurs (visiteurs amateurs de Logo) !

SOIT "SOMMES LISCAR
EC :SOMMES
EC "
SI EGAL? "1 :SOMMES [EC [Ecrivez la somme puis appuyer sur entrée] SOIT "NOMBRE LL ][EC [Ecrivez la première somme puis appuyez sur entrée] SOIT "PETIT LL EC [Ecrivez la deuxième somme puis appuyer sur entrée ]SOIT "GRAND LL]
EC "
EC [Souhaitez vous l'imprimer ? (O,N)]
SOIT "IMPRIM LISCAR
EC :IMPRIM
EC "
EC [Voulez vous connaître le temps de calcul (O,N)]
SOIT "TMP LISCAR
SI ET EGAL? :SOMMES "1 EGAL? :IMPRIM "N [VT EC " CM1* PREM :NOMBRE SOMME PREM :NOMBRE 1]
SI ET EGAL? :SOMMES "2 EGAL? :IMPRIM "N [VT EC " CM1* PREM :PETIT SOMME PREM :GRAND 1]
SI ET EGAL? :SOMMES "1 EGAL? :IMPRIM "O [VT SORTIE 6 ME 2 CT EC " CM1* PREM :NOMBRE SOMME PREM :NOMBRE 1 SORTIE 1]
SI ET EGAL? :SOMMES "2 EGAL? :IMPRIM "O [VT SORTIE 6 ME 2 CT EC " CM1* PREM :PETIT SOMME PREM :GRAND 1 SORTIE 1]
FIN

POUR CM1* :S :S1
SOIT "T1 TEMPS
SI ET EGAL? :IMPRIM "O EGAL? :S :S1 [VT STOP]
SI EGAL? :S :S1 [STOP]
SI ET EGAL? :AFFICHE "O ET EGAL? :IMPRIM "N PLG? DER CURS 20 [VT FCURS [0 0] EC " ]
SI ET EGAL? :AFFICHE "O ET EGAL? :IMPRIM "O PLG? DER CURS 20 [COPIE SORTIE 6 VE CT .FCURS [0 0] 0 EC " ]
SI ET EGAL? :AFFICHE "O ET EGAL? :IMPRIM "N PLG? DER CURS 20 [VT]
EC PH [Somme :] :S
EC PH [Nombre de cm :] CM-A [0 0 0] [] 1
SOIT "T2 TEMPS - :T1
SOIT "T3 QUOT ENT :T2 3600
SOIT "T4 RESTE ENT :T2 3600
SOIT "T5 QUOT ENT :T4 60
SOIT "T6 RESTE ENT :T4 60
SI EGAL? :TMP "O [EC PH [Temps de calcul :]PH :T3 PH "h PH :T5 PH "mn PH :T6 "s]
EC "
RENDS CM1* :S + 1 :S1
FIN

POUR CM1æ :S :S1 ;;imprime uniquement le nombre de cm
FTCAR [2 2]
FCURS [30 10]
FCT 12
EC "ATTENTION
FTCAR [1 1]
FCT 15
FCURS [14 15]
EC [L'ordinateur fonctionne , prière de ne pas l'arrêter]
SORTIE 2
CM1* :S :S1
SORTIE 1
FIN

POUR CM-A :A :AA :C ;;D B A, C
SI PLG? DER :A :S [RENDS CM-A2 :C ]
SI PLG? PREM :A :S [RENDS CM-A PH SOMME 1 PREM SP :A SP SP :A PH :AA 0 :C]
SI PLP? :S SOMME DER :A PREM PH :AA :A [RENDS CM-A PH SOMME 1 PREM SP PH :AA :A DER :A 0 :C] ;;contrôle de :D
SI PLP? :S SOMME DER :A DER SD PH :AA :A [RENDS CM-A PH 0 PH 0 SOMME 1 DER PH :AA :A PH 0 0 :C] ;;contrôle de :B
SI PLP? :S SOMME PREM PH :AA :A SOMME PREM SP PH :AA :A DER PH :AA :A [RENDS CM-A PH SOMME 1 PREM SP PH :AA :A DER PH :AA :A 0 :C]
RENDS CM-M PH :AA :A 0 :C
FIN

POUR CM-A2 :C
SI EGAL? :AFFICHE "O [FCURS LISTE 0 :LI + 5]
RENDS :C - 1
FIN

POUR CM-M :A :M :C ;;M , P
SI PLG? :M :S [RENDS CM-A PH SOMME 1 PREM :A SP :A [] :C ]
SI PLP? :S SOMME :M SOMME PREM :A DER :A [RENDS CM-A PH SOMME 1 PREM :A SP :A [] :C]
RENDS CM-F :A :M 0 :C
FIN

POUR CM-F :A :M :F :C ;;F, K
SI PLG? :F :S [RENDS CM-M :A :M + 1 :C ]
SI PLG? 0 DIFF SOMME PREM :A :M :F [RENDS CM-M :A :M + 1 :C]
RENDS CM-G :A :M :F 0 :C
FIN

POUR CM-G :A :M :F :G :C ;;G, J N O
SI PLG? :G :S [RENDS CM-F :A :M :F + 1 :C ]
SI PLP? :S SOMME PREM :A SOMME :G :M [RENDS CM-F :A :M :F + 1 :C] ;;J
SI PLG? 0 DIFF SOMME PREM :A SOMME :G :M SOMME PREM SP :A :F [RENDS CM-G :A :M :F DIFF SOMME PREM SP :A :F SOMME PREM :A :M :C] ;;N
SI PLG? 0 DIFF SOMME DER :A SOMME DER SD :A :F SOMME :G :M [RENDS CM-F :A :M :F + 1 :C] ;;O
RENDS CM-H :A :M :F :G 0 :C
FIN

POUR CM-H :A :M :F :G :H :C ;;H, E L I
SI PLG? :H :S [RENDS CM-G :A :M :F :G + 1 :C ]
SI PLP? :S SOMME :F SOMME :G :H [RENDS CM-G :A :M :F :G + 1 :C] ;;E
SI PLG? 0 DIFF SOMME DER :A :M :H [RENDS CM-G :A :M :F :G + 1 :C] ;;L
SI PLG? 0 DIFF SOMME :F SOMME :G :H SOMME DER :A :M [RENDS CM-H :A :M :F :G DIFF SOMME DER :A :M SOMME :F :G :C] ;;I
SI EGAL? :AFFICHE "O [ RENDS IMP :A :M :F :G :H :C][RENDS CM-H :A :M :F :G :H + 1 :C + 1]
FIN

POUR IMP :A :M :F :G :H :C
RENDS IMP1 PH DER :A PH DER SD :A PH DIFF :S SOMME PREM :A SOMME PREM SP :A DER :A PH PREM :A PH DIFF :S SOMME :F SOMME :G :H PH :F PH :G PH :H PH DIFF SOMME :F SOMME :G :H SOMME DER :A :M PH DIFF :S SOMME PREM :A SOMME :G :M PH DIFF SOMME PREM :A :M :F PH DIFF SOMME DER :A :M :H PH :M PH DIFF SOMME PREM :A SOMME :G :M SOMME PREM SP :A :F PH DIFF SOMME DER :A SOMME DER SD :A :F SOMME :G :M DIFF :S SOMME DER :A SOMME PREM :A :M :C
FIN

POUR IMP1 :L :C
SOIT "CO PREM CURS
SOIT "LI DER CURS
EC PH [(] PH :C [)]
RENDS IMP10 PREM :L SP PH :L " :CO :LI + 1 1
FIN

POUR IMP10 :L2 :L3 :CO :LI :NO
SI VIDE? :L3 [RENDS IMP20 [] [] :CO + 4 :LI - 4 :NO]
SI :NO = 5 [RENDS IMP10 :L2 :L3 :CO - 12 :LI + 1 1]
FCURS LISTE :CO + DIFF 2 COMPTE :L2 :LI
EC :L2
RENDS IMP10 PREM :L3 SP :L3 :CO + 3 :LI :NO + 1
FIN

POUR IMP20 :L2 :L3 :CO :LI :NO
SI PLG? :CO 64 [RENDS IMP30 :L2 :L3 0 :LI + 6 :NO ]
RENDS IMP40 :L2 :L3 :CO :LI :NO
FIN

POUR IMP30 :L2 :L3 :CO :LI :NO
SI PLG? :LI 20 [RENDS IMP35 :L2 :L3 0 0 :NO]
RENDS IMP40 :L2 :L3 :CO :LI :NO
FIN

POUR IMP35 :L2 :L3 :CO :LI :NO
SI EGAL? :IMPRIM "O [COPIE VE CT ][VT EC "]
RENDS IMP40 :L2 :L3 0 1 :NO
FIN

POUR IMP40 :L2 :L3 :CO :LI :NO ;;Il faut toutes ces procédures pour une simple impression ?... ;-)
FCURS LISTE :CO :LI
RENDS CM-H :A :M :F :G :H + 1 :C + 1
FIN


CM ;;lance le programme automatiquement lorsque vous sortez de l'Editeur (^Q).


RETOUR page précédente

 Hit-Parade