본문 바로가기

프로젝트/개인 프로젝트

Central Dogma C프로그램(2)_mRNA Seq. 입력 시 개시코돈 인식

반응형

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

 mRNA를 번역하여 아미노산 서열로 번역하기 위해서는 개시코돈을 인식하여 번역을 시작하고, 종결코돈을 인식하여 번역을 끝내야 한다. 우선 개시코돈 AUG를 인식하는 코드를 만들어 보자.

mRNA Seq. 입력 시 개시코돈 인식

먼저 프로그램 상에서 서열을 입력 받기 위한 코드를 작성하자.

#include<stdio.h>
#include<string.h>
main()
{
	char Seq[10000] = "\0"; /* 서열을 입력 받을 변수 정의, 입력가능한 bp 수 정의 */
	scanf("%s", Seq); /* 서열 입력 */
	printf("(1)%s \n", Seq); /* 입력된 서열이 정상적으로 저장되었는지 확인 */
}

 여기서 입력가능한 bp 수는 반드시 정의해주어야 한다. 입력하지 않으면 오버플로우가 발생해 이후 제대로 출력이 되지 않을 수 있다.

더보기

최대 입력가능한 bp 수를 정의하지 않아 오류난 코드

#include<stdio.h>
#include<string.h>
main()
{
	int length;
	int i, j, a, k, temp_j, temp_chr;
	j = 0, k = 0;
	temp_j = 0;
	char Seq[] = "\0";
	char compare[] = "\0";
	char temp_compare_1[] = "\0";
	char temp_compare_2[] = " AUG \0";
	char *temp_compare_3 = "\0";
	char temp_compare_total[] = "\0";
	scanf("%s", Seq);
	printf("(1)%s \n", Seq);
	length = strlen(Seq);
	printf("(2)%d \n", length);
	strcat(compare, Seq); 
	printf("(3)%s \n", compare);
	
	for(a = 0; a <= length; a++)
	{
		if(compare[j] == 'A' && compare[j+1] == 'U' && compare[j+2] == 'G')
		{
			temp_j = j;
			break;
		}
		else
		{
			j++;
		}
	}
	if(compare[temp_j] == 'A' && compare[temp_j+1] == 'U' && compare[temp_j+2] == 'G')
	{
		strncpy(temp_compare_1, compare, temp_j);
		temp_compare_3 = strstr(compare, "AUG");
		temp_chr = strlen(temp_compare_3);
		for(k = 0; k <= temp_chr; k++)
		{
			temp_compare_3[k] = temp_compare_3[k+3];
		}
		strcat(temp_compare_total, temp_compare_1);
		strcat(temp_compare_total, temp_compare_2);
		strcat(temp_compare_total, temp_compare_3);
		printf("%s", temp_compare_total);
		printf("\n");
		printf("M");
	}
	else
	{
		printf("%s", compare);
	}
	printf("\n(4)%d\n", j);
	return 0;
}

 아래의 입력값과 출력 결과를 보자

