|
|
|
|
Bonjour,
Je cherche désespérément de l'aide sur un sujet:
Voila, j'ai créé une fonction qui me rempli un tableau 2 dimension avec comme prmeier paramètre un chiffre et en deuxième une lettre. Cette fonction doit me retourner le tableau 2 dimension afin que je le repasse en paramètre d'entré dans une autre fonction mais cela ne marche pas!!
Je n'arrive déjà pas à afficher le tableau lorsque je fais un return de ma première fonction!!
Je vous mets mon bout de code et si quelqu'un à la solution, ça serait génial!
en vous remerciant
print "Veuillez entrer un motif \n";
$motif=<>;
chomp($motif);
$m=length($motif);
ma première fonction:
sub Calcul_Fonction_Transition {
$n= $_[0];
@sigma=('a','b','c');
$m=length($n);
for ($q=0 ; $q <= $m ; $q++) {
foreach $mot (@sigma) {
if ($m+1 < $q+2 ) {
$k=$m+1;
}else {
$k=$q+2;
}
do {
$k=$k-1;
$pk=substr($n,0,$q).$mot;
$lpk=length($pk);
} until ((substr($n,0,$k))eq(substr($pk,$lpk-$k,$k)) or ($k==0)) ;
$delta[$q][$mot]=$k;
print "$delta[$q][$mot] ";
}
print"\n";
}
return (@delta);
}
# appel par invocation de la fct suivi de la liste des valeurs des paramètres effectifs
@delt=Calcul_Fonction_Transition($motif);
print "voici delt: @delt\n";
ma deuxième fonction
sub Recherche_Automate_Fini{
$text=$_[0];
@delta=$_[1];
$m=$_[2];
$n=length($text);
$q=0;
for ($i=1;$i<=$n;$i++){
$lettre=substr($text,$i-1,1);
print "voici le tableau: $delta[$q][$lettre]\n";
$q=$delta[$q][$lettre];
if ($q==$m){
$s=$i-$m;
print "le motif apparait avec le decalage $s \n";
}
}
}
print "Veuillez entrer un texte \n";
$texte=<>;
chomp($texte);
@liste=($texte,@delt,$m);
&Recherche_Automate_Fini(@liste);
merci encore pour l'aide que vous m'apporterez
Configuration: Windows XP Internet Explorer 7.0
Salut,
&Recherche_Automate_Fini($text,\@delt,$m);Je prefererais de m'expliquer exactement ce que tu veux faire, puisque j'avoue que ton code ne'est pas trop parlant :-( Donc si tu peux me donner une exemple concret de ce que tu veux obtenir, peut être je pourrai écrire les fonctions. A toi. lami20j |
Je te remercie pour l'info de comment on passe un tableau 2D en paramètre dans une fonction.
|
Le mecanisme des sous-programmes je le connais ainsi que les structures de données.
|
En fait un entrée de ma première fonction j'ai un mot et en sortie le tableau 2D en question qui se présente sous cette forme:
|
Quand on essaie d'accèder à un élément de ton tableau de tableaux je dois faire $tableau[$i][$j]
|
Pour comprendre ce que je veux dire voici un test, pour te monter l'erreur d'interprétation que tu fait
#!/usr/bin/perl
use warnings;
print "Veuillez entrer un motif \n";
$motif=<>;
chomp($motif);
$m=length($motif);
sub Calcul_Fonction_Transition {
$n= $_[0];
@sigma=('a','b','c');
$m=length($n);
for ($q=0 ; $q <= $m ; $q++) {
foreach $mot (@sigma) {
if ($m+1 < $q+2 ) {
$k=$m+1;
}else {
$k=$q+2;
}
do {
$k=$k-1;
$pk=substr($n,0,$q).$mot;
$lpk=length($pk);
} until ((substr($n,0,$k))eq(substr($pk,$lpk-$k,$k)) or ($k==0));
$delta[$q][$mot]=$k;
# print "$delta[$q][$mot] ";
print "q = $q - mot = $mot - $k => $delta[$q][$mot]\n";
}
# print"\n";
}
return (@delta);
}
# appel par invocation de la fct suivi de la liste des valeurs des paramÃ~Cštres effectifs
# $tableau[$i][$j]@delt=Calcul_Fonction_Transition($motif);
#print "voici delt: @$_\n" foreach @delt;
L'exécutionlami20j@debian:~/trash$ perl ccm.pl Name "main::delt" used only once: possible typo at ccm.pl line 33. Veuillez entrer un motif ababaca Argument "a" isn't numeric in array element at ccm.pl line 24, <> line 1. q = 0 - mot = a - 1 => 1 Argument "b" isn't numeric in array element at ccm.pl line 24, <> line 1. q = 0 - mot = b - 0 => 0 Argument "c" isn't numeric in array element at ccm.pl line 24, <> line 1. q = 0 - mot = c - 0 => 0 q = 1 - mot = a - 1 => 1 q = 1 - mot = b - 2 => 2 q = 1 - mot = c - 0 => 0 q = 2 - mot = a - 3 => 3 q = 2 - mot = b - 0 => 0 q = 2 - mot = c - 0 => 0 q = 3 - mot = a - 1 => 1 q = 3 - mot = b - 4 => 4 q = 3 - mot = c - 0 => 0 q = 4 - mot = a - 5 => 5 q = 4 - mot = b - 0 => 0 q = 4 - mot = c - 0 => 0 q = 5 - mot = a - 1 => 1 q = 5 - mot = b - 4 => 4 q = 5 - mot = c - 6 => 6 q = 6 - mot = a - 7 => 7 q = 6 - mot = b - 0 => 0 q = 6 - mot = c - 0 => 0 q = 7 - mot = a - 1 => 1 q = 7 - mot = b - 2 => 2 q = 7 - mot = c - 0 => 0Explication Tu vois bien le message de warning Argument "a" isn't numeric in array element at ccm.pl line 24, Ben la ligne 24 c'est celle ci (voir en gras) lami20j@debian:~/trash$ sed '24!d' ccm.pl
$delta[$q][$mot]=$k;
En bref Perl te dit que $mot ne peux pas être un indice pour le tableau puisqu'il n'est pas numerique
Donc ton algo, que tu ne l'a toujours pas dit ne peux pas fonctionner. Tu m'as parler de ce que fait la 1ère fonction, ben je ne suis pas convaincu vu que l'algo n'est pas bon. Pour la 2ème partie tu ne m'as rien dit. Voici un exemple de ce que j'ai besoin de savoir (dans l'exemple tu vois le script ainsi que explication de ce qu'il fait) perl trier un tableau sans sort lami20j |
Je veux bien t'expliquer mais il s'agit d'un cours de modélisation du langage!
|
Salut,
lami20j@debian:~$ cat automate.pl
#!/usr/bin/perl
print "Veuillez entrer un motif \n";
$motif=<>;
chomp($motif);
$m=length($motif);
sub Calcul_Fonction_Transition {
$n= $_[0];
@sigma=('a','b','c');
$m=length($n);
for ($q=0 ; $q <= $m ; $q++) {
foreach $mot (@sigma) {
if ($m+1 < $q+2 ) {
$e1 = $k=$m+1;
}else {
$e2 = $k=$q+2;
}
do {
$k=$k-1;
$pk=substr($n,0,$q).$mot;
$lpk=length($pk);
} until ((substr($n,0,$k))eq(substr($pk,$lpk-$k,$k)) or ($k==0)) ;
push @{$delta[$q]},$k;
}
unshift @{$delta[$q]},$q;
}
return @delta;
}
@delt = Calcul_Fonction_Transition ($motif);
print "voici le tableau\n";
for (@delt) {
print "@{$_}\n";
}
lami20j@debian:~$ perl automate.pl
Veuillez entrer un motif
ababaca
voici le tableau
0 1 0 0
1 1 2 0
2 3 0 0
3 1 4 0
4 5 0 0
5 1 4 6
6 7 0 0
7 1 2 0
Maintenant tu as le tableau. Je pense que tu dois commencer expliquer la 2ème partie ;-)) Explique bien, et je vais comprendre ;-DD lami20j |
Oula tu m'impressionnes!!voila c'est ce que je cherchais pour le début, comment créer un tableau double entré!en fait tu dis qu'une ligne du tableau est une liste et tu ajoute soit à la fin soit au début!fallait y penser, merci!
|
Salut,
#!/usr/bin/perl
print "Veuillez entrer un motif \n";
$motif=<>;
chomp($motif);
$m=length($motif);
sub Calcul_Fonction_Transition {
$n= $_[0];
@sigma=('a','b','c');
$m=length($n);
for ($q=0 ; $q <= $m ; $q++) {
foreach $mot (@sigma) {
if ($m+1 < $q+2 ) {
$e1 = $k=$m+1;
}else {
$e2 = $k=$q+2;
}
do {
$k=$k-1;
$pk=substr($n,0,$q) . $mot;
} until ((substr($n,0,$k))eq(substr($pk,$lpk-$k,$k)) or ($k==0)) ;
push @{$delta[$q]},$k,$pk;
}
unshift @{$delta[$q]},$q;
}
return @delta;
}
@delt = Calcul_Fonction_Transition ($motif);
print "voici le tableau\n";
for (@delt) {
print "@{$_}\n";
}
Le résultat
lami20j@debian:~$ perl automate.pl
Veuillez entrer un motif
ababaca
voici le tableau
0 1 a 0 b 0 c
1 1 aa 2 ab 0 ac
2 3 aba 0 abb 0 abc
3 1 abaa 4 abab 0 abac
4 5 ababa 0 ababb 0 ababc
5 1 ababaa 4 ababab 6 ababac
6 7 ababaca 0 ababacb 0 ababacc
7 1 ababacaa 2 ababacab 0 ababacac
Ensuite tu utilise le tableau pour chercher le mot correspondant ainsi que le nombre de lettre lami20j |
Re!
|
Je te conseil de regardé ici automate fini en C et d'adapter en Perl.
|