logo

Algorithme sous-séquence en Pascal


« Précédent 1 2 Suivant » +


calculatricesAlgorithme sous-séquence en Pascal

#msg1696224 Posté le 29-02-08 à 21:18
Posté par Profilinfophile infophile

Bonsoir

Citation :
Soit v=[v_0,v_1,\cdots,v_{n-1}] un vecteur à éléments entiers naturels. On veut réordonner ce vecteur de sorte que tous les entiers v_i pairs soient placés en tête et tous les v_i impairs en queue, l'ordre relatif des éléments étant conservé à l'intérieur de chaque groupe


J'ai essayé mais ça n'a pas l'air de fonctionner (alors que le compilateur ne signale pas d'erreurs) :

Citation :
Program tri;

uses dos,crt;

Const n=10;

Type vecteur=array[0..n] of integer;

var u:vecteur;

Procedure Permute(var v:vecteur; taille:integer);

var i,j,k:integer;
    w:vecteur;

begin
j:=0;
     for i:=0 to taille do
     begin
          if v[i] mod 2 = 0 then
          begin
               w[j]:=v[i];
               j:=j+1;
          end;
     end;
     for i:=0 to taille do
     begin
          if v[i] mod 2 <> 0 then
          begin
               w[j]:=v[i];
               j:=j+1;
          end;
     end;
for k:=0 to taille do v[k]:=w[k];
end;

begin

