Programme REXX pour les graphes
Copyright (gH)
/* Grundys.Rex : Hunault, Angers 93 (Heuristique, Licence Maths) */
/* # 1. Initialisations et lecture du fichier des arcs */
NbNiv = 0 /* Niveau courant puis nombre de niveaux */
NbArc = 0 /* Arc courant puis nombre d' arcs */
NbSom = 0 /* Sommet courant puis nombre de sommets */
NbSrestant = 0 /* nombre de sommets actuellement sans niveaux */
FichA = 'Grundys.Arc' /* Fichier des Arcs */
LigneT. = '' /* Ligne des Totaux */
Connec. = '' /* Matrice de connecticit_ */
Niveau. = '' /* Listes liées des éléments par niveaux */
NumS. = 0 /* Numéro des sommets */
call ConstruireMatC
/* la matrice de connectivité à partir du fichier des arcs */
call TotalColonne
/* initialise la Ligne des Totaux et nbrestant */
/* # 2. Détermination des niveaux par la méthode de Moucron */
do while nbSrestant > 0 /* nombre de Sommets restant */
call SupprimeSetCreeN
/* supprime les sommets isolés et crée les niveaux */
end /* fintant que nbSrestant > 0 */
/* # 3. Affichages des résultats */
say " Graphe orienté associé au fichier Grundy.Arc "
say " avec : " nbsom " sommet(s) " nbarc " arc(s) " nbniv " niveau(x) "
call affMconnec
exit
/* ## Sous Programmes */
ConstruireMatC: procedure expose ficha nbarc nbsom connec. nums.
if dosdir(ficha) = '' then do
say " le fichier " ficha " n'est pas vu..."
say " abandon du programme."
end
nomsom = ""
do while lines(ficha)
lignarc = linein(ficha)
parse var lignarc orig dest
nbarc = nbarc + 1
if pos(orig,nomsom) = 0 then do
nbsom = nbsom + 1
nomsom = nomsom orig
nums.nbsom = orig
end
if pos(dest,nomsom) = 0 then do
nbsom = nbsom + 1
nomsom = nomsom dest
nums.nbsom = dest
end
norig = wordpos(orig,nomsom)
ndest = wordpos(dest,nomsom)
connec.norig.ndest = 1
end
return
TotalColonne: procedure expose nbsom connec. nums. lignet. nbSrestant nbniv
if nbniv = 0 then nbSrestant = nbsom
do so=1 to nbsom
somcol = 0
do sd=1 to nbsom
if connec.sd.so = 1 then somcol = somcol + connec.sd.so
end
lignet.so = somcol
end
return
SupprimeSetCreeN: procedure expose nbsom lignet. nbSrestant nbniv nums.
connec. niveau.
nbniv = nbniv + 1
niveau.nbniv = ""
totc. = 0
do s=1 to nbsom
if lignet.s = 0 then do
niveau.nbniv = niveau.nbniv nums.s
do sc=1 to nbsom
if connec.s.sc = 1 then do
totc.sc = totc.sc + 1
end
end
nbSrestant = nbSrestant - 1
lignet.s = -1
end
end
do s=1 to nbsom
lignet.s = lignet.s - totc.s
end
call affLignet
return
affMconnec: procedure expose connec. nums. nbsom nbniv niveau.
call charout , " "
do s=1 to nbsom
call charout , " "nums.s" "
end
say " Niveaux "
do so=1 to nbsom
nso = nums.so
call charout , nso " "
do sd=1 to nbsom
if connec.so.sd = 1
then call charout , " 1 "
else call charout , " "
end
if so <= nbniv
then say " " format(so,3) " : " niveau.so
else say
end
return
affLignet: procedure expose nbniv lignet. nbsom
call charout , " niveau " nbniv " : "
do s=1 to nbsom
call charout , format(lignet.s,3)
end
pull .
return