Advertisement
hydralix

Untitled

Nov 18th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #define N 1000000
  6.  
  7. struct sequence_t {
  8.     int lg;
  9.     char tab[1000000];
  10. };
  11. typedef struct sequence_t sequence;
  12.  
  13. struct ensemble_t {
  14.     int card;
  15.     sequence * tab[1000000];
  16. };
  17. typedef struct ensemble_t ensemble;
  18.  
  19. /* ------------------------------------------------------------------------------------------------ */
  20. /*  Copier coller dans un fichier et compiler
  21.  
  22.     C'est pas comme le fichier c de l'APP3 donner par les profs mais c'est la meme chose dans le fond
  23.  
  24.     Mon idee :
  25.  
  26.     -> On a un ou plusieurs brins et la signature du virus
  27.     -> On "balise" la signature du virus si on le trouve (autant de fois qu'il y en a) dans le brin
  28.     -> On découpe en sous-séquences
  29.     -> Puis on rajoute dans l'ensemble de brins
  30.  
  31.     Exemple :
  32.    
  33.     Brin : ACGTCGACGATTTACGATATACGATACG
  34.     Signature du virus : ACG
  35.  
  36.     -> étape 1 : on "balise" avec le caractère '|' (fonction chercheSousSeq)
  37.     -> résultat : ACG|TCG|ACG|ATT|ACG|ATAT|ACG|ATACG
  38.  
  39.     -> étape 2 : on découpe en sous-séquences
  40.     -> résultat :  ACG
  41.                     TCG
  42.                     ACG
  43.                     ATT
  44.                     ACG
  45.                     ATAT
  46.                     ACG
  47.                     ATACG
  48.  
  49.     -> étape 3 : on rajoute dans l'ensemble de brins   (fonction decoupe)
  50.     -> résultat : Ensemble au départ = ACGTCGACGATTTACGATATACGATACG
  51.                   Ensemble à la fin = ACG
  52.                                       TCG
  53.                                       ACG
  54.                                       ATT
  55.                                       ACG
  56.                                       ATAT
  57.                                       ACG
  58.                                       ATACG
  59.  
  60.     Perso je pense que ma méthode est trop coûteuse à cause de l'étape 1 O(n^3)
  61. */
  62.  
  63. /* Cree une nouvelle sequence */
  64. sequence * nouvelleSequence(){
  65.  
  66.     sequence * seq = malloc(sizeof(sequence));
  67.     if ( seq == NULL ){
  68.         printf("Dans fonction  : nouvelleSequence() \nseq == NULL \n\n");
  69.         exit(1);
  70.     }
  71.  
  72.     seq->lg = 0;
  73.  
  74.     return seq;
  75. }
  76.  
  77. /* Cree un nouveauEnsemble */
  78. ensemble * nouvelleEnsemble(){
  79.  
  80.     ensemble * E = malloc(sizeof(ensemble));
  81.     if ( E == NULL ){
  82.         printf("Dans fonction  : nouvelleEnsemble() \nE == NULL \n\n");
  83.         exit(1);
  84.     }
  85.     E->card = 0;
  86.  
  87.     return E;
  88. }
  89.  
  90. /* Verifie si la sequence est vide */
  91. int estVideSequence(sequence * seq){
  92.  
  93.     if ( seq == NULL ){
  94.         printf("Dans fonction  : estVideSequence(seq) \nseq == NULL \n\n");
  95.         exit(1);
  96.     }
  97.     else {
  98.         if ( seq->lg == 0 )
  99.             return 1;
  100.         else
  101.             return 0;
  102.     }
  103. }
  104.  
  105. /* Verifie si un ensemble est vide */
  106. int estVideEnsemble(ensemble * E){
  107.  
  108.     if ( E == NULL ){
  109.         printf("Dans fonction  : estVideEnsemble(E) \nE == NULL \n\n");
  110.         exit(1);
  111.     }
  112.     else {
  113.         if ( E->card == 0 )
  114.             return 1;
  115.         else
  116.             return 0;
  117.     }
  118. }
  119.  
  120. /* Affiche une sequence de caractere */
  121. void afficherSequence(sequence * seq){
  122.  
  123.      if ( seq == NULL ){
  124.         printf("Dans fonction  : afficherSequence(seq) \nseq == NULL \n\n");
  125.         exit(1);
  126.     }
  127.     else {
  128.         int i = 0;
  129.         while ( i < seq->lg ){
  130.  
  131.             printf("%c",seq->tab[i]);
  132.             i++;
  133.         }
  134.         printf("\n");
  135.     }
  136. }
  137.  
  138. /* Affiche un ensemble de sequence de caractere */
  139. void afficherEnsemble(ensemble * E){
  140.  
  141.     if ( E == NULL ){
  142.         printf("Dans fonction  : afficherEnsemble(E) \nE == NULL \n\n");
  143.         exit(1);
  144.     }
  145.     else {
  146.  
  147.         int i = 0;
  148.         while ( i < E->card ){
  149.  
  150.             afficherSequence(E->tab[i]);
  151.             i++;
  152.         }
  153.     }
  154. }
  155.  
  156. /* Ajoute l'element e a la fin de seq */
  157. void ajouterElementEnFin(sequence * seq, char e){
  158.  
  159.      if ( seq == NULL ){
  160.         printf("Dans fonction  : ajouterElementEnFin(seq,e) \nseq == NULL \n\n");
  161.         exit(1);
  162.     }
  163.     else if ( seq->lg == N ){
  164.         printf("Dans fonction : ajouterElementEnFin(seq,e) \nsequence pleine \n\n");
  165.     }
  166.     else if ( e == 'A' || e == 'C' || e == 'T' || e == 'G' ||e == '|' ) {
  167.         seq->tab[seq->lg] = e;
  168.         seq->lg++;
  169.     }
  170.     else {
  171.         printf("Dans fonction : ajouterElementEnFin(seq,e) \ncaractere %c invalide \n\n",e);
  172.     }
  173. }
  174.  
  175. /* Ajoute mot dans seq */
  176. void ajouterMotDansSequence(sequence * seq, char * mot){
  177.  
  178.      if ( seq == NULL ){
  179.         printf("Dans fonction  : ajouterMotDansSequence(seq,mot) \nseq == NULL \n\n");
  180.         exit(1);
  181.     }
  182.     else if ( seq->lg == N ){
  183.         printf("Dans fonction : ajouterMotDansSequence(seq,mot) \nsequence pleine \n\n");
  184.     }
  185.     else if ( mot == NULL ){
  186.         printf("Dans fonction : ajouterMotDansSequence(seq,mot) \nmot == NULL \n\n");
  187.         exit(1);
  188.     }
  189.     else if ( strlen(mot) == 0 ){
  190.         printf("Dans fonction : ajouterMotDansSequence(seq,mot) \nmot vide \n\n");
  191.     }
  192.     else {
  193.         int i = 0;
  194.  
  195.         while ( mot[i] != '\0' ){
  196.  
  197.             ajouterElementEnFin(seq,mot[i]);
  198.             i++;
  199.         }
  200.     }
  201. }
  202.  
  203. /* Ajoute e a seq apres l'indice i */
  204. void ajouterApresIndice(sequence * seq, char e, int indice){
  205.  
  206.      if ( seq == NULL ){
  207.         printf("Dans fonction  : ajouterApresIndice(seq,e,indice) \nseq == NULL \n\n");
  208.         exit(1);
  209.     }
  210.     else if ( seq->lg == N ){
  211.         printf("Dans fonction : ajouterApresIndice(seq,e,indice) \nsequence pleine \n\n");
  212.     }
  213.     else if ( indice < 0 || indice >= seq->lg ){
  214.         printf("Dans fonction : ajouterApresIndice(seq,e,indice) \nindice %i invalide \n\n",indice);
  215.     }
  216.     else if ( e == 'A' || e == 'C' || e == 'T' || e == 'G' || e == '|' ) {
  217.  
  218.         if ( indice == seq->lg - 1 ){
  219.             ajouterElementEnFin(seq,'|');
  220.         }
  221.  
  222.         else {
  223.             int i = seq->lg;
  224.             for (i = seq->lg; i > indice; i--){
  225.                 seq->tab[i] = seq->tab[i-1];
  226.             }
  227.             if ( i >= 0 && i < seq->lg + 1 ){
  228.                 seq->tab[i+1] = '|';
  229.                 seq->lg++;
  230.             }
  231.          }
  232.     }
  233.     else {
  234.         printf("Dans fonction : ajouterApresIndice(seq,e,indice) \ncaractere %c invalide \n\n",e);
  235.     }
  236. }
  237.  
  238. void chercheSousSeq(sequence * seq, char * mot){
  239.  
  240.      if ( seq == NULL ){
  241.         printf("Dans fonction  : chercheSousSeq(seq,mot) \nseq == NULL \n\n");
  242.         exit(1);
  243.     }
  244.     else if ( mot == NULL ){
  245.         printf("Dans fonction : chercherSousSeq(seq,mot) \nmot == NULL \n\n");
  246.         exit(1);
  247.     }
  248.     else if ( strlen(mot) > seq->lg ){
  249.         printf("Dans fonction : chercheSousSeq(seq,mot) \ntaille du mot trop grand ,taille mot = %i\n\n",strlen(mot));
  250.     }
  251.     else if ( strlen(mot) == 0 ){
  252.         printf("Dans fonction : chercheSousSeq(seq,mot)\nmot vide \n\n");
  253.     }
  254.     else if ( estVideSequence(seq) ){
  255.         printf("Dans fonction : chercheSousSeq(seq,mot)\nSequence vide \n\n");
  256.     }
  257.     else {
  258.  
  259.         int i = 0;
  260.         while ( i < seq->lg ){
  261.  
  262.                 if ( seq->tab[i] == mot[0] ){
  263.  
  264.                     int tailleMot = strlen(mot);
  265.                     int debut = i;
  266.                     int k = i + 1;
  267.                     int j = 1;
  268.  
  269.                     while ( k < seq->lg && j < tailleMot ){
  270.  
  271.                             if ( seq->tab[k] != mot[j] )
  272.                                 break;
  273.                     j++;
  274.                     k++;
  275.                     }
  276.  
  277.                     if ( j == tailleMot ){
  278.  
  279.                         int fin = k-1;
  280.  
  281.                         if ( debut == 0 )
  282.                             ajouterApresIndice(seq,'|',fin);
  283.                         else if ( seq->tab[debut-1] == '|' )
  284.                             ajouterApresIndice(seq,'|',fin);
  285.                         else {
  286.                             ajouterApresIndice(seq,'|',fin);
  287.                             ajouterApresIndice(seq,'|',debut-1);
  288.                         }
  289.                     i = k;
  290.                     }
  291.  
  292.                 }
  293.         i++;
  294.         }
  295.     }
  296. }
  297.  
  298. void ajouterSequenceDansEnsemble(ensemble * E, sequence * seq){
  299.  
  300.     if ( E == NULL ){
  301.         printf("Dans fonction : ajouterSequenceDansEnsemble(E,seq)\nE == NULL \n\n");
  302.         exit(1);
  303.     }
  304.     else if ( seq == NULL ){
  305.         printf("Dans fonction  : ajouterSequenceDansEnsemble(E,seq)\nseq == NULL \n\n");
  306.         exit(1);
  307.     }
  308.     else if ( E->card == N ){
  309.         printf("Dans fonction : ajouterSequenceDansEnsemble(E,seq)\nEnsemble plein \n\n");
  310.     }
  311.     else {
  312.         E->tab[E->card] = nouvelleSequence();
  313.  
  314.         int i = 0;
  315.         while ( i < seq->lg ){
  316.  
  317.                 ajouterElementEnFin(E->tab[E->card],seq->tab[i]);
  318.         i++;
  319.         }
  320.         E->card++;
  321.     }
  322.  
  323. }
  324.  
  325. void decoupe(ensemble * E, sequence * seq){
  326.  
  327.     if ( seq == NULL ){
  328.         printf("Dans fonction  : decoupe(seq) \nseq == NULL \n\n");
  329.         exit(1);
  330.     }
  331.     else if ( E == NULL ){
  332.         printf("Dans fonction  : decoupe(E,seq)\nE == NULL \n\n");
  333.         exit(1);
  334.     }
  335.     else if ( estVideSequence(seq) ){
  336.         printf("Dans fonction : decoupe(seq)\nSequence vide \n\n");
  337.     }
  338.     else {
  339.  
  340.         int i = 0;
  341.         while ( i < seq->lg ){
  342.  
  343.             sequence * sousSeq = nouvelleSequence();
  344.             int j = i;
  345.  
  346.             while ( j < seq->lg && seq->tab[j] != '|'  ){
  347.  
  348.                     ajouterElementEnFin(sousSeq,seq->tab[j]);
  349.             j++;
  350.             }
  351.  
  352.             if ( !estVideSequence(sousSeq) )
  353.                 ajouterSequenceDansEnsemble(E,sousSeq);
  354.  
  355.         i = j + 1;
  356.         }
  357.     }
  358. }
  359. int main()
  360. {
  361.     sequence * seq = nouvelleSequence();
  362.     ensemble * E = nouvelleEnsemble();
  363.  
  364.     srand(time(NULL));
  365.     ajouterMotDansSequence(seq,"ATACGATAAAATTTACGACGATACGACG");
  366.     afficherSequence(seq);
  367.  
  368.     chercheSousSeq(seq,"AAAATTTA");
  369.     afficherSequence(seq);
  370.     printf("\n");
  371.     decoupe(E,seq);
  372.  
  373.     afficherEnsemble(E);
  374.     return 0;
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement