IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Algorithme de recherche de sous-séquence dans une séquence ADN


Sujet :

Pascal

  1. #21
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    J'ai réussi à faire entrer à l'utilisateur la séquence et l'extrait à tester, mais ensuite quand je tente d'appliquer la fonction à ces deux séquences celle-ci ne me retourne rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Program essaiii;
     
    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 beaucoup !

  2. #22
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Gie,
    Citation Envoyé par Inf0phile Voir le message
    Je me suis renseigné pour "record", si j'ai bien compris à une variable on associe une "sous-variable" qu'on appelle champs. En particulier ici à chaque séquence on associe sa longueur.
    Oui, c'est le principe même des record : associer des données qui le sont logiquement par le sujet qu'on traite.
    Dans le cas de ton programme, un tableau contenant une séquence a une longueur maximale fixe, ET une longueur effective, qui est celle que les traitements doivent prendre ne compte, il est donc naturel de les regrouper, afin de toujours les manipuler ensemble.

    Citation Envoyé par Inf0phile Voir le message
    Et effectivement la boucle For c'est pas terrible si par exemple pour IndiceExtrait=1 on ne trouve pas de lettre correspondante dans Séquence (je reprends les notations d'Alcatiz c'est plus clair c'est vrai). Peut-être peut-on utiliser un "break" pour stopper la boucle si on ne trouve pas de lettre dans la Séquence ?
    Oui, on pourrait, mais il est plus "propre" de faire une boucle while qui va tourner tant que certaines conditions l'y autorisent (par exemple, on doit s'arrêter quand on a atteint la fin de la séquence OU la fin de la sous-séquence, OU qu'on a déjà trouvé la présence de la sous-séquence)

    Citation Envoyé par Inf0phile Voir le message
    Enfin je n'ai jamais manipulé de boolean pour les fonctions, donc ici si je ne me trompe pas la fonction retourne "vrai" si IndiceExtrait = LgExtrait c'est-à-dire si la boucle n'a pas été stoppée ?
    C'est bien ça.

  3. #23
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Merci pour ces précisions droggo !

    Il y a quelque chose que je ne comprends pas bien dans la fonction d'Alcatiz :

    if Extrait[IndiceExtrait] = Sequence[IndiceSequence] alors on incrémente.

    Mais au départ les deux indices sont à 1, donc pour incrémenter il faudrait que la première base des deux séquences soit identique non ? Et ce n'est pas forcément ce que l'on veut ?

    J'ai surement tord mais j'aimerais comprendre

  4. #24
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 968
    Points : 59 705
    Points
    59 705
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Inf0phile Voir le message
    Il y a quelque chose que je ne comprends pas bien dans la fonction d'Alcatiz :

    if Extrait[IndiceExtrait] = Sequence[IndiceSequence] alors on incrémente.

    Mais au départ les deux indices sont à 1, donc pour incrémenter il faudrait que la première base des deux séquences soit identique non ? Et ce n'est pas forcément ce que l'on veut ?

    J'ai surement tord mais j'aimerais comprendre
    L'indice dans la séquence est incrémenté à chaque itération de la boucle tandis que celui de l'extrait ne l'est que si la base qui lui correspond est identique à la base dans la séquence. Tourné autrement : on s'arrête à chaque base de l'extrait d'ADN et on avance dans la séquence jusqu'à trouver une base identique. Si on arrive à la fin de la séquence alors qu'on est pas à la fin de l'extrait, c'est que l'extrait n'est pas inclus dans la séquence.

  5. #25
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    D'accord je comprends mieux tourné de cette façon

    Mais sauriez-vous me dire pourquoi mon test (/votre fonction) ne donne rien ? (Alors qu'aucune erreur n'est signalée à la compilation).

    Merci encore !

  6. #26
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Gio,

    Vu ton programme pour lire une séquence, je suppose que maintenant tu comprends pourquoi il vaudrait mieux utiliser des string :

    - Une seule lecture à faire,
    ReadLn(chaine)

    - et la longueur est ensuite obtenue par
    longueur := Length(chaine)


  7. #27
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Oui vous avez raison, mais l'utilisation de array est imposée par l'énoncé

    Une idée pourquoi la fonction ne retourne rien ?

    PS : Ca veut dire quoi les Gio ? ...etc

  8. #28
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Dae,
    Citation Envoyé par Inf0phile Voir le message
    Oui vous avez raison, mais l'utilisation de array est imposée par l'énoncé
    Tu pourrais contourner en lisant une chaîne, et en faisant une procédure pour initialiser ton tableau à partir de cette chaîne. Ça resterait plus simple que ton code.

    Citation Envoyé par Inf0phile Voir le message
    PS : Ca veut dire quoi les Gio ? ...etc
    Je l'ai déjà écrit plusieurs fois (en tout cas, au moins une fois), mais c'est chaque fois modéré "hors sujet".

    En gros, c'est ma manière de dire Bonjour.

  9. #29
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    C'est bon j'ai trouvé d'où vient le problème, j'avais oublié d'afficher le résultat tout simplement ^^

    Je vous remercie à tous les deux pour votre patience

    Gio !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/01/2014, 22h01
  2. Création d'une séquence dans une transaction
    Par gangsoleil dans le forum PL/SQL
    Réponses: 2
    Dernier message: 16/01/2013, 09h24
  3. Réponses: 16
    Dernier message: 02/08/2012, 22h00
  4. créer une séquence dans une table déjà remplie
    Par dams78 dans le forum Oracle
    Réponses: 1
    Dernier message: 17/03/2010, 12h25
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo