본문 바로가기

프로젝트/개인 프로젝트

Central Dogma C프로그램(5)_개시코돈 인식 후 번역

반응형

[표 1] Amino acid의 명칭과 약자, R group의 특징

mRNA Seq.의 번역 결과를 저장하기 위한 함수 translation_codon 작성

앞서 [각주:1] 작성한 함수 translation_codon을 그대로 사용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
void translation_codon( char *mRNAseq, int temp_i )
{
    int i=0, j;    // 반복문 매개변수
    int temp;
    int x=10, y=10, z=10// codon 매개변수
    i=temp_i;
    
    if(temp_i > strlen(mRNAseq) ) {
        printf("Error: Not found initiation code");
        exit(0);
    }
    /* AUG를 인식하지 않으면 번역하지 않도록 하는 키
    제거해도 코드의 동작에는 오류가 없다. */
    
    while ( i<strlen(mRNAseq) )
    {
        if( mRNAseq[i] != '\0' )
        {
            for(j = 0; j < 3 ; j++)
            {
                if(mRNAseq[i] == 'U') {
                    temp = 0;
                    if(j == 0) { x = temp; }
                    else if(j == 1) { y = temp; }
                    else if(j == 2) { z = temp; }
                    else { printf("코드에 오류가 있습니다.\n"); }
                }
                else if(mRNAseq[i] == 'C') {
                    temp = 1;
                    if(j == 0) { x = temp; }
                    else if(j == 1) { y = temp; }
                    else if(j == 2) { z = temp; }
                    else { printf("코드에 오류가 있습니다.\n"); }
                }
                else if(mRNAseq[i] == 'A') {
                    temp = 2;
                    if(j == 0) { x = temp; }
                    else if(j == 1) { y = temp; }
                    else if(j == 2) { z = temp; }
                    else { printf("코드에 오류가 있습니다.\n"); }
                }
                else if(mRNAseq[i] == 'G') {
                    temp = 3;
                    if(j == 0) { x = temp; }
                    else if(j == 1) { y = temp; }
                    else if(j == 2) { z = temp; }
                    else { printf("코드에 오류가 있습니다.\n"); }
                }
                else { printf("ERORR_CODE_%d잘못된 입력입니다.\n다시 입력해주십시오.\n", i); }
                i++;
            }
        
            if(x>3 || y > 3 || z > 3 ) {
                printf("\nERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n");
                printf("%d %d %d\n", x, y, z);
            }    
            else {
                strcat( AA_seq[0].Amino_seq, codon_table_2[x][y][z] );
                strcat( AA_seq[0].Amino_seq, " \0");
                strcat( AA_seq[1].Amino_seq, codon_table_3[x][y][z] );
                strcat( AA_seq[1].Amino_seq, " \0");
                strcat( AA_seq[2].Amino_seq, codon_table_1[x][y][z] );
                strcat( AA_seq[2].Amino_seq, " \0");
            }
        }
        else { break; }
    }
    printf("\n");
}
cs

번역의 시작을 알려주기 위한 함수 find_AUG 작성

 개시코돈을 찾기 위해 함수 find_AUG를 작성했다. 함수 find_AUG는 입력받은 mRNA 서열을 앞에서부터 하나하나 조사하여 개시코돈 AUG를 찾아 개시코돈의 위치를 정수형(int형) 값으로 반환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int find_AUG ( char *mRNAseq )
{
    int i;
    int AUG_slot = 0;
    
    for( i=0; i<strlen(mRNAseq)+1; i++ ) {
        if( mRNAseq != '\0' ) {
            if( mRNAseq[i] == 'A' && mRNAseq[i+1== 'U' && mRNAseq[i+2== 'G' ){ return AUG_slot; }
            else{ AUG_slot++; }
        }
        else {
            return AUG_slot;
        }
    }
}
cs

코드 설명

 4: AUG의 위치를 저장하기 위해 변수 AUG_slot을 선언하고, 변수의 값을 0으로 초기화한다.

 6~10: 반복문을 이용해 mRNAseq로 입력받은 서열을 앞에서부터 하나하나 조사하여 개시코돈 AUG를 찾는다.

 8: 개시코돈 AUG를 찾으면 AUG_slot을 반환한다.

 9: 개시코돈 AUG가 아닌 경우 AUG_slot의 값을 1 증가시킨다.

 11~13: 개시코돈 AUG를 찾지 못하면 AUG_slot을 반환한다.

main 함수 작성

 함수 find_AUG를 작성했으므로 개시코돈을 인식하여 개시코돈의 위치를 함수 translation_codon으로 보내는 기능을 수행할 수 있도록 main 함수를 작성해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
main()
{
    int temp_taa, temp_AUG_slot;
    char mRNA_seq[10000= "\0";
    
    printf("입력 예시: UUU (#주의# 코돈 입력은 반드시 대문자로 해주세요.)\n");
    printf("출력 예시: %c \n", codon_table_2[0][0][0][0]);
    printf("U = 0, C = 1, A = 2, G = 3\n코돈 입력\n>>> ");
    scanf("%s", mRNA_seq);
    
    temp_AUG_slot = find_AUG( mRNA_seq );
    translation_codon( mRNA_seq, temp_AUG_slot );
    
    printf("숫자를 입력하세요\n  0 입력: 아미노산 한 글자로 출력\n  1 입력: 아미노산 세 글자로 출력\n>>> ");
    scanf("%d"&temp_taa);
    printf("mRNA Seq. 출력\n>>> %s\n", AA_seq[2].Amino_seq);
    printf("translation\n>>> %s\n", AA_seq[temp_taa].Amino_seq);
    return 0;
}
cs

코드 설명

 6~8: mRNA Seq. 입력을 설명한다.

 9: mRNA Seq.를 입력받는다.

 11~12: 개시코돈을 인식하고, 개시코돈의 위치를 함수 translation_codon에 입력하여 개시코돈부터 번역을 시작하도록 한다.

 14~15: 번역의 결과로 나타나는 아미노산 서열의 출력 방법을 나타낸다.

 16: mRNA Seq. 중 번역이 진행되는 부분만을 출력한다.

 17: 번역의 결과로 나타나는 아미노산 서열을 출력한다.

현재 단계에서 작성한 코드 결과물

더보기

현재 단계에서 작성한 코드 결과물

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
// 배열 및 구조체 선언부
char codon_table_1[4][4][4][4] = {
	{ {"UUU", "UUC", "UUA", "UUG"}, {"UCU", "UCC", "UCA", "UCG"}, {"UAU", "UAC", "UAA", "UAG"}, {"UGU", "UGC", "UGA", "UGG"} },
	{ {"CUU", "CUC", "CUA", "CUG"}, {"CCU", "CCC", "CCA", "CCG"}, {"CAU", "CAC", "CAA", "CAG"}, {"CGU", "CGC", "CGA", "CGG"} },
	{ {"AUU", "AUC", "AUA", "AUG"}, {"ACU", "ACC", "ACA", "ACG"}, {"AAU", "AAC", "AAA", "AAG"}, {"AGU", "AGC", "AGA", "AGG"} },
	{ {"GUU", "GUC", "GUA", "GUG"}, {"GCU", "GCC", "GCA", "GCG"}, {"GAU", "GAC", "GAA", "GAG"}, {"GGU", "GGC", "GGA", "GGG"} }
};

char codon_table_2[4][4][4][5] = {
	{ {"F", "F", "L", "L"}, {"S", "S", "S", "S"}, {"Y", "Y", "stop", "stop"}, {"C", "C", "stop", "W"} },
	{ {"L", "L", "L", "L"}, {"P", "P", "P", "P"}, {"H", "H", "Q", "Q"}, {"R", "R", "R", "R"} },
	{ {"I", "I", "I", "M"}, {"T", "T", "T", "T"}, {"N", "N", "K", "K"}, {"S", "S", "R", "R"} },
	{ {"V", "V", "V", "V"}, {"A", "A", "A", "A"}, {"D", "D", "E", "E"}, {"G", "G", "G", "G"} }
};

char codon_table_3[4][4][4][5] = {
	{ {"Phe", "Phe", "Leu", "Leu"}, {"Ser", "Ser", "Ser", "Ser"}, {"Tyr", "Tyr", "stop", "stop"}, {"Cys", "Cys", "stop", "Trp"} },
	{ {"Leu", "Leu", "Leu", "Leu"}, {"Pro", "Pro", "Pro", "Pro"}, {"His", "His", "Gln", "Gln"}, {"Arg", "Arg", "Arg", "Arg"} },
	{ {"Ile", "Ile", "Ile", "Met"}, {"Thr", "Thr", "Thr", "Thr"}, {"Asn", "Asn", "Lys", "Lys"}, {"Ser", "Ser", "Arg", "Arg"} },
	{ {"Val", "Val", "Val", "Val"}, {"Ala", "Ala", "Ala", "Ala"}, {"Asp", "Asp", "Glu", "Glu"}, {"Gly", "Gly", "Gly", "Gly"} }
};

struct Amino_Acid {
	char Amino_seq[20000];
} AA_seq[3];
/*	AA_seq[0]는 1약자
	AA_seq[1]은 3약자
	AA_seq[2]는 코돈 단위로 분리한 서열 */

// 전역변수 선언부

// 함수 선언부
void translation_codon( char *mRNAseq, int temp_i );
int find_AUG ( char *mRNAseq );

main()
{
	int temp_taa, temp_AUG_slot;
	char mRNA_seq[10000] = "\0";
	
	printf("입력 예시: UUU (#주의# 코돈 입력은 반드시 대문자로 해주세요.)\n");
	printf("출력 예시: %c \n", codon_table_2[0][0][0][0]);
	printf("U = 0, C = 1, A = 2, G = 3\n코돈 입력\n>>> ");
	scanf("%s", mRNA_seq);
	
	temp_AUG_slot = find_AUG( mRNA_seq );
	translation_codon( mRNA_seq, temp_AUG_slot );
	
	printf("숫자를 입력하세요\n  0 입력: 아미노산 한 글자로 출력\n  1 입력: 아미노산 세 글자로 출력\n>>> ");
	scanf("%d", &temp_taa);
	printf("mRNA Seq. 출력\n>>> %s\n", AA_seq[2].Amino_seq);
	printf("translation\n>>> %s\n", AA_seq[temp_taa].Amino_seq);
	return 0;
}

void translation_codon( char *mRNAseq, int temp_i )
{
	int i=0, j;	// 반복문 매개변수
	int temp;
	int x=10, y=10, z=10; // codon 매개변수
	i=temp_i;
	
	if(temp_i > strlen(mRNAseq) )	{
		printf("Error: Not found initiation code");
		exit(0);
	}
	/* AUG를 인식하지 않으면 번역하지 않도록 하는 키
	제거해도 코드의 동작에는 오류가 없다. */
	
	while ( i<strlen(mRNAseq) )
	{
		if( mRNAseq[i] != '\0' )
		{
			for(j = 0; j < 3 ; j++)
			{
				if(mRNAseq[i] == 'U') {
					temp = 0;
					if(j == 0) { x = temp; }
					else if(j == 1) { y = temp; }
					else if(j == 2) { z = temp; }
					else { printf("코드에 오류가 있습니다.\n"); }
				}
				else if(mRNAseq[i] == 'C') {
					temp = 1;
					if(j == 0) { x = temp; }
					else if(j == 1) { y = temp; }
					else if(j == 2) { z = temp; }
					else { printf("코드에 오류가 있습니다.\n"); }
				}
				else if(mRNAseq[i] == 'A') {
					temp = 2;
					if(j == 0) { x = temp; }
					else if(j == 1) { y = temp; }
					else if(j == 2) { z = temp; }
					else { printf("코드에 오류가 있습니다.\n"); }
				}
				else if(mRNAseq[i] == 'G') {
					temp = 3;
					if(j == 0) { x = temp; }
					else if(j == 1) { y = temp; }
					else if(j == 2) { z = temp; }
					else { printf("코드에 오류가 있습니다.\n"); }
				}
				else { printf("ERORR_CODE_%d잘못된 입력입니다.\n다시 입력해주십시오.\n", i); }
				i++;
			}
		
			if(x>3 || y > 3 || z > 3 ) {
				printf("ERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n");
				printf("%d %d %d\n", x, y, z);
				}
			else {
			strcat( AA_seq[0].Amino_seq, codon_table_2[x][y][z] );
			strcat( AA_seq[0].Amino_seq, " \0");
			strcat( AA_seq[1].Amino_seq, codon_table_3[x][y][z] );
			strcat( AA_seq[1].Amino_seq, " \0");
			strcat( AA_seq[2].Amino_seq, codon_table_1[x][y][z] );
			strcat( AA_seq[2].Amino_seq, " \0");
			}
		}
		else { break; }
	}
	printf("\n");
}

int find_AUG ( char *mRNAseq )
{
	int i;
	int AUG_slot = 0;
	
	for( i=0; i<strlen(mRNAseq)+1; i++ ) {
		if( mRNAseq != '\0' ) {
			if( mRNAseq[i] == 'A' && mRNAseq[i+1] == 'U' && mRNAseq[i+2] == 'G' ){ return AUG_slot; }
			else{ AUG_slot++; }
		}
		else {
			return AUG_slot;
		}
	}
}


반응형