サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>strcmp( )を使う
今日は、少しだけ役に立つプログラムを紹介します。人間の遺伝子の全塩基配列は解読されています。遺伝子の本体であるDNAは、アデニン(A)、シトシン(C)、グアニン(G)、チミン(T)の4種類の塩基がつながったひも状の構造をしています。
この情報がメッセンジャーRNA(mRNA)へ転写され、その塩基配列が順番に読みとられ、その情報をもとにタンパク質が合成されます。タンパク質はアミノ酸がつながったものです。mRNAはアデニン(A)、シトシン(C)、グアニン(G)、ウラシル(U)の4つの塩基がつながったひも状の構造をしています。
遺伝情報の最小単位は3つの塩基の配列です。3つの塩基で、1つのアミノ酸をコードします。これをトリプレットコード(コドン)といいます。例えば、UUUでフェニールアラニン、UCGでセリンというアミノ酸を指定することになります。
蛋白質を構成するアミノ酸は20種類です。下記に示します。
アミノ酸 3文字略号 1文字略号 必須? 糖原性 アラニン Ala A N ○ アルギニン Arg R N ○ アスパラギン Asn N N ○ アスパラギン酸 Asp D N ○ システイン Cys C N ○ グルタミン Gln Q N ○ グルタミン酸 Glu E N ○ グリシン Gly G N ○ ヒスチジン His H N ○ イソロイシン Ile I Y × ロイシン Leu L Y × リジン Lys K Y × メチオニン Met M Y ○ フェニルアラニン Phe F Y × プロリン Pro P N ○ セリン Ser S N ○ トレオニン Thr T Y ○ トリプトファン Trp W Y × チロシン Tyr Y N × バリン Val V Y ○
今日は、3つの塩基を入力すると、該当するアミノ酸を表示するソースプログラムを作ります。ソースプログラムを見て下さい。塩基配列とそれに対応するアミノ酸を、const char型のポインタの配列として別々に宣言しています。constを付けて宣言しているのは、データを書き変えようとするとエラーになるので良いとして、別々に宣言するのはどうでしょう。それらの対応関係は、それぞれの配列における位置に依存します。訂正が必要になった時、かなり苦労するでしょう。次回は改良版を紹介します。
ソースプログラムの中で使っている標準ライブラリ関数について説明します。
#include <string.h> int strcmp(const char *s, const char *t); 例:n = strcmp(s, t); 実行結果 戻り値 s > t 正の値 s = t 0 s < t 負の値
strcmp( )は、2つの文字列を辞書的に比較して、一致すれば0を返します。
メインルーチンで、トリプレットコードを入力すると、tripletcode[ ]の中の位置するトリプレットコードを探してその位置を求めます。その値を配列の添字に使って、対応するアミノ酸の名前を表示します。 */
#include <stdio.h> #include <string.h> /* strcmp( )で必要 */ void main(void); #define MAX_DCODE 64 /* 4種類の塩基の3文字の配列は */ /* 64通りある */ const char *tripletcode[ ] = { "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" }; const char *aminoacid[ ] = { "Phe", "Phe", "Leu", "Leu", "Ser", "Ser", "Ser", "Ser", "Tyr", "Tyr", "end", "end", "Cys", "Cys", "end", "Typ", "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" }; void main(void) { char code[4]; int i; printf("A, C, G, U の中から3文字を入力\t"); gets(code); /* ここにも欠陥が */ /* 下記参照 */ for (i = 0; i < MAX_DCODE ; i++) { if (!strcmp(tripletcode[i], code)) { /* 文字が一致したら真 */ printf("%s のアミノ酸は %s \n", code, aminoacid[i]); break; } } } |
/* メインルーチンの中に、下記の表現があります。
gets(code);
codeは、"char code[4];"とメインルーチンの最初で 宣言しています。 3つの塩基を表すコードと改行コードなので、 配列の大きさを4としました。しかし、キーボードから3文字が入力されるという保障はありません。 3文字以上の入力があった場合、他で使っているメモリを上書きし、動作が不安定になったり、最悪の場合暴走します。次回の改良版では、この点も改善して安全なプログラムにします。 */
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−