サイトマップ / C言語講座出入り口総目次目次:ポインタ>2次元ポインタ配列

青い直線

2次元ポインタ配列

青い直線

[strcmp( )を使う]←このソース→[Rec1.html]

/* 前回のソースプログラムには、欠点がありました。トリプレットコードとそれに対応するアミノ酸を、二つの配列 const char *tripletcode[ ]と、const char *aminoacid[ ]で表していました。それらの対応関係は、それぞれの配列における位置に依存していました。もし、将来データー訂正の必要がでた時( この件に関してはないと思いますが)、直すのがめんどうであり、かつ、間違う危険が高いと思われます。そこで今回は、2次元のポインタ配列を使って、よりすっきりと、かつ、保守性の良いものに改良します。ソースプログラムを見て下さい。2次元の配列を使うことで、塩基配列のデータとアミノ酸の対応関係が明確になりました。

前回指摘した、もう一つの欠点として、gets( )で文字の入力を行うと、メモリに確保した配列以上の文字が入力されるのを防ぐことができないという点でした。今回は、fgets( )を使ってサイズを限定して、文字列の入力を行うように改めました。

ソースプログラムの説明

fgets( )の引数の1つに、sizeof( )があります。sizeof( )は演算子です。sizeof( char )は、charのサイズを返します。sizeof( double )は、doubleのサイズを返します。

重要:charが何バイトか、doubleが何バイトかはハードウエアにより異なる可能性があります。データ型のサイズに関しては、直接数字を書かずsizeof( )演算子を使います。

    #include  <stdio.h>
    char *fgets(char *s, int n, FILE *fp);

    例:fgets(s, n, fp);

    実行結果    戻り値
    成功        読み込んだ文字列
    失敗        NULL

fgets( )は、ファイルポインタfpで示されるファイルから(ファイル操作に関しては少し後の項目で詳しく取り上げます。)、n -1文字を文字列sに読み込みます。今回は、3文字のアルファベットと1文字のヌル文字で、配列の大きさは4です。今回は、読み込むファイルは、stdin 、即ち、キーボードです。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <string.h>        /* strcmp呼び出しに必要 */

#define MAX_DCODE 64

void main(void);

  /* 2次元ポインタ配列にしたので、関連するデータがセットになった */
const char *dcodes[MAX_DCODE][2] = { 
        {"UUU", "Phe"}, {"UUC", "Phe"}, {"UUA", "Leu"}, {"UUG", "Leu"},
        {"UCU", "Ser"}, {"UCC", "Ser"}, {"UCA", "Ser"}, {"UCG", "Ser"},
        {"UAU", "Tyr"}, {"UAC", "Tyr"}, {"UAA", "end"}, {"UAG", "end"},
        {"UGU", "Cys"}, {"UGC", "Cys"}, {"UGA", "end"}, {"UGG", "Typ"},
        {"CUU", "Leu"}, {"CUC", "Leu"}, {"CUA", "Leu"}, {"CUG", "Leu"},
        {"CCU", "Pro"}, {"CCC", "Pro"}, {"CCA", "Pro"}, {"CCG", "Pro"},
        {"CAU", "His"}, {"CAC", "His"}, {"CAA", "Gln"}, {"CAG", "Gln"},
        {"CGU", "Arg"}, {"CGC", "Arg"}, {"CGA", "Arg"}, {"CGG", "Arg"},
        {"AUU", "Ile"}, {"AUC", "Ile"}, {"AUA", "Ile"}, {"AUG", "Met"},
        {"ACU", "Thr"}, {"ACC", "Thr"}, {"ACA", "Thr"}, {"ACG", "Thr"},
        {"AAU", "Asn"}, {"AAC", "Asn"}, {"AAA", "Lys"}, {"AAG", "Lys"},
        {"AGU", "Ser"}, {"AGC", "Ser"}, {"AGA", "Arg"}, {"AGG", "Arg"},
        {"GUU", "Val"}, {"GUC", "Val"}, {"GUA", "Val"}, {"GUG", "Val"},
        {"GCU", "Ala"}, {"GCC", "Ala"}, {"GCA", "Ala"}, {"GCG", "Ala"},
        {"GAU", "Asp"}, {"GAC", "Asp"}, {"GAA", "Glu"}, {"GAG", "Glu"},
        {"GGU", "Gly"}, {"GGC", "Gly"}, {"GGA", "Gly"}, {"GGG", "Gly"}
};

void main(void)
{
    char code[4];
    int i;

    printf("A C G U の中から3つの塩基を入力して下さい  ");
    fgets(code, sizeof(code), stdin);             /* キーボードから3文字読み込み */

    for (i = 0; i < MAX_DCODE ; i++) {
        if (!strcmp(dcodes[i][0], code)) {        /* 文字が一致したら真 */
            printf("%s のアミノ酸は %s \n", code, dcodes[i][1]);
            break;
        }
    }
}

/* ここまでソースプログラム */

/* 今回のデータは単純なので、2次元の配列で対応可能でしたが、もっと複雑な場合は構造体の配列を使います。かなりきついので、ずっと後のリスト型のデータ構造のところで扱います。 */

[strcmp( )を使う]←このソース→[Rec1.html]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>2次元ポインタ配列