Trier une chaine de caractere des codons selon leurs occurrences

a marqué ce sujet comme résolu.

Bonjour,

Mon sujet concerne l’extraction des sous chaines caractère (codons) d’une chaine de caractère, calculer leur occurrence et les trier selon leurs occurrences. J’ai fait les deux premières étapes (extraction codons et calculs d’occurrences) mais je n’arrive pas à trier les sous chaines selon les occurrences.

J’apprécie tout aide ou suggestions. Merci d’avance

#include <stdio.h>
#include <string.h>
int Extract_Codon(char chaine[], char codon[][4])
{
    int nb_codon = strlen(chaine)-2;
    for (int i = 0; i<nb_codon; i++)
    
    {
        strncpy(codon[i], chaine, 3);
        codon[i][3] = '\0';
        chaine++;
    }
    return nb_codon;
}

int main(void)
{
    char chaine [100] = "ACGACG";
    char listCodon[100][4];
    int nb_codon = Extract_Codon(chaine, listCodon);
    char tableau[nb_codon][2];
    int occ=0;
    for(int i=0; i<nb_codon; i++){
        int occ=0;
        for (int j=0; j<nb_codon; j++){
            if (strcmp(listCodon[i],listCodon[j])==0){
                occ++;
                
            }
        }
        printf("%s\n %d\n",listCodon[i], occ);
      
    }
}

Bonjour,

Tu peux regarder du côté des algorithmes de tri existant pour voir lequel tu voudrais implémenter dans ton programme. Là tu pourrais par exemple faire évoluer ton code pour échanger les valeurs listCodon[i] et listCodon[j] quand elles ne sont pas bien ordonnées.

Mais ton algorithme actuel ne sera pas des plus efficaces : pour un tableau de 10 éléments il te faudra réaliser 100 comparaisons, là où une vingtaine seraient suffisantes avec de meilleurs algorithmes (tri rapide, tri fusion).

J’ai réussi à faire le programme quelqu’un pourrait m’aider pour rédiger un algo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct
{
    char nom[4];
    int nombre;
} Codon;
 
void ExtractFirstCodon(char codon[], char chaine[])
{
    strncpy(codon, chaine, 3);
    codon[3] = '\0';
}
 
void InsertCodon(Codon listCodon[], char codon[], int position)
{
    listCodon[position].nombre=1;
    strcpy(listCodon[position].nom, codon);
}
 
int CompteCodons(char chaine[], Codon listCodon[])
{
    int nb_codon = strlen(chaine)-2;
    char codon[4];
    int indiceCodon = 1;
 
    for(int i=0; i<nb_codon; i++)
    {
        ExtractFirstCodon(codon, chaine);
        if(i==0)
        {
            InsertCodon(listCodon, codon, 0);
            chaine++;
            continue;
        }
 
        int codonAbsent = 1;
 
        for(int j=0; j<i; j++)
        {
            if(strcmp(listCodon[j].nom, codon)==0)
            {
                listCodon[j].nombre++;
                codonAbsent=0;
            }
        }
 
        if(codonAbsent)
        {
            InsertCodon(listCodon, codon, indiceCodon);
            indiceCodon++;
        }
 
        chaine++;
    }
    return indiceCodon;
}
int Tri_occ(const void *cd1, const void *cd2)
{
   int compar= ((Codon*)cd1)->nombre - ((Codon*)cd2)->nombre;
   if (compar==0)
    {
       return strcmp(((Codon*)cd1)->nom , ((Codon*)cd2)->nom)   ;  
        }
    else
        return -compar;
}



int main(void)
{
    char chaine [100] = "TACGACGCGACTACGTCGTACG";
    Codon listCodon[64];
 
    int nbCodon = CompteCodons(chaine, listCodon);
    qsort(listCodon, nbCodon, sizeof(Codon), Tri_occ);
    for(int i=0; i<nbCodon; i++)
        printf("%s --> %d\n", listCodon[i].nom, listCodon[i].nombre);
 
    return 0;
}

Merci d’avance

Bonjour,

Il y a un problème ligne 41, tu dois parcourir tous les codons que tu as déjà trouvé, c’est donc plutôt for(int j=0; j<indiceCodon; j++)

Quant à l’algo, il faut écrire ce que tu as fait, par exemple: a) extraire les codons b) compter les codons différents c) trier les codons différents puis tu détailles les 3 actions ci-dessus.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte