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

C++ Discussion :

m�thode pour encoder une s�quence ADN


Sujet :

C++

  1. #1
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut m�thode pour encoder une s�quence ADN
    Bonjour � toutes et � tous,

    Je d�bute en C++ et j'ai une petite API � d�velopper.
    Sauf que voil�, j'arrive � un moment o� je bloque un peu... !
    Donc j'ai une s�quence ADN form�e des quatre lettres suivantes : ATCG et j'ai besoin de l'encoder afin de pouvoir la manipuler (genre cr�er une s�quence reverse ex:GCTA, ou le compl�mentaire TAGC). Bref, mon souci est surtout qu'on m'a vite fait parl� d'un truc que je ne comprends pas.
    Apparemment, il est n�cessaire d'encoder pour se retrouver avec par exemple A = 0, C=1, T=2 et G=3. Pour que �a prenne moins de place en m�moire (Gni�h ? 1�re question xD). Apparemment, quand je "stock" mes valeurs dans un tableau, �a prendrait moins de place...
    Et apr�s bon... Je sais pas trop comment cr�er ma m�thode mais d�j�, comprendre �a m'aiderait pas mal.

    Merci d'avance pour votre aide !

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    te fatigues pas avec des consid�rations de quantit� de m�moire. (tu peux lancer ce regard � quiconque t'as sorti cette absurdit�)
    Tu veux une s�quence, tu cr�es un vector et basta. Un vector de char est suffisant. Si tu veux fignoler, tu peux cr�er un enum contenant tes 4 valeurs � la place, et c'est tout pour le moment, �a fera tr�s bien l'affaire.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Si j'ai bien compris le principe de l'ADN (ce qui reste encore � d�montrer, vu que je suis informaticien, et non biologiste ), le nuc�lotide est syst�matiquement compos�s de quatre �l�ments repr�sent�s par les lettre C G A et T (et autre combinaisons possibles), et tu as une s�rie de nuc�lotides qui se suivent pour repr�senter une "s�quence ADN"(merci wikipedia ).

    H� bien, le plus facile est sans doute de cr�er deux types de donn�e bien distincts : un type de donn�e permettant de repr�senter la notion de nucl�otide et un type de donn�e permettant de repr�senter... une s�quence d'ADN.

    Ceci dit, je dis qu'il faut cr�er des types de donn�es, mais le seul but recherch� est de permettre au d�veloppeur de savoir s'il est occup� � travailler sur... ce qui repr�sente un nucl�otide ou sur ce qui repr�sente une s�quence ADN! On n'est donc pas forc�ment oblig� d'aller tr�s loin dans la d�finition de ces types et, en l'occurrence, des alias de type pourraient tr�s bien faire l'affaire (enfin, dans un premier temps du moins).

    Ainsi, la notion de nucl�otide, vu quelle doit �tre repr�sent�e par quatre lettres, pourrait tr�s bien prendre la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    using Nucleotide = std::array<char, 4>;
    (Attention: C++11 obligatoire )

    Quant � la notion de "s�quence d'ADN", elle pourrait tout aussi bien prendre la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    using AdnSequence = std::vector<Nucleotide>;
    .

    La seule chose, c'est que la notion de tableau (comme celle repr�sent�e par la classe std::vector) est particuli�rement rapide lorsqu'il s'agit d'acc�der aux diff�rents �l�ments qu'elle contient, mais... d'une lenteur crasse lorsqu'il s'agit d'augmenter le nombre d'�l�ments qu'elle est capable de contenir. Si bien que l'id�al est g�n�ralement de faire en sorte que std::vector demande directement "assez de m�moire" que pour �tre en mesure de contenir l'ensemble des �l�ments que nous nous appr�tons � lui donner.

    PS : je confirme ce que bousk dit : un char pour repr�senter les valeurs de C, G, T et A est largement suffisant, et prendra surement moins de place en m�moire que d'utiliser n'importe quel type "entier"

    En outre, il serait �ventuellement possible de faire encore mieux du point de vue de l'utilisation de la m�moire en essayant de faire en sorte d'utiliser syst�matiquement deux bits pour chaque lettre. Mais, � moins d'avoir la preuve que l'utilisation d'un char pour repr�senter un des �l�ments du nucl�otide ne repr�sente d�j� une "utilisation trop importante de la m�moire", je crois qu'il serait particuli�rement masochiste d'essayer de faire autrement
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  4. #4
    Membre �clair�
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : Oman

    Informations professionnelles :
    Activit� : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Par d�faut Du nucl�otide...
    Salut,

    Un nucl�otide est SOIT : A, C, G ou T. Il semble donc qu'une enum soit plus appropri�e qu'un std::array!

    Non?

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Oui mais tu as bien une s�quence de nucl�otide non ? Donc fatalement � un moment il t'en faut plusieurs.. un tableau/array donc.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Membre �clair�
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : Oman

    Informations professionnelles :
    Activit� : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Par d�faut
    Ah ouais, je n'avais pas compris �a comme �a.

  7. #7
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Pour le coup, le nucl�otide ne contient qu'une valeur (parmi {A, T, C,G}), c'est la s�quence qui est repr�sentable par un vector.

    On a int�ret � prendre un using Nucleotide = char; ou enum class Nucleotide {A, T, C, G};.
    Mais je suis d'accord avec using AdnSequence = std::vector<Nucleotide>;. (ou list, selon besoin, mais � voir plus tard)

  8. #8
    Membre �clair�
    Avatar de VivienD
    Homme Profil pro
    D�veloppeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur logiciel
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par d�faut
    Bonjour,

    Pour repr�senter une nucl�otide et pouvoir retranscrire ta s�quence ADN sous la forme d'une cha�ne de caract�re, je serais plut�t d'avis d'utiliser l'�num�ration suivante:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    enum Nucleotide : char
    {
       A = 'A',
       C = 'C',
       G = 'G',
       T = 'T'
    };
    Ainsi, tu pourras faire les conversions Nucleotide-char de mani�re implicite.

    Tsch��

  9. #9
    Membre exp�riment� Avatar de RPGamer
    Homme Profil pro
    Ing�nieur en syst�mes embarqu�s
    Inscrit en
    Mars 2010
    Messages
    168
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing�nieur en syst�mes embarqu�s

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par d�faut
    En g�n�ralisant l'utilisation d'une nucl�otide comme celle de VivienD, tu peux alors repr�senter une s�quence ADN comme suit :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <iostream>
    #include <array>
     
    enum Nucleotide : char
    {
       A = 'A',
       C = 'C',
       G = 'G',
       T = 'T'
    };
     
    class Sequence
    {
    public:
     
       static constexpr size_t SIZE = 4;
     
       Sequence(const std::array<Nucleotide, SIZE> &sequence);
       void reverse();
       void complement();
     
       // opérateur << pour faciliter l'affichage d'une séquence
       friend std::ostream &operator <<(std::ostream &os, const Sequence &sequence)
       {
           for (char nucleotide : sequence.sequence)
           {
              os << nucleotide;
           }
           return os;
       }
     
    private:
     
       std::array<Nucleotide, SIZE> sequence;
     
    };
     
    Sequence::Sequence(const std::array<Nucleotide, SIZE> &sequence) :
       sequence(sequence)
    {
    }
     
    void Sequence::reverse()
    {
       for (auto i = 0u; i < SIZE/2; i++)
       {
           auto temp = sequence[i];
           sequence[i] = sequence[SIZE - 1 - i];
           sequence[SIZE - 1 - i] = temp;
       }
    }
     
    void Sequence::complement()
    {
       // ...
    }
     
    int main()
    {
        Sequence sequence{{A, T, C, G}};
        std::cout << sequence << std::endl;
     
        sequence.reverse();
        std::cout << sequence << std::endl;
     
        return 0;
    }
    Comme tu peux le voir, l'utilit� du tableau est visible lorsqu'il s'agit de manipuler la s�quence. Plus simple que mon exemple : utiliser la fonction std::reverse()

  10. #10
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par d�faut
    Salut,

    je suis pas franchement expert en C++ du coup je te parlerai pas des classes de std.
    Pour la remarque sur la m�moire : �a peut d�pendre du compilo mais le char est l'�l�ment le plus petit en m�moire (un octet).
    Pour l'inversion d'une s�quence : c'est une inversion de tableau, pas d'astuce particuli�re
    Pour la compl�mentaire d'une s�quence : l� l'utilit� de valeurs bien d�finies peut faciliter le travail (XOR).
    Exemple rapide avec des valeurs de PREPRO :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    #define A 0x01 // valeur pour l'adénine telle que A^X = T
    #define T 0x03 // valeur pour la thymine telle que T^X = A
    #define C 0x05 // valeur pour la cytosine telle que C^X = G
    #define G 0x07 // valeur pour la guanine telle que G^X = C
    #define Z 0x00 // délimiteur de séquence, facultatif
    #define X 0x02 // masque XOR d'inversion

  11. #11
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    il n'est pas forc�ment n�cessaire d'inverser la s�quence, tu peux aussi parcourir un tableau par la fin:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    for(int i = taille-1; i>=0; --i) {
        utiliser(tab[i]);
    }
    Si, comme je t'y invite vivement, tu travailles avec des std::vector (ou std::list ou autre), il y a les fonctions membres rbegin() et rend() pour cela.

  12. #12
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par jopopmk Voir le message
    Salut,

    je suis pas franchement expert en C++ du coup je te parlerai pas des classes de std.
    Pour la remarque sur la m�moire : �a peut d�pendre du compilo mais le char est l'�l�ment le plus petit en m�moire (un octet).
    Pour l'inversion d'une s�quence : c'est une inversion de tableau, pas d'astuce particuli�re
    Pour la compl�mentaire d'une s�quence : l� l'utilit� de valeurs bien d�finies peut faciliter le travail (XOR).
    Exemple rapide avec des valeurs de PREPRO :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    #define A 0x01 // valeur pour l'adénine telle que A^X = T
    #define T 0x03 // valeur pour la thymine telle que T^X = A
    #define C 0x05 // valeur pour la cytosine telle que C^X = G
    #define G 0x07 // valeur pour la guanine telle que G^X = C
    #define Z 0x00 // délimiteur de séquence, facultatif
    #define X 0x02 // masque XOR d'inversion
    Si ce n'est qu'un #define, c'est franchement moyen moyen en C++... Une �num�ration (simple) fait bien mieux le travail en cas de besoin
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  13. #13
    Membre exp�riment� Avatar de RPGamer
    Homme Profil pro
    Ing�nieur en syst�mes embarqu�s
    Inscrit en
    Mars 2010
    Messages
    168
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing�nieur en syst�mes embarqu�s

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par d�faut
    La meilleure approche est peut-�tre un mix des deux.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <iostream>
    #include <algorithm>
    #include <array>
    #include <map>
     
    enum Nucleotide : char
    {
       A = 0x01,
       C = 0x05,
       G = 0x07,
       T = 0x03
    };
     
    class Sequence
    {
    public:
     
       static constexpr size_t SIZE = 4;
     
       Sequence(const std::array<Nucleotide, SIZE> &sequence);
       void reverse();
       void complement();
     
       friend std::ostream &operator <<(std::ostream &os, const Sequence &sequence);
     
    private:
     
       static constexpr char COMPLEMENT = 0x02;
       static const std::map<char, char> mapping;
     
       std::array<Nucleotide, SIZE> sequence;
     
    };
     
    const std::map<char, char> mapping =
    {
      {0x01, 'A'},
      {0x05, 'C'},
      {0x07, 'G'},
      {0x03, 'T'}
    };
     
    Sequence::Sequence(const std::array<Nucleotide, SIZE> &sequence) :
       sequence(sequence)
    {
    }
     
    void Sequence::reverse()
    {
       std::reverse(sequence.begin(), sequence.end());
    }
     
    void Sequence::complement()
    {
       // ...
    }
     
    inline std::ostream &operator <<(std::ostream &os, const Sequence &sequence)
    {
       for (char nucleotide : sequence.sequence)
       {
          os << mapping.at(nucleotide);
       }
       return os;
    }
     
    int main()
    {
        Sequence sequence{{A, T, C, G}};
        std::cout << sequence << std::endl;
     
        sequence.reverse();
        std::cout << sequence << std::endl;
     
        sequence.complement();
        std::cout << sequence << std::endl;
     
        return 0;
    }

  14. #14
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par d�faut
    J'ai bien dit que j'�tais pas expert en C++, et que mon exemple �tait "rapide"
    Ce choix de valeurs (d'autres fonctionnent aussi hein) permet de trouver la compl�mentaire d'une s�quence de la plus simple des mani�res.
    On peut �videmment valoriser les �l�ments d'une enum pareillement, mais en C �a taille un int, l� on a de la constante qui tient dans un octet (*).

    Maintenant � voir quel est l'objectif principal : manipuler des s�quences (valoriser l'enum avec des valeurs qui simplifie les op�rations) ou les afficher (valoriser l'enum avec les char �quivalents) ? Je proposais juste une astuce pour le premier cas.

    (*) : en C non plus les #define ne sont pas toujours les meilleurs choix

  15. #15
    Membre exp�riment� Avatar de RPGamer
    Homme Profil pro
    Ing�nieur en syst�mes embarqu�s
    Inscrit en
    Mars 2010
    Messages
    168
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing�nieur en syst�mes embarqu�s

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par d�faut
    Pour le compl�ment, j'ai �a avec un enum :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    void Sequence::complement()
    {
       for (auto &nucleotide : sequence)
       {
           nucleotide = static_cast<Nucleotide>(nucleotide ^ COMPLEMENT);
       }
    }
    Une id�e pour faire plus simple?

  16. #16
    Membre �clair�
    Avatar de VivienD
    Homme Profil pro
    D�veloppeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur logiciel
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par d�faut
    Citation Envoy� par jopopmk Voir le message
    Salut,

    je suis pas franchement expert en C++ du coup je te parlerai pas des classes de std.
    Pour la remarque sur la m�moire : �a peut d�pendre du compilo mais le char est l'�l�ment le plus petit en m�moire (un octet).
    Pour l'inversion d'une s�quence : c'est une inversion de tableau, pas d'astuce particuli�re
    Pour la compl�mentaire d'une s�quence : l� l'utilit� de valeurs bien d�finies peut faciliter le travail (XOR).
    Exemple rapide avec des valeurs de PREPRO :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    #define A 0x01 // valeur pour l'adénine telle que A^X = T
    #define T 0x03 // valeur pour la thymine telle que T^X = A
    #define C 0x05 // valeur pour la cytosine telle que C^X = G
    #define G 0x07 // valeur pour la guanine telle que G^X = C
    #define Z 0x00 // délimiteur de séquence, facultatif
    #define X 0x02 // masque XOR d'inversion
    Citation Envoy� par RPGamer Voir le message
    La meilleure approche est peut-�tre un mix des deux.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <iostream>
    #include <algorithm>
    #include <array>
    #include <map>
     
    enum Nucleotide : char
    {
       A = 0x01,
       C = 0x05,
       G = 0x07,
       T = 0x03
    };
     
    class Sequence
    {
    public:
     
       static constexpr size_t SIZE = 4;
     
       Sequence(const std::array<Nucleotide, SIZE> &sequence);
       void reverse();
       void complement();
     
       friend std::ostream &operator <<(std::ostream &os, const Sequence &sequence);
     
    private:
     
       static constexpr char COMPLEMENT = 0x02;
       static const std::map<char, char> mapping;
     
       std::array<Nucleotide, SIZE> sequence;
     
    };
     
    const std::map<char, char> mapping =
    {
      {0x01, 'A'},
      {0x05, 'C'},
      {0x07, 'G'},
      {0x03, 'T'}
    };
     
    Sequence::Sequence(const std::array<Nucleotide, SIZE> &sequence) :
       sequence(sequence)
    {
    }
     
    void Sequence::reverse()
    {
       std::reverse(sequence.begin(), sequence.end());
    }
     
    void Sequence::complement()
    {
       // ...
    }
     
    inline std::ostream &operator <<(std::ostream &os, const Sequence &sequence)
    {
       for (char nucleotide : sequence.sequence)
       {
          os << mapping.at(nucleotide);
       }
       return os;
    }
     
    int main()
    {
        Sequence sequence{{A, T, C, G}};
        std::cout << sequence << std::endl;
     
        sequence.reverse();
        std::cout << sequence << std::endl;
     
        sequence.complement();
        std::cout << sequence << std::endl;
     
        return 0;
    }
    On peut m�me aller plus loin si on tient prendre en compte les propri�t�s chimiques des nucl�otides. Soit dit en passant, je fais appel � de lointains souvenirs, l�.

    D'une part, l'ad�nine et la cytosine sont des amines tandis que la guanine et la thymine sont des c�tones; et il s'av�re qu'un c�tone ne peut s'apparier qu'� une anime, et inversement. D'autre part, l'ad�nine et la guanine sont des purines tandis que la cytosine et la thymine sont des pyrimidines; et il s'av�re qu'une purine ne peut s'apparier qu'� une pyrimidine.
    En r�servant un bit pour chacun des types de mol�cule (soit quatre bits en tout, sur au minimum huit disponibles dans char), on peut code l'�num�ration Nucleotide comme suit:
    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
    enum Nucleotide : char
    {
      //Flags
      __F_Nucleotide_Amine = 0x01,
      __F_Nucleotide_Ketone = 0x02,
      __F_Nucleotide_Purine = 0x04,
      __F_Nucleotide_Pyrimidine = 0x08,
     
      //Mask
      __M_Nucleotide_Complement = 0x0f,
     
      //Nucleotides
      A = __F_Nucleotide_Amine | __F_Nucleotide_Purine,
      C = __F_Nucleotide_Amine | __F_Nucleotide_Pyrimidine,
      G = __F_Nucleotide_Ketone | __F_Nucleotide_Purine,
      T = __F_Nucleotide_Ketone | __F_Nucleotide_Pyrimidine
    };
    Avec l'op�rateur binaire & et les drapeaux __F_Nucleotide_Xyz, on peut savoir si le nucl�otide est une amine, un c�tone, une purine ou une pyrimidine. Avec l'op�rateur binaire ^ et le masque __M_Nucleotide_Complement on peut trouver le compl�ment d'un nucl�otide ou savoir si deux nucl�otides peuvent s'apparier l'un � l'autre: en effet, l'op�ration X ^ Y donne 0x0f, c'est-�-dire __M_Nucleotide_Complement, si et seulement si X et Y repr�sente des nucl�otides compl�mentaires.

  17. #17
    Membre exp�riment� Avatar de RPGamer
    Homme Profil pro
    Ing�nieur en syst�mes embarqu�s
    Inscrit en
    Mars 2010
    Messages
    168
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing�nieur en syst�mes embarqu�s

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par d�faut
    Je suis pas fan des __ normalement r�serv�s pour la STL mais l'id�e est bonne

  18. #18
    Membre �clair�
    Avatar de VivienD
    Homme Profil pro
    D�veloppeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur logiciel
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par d�faut
    Citation Envoy� par RPGamer Voir le message
    Je suis pas fan des __ normalement r�serv�s pour la STL mais l'id�e est bonne
    Je utilise le double tiret bas pour indiquer aux d�veloppeurs qui veulent utiliser mon code, moi inclus, qu'ils ne doivent pas toucher � ces �l�ments.

  19. #19
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Je utilise le double tiret bas pour indiquer aux d�veloppeurs qui veulent utiliser mon code, moi inclus, qu'ils ne doivent pas toucher � ces �l�ments.
    Valable en C, mais pas en C++, ou les "__" en d�but d'identifiants sont r�serv�s � la STL.

    P.S.: Je ne crois pas que les "__" soient valide en C non plus. Je crois que les "__exit" et autres bidules impl�ment�s dans certaines C-Runtime appr�cient la blague.

  20. #20
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par d�faut
    Le "__" est utilis� pour les conventions d'appel sous Zindows (MSVC) ex. __cdecl, __fastcall ...
    Je sais pas si y'a une vraie convention pour son usage.

    Enfin c'est pas la question, on s'�gare
    Remarquez, FryHandiz n'est pas revenu depuis qu'il a pos� sa question ...

    Sinon j'aime bien le d�coupage de VivienD, �a ajoute du sens suppl�mentaire et le principe est �l�gant.

Discussions similaires

  1. M�thode pour dimensionner une architecture ?
    Par ericlemoustic dans le forum Autres
    R�ponses: 3
    Dernier message: 11/05/2006, 16h14
  2. Pb pour encoder une adresse avec des &
    Par fpouget dans le forum Langage
    R�ponses: 2
    Dernier message: 28/04/2006, 09h41
  3. M�thode pour marquer une carte
    Par Space Cowboy dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 6
    Dernier message: 27/03/2006, 13h15
  4. M�thode pour inclure une langue
    Par HwRZxLc4 dans le forum Langage
    R�ponses: 14
    Dernier message: 20/03/2006, 09h22
  5. [SWING][THREAD]M�thodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fen�tres
    R�ponses: 3
    Dernier message: 05/05/2004, 10h35

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