함수를 이용해 동일한 동작을 하도록 코드를 수정해보자.
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 서열 양쪽에 공백을 삽입하여 입력한 서열 상에서 개시코돈의 위치를 쉽게 확인할 수 있도록 서열을 출력하고, 다음 줄에 메싸이오닌이 출력되도록 코드를 작성하자. 이때, AUG 서열이 입력된 서열의 처음에 있으면, AUG 뒤에만 공백을 삽입한다. 1
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;
}
- Methionine, Met, M
'프로젝트 > 개인 프로젝트' 카테고리의 다른 글
Central Dogma C프로그램(5)_개시코돈 인식 후 번역 (0) | 2022.03.30 |
---|---|
Central Dogma C프로그램(4)_임의의 서열 삽입 (0) | 2022.02.20 |
Central Dogma C프로그램(3)_mRNA Seq. 입력 시 아미노산 서열 단순 출력 (0) | 2022.01.20 |
Central Dogma C프로그램(2)_mRNA Seq. 입력 시 개시코돈 인식 (0) | 2021.11.25 |
Central Dogma C프로그램(1)_코돈 입력 시 아미노산 출력 (0) | 2021.11.11 |