앞서 Central Dogma(1)코돈 입력 시 아미노산 출력에서 작성한 아미노산 출력을 확장하여 mRNA Seq.에 따른 아미노산 서열을 개시코돈과 종결코돈에 관계없이 출력하는 코드를 작성해보자. 1
mRNA Seq. 입력 시 아미노산 서열 단순 출력
우선 코돈표는 프로그램 상에서 바뀌지 않을 값, 즉 일종의 상수 취급이므로 전역변수로 선언해주자.
// 배열 및 구조체 선언부
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"} }
};
mRNA Seq.를 번역하여 아미노산 서열로 출력하기 위해 Central Dogma(1)에서 작성한 코드를 수정하여 함수로 선언하자. 우선 함수명은 translation_codon이며, mRNA Seq.를 입력받기 위해 매개변수 mRNA_seq를, 아미노산 번역의 시작 위치를 결정하기 위해 매개변수 temp_i를 사용한다. 이 함수의 반환 자료형은 void형이다.
// 함수 선언부
void translation_codon( char *mRNA_seq, int temp_i );
기본적으로 번역 과정에서는 mRNA Seq.를 전부 확인해야 하므로 반복문을 이용하고자 한다. 이 과정을 위해 mRNA Seq.의 길이만큼 반복문이 동작하도록 코드를 작성해주자. 우선 strlen 함수를 이용해 mRNA_seq의 길이를 확인하도록 한다. 이후 if문을 활용해 mRNA_seq에 저장되어있는 문자가 NULL이면 동작을 종료하도록 만들어 준다.
int i=0; // 반복문 매개변수
i = temp_i;
while ( i<strlen(mRNA_seq) )
{
if( mRNA_seq[i] != '\0' )
{
}
else { break; }
}
이제 기존 Central Dogma(1)의 코드를 if문 사이에 넣어 계속 수행하도록 하자. 다만 이를 위해서는 코드의 일부분을 수정해야한다. 우선 앞서 i라는 변수를 사용한 반복문에 포함되는 코드이므로 다른 변수를 사용해 반복문을 수행해야 한다. 본문에서는 변수로 j를 사용한다.
또한, 기존의 코드는 하나의 코돈이 지정하는 아미노산을 출력하는 코드문이었기에 단순히 코돈의 1, 2, 3 번째에 어느 염기가 위치하는지만 확인하면 문제없이 동작했다. 다만 해당 함수에서는 코돈에 비해 상대적으로 긴 mRNA Seq.를 사용하기에, 그리고 그 서열의 길이가 코돈의 길이와 달리명확히 정해지지 않았기에 이 방법을 사용하기 힘들다. 이를 해결하기 위해 나머지를 이용한다. 코돈은 3으로 나누었을 때 각 자리가 0, 1, 2의 배열 index값을 가진다. 이는 mRNA Seq. 또한 동일한데, 각 자리가 0, 1, 2의 배열 index값이 반복되는 구조이다. 즉, 3으로 나누어 나머지를 얻어내는 연산을 이용하면 기존의 코드를 크게 수정하지 않고 원하는 결과를 얻어낼 수 있다.
int j; // 반복문 매개변수
int temp;
int x=10, y=10, z=10; // codon 매개변수
for(j = 0; j < 3 ; j++)
{
if(mRNA_seq[i] == 'U') {
temp = 0;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'C') {
temp = 1;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'A') {
temp = 2;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'G') {
temp = 3;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 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 {
if(codon_table_2[x][y][z]!='\0') { printf("%s", codon_table_2[x][y][z]); }
else { printf("ERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n"); }
}
코드 비교
코드 비교
기존
for(i = 0; i < 3; i++)
{
if(N[i] == 'U') {
temp = 0;
if(i == 0) { x = temp; }
else if(i == 1) { y = temp; }
else if(i == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(N[i] == 'C') {
temp = 1;
if(i == 0) { x = temp; }
else if(i == 1) { y = temp; }
else if(i == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(N[i] == 'A') {
temp = 2;
if(i == 0) { x = temp; }
else if(i == 1) { y = temp; }
else if(i == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(N[i] == 'G') {
temp = 3;
if(i == 0) { x = temp; }
else if(i == 1) { y = temp; }
else if(i == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else { printf("ERORR_CODE_%d잘못된 입력입니다.\n다시 입력해주십시오.\n", i); }
}
if(x>3 || y > 3 || z > 3 ) {
printf("ERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n");
return main();
}
else {
printf("%d, %d, %d\n", x, y, z);
printf("translation: ");
if(codon_table_2[x][y][z]!='\0') { printf("%s", codon_table_2[x][y][z]); }
else { printf("ERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n"); }
printf("\n");
}
함수를 만들기 위해 수정한 코드
for(j = 0; j < 3 ; j++)
{
if(mRNA_seq[i] == 'U') {
temp = 0;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'C') {
temp = 1;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'A') {
temp = 2;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'G') {
temp = 3;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 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 {
if(codon_table_2[x][y][z]!='\0') { printf("%s", codon_table_2[x][y][z]); }
else { printf("ERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n"); }
}
기존의 코드에서는 조건 처리 시 나머지 연산을 사용하지 않은 것과 달리, 함수를 만들기 위해 수정한 코드에서는 나머지 연산을 사용한다.
현재 단계에서 작성한 함수 translation_codon의 코드 결과물
현재 단계에서 작성한 함수 translation_codon의 코드 결과물
void translation_codon( char *mRNA_seq, int temp_i )
{
int i=0, j; // 반복문 매개변수
int temp;
int x=10, y=10, z=10; // codon 매개변수
i = temp_i;
printf("translation: ");
while ( i<strlen(mRNA_seq) )
{
if( mRNA_seq[i] != '\0' )
{
for(j = 0; j < 3 ; j++)
{
if(mRNA_seq[i] == 'U') {
temp = 0;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'C') {
temp = 1;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'A') {
temp = 2;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'G') {
temp = 3;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 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 {
if(codon_table_2[x][y][z]!='\0') { printf("%s", codon_table_2[x][y][z]); }
else { printf("ERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n"); }
}
}
else { break; }
}
printf("\n");
}
함수 translation_codon을 완성했으니 본격적으로 main 함수를 작성해보자. 우선 mRNA Seq.를 입력받을 배열 N을 선언한 후, NULL값으로 초기화한다. 이후 scanf 함수를 통해 서열을 입력받고, translation_codon 함수를 통해 번역 결과를 출력한다.
main()
{
char N[100] = "\0";
printf("입력 예시: UUU (#주의# 코돈 입력은 반드시 대문자로 해주세요.)\n");
printf("출력 예시: %c \n", codon_table_2[0][0][0][0]);
printf("U = 0, C = 1, A = 2, G = 3\n코돈 입력: ");
scanf("%s", N);
translation_codon( N, 0 );
return 0;
}
현재 단계에서 작성한 코드 결과물
현재 단계에서 작성한 코드 결과물
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
// 배열 및 구조체 선언부
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"} }
};
// 전역변수 선언부
// 함수 선언부
void translation_codon( char *mRNA_seq, int temp_i );
main()
{
char N[100] = "\0";
printf("입력 예시: UUU (#주의# 코돈 입력은 반드시 대문자로 해주세요.)\n");
printf("출력 예시: %c \n", codon_table_2[0][0][0][0]);
printf("U = 0, C = 1, A = 2, G = 3\n코돈 입력: ");
scanf("%s", N);
translation_codon( N, 0 );
return 0;
}
void translation_codon( char *mRNA_seq, int temp_i )
{
int i=0, j; // 반복문 매개변수
int temp;
int x=10, y=10, z=10; // codon 매개변수
i = temp_i;
printf("translation: ");
while ( i<strlen(mRNA_seq) )
{
if( mRNA_seq[i] != '\0' )
{
for(j = 0; j < 3 ; j++)
{
if(mRNA_seq[i] == 'U') {
temp = 0;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'C') {
temp = 1;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'A') {
temp = 2;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 2) { z = temp; }
else { printf("코드에 오류가 있습니다.\n"); }
}
else if(mRNA_seq[i] == 'G') {
temp = 3;
if(i%3 == 0) { x = temp; }
else if(i%3 == 1) { y = temp; }
else if(i%3 == 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 {
if(codon_table_2[x][y][z]!='\0') { printf("%s", codon_table_2[x][y][z]); }
else { printf("ERORR_CODE_123잘못된 입력입니다.\n다시 입력해주십시오.\n"); }
}
}
else { break; }
}
printf("\n");
}
- 이하 Central Dogma(1)로 기술
[본문으로]
'프로젝트 > 개인 프로젝트' 카테고리의 다른 글
Central Dogma C프로그램(5)_개시코돈 인식 후 번역 (0) | 2022.03.30 |
---|---|
Central Dogma C프로그램(4)_임의의 서열 삽입 (0) | 2022.02.20 |
Central Dogma C프로그램(2.1)_mRNA Seq. 입력 시 개시코돈 인식 ver.2 (0) | 2022.01.18 |
Central Dogma C프로그램(2)_mRNA Seq. 입력 시 개시코돈 인식 (0) | 2021.11.25 |
Central Dogma C프로그램(1)_코돈 입력 시 아미노산 출력 (0) | 2021.11.11 |