Advertisement
hocikto19

ZPrPr projekt

Nov 21st, 2013
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.18 KB | None | 0 0
  1. /*Vytvoril KOVatOr
  2. *sluzi to ako pomocka pri tvorbe projektu
  3. *ak to niekto copypastne a odovzda nikdy viac to uz nepostnem
  4. *vyhradne pre nasu studijnu skupinu - toto paste sa nesmie nikam postnut bez mojho vedomia
  5. *mozete si to skopirovat tak akurat sebe na komp a nikomu dalsiemu o tom nehovorit
  6. *ak sa o tom dozvedia na STU budem mat pruser a uz nikdy nic nepostnem
  7. *s pozdravom
  8. *kovo*/
  9.  
  10. /* Definicia kniznic a makier ktore budem pouzivat*/
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #define MAX 1000 //maximalna dlzka retazca
  15. #define SUBOR "DNAsekvencia.dat" //nazov citaneho suboru
  16.  
  17. /*V tejto casti su hlavicky vsetkych
  18. *funkcii ktore pri praci pouzijeme*/
  19.  
  20. int vypis();
  21. int retazec(char pole[]);
  22. int histogram(char *p_pole);
  23. int podsekvencie (char *p_pole);
  24. int komplementarne(char pole[]);
  25. int vynuluj(char *p_pole);
  26. int velke(char *p_pole, int j);
  27.  
  28. /*Hlavna funkcia ktora sa spusti ako prva
  29. *mame v zadefinovane pole do ktoreho nacitame
  30. *zo suboru retazec a switch ktorym
  31. *budeme volat funkcie*/
  32.  
  33. int main()
  34. {
  35.     char volba, pole[MAX]; //pole o velkosti MAX
  36.     vynuluj(&pole[0]); //zavolame funkciu ktora nam pole vynuluje
  37.     do { //cyklus ktory nacitava znaky, az kym nie je stlacena validna klavesa ktora vyvola funkciu
  38.     while((volba=getchar())!='v' && volba!='n' && volba!='h' && volba!='p' && volba!='c' && volba!='k')
  39.         ;
  40.     switch (volba) { //stlacenim prislusneho tlacitka zavolame prislusnu funkciu
  41.     case 'v': vypis(); break;
  42.     case 'n': retazec(pole); break;
  43.     case 'h': histogram(&pole[0]); break;
  44.     case 'p': podsekvencie(&pole[0]); break;
  45.     case 'c': komplementarne(pole); break;
  46.     case 'k': printf("koniec\n"); break;
  47.     }
  48.     } while(volba!='k'); //do-while cyklus skonci ked stlacime k
  49.     return 0;
  50. }
  51.  
  52. /*Funkcia vlozi do celeho pola na kazdu adresu 0
  53. *a prepise vsetko sa tam vyskytovalo doteraz
  54. *funkcia nie je nutnou sucastou programu*/
  55.  
  56. int vynuluj(char *p_pole)
  57. {
  58.     int i;
  59.     for(i=0; i<MAX; i++)
  60.         *(p_pole+i)=0;
  61.     return 0;
  62. }
  63.  
  64. /*funkcia otvori subor a vypise jeho obsah
  65. *na obrazovku, pricom v riadku bude
  66. *zvoleny pocet znakov z intervalu*/
  67.  
  68. int vypis() //vypis retazca na obrazovku
  69. {
  70.     FILE *fr;
  71.     int p, n, c;
  72.     scanf("%d", &p);
  73.     if (p<0 || p>20)    //nacitanie znakov na riadok
  74.     {
  75.         printf("Nespravny pocet nukleotidov na riadok\n");
  76.         return 1;
  77.     }
  78.     if ((fr=fopen(SUBOR, "r"))==NULL)
  79.     {
  80.         printf("Neotvoreny subor\n"); //otvorenie suboru
  81.         return 1;
  82.     }
  83.     do      //vypisanie znakov na obrazovku
  84.     {
  85.         n=p;
  86.         while (n>0 && (c=getc(fr))!=EOF) //keby nebolo n prve, vypadavali by nam znaky
  87.         {
  88.             putchar(c);
  89.             n--;
  90.         }
  91.         putchar('\n');
  92.     } while(c!=EOF);
  93.     if (fclose(fr)==EOF)
  94.         printf("Subor sa nepodarilo zatvorit");
  95.     return 0;
  96. }
  97.  
  98. /*funkcia otvori subor a nacita z neho
  99. *znaky do pola. ak je v subore znak,
  100. *ktory nepatri do abecedy X tak vyhodi
  101. *chybovu hlasku a pole vynuluje*/
  102.  
  103. int retazec(char pole[]) //funkcii posielame pole do ktoreho chceme zapisovat
  104. {
  105.     FILE *fr;
  106.     int i=0;
  107.     char c;
  108.     if((fr=fopen(SUBOR, "r"))==NULL)
  109.     {
  110.        printf("Neotvoreny subor\n");
  111.        return 1;
  112.     }
  113.     while(i++<MAX && ((c=toupper(getc(fr)))!=EOF))  //overenie ci su znaky v subore z abecedy X
  114.         if(c!='A' && c!='G' && c!='C' && c!='T')
  115.         {
  116.             printf("Sekvencia nesplna podmienky\n");  //ak niesu tak return
  117.             return 0;
  118.         }
  119.     rewind(fr);
  120.     vynuluj(&pole[0]);
  121.     fscanf(fr, "%s", pole); //nacitanie sekvencie
  122.     velke(&pole[0], MAX); //konverzia znakov na velke
  123.     #ifdef LADENIE //vypis nacitaneho pola pri ladeni //definovanim modu LADENIE si mozeme nacitane znaky vypisat
  124.     for(i=0; i<MAX; i++)
  125.     {
  126.         if (pole[i]=='\0')
  127.             break;
  128.         else
  129.             putchar(pole[i]);
  130.     }
  131.     putchar('\n');
  132.     #endif // Ladenie
  133.     printf("Sekvenciu sa podarilo nacitat\n");
  134.     if (fclose(fr)==EOF)
  135.         printf("Subor sa nepodarilo zatvorit");
  136.     return 0;
  137. }
  138.  
  139. /*Histogram vypise pocetnost pismen ACGT v retazci*/
  140.  
  141. int histogram(char *p_pole) //funkcii posielame pole
  142. {
  143.     int histo[4], n;
  144.     if (*p_pole!='A' && *p_pole!='G' && *p_pole!='C' && *p_pole!='T') //overenie ci je retazec nacitany
  145.     {
  146.         printf("Sekvencia nie je nacitana\n");
  147.         return 1;
  148.     }
  149.     for(n=4; n>0; n--)
  150.         histo[n-1]=0;
  151.     while (n<MAX && *(p_pole+n)!='\0') //v tom pripade sa oplati switch, lebo mame iba 4 znakovu abecedu
  152.     {
  153.         switch (*(p_pole+n)) {
  154.         case 'A': histo[0]++; break;
  155.         case 'C': histo[1]++; break;
  156.         case 'G': histo[2]++; break;
  157.         case 'T': histo[3]++; break;
  158.         default: ; break;
  159.         }
  160.         n++;
  161.     }
  162.     printf("A: %d\nC: %d\nG: %d\nT: %d\n", histo[0], histo[1], histo[2], histo[3]);
  163.     return 0;
  164. }
  165.  
  166. /*Funkcia vypise na obrazovku vsetky
  167. *vyskyty zadanej podsekvencie najvasej
  168. *dlzky 5 znakov*/
  169.  
  170. int podsekvencie (char *p_pole) //funkcii posielame pole
  171. {
  172.     char sekvencia[5];
  173.     int i=0, n, j=0, k;
  174.     if (*p_pole!='A' && *p_pole!='G' && *p_pole!='C' && *p_pole!='T')
  175.     {
  176.         printf("Sekvencia nie je nacitana\n");
  177.         return 1;
  178.     }
  179.     for(n=0; n<5; n++)
  180.         sekvencia[n]=0; //vynulovanie sekvencie
  181.     scanf("%s", sekvencia);
  182.     while(sekvencia[j]!='\0' && j<5)
  183.         j++;    //zistenie dlzky retazca
  184.     velke(&sekvencia[0], j);
  185.     while(i<MAX-j && (*(p_pole+i)=='A' || *(p_pole+i)=='G' || *(p_pole+i)=='C' || *(p_pole+i)=='T'))
  186.     {
  187.         for(n=0; n<j; n++)   //zistujeme ci su v retazci podsekvencie
  188.             if(sekvencia[n]!=*(p_pole+i+n))
  189.                 break;
  190.         if (n==j)   //ak su, tak ich vypiseme
  191.         {
  192.             printf("\n%d ", i+1);
  193.             for(k=i-3; k<i+n+3; k++)
  194.                 if(k<MAX && (*(p_pole+k)=='A' || *(p_pole+k)=='G' || *(p_pole+k)=='C' || *(p_pole+k)=='T'))
  195.                     putchar(*(p_pole+k));
  196.                 else
  197.                     putchar('-');
  198.         }
  199.         i++;
  200.     }
  201.     putchar('\n');
  202.     return 0;
  203. }
  204.  
  205. /*Funkcia vypise retazec komplementarny
  206. *k povodnemu retazcu podla zadania*/
  207.  
  208. int komplementarne(char pole[])
  209. {
  210.     int i=0, n, j=0;
  211.     char komp[MAX];
  212.     if (pole[0]!='A' && pole[0]!='G' && pole[0]!='C' && pole[0]!='T')
  213.     {
  214.         printf("Sekvencia nie je nacitana\n");
  215.         return 1;
  216.     }
  217.     while(i<MAX && pole[i]!=0)
  218.         i++; //zistenie dlzky retazca
  219.     for(n=--i;n>=0; n--)
  220.         komp[n]=pole[j++];
  221.     #ifdef LADENIE //zapnutim modu LADENIE mozno vypisat co sme zatial urobili, sluzi na lahsiu kontrolu
  222.     for(n=0;n<=i; n++)
  223.         putchar(komp[n]);
  224.         putchar('\n');
  225.     #endif // LADENIE
  226.     for(n=0; n<=i; n++)
  227.     {
  228.         switch (komp[n]) {
  229.         case 'A': printf("T"); break;
  230.         case 'G': printf("C"); break;
  231.         case 'C': printf("G"); break;
  232.         case 'T': printf("A"); break;
  233.         }
  234.     }
  235.     putchar('\n');
  236.     return 0;
  237. }
  238.  
  239. /*Funkcia zmeni znaky v poli na velke
  240. *funkcia nie je nutnou sucastou programu*/
  241.  
  242. int velke(char *p_pole, int j)
  243. {
  244.     int i=0;
  245.     while(i<j && *(p_pole+i)!='\0')
  246.     *(p_pole+i++)=toupper(*(p_pole+i));
  247.     return 0;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement