#define _CRT_SECURE_NO_WARNINGS #include #include void premenNaMalePismena(char *retazec); char *charVStringu(const char *s, int c); char *nacitajSekvenciuZoSuboru(); void vypisSekvencieOdPozicie(char *sekvencia, unsigned int od, unsigned int potial); signed int hladaj(char *prvyRetazec, char *druhyRetazec, int pozicia); int zratajPismena(char * sekvencia, char pismeno); void histogramSekvencie(char *sekvencia); void najdlhsiPodretazecVSekvencii(char *retazec); char *vlozSekvenciuOdPozicie(unsigned int pozicia, unsigned int dlzka, char *novaSekvencia, char *sekvencia); void najdiPodretazecVSekvencii(unsigned int len, char *sekvencia, char *pattern); char *podretazec(char *vstup, int start, int len); void najdiPozicie(char *sekvencia, char pismeno, int velkost); int main() { char *dnaSekvencia = NULL; char novaSekvencia[1000]; char vyber = '\0'; unsigned int od = 0, potial = 0; while (vyber != 'k') { scanf(" %c", &vyber); if (vyber == 'n') { if (dnaSekvencia != NULL) { free(dnaSekvencia); dnaSekvencia = NULL; } dnaSekvencia = nacitajSekvenciuZoSuboru(); } else if (vyber == 'p') { scanf("%d %s", &potial, novaSekvencia); najdiPodretazecVSekvencii(potial, dnaSekvencia, novaSekvencia); } else if (vyber == 'h') { histogramSekvencie(dnaSekvencia); } else if (vyber == 'o') { najdlhsiPodretazecVSekvencii(dnaSekvencia); } else if (vyber == 'v') { scanf("%d %d", &od, &potial); vypisSekvencieOdPozicie(dnaSekvencia, od, potial); } else if (vyber == 'l') { scanf("%d %d %s", &od, &potial, novaSekvencia); dnaSekvencia = vlozSekvenciuOdPozicie(od, potial, novaSekvencia, dnaSekvencia); } } return 0; } //funkcia na orezanie retazca char *podretazec(char *vstup, int start, int len) { char *ret = (char *)malloc((len + 1) * sizeof (char)); memcpy(ret, vstup + start, len); ret[len] = '\0'; return ret; } //funkcia na premenu retazca na male pismena, void premenNaMalePismena(char *string) { char* sekvencia = string; for (; *sekvencia; ++sekvencia) *sekvencia = tolower(*sekvencia); } //funkcia na hladanie podretazca v retazci od pozicie signed int hladaj(char *prvyRetazec, char *druhyRetazec, int pozicia) { int i = pozicia, j = 0, vyskyt; char act = prvyRetazec[i]; premenNaMalePismena(druhyRetazec); premenNaMalePismena(prvyRetazec); for (;;) { act = prvyRetazec[i]; if ('\0' == act) { break; } while (prvyRetazec[i] != druhyRetazec[0] && prvyRetazec[i] != '\0') { i++; } if (prvyRetazec[i] == '\0') { return(-1); } vyskyt = i; while (prvyRetazec[i] == druhyRetazec[j] && prvyRetazec[i] != '\0' && druhyRetazec[j] != '\0') { i++; j++; } if (druhyRetazec[j] == '\0') { return vyskyt; } if (prvyRetazec[i] == '\0') { return -1; } i = vyskyt + 1; j = 0; } return -1; } //funkcia na zistenie ci je v stringu dane pismeno char *charVStringu(const char *s, int c) { const char ch = c; for (; *s != ch; s++) if (*s == '\0') return 0; return (char *)s; } //funkcia na nacitanie sekvencie zo suboru char *nacitajSekvenciuZoSuboru() { int ukazovatel = 0; int velkost = 0; char *sekvencia = NULL; //otvorime subor FILE *file = fopen("DNAsekvencia.txt", "r"); //skontrolujeme, ci je subor otvoreny if (file == NULL) { printf("Subor sa nepodarilo otvorit\n"); return NULL; } //spocitame pocet pismen v subore while (fgetc(file) != EOF) velkost++; //pretoze je ukazovatel na konci suboru, vratime ho na zaciatku rewind(file); //alokujeme string velkosti suboru + 1 na terminator znak sekvencia = (char *)malloc((velkost + 1) * sizeof(char)); fgets(sekvencia, velkost + 1, file); //skontrolujeme, ci sa subor uzavrel if (fclose(file) == EOF) { printf("Subor sa nepodaril zavriet\n"); } //skontrolujeme, ci je sekvencia platna for (ukazovatel; ukazovatel < velkost; ukazovatel++) { if (charVStringu("ACGTacgt", (int)sekvencia[ukazovatel]) != NULL) { continue; } else { printf("Sekvencia nesplna podmienky\n"); return NULL; } } printf("Sekvenciu sa podarilo nacitat\n"); return sekvencia; } //funkcia na vypis sekvencie void vypisSekvencieOdPozicie(char *sekvencia, unsigned int od, unsigned int potial) { if (sekvencia == NULL) { printf("Sekvencia nie je nacitana\n"); return; } //osetrime nerealne scenare if (od < 1 || potial < 1 || od > potial || ((od + potial + -1) > strlen(sekvencia))) { printf("Zadanu podsekvenciu nie je mozne vypisat\n"); return; } for (od; od <= potial; od++) { printf("%c", sekvencia[od - 1]); } printf("\n"); } //funkcia ktora nam vrati pocet pismen v sekvencii int zratajPismena(char * sekvencia, char pismeno) { int var = 0; int i = 0; for (i; i < strlen(sekvencia); i++) { if (sekvencia[i] == toupper(pismeno) || sekvencia[i] == pismeno) { var++; } } return var; } //funkcia na vypis histogramu void histogramSekvencie(char *sekvencia) { unsigned int t = 0, a = 0, g = 0, c = 0, i = 0; if (sekvencia == NULL) { printf("Sekvencia nie je nacitana\n"); return; } printf("A: %d\nC: %d\nG: %d\nT: %d\n", zratajPismena(sekvencia, 'a'), zratajPismena(sekvencia, 'c'), zratajPismena(sekvencia, 'g'), zratajPismena(sekvencia, 't')); } //funkcia na najdenie podretazcov v sekvencii void najdiPodretazecVSekvencii(unsigned int dlzka, char *sekvencia, char *pattern) { char *skopirovanyPattern; char *skopirovanaSekvencia; if (sekvencia == NULL) { printf("Sekvencia nie je nacitana\n"); return; } skopirovanaSekvencia = (char *)malloc((strlen(sekvencia) + 1)* sizeof(char)); strcpy(skopirovanaSekvencia, sekvencia); premenNaMalePismena(pattern); premenNaMalePismena(skopirovanaSekvencia); unsigned int i = 0, j, count = 0; //osetrime ze ak sme zadali dlhsi string, nez sme si zadali, tak nech oreze if (strlen(pattern) >= dlzka) { skopirovanyPattern = (char *)malloc(strlen(pattern) * sizeof(char)); skopirovanyPattern = podretazec(pattern, 0, dlzka); } else { skopirovanyPattern = (char *)malloc(strlen(pattern) * sizeof(char)); strcpy(skopirovanyPattern, pattern); } //najdeme prvy vyskyt podretazca i = hladaj(skopirovanaSekvencia, skopirovanyPattern, 0); for (i; i < strlen(skopirovanaSekvencia);) { count = 0; printf("%d ", i + 1); if (i == -1) { break; } //ak je to nahodou na zaciatku, tak nech nam to vyplni ciarkami if (i + 1 == 1) { //vypln ciarkami for (j = 0; j < 3; j++) { printf("-"); } //povodny podretazec for (j = i; j < i + strlen(skopirovanyPattern); j++) { printf("%c", toupper(skopirovanaSekvencia[j])); } //ak je dalsi retazec za povodnym podretazcom v retazci, tak nam to vypise if ((i + strlen(skopirovanyPattern) + 3) < strlen(skopirovanaSekvencia)) { for (j; j < i + strlen(skopirovanyPattern) + 3; j++) { printf("%c", toupper(skopirovanaSekvencia[j])); } } else { for (j; j < i + strlen(skopirovanyPattern) + 3; j++) { printf("-"); } } printf("\n"); //najdeme miesto dalsej sekvencie a nastavi index na miesto, kde sa to zacina i = hladaj(skopirovanaSekvencia, skopirovanyPattern, i + 1); continue; } //ak sa blizime ku koncu, tak dokym mame chary, dovtedy vypisujeme else { for (j = i; j < i + strlen(skopirovanyPattern); j++) { printf("%c", toupper(skopirovanaSekvencia[j])); count++; } for (j = i - 3; j < i; j++) { printf("%c", toupper(skopirovanaSekvencia[j])); count++; } if ((i + strlen(skopirovanyPattern) + 3) < strlen(skopirovanaSekvencia)) { for (j; j < i + strlen(skopirovanyPattern) + 3; j++) { printf("%c", toupper(skopirovanaSekvencia[j])); count++; } } else { //kym su chary while (*(skopirovanaSekvencia + j) != '\0') { count++; printf("%c", toupper(*(skopirovanaSekvencia + j))); j++; } //ak uz chary nie su, doplnime ciarkami na plnu dlzku, podla toho, ze count je jak velke for (j = count; j < 8; j++) { printf("-"); } } printf("\n"); i = hladaj(skopirovanaSekvencia, skopirovanyPattern, i + 1); continue; } } } char *vlozSekvenciuOdPozicie(unsigned int pozicia, unsigned int dlzka, char *novaSekvencia, char *sekvencia) { char *novaDNASekvencia = NULL; char *skopirovanyPattern = NULL; int velkost = 0; if (sekvencia == NULL) { printf("Sekvencia nie je nacitana\n"); return sekvencia; } //osetrime scenare if (pozicia < 1 || pozicia > strlen(sekvencia) + 1) { printf("Do sekvencie nie je mozne podsekvenciu vlozit\n"); return sekvencia; } velkost = (dlzka + strlen(sekvencia) + 2); //naalokujeme novy retazec novaDNASekvencia = (char *)malloc(velkost * sizeof(char)); memset(novaDNASekvencia, '\0', velkost); skopirovanyPattern = podretazec(novaSekvencia, 0, dlzka); //prekopirujeme zaciatok strncpy(novaDNASekvencia, sekvencia, pozicia - 1); //sekvenciu na vlozenie strcpy(novaDNASekvencia + strlen(novaDNASekvencia), skopirovanyPattern); //ostatok sekvencie strcpy(novaDNASekvencia + strlen(novaDNASekvencia), sekvencia + pozicia - 1); printf("Podsekvencia vlozena\n"); return novaDNASekvencia; } //pomocna funkcia na najdenie pozicii kde sa podretazec v retazci nachadza void najdiPozicie(char *sekvencia, char pismeno, int velkost) { int i = 0; char *kontrolnyRetazec = (char *)malloc((velkost + 1) * sizeof(char)); memset(kontrolnyRetazec, pismeno, (velkost)+1 * sizeof(char)); kontrolnyRetazec[velkost] = '\0'; i = hladaj(sekvencia, kontrolnyRetazec, 0); for (i; i < strlen(sekvencia);) { printf("%c %d\n", toupper(pismeno), i + 1); i = hladaj(sekvencia, kontrolnyRetazec, i + 1); if (i == -1) { break; } } } //pomocna funkcia na zistenie, ci sa sekvencia z pismen nachadza v retazci int skontrolujStringy(char *str1, char pismeno, int inkrement) { char *kontrolnyRetazec = (char *)malloc((strlen(str1) - inkrement + 1) * sizeof(char)); memset(kontrolnyRetazec, pismeno, (strlen(str1) - inkrement + 1) * sizeof(char)); kontrolnyRetazec[strlen(str1) - inkrement + 1] = '\0'; if (strstr(str1, kontrolnyRetazec) != NULL) { return 1; } else { return 0; } } //funkcia na najdlhsi podretazec v sekvencii void najdlhsiPodretazecVSekvencii(char *retazec) { unsigned int i = 0; char *kontrolnyRetazec = NULL; char *skopirovanyRetazec = NULL; unsigned int velkost, c = 0, g = 0, a = 0, t = 0; if (retazec == NULL) { printf("Sekvencia nie je nacitana\n"); return; } kontrolnyRetazec = (char *)malloc((strlen(retazec) + 1) * (sizeof(char))); skopirovanyRetazec = (char *)malloc((strlen(retazec) + 1) * (sizeof(char))); strcpy(skopirovanyRetazec, retazec); premenNaMalePismena(skopirovanyRetazec); for (i; i < strlen(retazec); i++) { //nastavi nam vsetky hodnoty na dane pismo v sekvencii na N - i rozmedzi, cize ak je N 20 tak 20,19,18,17... //tym zistime, ze ake je najdlhsi retazec g = skontrolujStringy(skopirovanyRetazec, 'g', i); c = skontrolujStringy(skopirovanyRetazec, 'c', i); a = skontrolujStringy(skopirovanyRetazec, 'a', i); t = skontrolujStringy(skopirovanyRetazec, 't', i); if (a == 1 || c == 1 || g == 1 || t == 1) { break; } kontrolnyRetazec = (char *)malloc((strlen(retazec) - i + 1) * (sizeof(char))); } velkost = (strlen(retazec) - i + 1); free(kontrolnyRetazec); kontrolnyRetazec = NULL; kontrolnyRetazec = (char *)malloc((velkost + 1)* (sizeof(char))); printf("Najdlhsie useky opakujucich sa nukleotidov: %d\n", velkost); //najde vsetky pozicie, kde sa tie opakujuce sa veci nachadzaju if (c == 1) { najdiPozicie(skopirovanyRetazec, 'c', velkost); } if (a == 1) { najdiPozicie(skopirovanyRetazec, 'a', velkost); } if (t == 1) { najdiPozicie(skopirovanyRetazec, 't', velkost); } if (g == 1) { najdiPozicie(skopirovanyRetazec, 'g', velkost); } }