입력 ajkngkjajngkjahngjbanbhjnbhAUGbjmnbghnbhnbghnbhnbhnb
출력 (1)ajkngkjajngkjahngjbanbhjnbhAUGbjmnbghnbhnbghnbhnbhnb
(2)52
(3)ajkngkjajngkjahngjba4

 '(3)'을 보면 20번째 서열 이후로는 전혀 다른 문자가 출력되는 것을 볼 수 있다. 즉, 프로그램 상에서 연산하는 과정에서 전혀 다른 문자로 저장되었다고 생각할 수 있다.


 서열을 입력 받았으니 이제 입력한 서열의 길이를 변수에 저장하자. 이 변수에 입력한 서열의 길이를 저장하는 이유는 아래의 반복문에서 같이 설명하겠다.

	int length;
	length = strlen(Seq); /* 입력받은 서열의 길이 */
	printf("(2)%d \n", length); /* 길이가 제대로 저장되었는지 확인 */

 입력한 서열에서 개시코돈의 위치를 찾는 코드를 작성하자. 앞서 입력한 서열의 길이는 반복문이 몇 회 반복할 지 결정하기 위한 지표로 사용된다. AUG 서열이 있을 수 있는 위치는 ( [입력한 서열의 길이[각주:1]] -2 )개 있다. 그러므로 (length-2)회 동안 코드를 반복하여 AUG 서열의 위치를 확인하고, 없을 경우 반복문을 1회 더 반복하여 입력한 전체 서열을 출력하도록 작성하자.

	int j, a, temp_j;
	for(a = 0; a <= length -1; a++)
	{
		if(Seq[j] == 'A' && Seq[j+1] == 'U' && Seq[j+2] == 'G') /* 해당 서열이 AUG가 맞는지 확인 */
		{
			temp_j = j;
			break;
		}
		else if(j <= length -2)
		{
			j++; /* 해당 서열이 AUG 서열이 아닐 경우 그 다음 서열을 확인 */
		}
		else
		{
			printf("%s", Seq); /* 서열 전체에 AUG 서열이 없는 경우 그 전체 서열을 그대로 출력 */
			break;
		}
	}

 AUG 서열이 있음을 확인하고, 그 서열의 위치를 찾았을 경우 AUG 서열 양쪽에 '띄어쓰기'를 해주어 입력한 서열 상에서 개시코돈의 위치를 쉽게 확인할 수 있도록 서열을 출력하고, 다음 줄에 메싸이오닌[각주:2]이 출력되도록 코드를 작성하자.

	int k, temp_chr;
	char temp_compare_1[10000] = "\0"; /* 저장가능한 bp 수 */
	char temp_compare_2[6] = " AUG ";
	char *temp_compare_3 = "\0";
	char temp_compare_total[10000] = "\0"; /* 저장가능한 bp 수 */
			strncpy(temp_compare_1, Seq, temp_j);
			temp_compare_3 = strstr(Seq, "AUG");
			temp_chr = strlen(temp_compare_3);
			for(k = 0; k <= temp_chr; k++) /* 3번째 서열에서 AUG 지우기 */
			{
				temp_compare_3[k] = temp_compare_3[k+3];
			}
			strcat(temp_compare_total, temp_compare_1); /* 서열 합치기 */
			strcat(temp_compare_total, temp_compare_2); /* 서열 합치기 */
			strcat(temp_compare_total, temp_compare_3); /* 서열 합치기 */
			strcat(temp_compare_total, "\0");
			printf("%s", temp_compare_total);
			printf("\n");
			printf("M");
			printf("\n");

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

더보기

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

#include<stdio.h>
#include<string.h>
main()
{
	int length;
	int j, a, k, temp_j, temp_chr;
	j = 0, k = 0;
	temp_j = 0;
	char Seq[10000] = "\0"; /* 입력가능한 BP 수 */
	char temp_compare_1[10000] = "\0"; /* 저장가능한 BP 수 */
	char temp_compare_2[6] = " AUG ";
	char *temp_compare_3 = "\0";
	char temp_compare_total[10000] = "\0"; /* 저장가능한 BP 수 */
	scanf("%s", Seq);
	printf("(1)%s \n", Seq);
	length = strlen(Seq);
	printf("(2)%d \n", length);
	for(a = 0; a <= length -1; a++)
	{
		if(Seq[j] == 'A' && Seq[j+1] == 'U' && Seq[j+2] == 'G')
		{
			temp_j = j;
			strncpy(temp_compare_1, Seq, temp_j);
			temp_compare_3 = strstr(Seq, "AUG");
			temp_chr = strlen(temp_compare_3);
			for(k = 0; k <= temp_chr; k++)
			{
				temp_compare_3[k] = temp_compare_3[k+3];
			}
			strcat(temp_compare_total, temp_compare_1);
			strcat(temp_compare_total, temp_compare_2);
			strcat(temp_compare_total, temp_compare_3);
			strcat(temp_compare_total, "\0");
			printf("%s", temp_compare_total);
			printf("\n");
			printf("M");
			printf("\n");
			break;
		}
		else if(j <= length -2)
		{
			j++;
		}
		else
		{
			printf("%s", Seq);
		}
	}
	printf("\n(4)%d\n", j);
	return 0;
}
입력 ajkngkjajngkjahngjbanbhjnbhAUGbjmnbghnbhnbghnbhnbhnb
출력 (1)ajkngkjajngkjahngjbanbhjnbhAUGbjmnbghnbhnbghnbhnbhnb
(2)52
ajkngkjajngkjahngjbanbhjnbh AUG bjmnbghnbhnbghnbhnbhnb
M

(4)27


  1. 이하 length

    [본문으로]

  2. Methionine, Met, M

    [본문으로]

반응형