[C++/C] 色々な型(typedef, enum, 構造体)

### typedef
typedefはint型やdouble型などの型に対して新しい名前をつけるためのキーワード

typedef unsigned long int Count;
Count num = 1;

### enum
ユーザー定義型

enum Week{SUN, MON, TUE, WED, THU, FRI, SAT};

int main() {
    
    Week w;
    w = SUN;

    switch(w){
        case SUN: cout << "日曜です。\n"; break;
        case MON: cout << "月曜です。\n"; break;
        case TUE: cout << "火曜です。\n"; break;
        case WED: cout << "水曜です。\n"; break;
        case THU: cout << "木曜です。\n"; break;
        case FRI: cout << "金曜です。\n"; break;
        case SAT: cout << "土曜です。\n"; break;
        default: cout << "何曜かわかりません。\n"; break;
    }

    return 0;
}

### Structure data type(構造体)

struct Car {
    int num;
    double gas;
};

int main() {
    
    Car car1;

    cout << "ナンバーを入力してください。\n";
    cin >> car1.num;

    cout << "ガソリン量を入力してください。\n";
    cin >> car1.gas;

    cout << "車のナンバーは" << car1.num << ":ガソリン量は" << car1.gas << "です。\n";

    return 0;
}

代入もできる

struct Car {
    int num;
    double gas;
};

int main() {
    
    Car car1 = {1234, 25.5};
    Car car2 = {4567, 52.2};

    cout << "car1の車のナンバーは" << car1.num << ":ガソリン量は" << car1.gas << "です。\n";
    cout << "car2の車のナンバーは" << car2.num << ":ガソリン量は" << car2.gas << "です。\n";

    car2 = car1;

    cout << "car2の車のナンバーは" << car2.num << ":ガソリン量は" << car2.gas << "です。\n";    

    return 0;
}

### 構造体の応用

struct Car {
    int num;
    double gas;
};

void show(Car c);

int main() {
    
    Car car1 = {0, 0.0};

    cout << "ナンバーを入力してください。\n";
    cin >> car1.num;

    cout << "ガソリン量を入力してください。\n";
    cin >> car1.gas;

    show(car1);    

    return 0;
}

void show(Car c){
    cout << "車のナンバーは" << c.num << "ガソリン量は" << c.gas << "です。\n";
}

ポインタを使用する

struct Car {
    int num;
    double gas;
};

void show(Car* pC);

int main() {
    
    Car car1 = {0, 0.0};

    cout << "ナンバーを入力してください。\n";
    cin >> car1.num;

    cout << "ガソリン量を入力してください。\n";
    cin >> car1.gas;

    show(&car1);    

    return 0;
}

void show(Car* pC){
    cout << "車のナンバーは" << pC->num << "ガソリン量は" << pC->gas << "です。\n";
}

※参照もできる

### Union data type(共用体)
同時に値を記憶できるのではなく、全体で1つしか値を記憶することができない

union Year {
    int ad;
    int gengo;
};

int main() {
    
    Year myyear;

    cout << "西暦を入力してください。\n";
    cin >> myyear.ad;

    cout << "西暦は" << myyear.ad << "です。\n";
    cout << "元号も" << myyear.gengo << "です。\n";

    return 0;
}

### Practice

struct Person {
    int age;
    double weight;
    double height;
};

int main() {
    
    Person person1, person2;

    cout << "年齢を入力してください。\n";
    cin >> person1.age;
    cout << "体重を入力してください。\n";
    cin >> person1.weight;
    cout << "身長を入力してください。\n";
    cin >> person1.height;

    cout << "年齢を入力してください。\n";
    cin >> person2.age;
    cout << "体重を入力してください。\n";
    cin >> person2.weight;
    cout << "身長を入力してください。\n";
    cin >> person2.height;

    cout << "年齢" << person1.age << "体重" << person1.weight << "身長" << person1.height << "\n";
    cout << "年齢" << person2.age << "体重" << person2.weight << "身長" << person2.height << "\n";

    return 0;
}

↑同じ処理はfor文で回す

struct Person {
    int age;
    double weight;
    double height;
};

void aging(Person* p);

int main() {
    
    Person person1, person2;

    cout << "年齢を入力してください。\n";
    cin >> person1.age;
    cout << "体重を入力してください。\n";
    cin >> person1.weight;
    cout << "身長を入力してください。\n";
    cin >> person1.height;

    cout << "年齢" << person1.age << "体重" << person1.weight << "身長" << person1.height << "\n";

    aging(&person1);

    return 0;
}

void aging(Person* p) {

    cout << "1年経過しました。\n";
    int a = p->age + 1;
    cout << "年齢" << a << "体重" << p->weight << "身長" << p->height << "\n";
}

ポインタで関数を呼び出す際は、入力時はアドレス(&person)で呼び出す。