2016-03-21 3 views
0

船に12人の乗客がいるとします。それぞれが異なっています。 これらの12人の乗客がのカテゴリに分類されます。制限された文字列で自動的に配列要素を埋め込む

  • クラス:これらの各カテゴリは、2つの異なるオプションを持つことができ

    • クラス
    • 年齢
    • 性別

    「第1」または「第2」のいずれかである

  • 年齢は「大人」または「子供」のいずれかである

  • 性別が「男性」または「女性」

が、私は「旅客」と呼ばれるタイプの構造体の新しいデータ型を作成することを決めたのいずれかです。下のコードで見るように、クラス、年齢、性別の3つのメンバーがあります。

次に、この新しく作成されたデータ型(Passenger)の変数(allPassengers)を作成します。

しかし、乗客に関する情報の12種類の組み合わせすべてで、「allPassengers」と呼ばれるタイプのPassengerの配列を記入するにはどうすればよいですか?

など。

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

    typedef struct { 
     char class[7]; 
     char age[6]; 
     char gender[7]; 
    } 
Passenger; 


/* This is where all the information about passengers will be stored, global variable, 
there are 9 combinations of passengers (allocated array elements for the variable), last one is reserved for the null character \0 */ 
Passenger allPassengers[10]; 


int main() { 

    // First combination 
    strcpy(allPassengers[0].class, "first"); 
    strcpy(allPassengers[0].age, "adult"); 
    strcpy(allPassengers[0].gender, "male"); 


    // Second combination 
    strcpy(allPassengers[1].class, "second"); 
    strcpy(allPassengers[1].age, "adult"); 
    strcpy(allPassengers[1].gender, "male"); 


    // Third combination 
    strcpy(allPassengers[2].class, "first"); 
    strcpy(allPassengers[2].age, "child"); 
    strcpy(allPassengers[2].gender, "male"); 

    // ... etc 

    return 0; 
} 

Here's同じコード(フレンドリーコピー&ペースト):私は手動で最初の3つの組み合わせを作成しました。

数字だけの配列(forループ)を記入するのは簡単だったでしょう。しかし、最初の2つのallPassengers[0]と、allPassengers[1]など、必要な情報を記入する方法はわかりません。私は複雑な "if文"をループの内部に書くと思います。以前の全会員のクラスを確認してください。 2つ以上の一致がある場合、クラス "second"を割り当てます。

またはスイッチケースではありません。より強固な組み合わせを記入しなければならない場合はどうすればいいですか?

変数には制限付きの文字列しか使用できません。例えばクラスは "first"か "second"のどちらかを取ることができますか?

手がかりはありますか?

+0

'pow(2,3)<12'です。 – EOF

+0

アイテムごとに2つのオプションに制限されている場合は、[ブール型](http://stackoverflow.com/questions/1921539/using-boolean-values-in-c)または0-1ベースのシステムでは、ロジックがはるかに容易になります。 IE '(isFirstClass {0,1}、isAdult {0,1}、isMale {0,1})'または任意の組み合わせである。 –

答えて

0

データが厳密に特定の値に限定されている場合は、列挙型を作成することをお勧めします。

例:

enum ClassEnum{ 
FIRST, 
SECOND 
}; 

enum AgeEnum{ 
    ADULT, 
    CHILD 
}; 

enum GenderEnum{ 
    MALE, 
    FEMALE 
}; 

typedef struct { 
     ClassEnum class; 
     AgeEnum age; 
     GenderEnum gender; 
    } 
Passenger; 

それはあなたがもう文字列を操作する必要がないので、やろうとしているものを簡素化します。

すべての組み合わせで配列を塗りつぶすために、すべての組み合わせを処理する関数を書くという選択肢はありません。

0

構造を初期化するために使用する乗客構造と属性値のセットを指す関数を定義することをお勧めします。たとえば:

void init_passenger(Passenger *passenger, const char *class, 
    const char *age, const char *gender) { 
    strcpy(passenger->class, class); 
    /* ... */ 
} 

私もmagic numbersを避け、構造体の定義は

typedef struct { 
    char class[MAX_CLASS_LEN]; 
    char age[MAX_AGE_LEN]; 
    char gender[MAX_GENDER_LEN]; 
} Passenger; 

なるように、スペースが問題ではない場合は、1つのマクロを持つことができ、マクロ

#define CLASS_MAX_LEN 7 
#define AGE_MAX_LEN 6 
#define GENDER_MAX_LEN 7 

を定義します

#define MAX_LEN 7 

乗客の配列を記入するには、適切な値i(および適切な属性値)の関数init_passenger(allPassengers[i], "firstm "child", "male")を呼び出します。

考えられるすべての値をループするには、可能な属性値の配列ごとに1つずつ、別々の回答として提案する3つのループを入れ子にします。

P.S.私はあなたがよく知っていると思っていますTitanic dataset。それは正確ですか?

+0

>それは正確ですか?はい – Jack

0

文字列のヌル終端配列をお勧めします。これは、Cではヌルで終了する文字配列です。

char **classes = { "first", "second", NULL }; 
char **ages = { "child", "adult", NULL }; 
char **gender = { "female", "male", NULL }; 

for(char **class = classes; class; class++) { 
    for(char **age = ages; age; age++) { 
     for(char **gender = genders; gender; gender++) { 

あなたがある特定の文字列内の文字を、リスト内の文字列による増分しないように++演算子は、文字**変数におよびNOT変数char *型で動作していることに注意してください。ヌル終了は、ループ変数自体のforループの非常に簡単な第2項を許可します。このアプローチは一般的に可能です。新しいカテゴリ値を文字列のリストに追加するだけで、論理は基本的に同じになります。

0

各乗客は3つの属性を持っている(あなたがより多くのカテゴリ値を追加すると、あなたが組み合わせの数としてより多くのスペースを事前に割り当てる必要があるだろうが成長)、および各属性は、2つの値を持っているので、そこにある
= 8つの可能性があります。配列を記入するには、binary numberという概念を使用できます。

pallPassengersアレイのインデックスとして使用され、同時に、pのバイナリ表現が文字列の選択に使用されます。 pの最上位ビットはgenderを決定し、中間ビットはageを決定し、最下位ビットはclassを決定する。

Passenger allPassengers[8]; 

int main(void) 
{ 
    for (int p = 0; p < 8; p++) 
    { 
     char *gender = (p & 4) ? "female" : "male"; 
     char *age = (p & 2) ? "child" : "adult"; 
     char *class = (p & 1) ? "second" : "first"; 

     strcpy(allPassengers[p].gender, gender); 
     strcpy(allPassengers[p].age, age); 
     strcpy(allPassengers[p].class, class); 
    } 

    for (int p = 0; p < 8; p++) 
     printf("%-6s %s %-6s\n", allPassengers[p].class, allPassengers[p].age, allPassengers[p].gender); 
} 
関連する問題