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