본문 바로가기

프로젝트/개인 프로젝트

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

반응형

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

 함수를 이용해 동일한 동작을 하도록 코드를 수정해보자.

mRNA Seq. 입력 시 개시코돈 인식 ver.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");

 먼저 임의의 위치에 임의의 서열을 삽입하는 함수를 만들어주자. 함수의 이름은 insert_Seq라고 하였으며, char형 변수 s1, s2와 int형 변수 temp를 입력받아 동작한다. 함수 insert_Seq 반환형은 void형으로 반환값이 없다. 지역변수 k를 선언하여 삽입할 부분에 넣어줄 더미의 길이를 결정한다. 이후 memmove 함수를 이용하여 정해진 위치에 원하는 문자열을 삽입한다. 아래의 <memmove 함수의 동작>을 클릭하면 해당 함수의 동작에 대해 간단한 설명을 볼 수 있다.

더보기
더보기

memmove 함수의 동작

 여기서는 memmove 함수의 동작을 간단하게, 그리고 직관적으로 이해하기 쉽게 설명하고자 한다. memmove 함수는 헤더파일 <string.h>에서 정의되므로 #include 함수를 이용해 아래와 같이 선언한 후 이용할 수 있다.

#include <string.h>

 우선 memmove 함수는 세 가지 변수를 입력받아 동작한다. 첫 번째 변수는 '데이터가 복사될 위치', 두 번째 변수는 '데이터를 복사할 위치', 세 번째 변수는 '복사할 바이트 수'이다. 아래 코드를 보자.

char s1[], s2[];
int a1, a2, a3;
memmove(s1+a1, s2+a2, a3);

 이 코드의 a1은 복사한 데이터를 입력받을 s1의 위치를 결정한다. 이때 a1이 0이라면 입력하지 않아도 된다.

 a2는 복사를 시작할 s2의 위치를 결정한다. 마찬가지로 a2가 0이라면 입력하지 않아도 된다.

 a3는 복사할 바이트 수, 즉 s2의 데이터를 어디까지 복사할 지 결정한다.

 최종적인 연산의 결과로 s1을 받을 수 있다.

memmove 함수의 동작 테스트 확인용 코드

 아래 코드를 수정해가며 memmove 함수의 동작을 확인해보기 바란다.

<테스트 코드 1>

#include <stdio.h>
#include <string.h>

main( )
{
	char s1[ ] = "abcdef";
	chat s2[ ] = "123";
	int a1 = 2;
	int a2 = 1;
	int a3 = 3;

	printf("s1: %s\ns2: %s\na1: %d, a2: %d, a3: %d\n", s1, s2, a1, a2, a3);
	memmove(s1+a1, s2+a2, a3);
	printf("s1: %s\ns2: %s\na1: %d, a2: %d, a3: %d\n", s1, s2, a1, a2, a3);
	return 0;
}

<테스트 코드 2>

#include <stdio.h>
#include <string.h>

main( )
{
	char s1[ ] = "\0";
	chat s2[ ] = "\0";
	int a1, a2, a3;

	printf("서열의 입력은 영어로만 해주세요\n");
	printf("주 서열 입력\n>>> ");
	scanf("%s", s1);

	printf("삽입 서열 입력\n>>> ");
	scanf("%s", s2);

	printf("삽입할 위치\n>>>");
	scanf("%d", &a1);
	printf("복사 시작 위치\n>>>");
	scanf("%d", &a2);
	printf("복사 글자수\n>>>");
	scanf("%d", &a3);

	printf("s1: %s\ns2: %s\na1: %d, a2: %d, a3: %d\n", s1, s2, a1, a2, a3);
	memmove(s1+a1, s2+a2, a3);
	printf("s1: %s\ns2: %s\na1: %d, a2: %d, a3: %d\n", s1, s2, a1, a2, a3);
	return 0;
}

void insert_Seq(char *s1, char *s2, int temp)
{
	int k;
	char temp_s[10000] = "\0";
	k = strlen(s2)-temp; /* 더미 길이 = (삽입할 서열의 길이) -(서열의 삽입 위치) */
	if(k>=0)
	{
		strcat(temp_s, s1);
	}
	memmove(temp_s+k, s1, strlen(s1));
	memmove(s1+temp, temp_s, strlen(temp_s));
	memmove(s1+temp, s2, strlen(s2));
}

 AUG 서열 양쪽에 공백을 삽입하여 입력한 서열 상에서 개시코돈의 위치를 쉽게 확인할 수 있도록 서열을 출력하고, 다음 줄에 메싸이오닌[각주:1]이 출력되도록 코드를 작성하자. 이때, AUG 서열이 입력된 서열의 처음에 있으면, AUG 뒤에만 공백을 삽입한다.

			strcat(temp_compare_total, Seq);
			if(temp_j == 0)
			{
				insert_Seq(temp_compare_total, temp_blank, temp_j+3);
			}
			else
			{
				insert_Seq(temp_compare_total, temp_blank, temp_j);
				insert_Seq(temp_compare_total, temp_blank, temp_j+4);
			}
			printf("%s", temp_compare_total);
			printf("\n");
			printf("M");
			printf("\n");

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

더보기
더보기

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

#include<stdio.h>
#include<string.h>
void insert_Seq(char *s1, char *s2, int temp)
{
	int k;
	char temp_s[100] = "\0";
	k = strlen(s2)-temp;
	if(k>=0) { strcat(temp_s, s1); }
	memmove(temp_s+k, s1, strlen(s1));
	memmove(s1+temp, temp_s, strlen(temp_s));
	memmove(s1+temp, s2, strlen(s2));
}
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_blank[2] = " ";
	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;
			strcat(temp_compare_total, Seq);
			if(temp_j == 0) { insert_Seq(temp_compare_total, temp_blank, temp_j+3); }
			else
			{
				insert_Seq(temp_compare_total, temp_blank, temp_j);
				insert_Seq(temp_compare_total, temp_blank, temp_j+4);
			}
			printf("%s", temp_compare_total);
			printf("\n");
			printf("M");
			printf("\n");
			break;
		}
		else if(j <= length -2) { j++; }
		else
		{
			printf("%s", Seq);
			break;
		}
	}
	printf("\n(4)%d\n", j);
	return 0;
}


  1. Methionine, Met, M

    [본문으로]

반응형