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

Turbo Pascal Discussion :

Exercice de bio-informatique


Sujet :

Turbo Pascal

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Exercice de bio-informatique
    Salut tout le monde ;
    voilà cet exercice très intéressant :
    Une séquence adn ne contient que les caractères (a,t,c,g).
    1. Écrire une fonction valide qui prend une chaîne en paramètre, et renvoie true si la chaîne contient une chaîne adn et false sinon.
    2. Écrire une fonction cherche_base qui retourne le rang où apparaît pour la première fois la base représentée par un caractère dans la séquence adn, tous deux passés en paramètre. Si la base n'apparaît pas, la fonction devra renvoyer -1 pour indiquer une erreur.

    Exemples : cherche_base('attgcc','c'); retourne 5 et cherche_base('gcctt','a'); retourne -1.
    Voilà ce que j'ai pu faire :
    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
     
    program heh;
    uses crt;
    var d:string; k:boolean; x:char; p:integer;
    function valide(s:string):boolean;
    var i:integer;
    begin
    valide:=true;
    for i:=1 to length(s) do begin
    if (s[i]<>'a') and (s[i]<>'g') and (s[i]<>'c') and (s[i]<>'t') then
    valide:=false;
    end;
       end;
    function cherche_base(s:string;l:char):integer;
    var i,m,o,w,q:integer;
    m:=0,o:=0;w:=0;q:=0;
    for i:=1 to length(s) do begin
    if s[i]='a' then m:=i;
    if s[i]='c' then o:=i;
    if s[i]='g' then w:=i;
    if s[i]='t' then q:=i;
    end;
    cherche_base:=i;
    end;
    begin
    clrscr;
    writeln('donner votre chaine'); readln(d);
    k:=valide(d);
    writeln(k);
    write('donner le char'); readln(x);
    p:=cherche_base(d,x);
    write(p);
    readln;readln;
    Et voilà, je n'arrive pas à faire la deuxième question ; j'ai essayé mais vous voyez que c'est faux, il donne toujours la position 6.
    J'ai besoin de votre aide.

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    function cherche_base(s:string;l:char):integer;
    var i,m,o,w,q:integer;
    ??? BEGIN ???
    m:=0,o:=0;w:=0;q:=0;
    for i:=1 to length(s) do begin
    if s[i]='a' then m:=i;
    if s[i]='c' then o:=i;
    if s[i]='g' then w:=i;
    if s[i]='t' then q:=i;
    end;
    cherche_base:=i;
    end;
    C'est tout à fait normal que cela te renvoie toujours la longueur de la chaine entrée puisque tu affectes à la fonction le nombre i après une boucle For....Do. Tu dois savoir qu'à la fin de celle-ci, i vaut la longueur de la chaine.
    Autre remarque : Avant tout traitement dans une procédure ou fonction et après déclaration des variables(si besoin est), il faut obligatoirement mettre Begin, ce que tu n'a pas fait. D'où je me pose la question : Comment tu as pu compiler dans ce cas sauf si tu n'as pas fait un bon copier/coller en transmettant ton code.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kia,

    À quoi j'ajoute : prends tout de suite l'habitude de mettre ton code en forme (indentation, aérer avec des lignes vides ...),

    donner des noms explicites aux variables, constantes, fonctions...

    Voici un exemple avec ton code (sauf pour les noms ), corrigé pour les begin et end:
    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
    program heh;
     
    uses crt;
     
    var d:string; k:boolean; x:char; p:integer;
     
    function valide(s:string):boolean;
    var i:integer;
    begin
        valide:=true;
        for i:=1 to length(s) do begin
            if (s[i]<>'a') and (s[i]<>'g') and (s[i]<>'c') and (s[i]<>'t') then
                valide:=false;
        end;
    end;
     
    function cherche_base(s:string;l:char):integer;
    var i,m,o,w,q:integer;
    begin
        m:=0,o:=0;w:=0;q:=0;
        for i:=1 to length(s) do begin
            if s[i]='a' then m:=i;
            if s[i]='c' then o:=i;
            if s[i]='g' then w:=i;
            if s[i]='t' then q:=i;
        end;
        cherche_base:=i;
    end;
     
    begin
        clrscr;
        writeln('donner votre chaine'); readln(d);
        k:=valide(d);
        writeln(k);
        write('donner le char'); readln(x);
        p:=cherche_base(d,x);
        write(p);
        readln;readln;
    end.
    Et voici ce qu'aurait donné le code sans la correction pour les begin et end, mais indenté "correctement":
    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
     
    program heh;
     
    uses crt;
     
    var d:string; k:boolean; x:char; p:integer;
     
    function valide(s:string):boolean;
    var i:integer;
    begin
        valide:=true;
        for i:=1 to length(s) do begin
            if (s[i]<>'a') and (s[i]<>'g') and (s[i]<>'c') and (s[i]<>'t') then
                valide:=false;
        end;
    end;
     
    function cherche_base(s:string;l:char):integer;
    var i,m,o,w,q:integer;
    m:=0,o:=0;w:=0;q:=0;
    for i:=1 to length(s) do begin
        if s[i]='a' then m:=i;
        if s[i]='c' then o:=i;
        if s[i]='g' then w:=i;
        if s[i]='t' then q:=i;
    end;
    cherche_base:=i;
    end;
    clrscr;
    writeln('donner votre chaine'); readln(d);
    k:=valide(d);
    writeln(k);
    write('donner le char'); readln(x);
    p:=cherche_base(d,x);
    write(p);
    readln;readln;
    On voit immédiatement qu'il y a des problèmes, puisqu'on ne peut pas faire une indentation correcte dès qu'il manque des éléments.

    Ça n'a l'air de rien, mais la présentation est primordiale, pour toi et pour ceux qui sont amenés à lire ton code, ou même à le reprendre pour le développer, et il faut en prendre l'habitude très tôt, après on le fait machinalement.
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut,

    Pour commencer, potasser un peu les docs, en particulier celle du langage, ne fait pas de mal...

    Après une bonne lecture des fonctions portant sur les chaînes, la deuxième partie de ton exercice est d'une simplicité enfantine, la fonction Pos() fait presque tout le travail, il ne reste qu'à aménager la valeur de retour de Pos (qui retourne 0 en cas d'échec de la recherche). Une autre solution consiste à parcourir bêtement la chaîne et noter la position de la première base dans une variable temporaire, si trouvée, la variable temporaire étant initialisée à -1.
    A quoi servent les variables m,o,w,q ? Décoration ?

    Par rapport à l'emploi de la variable i après le for, c'est une pratique risquée, il vaut mieux toujours considérer qu'une variable de boucle est locale à cette boucle et ne pas l'utiliser après sans l'avoir réinitialisée.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Goe,
    Citation Envoyé par e-ric Voir le message
    Par rapport à l'emploi de la variable i après le for, c'est une pratique risquée, il vaut mieux toujours considérer qu'une variable de boucle est locale à cette boucle et ne pas l'utiliser après sans l'avoir réinitialisée.
    +1

    Car même si c'est en général le cas, rien dans la définition du langage ne garantit la valeur de cette variable en sortie de boucle.
    C'est donc à éviter, car ça joue sur un comportement qui peut être modifié d'un compilateur à l'autre, et même d'une version à l'autre pour un compilateur donné.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut

    Je ne suis pas allé voir la définition du langage mais, sur anecdote personnelle, cela dépend aussi de l'optimisation pour un programme donné.

    Ainsi avec Delphi 7 (cas de l'expérience), une boucle for ... to peut dans certains cas être compilée comme une boucle for ... downto i.e. la boucle est inversée (l'indice de départ étant 0, le compilo inverse le sens de l'itération pour faire des comparaisons à 0 sans doute plus rapides), attention cela est vrai dans certains cas, je l'ai constaté une fois avec l'option d'optimisation activée dans D7.

    Dans ces conditions, faire des hypothèses sur la valeur du compteur du for en sortie de celui-ci est une gentille illusion.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. [MCD] Exercice de BTS Informatique fini besoin d'aide
    Par niko999 dans le forum Schéma
    Réponses: 3
    Dernier message: 26/01/2010, 15h45
  2. Réponses: 0
    Dernier message: 20/11/2008, 22h46
  3. bio-informatique
    Par hutchuck dans le forum Emploi
    Réponses: 6
    Dernier message: 20/05/2008, 09h51

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