initialisation(u,n); (*C'est une procédure qui génère aléatoirement un vecteur*)
writeln;
Permute(u,n);
writeln;
readln;

end.


Merci à ceux qui pourront m'aider
re : Algorithme sous-séquence en Pascal#msg1696289 Posté le 29-02-08 à 21:50
Posté par ProfilEric1 Eric1

bonjour


ca te donne quoi comme résultat? rien n'a changé dans le tri? ou ca a trié bizarrement?
re : Algorithme sous-séquence en Pascal#msg1696330 Posté le 29-02-08 à 22:03
Posté par Profilinfophile infophile

Bonjour Eric

Ca ne me tri rien du tout, à l'exécution on voit le vecteur initial s'afficher mais pas le vecteur trié
re : Algorithme sous-séquence en Pascal#msg1696356 Posté le 29-02-08 à 22:12
Posté par ProfilEric1 Eric1

bon. Je n'ai jamais codé en Pascal.


Ton raisonnement a l'air bon.


Mais je ne sais pas trop comment fonctionne le passage des parametres dans les procédures.
La procédure retourne t-elle quelquechose?
Lorsque tu appelles Permute sur le vecteur u, est-ce que u est modifié, ou seulement une copie?

Je pense que le probleme est de cet ordre.

As tu essayer d'afficher le vecteur à l'intérieur de la procédure?
re : Algorithme sous-séquence en Pascal#msg1696369 Posté le 29-02-08 à 22:16
Posté par Profilinfophile infophile

Merci de t'intéresser à mon problème

Les procédures ne retournent rien (à l'inverse des fonctions).

Lorsque j'appelle Permute sur u, oui u est modifié (normalement, là c'est pas le cas )

Et oui j'ai essayé d'afficher le vecteur mais le compilateur râle, apparemment avec ce type on ne peut pas écrire write(u);
re : Algorithme sous-séquence en Pascal#msg1696391 Posté le 29-02-08 à 22:27
Posté par ProfilEric1 Eric1

et si tu fais


for i:=0 to taille do
begin
write(v[i]);
end;
re : Algorithme sous-séquence en Pascal#msg1696392 Posté le 29-02-08 à 22:27
Posté par ProfilFractal Fractal

Salut Kévin et Eric

Que signifient les instructions writeln et readln ?
Je n'ai jamais non plus programmé en Pascal, donc c'est pas dit que je puisse t'aider
Sinon ta procédure de génération d'un vecteur aléatoire fonctionne correctement?

Fractal
re : Algorithme sous-séquence en Pascal#msg1696399 Posté le 29-02-08 à 22:29
Posté par ProfilEric1 Eric1

A mon avis ca écrit et va à la ligne (comme en java), mais ca écrit quoi? bonne question. le vecteur courant u?
re : Algorithme sous-séquence en Pascal#msg1696405 Posté le 29-02-08 à 22:31
Posté par ProfilFractal Fractal

Voui c'est pour ça, je trouve bizarre une fonction qui écrit mais qui ne prend aucun paramètre, comment elle peut savoir que c'est u qu'on veut écrire?
Et puis si cette fonction marche, pourquoi ne pas l'utiliser dans la procédure pour essayer de trouver ce qui plante.

Fractal
re : Algorithme sous-séquence en Pascal#msg1696415 Posté le 29-02-08 à 22:36
Posté par ProfilEric1 Eric1

writeln; doit juste sauter une ligne à mon avis
re : Algorithme sous-séquence en Pascal#msg1696443 Posté le 29-02-08 à 22:46
Posté par Profilinfophile infophile

Salut guillaume

Ca y est ça marche ! Le message de 22:27 d'eric était la solution, c'était pas grand chose finalement !

Merci à vous deux

J'aurai peut-être besoin de vos lumières, je continue à travailler sur le problème

PS : Ca a l'air de te plaire l'info guillaume
re : Algorithme sous-séquence en Pascal#msg1696444 Posté le 29-02-08 à 22:47
Posté par Profilinfophile infophile

Et oui writeln; ça saute une ligne
re : Algorithme sous-séquence en Pascal#msg1696455 Posté le 29-02-08 à 22:50
Posté par ProfilEric1 Eric1

content d'avoir pu t'aider
re : Algorithme sous-séquence en Pascal#msg1696477 Posté le 29-02-08 à 22:56
Posté par ProfilFractal Fractal

Voui, j'adore l'info ^^
J'avais déjà programmé avant, mais ça faisait longtemps que j'avais pas fait grand chose et là je suis entrain de redécouvrir la programmation (même si j'aurais préféré un autre langage que Caml...)

Fractal
re : Algorithme sous-séquence en Pascal#msg1696488 Posté le 29-02-08 à 22:58
Posté par ProfilEric1 Eric1

lol

moi cette année j'aurai fait C ,Java, PHP,SQL,UML,XML,shell...


mais jamais fait de pascal ni Caml
re : Algorithme sous-séquence en Pascal#msg1696516 Posté le 29-02-08 à 23:04
Posté par Profilbrice3168 brice3168

salut Kévin ca va ?
re : Algorithme sous-séquence en Pascal#msg1696876 Posté le 01-03-08 à 03:20
Posté par Profilhatimy hatimy

Bonsoir,
je ne connais pas le pascal, en revanche le Caml fait partie de notre vie de taupin ... Tu pourrais faire l'analogie :je nomme prog le programme
Let prog v =
let n= vect_length v
ans v'=make_vect 0 n
(*je crée vecteur qui contient 0 et de même longueur que v*)
and j=ref 0 (*j contiendra l'indice des impairs*)
ans i=ref 0 in (*i contiendra l'indice des pairs*) in
for k =0 to n-1 do
if v.(k) mod 2
re : Algorithme sous-séquence en Pascal#msg1696877 Posté le 01-03-08 à 03:23
Posté par Profilhatimy hatimy

zut erreur de frappe je reprend :
Let prog v =
let n= vect_length v
and v'=make_vect 0 n
(*je crée vecteur qui contient 0 et de même longueur que v*)
and j=ref n-1 (*j contiendra l'indice des impairs*)
ans i=ref 0 in (*i contiendra l'indice des pairs*) in
for k =0 to n-1 do
if v.(k) mod 2 = 0 then
v'.(i)<-v.(k);
i:=!i +1
else v'.(j)<- v.(k);
j:=!j-1;
done;
!v;;
re : Algorithme sous-séquence en Pascal#msg1696889 Posté le 01-03-08 à 07:23
Posté par ProfilFractal Fractal

hatimy -> Il ne peut pas y avoir plusieurs instructions dans un if, il faut que tu mettes des begin end. De plus t'as oublié quelques points d'exclamation
En prépa tout le monde n'apprend pas le Caml, dans le lycée de Kévin ils ont choisi le Pascal à la place.

Fractal
re : Algorithme sous-séquence en Pascal#msg1697559 Posté le 01-03-08 à 13:16
Posté par Profilhatimy hatimy

Begin
En effet, j'ai oublié l'exclamation avant le v', mais bon à 3h du mat on manque de vigilance ...
Par contre pour le coup du begin end, on m'a jamais appris ça, on m'a plutôt dit qu'on l'utilisait qu'on voulait définir une même variable dans un même programme ... grossomodo elles jouent le rôle de parenthèse ...
Et puis j'ai toujours cru qu'on n'enseignait que le Caml, vu le faible effectif des élèves qui composent avec le Pascal d'après ce qui est signalé dans les concours. Dans tous les cas j'aurais préféré le Pascal.
End
re : Algorithme sous-séquence en Pascal#msg1699721 Posté le 01-03-08 à 23:36
Posté par ProfilFractal Fractal

Si tu rentres le programme suivant, il ne passe même pas le compilateur :
Citation :
let test b =
  if b then
    print_endline "Vrai";
    print_endline "Vrai bis"
  else
    print_endline "Faux";
    print_endline "Faux bis";;


Pour que le if prenne en compte le fait qu'il y ait plusieurs instructions, il faut soit les encadrer de begin end :
Citation :
let test b =
  if b then
    begin    
      print_endline "Vrai";
      print_endline "Vrai bis"
    end
  else
    begin    
      print_endline "Faux";
      print_endline "Faux bis"
    end;;


soit les encadrer de parenthèses :
Citation :
let test b =
  if b then
    (print_endline "Vrai";
    print_endline "Vrai bis")
  else
    (print_endline "Faux";
    print_endline "Faux bis");;



D'autre part, moi aussi j'étais persuadé que tout le monde apprenait le Caml, mais visiblement non

Fractal
re : Algorithme sous-séquence en Pascal#msg1699751 Posté le 01-03-08 à 23:55
Posté par Profilinfophile infophile

Bonsoir

Je suis sur un autre problème, intéressant mais mon programme ne fournit rien (et encore une fois aucune erreur n'est signalée).

Citation :
But du problème : On possède deux séquences d'ADN formée des bases G,T,A,C. Soit Séquence celle dont la longueur est la plus grande et Extrait l'autre. On cherche à écrire un algorithme qui teste si Extrait est une sous-séquence de Séquence.

Pour fixer les idées, on dit que v est une sous-séquence de u si on retrouve les bases de v dans u et ceci dans le même ordre.

Exemple : u = GTACGTTA et v = GCTA alors on a bien v sous-séquence car u = GTACGTTA


Voilà mon code :

Citation :
Program genome;

uses dos,crt;

Type Seq=array[1..20] of char;

var i,j,LgSequence, LgExtrait : integer;
    Sequence, Extrait : Seq;
    baseseq, baseext : char;

Function EstSousSeq (LgSequence, LgExtrait : Integer; Sequence, Extrait : Seq) : Boolean;
Var IndiceSequence, IndiceExtrait : Integer;
Begin
  IndiceSequence := 1;
  IndiceExtrait := 1;
  while (IndiceExtrait <= LgExtrait) and (IndiceSequence <= LgSequence) do
    begin
      if Extrait[IndiceExtrait] = Sequence[IndiceSequence]
         then
           Inc(IndiceExtrait);
      Inc(IndiceSequence);
    end;
  EstSousSeq := (IndiceExtrait > LgExtrait);
End;

begin
     writeln('Entrez la longueur de la sequence');
     readln(LgSequence);
     writeln('Entrez la longueur de l extrait');
     readln(LgExtrait);
          for i:=1 to LgSequence do
          begin
               writeln('Entrez dans la sequence le terme ',i);
               readln(baseseq);
               Sequence[i]:=baseseq;
          end;
          for j:=1 to LgExtrait do
          begin
                writeln('Entrez dans l extrait le terme ',j);
                readln(baseext);
                Extrait[j]:=baseext;
          end;
     for i:=1 to Lgsequence do write(Sequence[i],' ');
     writeln;
     for j:=1 to LgExtrait do write(Extrait[j], ' ');
     writeln;
     EstSousSeq(LgSequence,LgExtrait,Sequence,Extrait);
     writeln;
     readln;
end.


Merci à la personne qui aura le courage d'y jeter un oeil
re : Algorithme sous-séquence en Pascal#msg1699763 Posté le 02-03-08 à 00:02
Posté par ProfilFractal Fractal

Salut Kévin
Je ne pourrai pas te corriger sur la syntaxe, mais l'algorithme me semble correct.
Ensuite il y a toujours quelque chose que je ne comprends pas, c'est comment tu es censé récupérer le résultat à la fin? Tu exécutes ta fonction mais il n'y a pas d'instruction d'affichage ou autre, si?
D'autre part, as-tu moyen de faire des fonctions récursives en Pascal? Bien que ton algorithme me semble parfaitement correct, il m'aurait semblé plus naturel de le faire en récursif.

Fractal
re : Algorithme sous-séquence en Pascal#msg1699774 Posté le 02-03-08 à 00:10
Posté par Profilinfophile infophile

Salut Guillaume

Je pensais que puisque c'était une fonction le résultat s'afficherait sans rien demander non ?

Et oui on peut faire du récursif en Pascal mais c'est quelque chose que je ne maitrise pas vraiment.
re : Algorithme sous-séquence en Pascal#msg1699784 Posté le 02-03-08 à 00:18
Posté par ProfilFractal Fractal

Citation :
Je pensais que puisque c'était une fonction le résultat s'afficherait sans rien demander non ?

Là, aucune idée, en Caml il n'y a pas de distinction entre procédures et fonctions, donc je ne peux pas t'en dire plus. Il me semble juste qu'une fonction renvoie un résultat, mais qu'il faut quand même faire un print si tu veux l'afficher. Moi je mettrais un truc du genre :
Citation :
if EstSousSeq(LgSequence,LgExtrait,Sequence,Extrait);
then
  writeln('C'est une sous-séquence, youpi !!');
else
  writeln('Ah bah non, c'est pas une sous-séquence, tant pis...');


Si tu ne maîtrise pas le récursif, pas de problème, ton algorithme itératif est très bien

Fractal
re : Algorithme sous-séquence en Pascal#msg1699785 Posté le 02-03-08 à 00:19
Posté par ProfilTony13 Tony13

il y a quelqu'un ??
re : Algorithme sous-séquence en Pascal#msg1699791 Posté le 02-03-08 à 00:21
Posté par ProfilFractal Fractal

Et tsé quoi, en Caml les noms des variables peuvent aller jusqu'à 16 millions de caractères
Promis, c'est tiré du manuel officiel de Caml ^^

Fractal
re : Algorithme sous-séquence en Pascal#msg1699796 Posté le 02-03-08 à 00:23
Posté par ProfilTony13 Tony13

escusez moi, mais il y a du monde là?
re : Algorithme sous-séquence en Pascal#msg1699799 Posté le 02-03-08 à 00:26
Posté par Profilinfophile infophile

Roh t'es génial Guillaume ça marche

Pour la peine je rend mon devoir avec :

Citation :
if EstSousSeq(LgSequence,LgExtrait,Sequence,Extrait);
then
  writeln('C'est une sous-séquence, youpi !!');
else
  writeln('Ah bah non, c'est pas une sous-séquence, tant pis...');




Merci t'assure, toujours là pour filer un coup de main
re : Algorithme sous-séquence en Pascal#msg1699802 Posté le 02-03-08 à 00:27
Posté par Profilinfophile infophile

16 millions de caractères le truc super utile

Oui tony il y a du monde
re : Algorithme sous-séquence en Pascal#msg1699804 Posté le 02-03-08 à 00:27
Posté par ProfilTony13 Tony13

Mais moi personne ne veut me filer un coup de main
re : Algorithme sous-séquence en Pascal#msg1699807 Posté le 02-03-08 à 00:28
Posté par ProfilTony13 Tony13

Ahhh enfait j'ai laissé un topic "Encadrement de fonction" et je n'ai pas de réponse...
re : Algorithme sous-séquence en Pascal#msg1699816 Posté le 02-03-08 à 00:32
Posté par Profilinfophile infophile

J'ai été voir

Sache qu'en général ce n'est pas autorisé d'aller sur d'autres topics pour demander de l'aide
re : Algorithme sous-séquence en Pascal#msg1699821 Posté le 02-03-08 à 00:33
Posté par ProfilFractal Fractal

De rien

(il gêne pas le point-virgule dans le if?)

Fractal
re : Algorithme sous-séquence en Pascal#msg1699824 Posté le 02-03-08 à 00:35
Posté par ProfilTony13 Tony13

ah d'accord je suis désolé, je ne savais pas trop comment faire...
re : Algorithme sous-séquence en Pascal#msg1699828 Posté le 02-03-08 à 00:38
Posté par Profilinfophile infophile

Guillaume > Si si je l'avais enlevé

Tu développes un msn en Ocaml alors ?

Tony > Pas grave
re : Algorithme sous-séquence en Pascal#msg1699835 Posté le 02-03-08 à 00:42
Posté par ProfilFractal Fractal

Voué ^^ J'essaye
On arrive à se parler entre deux ordis de la maison, c'est déjà ça, mais c'est que par le réseau local pour l'instant, je sais pas si ça marche pour deux ordinateurs connectés uniquement par internet, doit y avoir tous les pare-feux qui vont se réveiller pour empêcher les informations de passer

Fractal
re : Algorithme sous-séquence en Pascal#msg1699843 Posté le 02-03-08 à 00:44
Posté par Profilinfophile infophile

Et c'est balèse à coder ?

Ca me rappelle en MPI en seconde, on avait trouvé un truc pour se parler d'un ordi à l'autre sous ms dos ^^
re : Algorithme sous-séquence en Pascal#msg1699849 Posté le 02-03-08 à 00:48
Posté par ProfilFractal Fractal

Non, la partie gestion du réseau est facile, suffit de trouver les quelques commandes nécessaires, mais ça se fait facilement. Après faudra que je voie comment faire pour que chacun puisse parler n'importe quand, parce que la commande qui permet de récupérer ce que l'autre a écrit est bloquante, c'est à dire qu'il est impossible de faire autre chose pendant ce temps, c'est pas pratique.

Fractal
re : Algorithme sous-séquence en Pascal#msg1699955 Posté le 02-03-08 à 03:00
Posté par Profilhatimy hatimy

Re infophile,
Pour ton programme, moi je voudrais te proposer quelque chose un poil plus compliqué :
si on a deux séquences u et v représentées par des vecteurs, comment verifier
si v est dans u dans le sens où les bases qui constituent v doivent se succéder dans u.
exemple : u = GTACGTTA et v = ACGT alors v est incluse dans u.(le mot "inclus" je l'ai inventé ).
Tu comprend ce que je cherche ?
re : Algorithme sous-séquence en Pascal#msg1699957 Posté le 02-03-08 à 03:15
Posté par Profilhatimy hatimy

Ton programme me paraît long. Est ce dû au langage Pascal lui même ?
je propose ce qui suit :
Let sous-sequence u v =
(*on vérifiera si v est sous-séquence de u*)
let i =ref 0 (*indique l'indice d'un élément de v*)
ans n= vect_length v
and m = vect_length u
and b = ref True in
While !b do
   for j =0 to n-1 do
  i:=0
     while v.(!i)<>v.(j) do
      if !i < m then i:=!i+1 (*Fractal j'espère que c'est bon cette fois-ci *)
      else b:=False
     done
    done
done;
!b;;
re : Algorithme sous-séquence en Pascal#msg1700140 Posté le 02-03-08 à 11:04
Posté par Profilgui_tou gui_tou

Bonjour ^^

Citation :
Ca me rappelle en MPI en seconde, on avait trouvé un truc pour se parler d'un ordi à l'autre sous ms dos ^^


netsend hein ? Je me rappelle qu'en TD de phsique en première, on avait trouvé la commande
pour envoyer un message ... à tout le réseau (ie les 500 ordis du bahut )

Et sinon > Guigui, bravo
re : Algorithme sous-séquence en Pascal#msg1700453 Posté le 02-03-08 à 12:37
Posté par Profilinfophile infophile

hatimy > Dans ce cas c'est simple en utilisant un type string avec la fonction Pos

guitou > Oui
re : Algorithme sous-séquence en Pascal#msg1700587 Posté le 02-03-08 à 13:18
Posté par Profilhatimy hatimy

moi j'aimerais resté dans les données de ton vecteur et résoudre ce problème.
C'est quoi cette fonction Pos ?
re : Algorithme sous-séquence en Pascal#msg1700627 Posté le 02-03-08 à 13:33
Posté par Profilinfophile infophile

Regarde ici :

Cela dit ça doit pas être bien compliqué à programmer, on prend la première lettre de l'extrait on regarde si elle est dans la séquence et une fois trouvée on regarde si les lettres suivantes coincident avec le reste de l'extrait. Et on fait une boucle pour traiter les occurences.

re : Algorithme sous-séquence en Pascal#msg1700717 Posté le 02-03-08 à 14:05
Posté par Profilhatimy hatimy

Oui, là le coût du programme doit être grossomodo de l'ordre de np avec n la longueur de ta liste et p la longueur de ton mot (je trouve qu'il vaut dans le pire des cas p.(n-(p+1)/2) )
Je sais pas s'il peut y avoir une astuce pour avoir un coût moindre...
re : Algorithme sous-séquence en Pascal#msg1701479 Posté le 02-03-08 à 16:42
Posté par Profilinfophile infophile

Re-bonjour

J'ai de nouveau un tout petit problème :

Citation :
Une séquence w est sous-séquence commune maximale de u et v si w est sous-séquence de u et v, et de longueur maximale. On note L(i,j) la longueur d'une sous-séquence commune maximale aux mots u(i) = a1...ai et v(j) = b1...bj.

J'ai montré que 3$ \rm L(i,j)=\{1+L(i-1,j-1) si a_i=b_j\\max(L(i,j-1),L(i-1,j)) sinon


On veut une fonction qui donne la longueur maximale de cette sous-séquence commune. Alors voici l'algo que j'ai testé, il marche (presque) bien, il donne la longueur maximale - 1 et je ne vois pas d'où sort ce -1

Citation :
Function LongSSC(n,m:integer;u,v:Seq):integer;

Var i,j,k,l:integer;w:array[0..Nmax,0..Nmax] of integer;

Begin

for k:=0 to n do
begin
     for l:=0 to n do w[k,l]:=0;
end;

for i:=1 to n do
begin
     for j:=1 to m do
     begin
          if (u[i-1]=v[j-1]) then
             w[i,j]:=1+w[i-1,j-1]
          else
          begin
             if (w[i,j-1]<w[i-1,j]) then
                w[i,j]:=w[i-1,j]
             else
                w[i,j]:=w[i,j-1];
          end;  
     end;
end;
LongSSC:=w[n,m];
End;


Merci à celui qui verra le soucis
re : Algorithme sous-séquence en Pascal#msg1701575 Posté le 02-03-08 à 17:02
Posté par Profilhatimy hatimy

est ce que tu l'a fait récursivement ton programme ? Comment est ce qu'on déclare la récursivité en Pascal ?
re : Algorithme sous-séquence en Pascal#msg1701609 Posté le 02-03-08 à 17:10
Posté par Profilinfophile infophile

Non je n'ai pas fait de récursif, en plus ça ne fonctionne pas chez moi, par exemple j'ai essayé de trouver le bit p d'un nombre a en récursif et j'ai une erreur à la compilation :

Citation :
Function bit2(a,p : integer) : LongInt;

begin
if p>0 then bit2(a,p):=bit2(a div 2, p-1) else bit2(a,p):=a mod 2
end;


Et ça marque : Argument can't be assigned to
re : Algorithme sous-séquence en Pascal#msg1701621 Posté le 02-03-08 à 17:12
Posté par ProfilFractal Fractal

Citation :
for k:=0 to n do
begin
     for l:=0 to n do w[k,l]:=0;
end;

Pourquoi est-ce qu'il y a deux fois n?

D'ailleurs je rejoins hatimy, vu ce que tu as montré, une version récursive serait quand même plus jolie

Fracta

« Précédent 1 2 Suivant » +


Répondre à ce sujet

réservé Seuls les membres peuvent poster sur le forum !

Vous devez être connecté pour poster
attention Un modérateur est susceptible de supprimer toute contribution qui ne serait pas en relation avec le thème de discussion abordé, la ligne éditoriale du site, ou qui serait contraire à la loi.

  • Ce topic

    imprimer Imprimer
    réduire la tailleRéduire   /   agrandir la tailleAgrandir

    Pour plus d'options, connection connectez vous !
  • Fiches de maths



maths - prof de maths haut de pagehaut Retrouvez cette page sur ilemaths l'île des mathématiques
© Tom_Pascal & Océane 2012