Convertir chaine

Résolu
tina -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
je veux convertir uen chaine de caractére en une autre chaine ;a savoir que la chaine 1 a été choisi aléatoirement et sa taille peut être 50
la conversion de la chaine selon par 3 caractére et ensuite je concaténe les resulat trouver pour avoir une séquence compléte.


public static String GenererSequencechaine(int taille)
{ //Cette fonction vous permettra de générer une séquence aléatoire d'alphabet pour une taille passée en paramètre.

taille=50;
String séquence = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random rand = new Random();
for (int i=1; i<taille; i++)
{
System.out.print(séquence.charAt(rand.nextInt(séquence.length())));
}
System.out.print("\n");
return séquence;
}
lors de la seuxiéme methode je troubve des problémes:
public static void ConvertirProteinARN(String chaine1, String chaine2)
{ //Cette fonction permettra de convertir la séquence de protéines en séquence d’ARN la sequence etwila il faut qu'il marche 3 à 3
int taille=50;
int position=0;
String séquence1;

for (int i=0;i<taille;i++)


{ if (chaine1=="phe")
{ARN="UUU";
chaine1=chaine2;
position ++;
}
if(chaine1=="leu"){chaine2="UUA";
chaine1=chaine2;
position++;}
if (chaine1=="SER"){chaine2="UCU";
chaine1=chaine2;
position++;}
if (chaine1=="Tyr"){chaine2="UAU";
position++;
chaine1=chaine2;}

}
}
A voir également:

3 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Désolée je n'ai pas compris comment tu faisais ta conversion. Donne-nous aussi un exemple concret, peut-être que ce sera plus clair.

Bonne chance
0
tina
 
Bonjour,
moi j'ai un tableau qui contient de chaine caractére par exemple :

seq1 seq2
phe UUU
lit UAU
smq UUA
nne LUA

Aprés la generartion de la sequence aléatoire sachant quel aura comme taille minimum 1 et taille max 50 je dois la convertir en selon le tableau de sequence verifier si cette sequence génerer contient la se1 et je la covertit à la seq2 selon se repete tout au long de la taille de la sequence genérer ensuite je concaténe la conversion realisé.
donc moi selon ma resolution je dois donner une position de depart pour traiter la sequence generer =0 et en arrivant à la position 2 je verifie s'il existe dans la seq1 si oui je la convertit en seq2 et position devienne position +3 et je continuit jusqu'à la fin de la sequence ensuite je concaténe les resultats trouvées.
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Ok alors je résume
- tu as une séquence seq1 d'entrée
- tu as une map qui associe pour un motif de seq1, un motif pour seq2
Tu parcours seq1 et à chaque fois que tu trouves un motif référencé dans ta map, tu ajoutes le motif correspondant à la fin de seq2.

Voici le pseudo code que je te propose :
construire seq1
construire une map qui associe à chaque motif (pour seq1) un motif correspondant (seq2)
i=0
tant que i < longueur(seq1)
  motif_trouve = faux
  extraire dans substr la sous chaine de seq1 qui débute à l'index i
  pour chaque clé de la map
    si substr commence par la clé (ie motif1)
      ajouter dans seq2 le motif de remplacement motif2
      incrémenter i de longueur(motif2)
      motif_trouve = vrai
      break
    fin si
  fin pour
  si motif_trouve == faux, incrémenter i de 1
fin tant que

Vu que je ne sais pas coder en java voici la version C++ (en espérant que ça t'aide).
#include <string>
#include <map>
#include <iostream>

const std::map<std::string,std::string>
prepare_map_motif1_motif2(){
    std::map<std::string,std::string> map_motif1_motif2;
    map_motif1_motif2["phe"] = "UUU";
    map_motif1_motif2["lit"] = "UAU";
    map_motif1_motif2["smq"] = "UUA";
    map_motif1_motif2["nne"] = "LUA";
    return map_motif1_motif2;
}

int main(){
    const std::map<std::string,std::string> map_motif1_motif2(prepare_map_motif1_motif2());
    const std::string seq1("pheblalbalbalitblablasmqblablanne");
    std::string seq2;

    for(unsigned i=0;i<seq1.length();){
        bool motif_trouve = false;
        std::string substr = std::string(seq1,i);
        std::map<std::string,std::string>::const_reverse_iterator
            map_motif1_motif2_it (map_motif1_motif2.rbegin()),
            map_motif1_motif2_end(map_motif1_motif2.rend());
        for(;map_motif1_motif2_it!=map_motif1_motif2_end;++map_motif1_motif2_it){
            const std::string & motif1 = map_motif1_motif2_it->first;
            if (substr.find(motif1) == 0){
                std::cout << "motif [" << motif1 << "] trouvé à la position " << i << std::endl;
                const std::string & motif2 = map_motif1_motif2_it->second;
                seq2 += motif2;
                i += motif1.length();
                motif_trouve = true;
                break;
            }
        }
        if (!motif_trouve) ++i;
    }
    std::cout << "seq2 = " << seq2 << std::endl;
    return 0;
}

Ce qui donne à l'exécution :
motif [phe] trouvé à la position 0
motif [lit] trouvé à la position 12
motif [smq] trouvé à la position 21
motif [nne] trouvé à la position 30
seq2 = UUUUAUUUALUA

Note que l'ordre du parcours de la map est important. Ici les clé sont automatiquement triées dans l'ordre alphabétique donc si par exemple "plop" et "plo" ont tout deux un motif2 associé, il faut d'abord vérifier si la chaîne que tu traites commences par "plop" (et remplacer par le motif associé à plop), sinon utiliser le motif associé à "plo". C'est pour cela que je parcours la map en partant de la fin (reverse iterator).

Est ce que le programme fait bien ce que tu voulais ?

Bonne chance
0