Advertisement
BlueBear

xbeke.c

Apr 6th, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.14 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. void premenNaMalePismena(char *retazec);
  7. char *charVStringu(const char *s, int c);
  8. char *nacitajSekvenciuZoSuboru();
  9. void vypisSekvencieOdPozicie(char *sekvencia, unsigned int od, unsigned int potial);
  10. signed int hladaj(char *prvyRetazec, char *druhyRetazec, int pozicia);
  11. int zratajPismena(char * sekvencia, char pismeno);
  12. void histogramSekvencie(char *sekvencia);
  13. void najdlhsiPodretazecVSekvencii(char *retazec);
  14. char *vlozSekvenciuOdPozicie(unsigned int pozicia, unsigned int dlzka, char *novaSekvencia, char *sekvencia);
  15. void najdiPodretazecVSekvencii(unsigned int len, char *sekvencia, char *pattern);
  16. char *podretazec(char *vstup, int start, int len);
  17. void najdiPozicie(char *sekvencia, char pismeno, int velkost);
  18.  
  19. int main()
  20. {
  21.     char *dnaSekvencia = NULL;
  22.     char novaSekvencia[1000];
  23.     char vyber = '\0';
  24.     unsigned int od = 0, potial = 0;
  25.  
  26.     while (vyber != 'k')
  27.     {
  28.         scanf(" %c", &vyber);
  29.         if (vyber == 'n')
  30.         {
  31.             if (dnaSekvencia != NULL)
  32.             {
  33.                 free(dnaSekvencia);
  34.                 dnaSekvencia = NULL;
  35.             }
  36.             dnaSekvencia = nacitajSekvenciuZoSuboru();
  37.         }
  38.         else if (vyber == 'p')
  39.         {
  40.             scanf("%d %s", &potial, novaSekvencia);
  41.             najdiPodretazecVSekvencii(potial, dnaSekvencia, novaSekvencia);
  42.         }
  43.         else if (vyber == 'h')
  44.         {
  45.             histogramSekvencie(dnaSekvencia);
  46.         }
  47.         else if (vyber == 'o')
  48.         {
  49.             najdlhsiPodretazecVSekvencii(dnaSekvencia);
  50.         }
  51.         else if (vyber == 'v')
  52.         {
  53.             scanf("%d %d", &od, &potial);
  54.             vypisSekvencieOdPozicie(dnaSekvencia, od, potial);
  55.         }
  56.        
  57.         else if (vyber == 'l')
  58.         {
  59.             scanf("%d %d %s", &od, &potial, novaSekvencia);
  60.             dnaSekvencia = vlozSekvenciuOdPozicie(od, potial, novaSekvencia, dnaSekvencia);
  61.         }
  62.     }
  63.  
  64.     return 0;
  65. }
  66.  
  67. //funkcia na orezanie retazca
  68. char *podretazec(char *vstup, int start, int len)
  69. {
  70.     char *ret = (char *)malloc((len + 1) * sizeof (char));
  71.     memcpy(ret, vstup + start, len);
  72.     ret[len] = '\0';
  73.     return ret;
  74. }
  75.  
  76. //funkcia na premenu retazca na male pismena,
  77. void premenNaMalePismena(char *string)
  78. {
  79.     char* sekvencia = string;
  80.     for (; *sekvencia; ++sekvencia) *sekvencia = tolower(*sekvencia);
  81. }
  82.  
  83. //funkcia na hladanie podretazca v retazci od pozicie
  84. signed int hladaj(char *prvyRetazec, char *druhyRetazec, int pozicia)
  85. {
  86.     int i = pozicia, j = 0, vyskyt;
  87.     char act = prvyRetazec[i];
  88.     premenNaMalePismena(druhyRetazec);
  89.     premenNaMalePismena(prvyRetazec);
  90.  
  91.     for (;;)
  92.     {
  93.         act = prvyRetazec[i];
  94.         if ('\0' == act)
  95.         {
  96.             break;
  97.         }
  98.         while (prvyRetazec[i] != druhyRetazec[0] && prvyRetazec[i] != '\0')
  99.         {
  100.             i++;
  101.         }
  102.         if (prvyRetazec[i] == '\0')
  103.         {
  104.             return(-1);
  105.         }
  106.  
  107.         vyskyt = i;
  108.  
  109.         while (prvyRetazec[i] == druhyRetazec[j] && prvyRetazec[i] != '\0' && druhyRetazec[j] != '\0')
  110.         {
  111.             i++;
  112.             j++;
  113.         }
  114.  
  115.         if (druhyRetazec[j] == '\0')
  116.         {
  117.             return vyskyt;
  118.         }
  119.         if (prvyRetazec[i] == '\0')
  120.         {
  121.             return -1;
  122.         }
  123.  
  124.         i = vyskyt + 1;
  125.         j = 0;
  126.     }
  127.     return -1;
  128. }
  129.  
  130. //funkcia na zistenie ci je v stringu dane pismeno
  131. char *charVStringu(const char *s, int c)
  132. {
  133.     const char ch = c;
  134.  
  135.     for (; *s != ch; s++)
  136.     if (*s == '\0')
  137.         return 0;
  138.     return (char *)s;
  139. }
  140.  
  141. //funkcia na nacitanie sekvencie zo suboru
  142. char *nacitajSekvenciuZoSuboru()
  143. {
  144.  
  145.     int ukazovatel = 0;
  146.     int velkost = 0;
  147.     char *sekvencia = NULL;
  148.     //otvorime subor
  149.     FILE *file = fopen("DNAsekvencia.txt", "r");
  150.  
  151.     //skontrolujeme, ci je subor otvoreny
  152.     if (file == NULL)
  153.     {
  154.         printf("Subor sa nepodarilo otvorit\n");
  155.         return NULL;
  156.     }
  157.  
  158.     //spocitame pocet pismen v subore
  159.     while (fgetc(file) != EOF) velkost++;
  160.  
  161.     //pretoze je ukazovatel na konci suboru, vratime ho na zaciatku
  162.     rewind(file);
  163.  
  164.     //alokujeme string velkosti suboru + 1 na terminator znak
  165.     sekvencia = (char *)malloc((velkost + 1) * sizeof(char));
  166.     fgets(sekvencia, velkost + 1, file);
  167.  
  168.     //skontrolujeme, ci sa subor uzavrel
  169.     if (fclose(file) == EOF)
  170.     {
  171.         printf("Subor sa nepodaril zavriet\n");
  172.     }
  173.  
  174.     //skontrolujeme, ci je sekvencia platna
  175.     for (ukazovatel; ukazovatel < velkost; ukazovatel++)
  176.     {
  177.         if (charVStringu("ACGTacgt", (int)sekvencia[ukazovatel]) != NULL)
  178.         {
  179.             continue;
  180.         }
  181.         else
  182.         {
  183.             printf("Sekvencia nesplna podmienky\n");
  184.             return NULL;
  185.         }
  186.     }
  187.  
  188.     printf("Sekvenciu sa podarilo nacitat\n");
  189.     return sekvencia;
  190.  
  191. }
  192.  
  193. //funkcia na vypis sekvencie
  194. void vypisSekvencieOdPozicie(char *sekvencia, unsigned int od, unsigned int potial)
  195. {
  196.     if (sekvencia == NULL)
  197.     {
  198.         printf("Sekvencia nie je nacitana\n");
  199.         return;
  200.     }
  201.  
  202.     //osetrime nerealne scenare
  203.     if (od < 1 || potial < 1 || od > potial || ((od + potial + -1) > strlen(sekvencia)))
  204.     {
  205.         printf("Zadanu podsekvenciu nie je mozne vypisat\n");
  206.         return;
  207.     }
  208.     for (od; od <= potial; od++)
  209.     {
  210.         printf("%c", sekvencia[od - 1]);
  211.     }
  212.     printf("\n");
  213.  
  214. }
  215.  
  216. //funkcia ktora nam vrati pocet pismen v sekvencii
  217. int zratajPismena(char * sekvencia, char pismeno)
  218. {
  219.     int var = 0;
  220.     int i = 0;
  221.     for (i; i < strlen(sekvencia); i++)
  222.     {
  223.         if (sekvencia[i] == toupper(pismeno) || sekvencia[i] == pismeno)
  224.         {
  225.             var++;
  226.         }
  227.     }
  228.     return var;
  229. }
  230.  
  231. //funkcia na vypis histogramu
  232. void histogramSekvencie(char *sekvencia)
  233. {
  234.     unsigned int t = 0, a = 0, g = 0, c = 0, i = 0;
  235.  
  236.     if (sekvencia == NULL)
  237.     {
  238.         printf("Sekvencia nie je nacitana\n");
  239.         return;
  240.     }
  241.  
  242.     printf("A: %d\nC: %d\nG: %d\nT: %d\n",
  243.         zratajPismena(sekvencia, 'a'),
  244.         zratajPismena(sekvencia, 'c'),
  245.         zratajPismena(sekvencia, 'g'),
  246.         zratajPismena(sekvencia, 't'));
  247. }
  248.  
  249. //funkcia na najdenie podretazcov v sekvencii
  250. void najdiPodretazecVSekvencii(unsigned int dlzka, char *sekvencia, char *pattern)
  251. {
  252.     char *skopirovanyPattern;
  253.     char *skopirovanaSekvencia;
  254.  
  255.     if (sekvencia == NULL)
  256.     {
  257.         printf("Sekvencia nie je nacitana\n");
  258.         return;
  259.     }
  260.     skopirovanaSekvencia = (char *)malloc((strlen(sekvencia) + 1)* sizeof(char));
  261.  
  262.     strcpy(skopirovanaSekvencia, sekvencia);
  263.     premenNaMalePismena(pattern);
  264.     premenNaMalePismena(skopirovanaSekvencia);
  265.  
  266.  
  267.     unsigned int i = 0, j, count = 0;
  268.  
  269.     //osetrime ze ak sme zadali dlhsi string, nez sme si zadali, tak nech oreze
  270.     if (strlen(pattern) >= dlzka)
  271.     {
  272.         skopirovanyPattern = (char *)malloc(strlen(pattern) * sizeof(char));
  273.         skopirovanyPattern = podretazec(pattern, 0, dlzka);
  274.     }
  275.     else
  276.     {
  277.         skopirovanyPattern = (char *)malloc(strlen(pattern) * sizeof(char));
  278.         strcpy(skopirovanyPattern, pattern);
  279.     }
  280.  
  281.     //najdeme prvy vyskyt podretazca
  282.     i = hladaj(skopirovanaSekvencia, skopirovanyPattern, 0);
  283.  
  284.     for (i; i < strlen(skopirovanaSekvencia);)
  285.     {
  286.         count = 0;
  287.         printf("%d ", i + 1);
  288.         if (i == -1)
  289.         {
  290.             break;
  291.         }
  292.         //ak je to nahodou na zaciatku, tak nech nam to vyplni ciarkami
  293.         if (i + 1 == 1)
  294.         {
  295.             //vypln ciarkami
  296.             for (j = 0; j < 3; j++)
  297.             {
  298.                 printf("-");
  299.             }
  300.             //povodny podretazec
  301.             for (j = i; j < i + strlen(skopirovanyPattern); j++)
  302.             {
  303.                 printf("%c", toupper(skopirovanaSekvencia[j]));
  304.             }
  305.             //ak je dalsi retazec za povodnym podretazcom v retazci, tak nam to vypise
  306.             if ((i + strlen(skopirovanyPattern) + 3) < strlen(skopirovanaSekvencia))
  307.             {
  308.                 for (j; j < i + strlen(skopirovanyPattern) + 3; j++)
  309.                 {
  310.                     printf("%c", toupper(skopirovanaSekvencia[j]));
  311.                 }
  312.             }
  313.             else
  314.             {
  315.                 for (j; j < i + strlen(skopirovanyPattern) + 3; j++)
  316.                 {
  317.                     printf("-");
  318.                 }
  319.             }
  320.             printf("\n");
  321.             //najdeme miesto dalsej sekvencie a nastavi index na miesto, kde sa to zacina
  322.             i = hladaj(skopirovanaSekvencia, skopirovanyPattern, i + 1);
  323.             continue;
  324.         }
  325.         //ak sa blizime ku koncu, tak dokym mame chary, dovtedy vypisujeme
  326.         else
  327.         {
  328.             for (j = i; j < i + strlen(skopirovanyPattern); j++)
  329.             {
  330.                 printf("%c", toupper(skopirovanaSekvencia[j]));
  331.                 count++;
  332.             }
  333.             for (j = i - 3; j < i; j++)
  334.             {
  335.                 printf("%c", toupper(skopirovanaSekvencia[j]));
  336.                 count++;
  337.             }
  338.             if ((i + strlen(skopirovanyPattern) + 3) < strlen(skopirovanaSekvencia))
  339.             {
  340.                 for (j; j < i + strlen(skopirovanyPattern) + 3; j++)
  341.                 {
  342.                     printf("%c", toupper(skopirovanaSekvencia[j]));
  343.                     count++;
  344.                 }
  345.             }
  346.             else
  347.             {
  348.                 //kym su chary
  349.                 while (*(skopirovanaSekvencia + j) != '\0')
  350.                 {
  351.                     count++;
  352.                     printf("%c", toupper(*(skopirovanaSekvencia + j)));
  353.                     j++;
  354.                 }
  355.                  //ak uz chary nie su, doplnime ciarkami na plnu dlzku, podla toho, ze count je jak velke
  356.                 for (j = count; j < 8; j++)
  357.                 {
  358.                     printf("-");
  359.                 }
  360.             }
  361.  
  362.             printf("\n");
  363.             i = hladaj(skopirovanaSekvencia, skopirovanyPattern, i + 1);
  364.             continue;
  365.         }
  366.     }
  367. }
  368.  
  369. char *vlozSekvenciuOdPozicie(unsigned int pozicia, unsigned int dlzka, char *novaSekvencia, char *sekvencia)
  370. {
  371.     char *novaDNASekvencia = NULL;
  372.     char *skopirovanyPattern = NULL;
  373.     int velkost = 0;
  374.  
  375.     if (sekvencia == NULL)
  376.     {
  377.         printf("Sekvencia nie je nacitana\n");
  378.         return sekvencia;
  379.     }
  380.     //osetrime scenare
  381.     if (pozicia < 1 || pozicia > strlen(sekvencia) + 1)
  382.     {
  383.         printf("Do sekvencie nie je mozne podsekvenciu vlozit\n");
  384.         return sekvencia;
  385.     }
  386.     velkost = (dlzka + strlen(sekvencia) + 2);
  387.  
  388.     //naalokujeme novy retazec
  389.     novaDNASekvencia = (char *)malloc(velkost * sizeof(char));
  390.     memset(novaDNASekvencia, '\0', velkost);
  391.     skopirovanyPattern = podretazec(novaSekvencia, 0, dlzka);
  392.     //prekopirujeme zaciatok
  393.     strncpy(novaDNASekvencia, sekvencia, pozicia - 1);
  394.     //sekvenciu na vlozenie
  395.     strcpy(novaDNASekvencia + strlen(novaDNASekvencia), skopirovanyPattern);
  396.     //ostatok sekvencie
  397.     strcpy(novaDNASekvencia + strlen(novaDNASekvencia), sekvencia + pozicia - 1);
  398.     printf("Podsekvencia vlozena\n");
  399.     return novaDNASekvencia;
  400.  
  401. }
  402.  
  403. //pomocna funkcia na najdenie pozicii kde sa podretazec v retazci nachadza
  404. void najdiPozicie(char *sekvencia, char pismeno, int velkost)
  405. {
  406.     int i = 0;
  407.     char *kontrolnyRetazec = (char *)malloc((velkost + 1) * sizeof(char));
  408.     memset(kontrolnyRetazec, pismeno, (velkost)+1 * sizeof(char));
  409.     kontrolnyRetazec[velkost] = '\0';
  410.     i = hladaj(sekvencia, kontrolnyRetazec, 0);
  411.  
  412.     for (i; i < strlen(sekvencia);)
  413.     {
  414.         printf("%c %d\n", toupper(pismeno), i + 1);
  415.         i = hladaj(sekvencia, kontrolnyRetazec, i + 1);
  416.         if (i == -1)
  417.         {
  418.             break;
  419.         }
  420.     }
  421. }
  422.  
  423. //pomocna funkcia na zistenie, ci sa sekvencia z pismen nachadza v retazci
  424. int skontrolujStringy(char *str1, char pismeno, int inkrement)
  425. {
  426.     char *kontrolnyRetazec = (char *)malloc((strlen(str1) - inkrement + 1) * sizeof(char));
  427.     memset(kontrolnyRetazec, pismeno, (strlen(str1) - inkrement + 1) * sizeof(char));
  428.     kontrolnyRetazec[strlen(str1) - inkrement + 1] = '\0';
  429.     if (strstr(str1, kontrolnyRetazec) != NULL)
  430.     {
  431.         return 1;
  432.     }
  433.     else
  434.     {
  435.         return 0;
  436.     }
  437. }
  438.  
  439. //funkcia na najdlhsi podretazec v sekvencii
  440. void najdlhsiPodretazecVSekvencii(char *retazec)
  441. {
  442.     unsigned int i = 0;
  443.     char *kontrolnyRetazec = NULL;
  444.     char *skopirovanyRetazec = NULL;
  445.     unsigned int velkost, c = 0, g = 0, a = 0, t = 0;
  446.  
  447.     if (retazec == NULL)
  448.     {
  449.         printf("Sekvencia nie je nacitana\n");
  450.         return;
  451.     }
  452.  
  453.     kontrolnyRetazec = (char *)malloc((strlen(retazec) + 1) * (sizeof(char)));
  454.     skopirovanyRetazec = (char *)malloc((strlen(retazec) + 1) * (sizeof(char)));
  455.     strcpy(skopirovanyRetazec, retazec);
  456.  
  457.     premenNaMalePismena(skopirovanyRetazec);
  458.  
  459.     for (i; i < strlen(retazec); i++)
  460.     {  
  461.         //nastavi nam vsetky hodnoty na dane pismo v sekvencii na N - i rozmedzi, cize ak je N 20 tak  20,19,18,17...
  462.         //tym zistime, ze ake je najdlhsi retazec
  463.         g = skontrolujStringy(skopirovanyRetazec, 'g', i);
  464.         c = skontrolujStringy(skopirovanyRetazec, 'c', i);
  465.         a = skontrolujStringy(skopirovanyRetazec, 'a', i);
  466.         t = skontrolujStringy(skopirovanyRetazec, 't', i);
  467.  
  468.        
  469.         if (a == 1 || c == 1 || g == 1 || t == 1)
  470.         {
  471.             break;
  472.         }
  473.        
  474.         kontrolnyRetazec = (char *)malloc((strlen(retazec) - i + 1) * (sizeof(char)));
  475.     }
  476.  
  477.     velkost = (strlen(retazec) - i + 1);
  478.  
  479.     free(kontrolnyRetazec);
  480.     kontrolnyRetazec = NULL;
  481.     kontrolnyRetazec = (char *)malloc((velkost + 1)* (sizeof(char)));
  482.     printf("Najdlhsie useky opakujucich sa nukleotidov: %d\n", velkost);
  483.     //najde vsetky pozicie, kde sa tie opakujuce sa veci nachadzaju
  484.     if (c == 1)
  485.     {
  486.         najdiPozicie(skopirovanyRetazec, 'c', velkost);
  487.     }
  488.     if (a == 1)
  489.     {
  490.         najdiPozicie(skopirovanyRetazec, 'a', velkost);
  491.     }
  492.     if (t == 1)
  493.     {
  494.         najdiPozicie(skopirovanyRetazec, 't', velkost);
  495.     }
  496.     if (g == 1)
  497.     {
  498.         najdiPozicie(skopirovanyRetazec, 'g', velkost);
  499.     }
  500. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement