Tableaux à 2 dimensions en Ruby


#1

Je suis en train d’essayer le langage Ruby,
c’est proche des autres langages scripts comme Perl, Python ou Haskell, et il est implanté d’office dans Linux Debian, autant en profiter. Le truc c’est de bien mettre l’extension .rb au script, et ensuite on peut le lancer avec la commande ruby monScript.rb, ou directement ./monScrpit.rb si on le met en executable (chmod).

Mon premier programme Ruby est donc un programme d’algorithme de Floyd. Le principe est simple, pour une matrice carré (M) de n colonnes, l’algorithme de Floyd est (à partir de 1, mais dans le programme il faudra partir de 0)

C’est simple comme algo.

Le problème, c’est que pour travailler sur les matrices, il nous faut imperativement des tableaux à 2 dimensions.
En Ruby, un tableau en 2 dimensions deviens Tab[[x1, y2],[x2, y2]] par exemple.
Bon.
Ben voici mon programme Floyd.rd actuel qui marche pour la saisie de la matrice :

[quote]#! /usr/bin/ruby

puts "*** dimensions de la matrice initiale ***"
print "Entrez le nombre de sommets correspondants au graph de la matrice initiale : "
lignes = gets.chomp.to_i
colonnes = lignes
print “Dimensions de la matrice initiale “,lignes,“x”,colonnes,”\n\n”

puts “*** initialisation de la matrice initiale ***“
mat=[[]]
for incLig in (0…lignes-1)
mat[incLig]=[]
for incCol in (0…colonnes-1)
print “Entrez la valeur de (x”, incLig+1,”, y”, incCol+1,") : "
mat[incLig]+=[[gets.chomp.to_i]]
end
end

puts "\n*** valeurs de la matrice initiale ***“
i=0
while i < mat.length
j=0
while j<mat[i].length
print mat[i][j],” "
j += 1
end
print "\n"
i+=1
end
[/quote]
Jusque là, ça fonctionne.
Maintenant, quand je rajoute l’algo, ça plante parcequ’au lieu d’ajouter les valeurs de la matrice, il ajoute les champs (et non les valeurs).
Pour l’instant, ca devient

J’ai passé encore une nuit blanche (pas uniquement dessus)… je fatigue là, alors si quelqu’un pouvait s’y interresser, ce serait sympa, merci.


#2

Eureka, j’ai trouvé.

Pour faire des opérations sur des tableaux à 2 dimensions (et plus), il suffit d’utiliser la fonction membre at(), qui va pointer vers la valeur de la cellule.

Par exemple :

C’est bizarre qu’il faille ajouter encore un at(0), mais sans ça l’interpreteur Ruby prend en compte l’array, et non la valeur.

Une remarque encore, pour affecter une valeur à une cellule du tableau, il faut la mettre entre crochets, ex :

Voilà. J’ai fini le programme, ça marche bien maintenant. :slightly_smiling:
Encore 2, 3 autres, et j’essaye l’haskell, par curiosité. :smiley:


#3

Ouaip, c’est vraiment pas le top pour les tableaux à 2 dimensions Ruby, car il utilise d’emblée des pointeurs vers les valeurs. Du coup, quand on fait une copie de tableau, on ne copie pas les valeurs mais seulement leurs adresses, et une modification de l’un modifie l’autre. Il y a bien une fonction pour la copie des valeurs, mais ça ne marche qu’avec des string, et non avec des chiffres.
C’est donc un langage plutôt orienté vers la manipulation de textes.


#4

Tu parles tout seul ? Moi aussi, ça m’arrive. :wink:

Comme je suis totalement incompétent pour te donner des réponses (ce que je fais pourtant), je vais plutôt te soumettre cette maxime :

En Info comme en Math, la solution est souvent une bonne nuit de sommeil.

Voilà c’était pas dur alors je :arrow_right: :mrgreen: