Valid XHTML     Valid CSS2    

Listing du fichier matadj.php

 

00001     <?php
00002     #   # (gH)   -_-  matadj.php  ;  TimeStamp (unix) : 06 Août 2014 vers 16:06
00003     
00004     error_reporting
(E_ALL E_NOTICE ) ;
00005     
00006     ###################################################################################
00007     ###################################################################################
00008     
00009     echo 
"\n\nMatrice d'adjacence d'un graphe dont on connait les listes d'adjacence.\n\n" ;
00010     
00011     ###################################################################################
00012     ###################################################################################
00013     
00014     # aide éventuelle
00015     
00016     ###################################################################################
00017     
00018     if (!isset(
$argv[1])) {
00019     
00020       echo "\n" 
;
00021       echo "syntaxe : php matadj.php fichier_LISTADJ\n" 
;
00022       echo "exemple : php matadj.php ladj.txt où le fichier ladj.txt est:\n" 
;
00023       echo "\n" 
;
00024     
00025       echo "html head body \n" 
;
00026       echo "head  \n" 
;
00027       echo "body  \n" 
;
00028       echo "title \n" 
;
00029       echo "\n" 
;
00030     
00031       echo "Le graphe résultat est visible à l'adresse\n\n" 
;
00032       echo "   http://forge.info.univ-angers.fr/~gh/Pagsd/xhtml.png\n" 
;
00033     
00034       echo "\n" 
;
00035       exit(-1
) ;
00036     
00037     } # fin si
00038     
00039     ###################################################################################
00040     
00041     # lecture du fichier, on en déduit le nombre de sommets
00042     
00043     ###################################################################################
00044     
00045     $dbg 
/* mettre 1 pour les cours et pour affichage détaillé */
00046     
00047     $nomf 
$argv[1] ;
00048     if (!file_exists
($nomf)) {
00049       echo "\n" 
;
00050       echo "Fichier 
$nomf non vu. STOP.\n" ;
00051       echo "\n" 
;
00052       exit(-1
) ;
00053     } # fin si
00054     
00055     $nbsom    
= -1      # nombre de sommets
00056     $sommets  
= array() ; # tableau des noms de sommets
00057     $sommetsi 
= array() ; # tableau inverse des noms de sommets
00058     $listes   
= array() ; # tableau des listes d'adjacence
00059     $matadj   
= array() ; # matrice d'adjacence
00060     
00061     $ladj 
file_get_contents($nomf) ;
00062     
00063     # on découpe suivant \n et on passe en revue les lignes
00064     
00065     $tladj 
preg_split("/\n/",$ladj) ;
00066     
00067     if ($dbg
==1) { print_r($tladj) ; } ;
00068     
00069     $nbl 
;
00070     foreach ($tladj 
as $nums=>$liste) {
00071     
00072       if ($dbg
==1) { echo $nums => $liste \n" ; } ;
00073       $liste 
trim($liste) ;
00074       $nbl
++ ;
00075       if ($dbg
==1) { echo "\n liste numéro $nbl : $liste\n "; } ;
00076     
00077       # traitement de la liste si non vide
00078     
00079       if (
strlen($liste)>0) {
00080     
00081         # on convertit la liste en tableau
00082     
00083         $tdm 
preg_split("/\s+/",$liste) ;
00084         $noms 
$tdm[0] ;
00085     
00086         # si le premier sommet (l'origine) n'est pas connu, on l'ajoute
00087     
00088         if (!isset(
$sommetsi$noms])) {
00089           $nbsom
++ ;
00090           $sommets
[$nbsom]     = $tdm[0] ;
00091           echo "  sommet numéro "
.sprintf("%2d",1+$nbsom)." : ".$sommets[$nbsom]."\n"  ;
00092           $sommetsi
$tdm[0] ] = $nbsom ;
00093           $nums 
$nbsom ;
00094           $listes
[$nums] = array_slice($tdm,1,count($tdm)-1) ;
00095           if ($dbg
==1) {
00096             echo "   on initialise la liste de 
$noms en position $nums avec : ".implode(" ",$listes[$nums])."\n" ;
00097           } # fin si debug
00098         } else {
00099           # sinon, on récupère son numéro
00100           $nums 
$sommetsi$noms ] ;
00101           if ($dbg
==1) {
00102               echo " sommet 
$noms déjà vu, numéro ".sprintf("%2d",1+$nums)."\n"  ;
00103               echo " sa liste était "
.implode(" ",$listes[$nums])."\n" ;
00104               echo " et il faut ajouter "
.implode(" ",array_slice($tdm,1,count($tdm)-1))."\n" ;
00105           } # fin si debug
00106           $listes
[$nums] = array_merge($listes[$nums],array_slice($tdm,1,count($tdm)-1)) ;
00107           if ($dbg
==1) {
00108              echo " sa liste est donc "
.implode(" ",$listes[$nums])."\n" ;
00109           } # fin si debug
00110         
# fin si
00111     
00112         # on traite maintenant la liste courante des sommets (destination)
00113     
00114         foreach (
$listes[$nums] as $num => $sommet) {
00115     
00116          # on ajoute un sommet non vu
00117          if (!isset(
$sommetsi$sommet ])) {
00118             $nbsom
++ ;
00119             $sommets
[$nbsom]    = $sommet ;
00120             $sommetsi
[$sommet]  = $nbsom ;
00121             if ($dbg
==1) {
00122                echo "  sommet numéro "
.sprintf("%2d",1+$nbsom)." : ".$sommets[$nbsom]."\n"  ;
00123             } # fin si debug
00124             $listes
[$nbsom] = array() ;
00125          } ; # fin si
00126     
00127         
# fin pour chaque sommet
00128     
00129       
# fin si
00130     
00131     
# fin pour chaque liste
00132     
00133     if (
$dbg==1) { echo " voici les listes " print_r($listes) ; } ;
00134     
00135     ###################################################################################
00136     
00137     # initialisation de la matrice d'adjacence
00138     
00139     ###################################################################################
00140     
00141     # plus astucieux avec une ligne-tableau recopiée ?
00142     
00143     for (
$isom=0;$isom<=$nbsom;$isom++) {
00144       $matadj
[$isom] = array() ;
00145       for ($jsom
=0;$jsom<=$nbsom;$jsom++) {
00146           $matadj
[$isom][$jsom] = ;
00147       } # fin pour jsom
00148     
# fin pour isom
00149     
00150     ###################################################################################
00151     
00152     # remplissage de la matrice d'adjacence
00153     
00154     ###################################################################################
00155     
00156     for (
$isom=0;$isom<=$nbsom;$isom++) {
00157           $liste 
$listes[$isom] ;
00158          if ($dbg
==1) { echo " sommet $isom : liste => \n" print_r($liste) ; } ;
00159           foreach ($liste  
as $sommet) {
00160              if ($dbg
==1) { echo "    $isom : $sommet \n" ; } ;
00161              $jsom 
$sommetsi$sommet ] ;
00162              $matadj
$isom][ $jsom ] = ;
00163           } # fin pour chaque liste
00164     
# fin pour isom
00165     
00166     echo 
"\nVoici la matrice d'adjacence associée au fichier $nomf :\n\n" ;
00167     
00168     echo "num nom    " 
;
00169     for ($isom
=0;$isom<=$nbsom;$isom++) {
00170       echo sprintf
("%2d ",1+$isom) ;
00171     } # fin pour isom
00172     echo 
"\n" ;
00173     
00174     for ($isom
=0;$isom<=$nbsom;$isom++) {
00175       echo sprintf
(" %2d ",1+$isom) ;
00176       echo substr
($sommets[$isom]."         ",0,7) ;
00177       for ($jsom
=0;$jsom<=$nbsom;$jsom++) {
00178           echo " "
.$matadj[$isom][$jsom]." " ;
00179       } # fin pour jsom
00180       echo 
"\n" ;
00181     } # fin pour isom
00182     echo 
"\n" ;
00183     
00184     ###################################################################################
00185     
00186     # création du fichier DOT
00187     
00188     ###################################################################################
00189     
00190     $ftmp  
"dot_tmp.gv.txt" ;
00191     $fh    
fopen($ftmp,"w") or die(" impossible d'écrire le fichier $ftmp. Stop\n.") ;
00192     fputs
($fh,"digraph matrice {\n") ;
00193     
00194     for ($isom
=0;$isom<=$nbsom;$isom++) {
00195       $liste 
$listes[$isom] ;
00196       foreach ($liste 
as $sommet) {
00197            $lig 
"   ".utf8_encode($sommets[$isom])." -> ".utf8_encode($sommet)." ;\n" ;
00198            fputs
($fh,$lig) ;
00199            if ($dbg
==1) { echo $lig ; } ;
00200       } # fin pour chaque sommet
00201     
# fin pour isom
00202     
00203     fputs
($fh,"}\n") ;
00204     fclose
($fh) ;
00205     
00206     $fpng 
"dot_tmp.gv.png" ;
00207     
00208     ###################################################################################
00209     
00210     # exécution du fichier DOT
00211     
00212     ###################################################################################
00213     
00214     if (
$dbg==1) { system("cat $ftmp") ; } ;
00215     $cmd 
" dot -T png $ftmp -o $fpng " ;
00216     if ($dbg
==1) { echo "\n $cmd \n" ; } ;
00217     system
($cmd) ;
00218     
00219     
00220     ###################################################################################
00221     
00222     echo 
"\n\n -- fin normale de matadj.php\n\n" ;
00223     ?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)