【C++】名前、身長、体重、をキーボードから読み込みソートさせるプログラム

プログラミング

やっと一冊入門書が終わりそうです。

今回のプログラム

名前、身長、体重の三つのデータをキーボードから入力して構造体の中に放り込んであとからそれをソートさせようという、そんなプログラムです。

#include <iostream>
#include<string.h>

#define NUMBER 5
#define NAME_LENGTH 64

//学生を表す構造体

typedef struct {
    char name[NAME_LENGTH];
    int height;
    float weight;
}Student;

void swap_Student(Student* x, Student* y) {
    Student temp = *x;
    *x = *y;
    *y = temp;
}

void sort_by_height(Student a[], int n) {
    int i, j;
    int flag = 0;

    printf("\nどの項目でソートしますか? 【9=身長/0=体重】:");
    scanf_s("%d", &flag);
    putchar('\n');

    for (i = 0; i < n - 1; i++) {
        for (j = n - 1; j > i; j--) {
            switch (flag) {
            case 0:if (a[j - 1].weight > a[j].weight) {
                swap_Student(&a[j - 1], &a[j]);
            }; break;

            case 9:if (a[j - 1].height > a[j].height) {
                swap_Student(&a[j - 1], &a[j]);
            }; break;
            }
        }
    }
}

void struct_put(Student a[],int n) {
    int i;

    for (i = 0; i < n; i++) {
        printf("%-8s %6d%6.1f\n", a[i].name, a[i].height, a[i].weight);
    }
}

void struct_input(Student a[],int n) {
    
    int i;
    for (i = 0; i < n; i++) {
        printf("%2d人目の情報を入力\n",i+1);
        printf("氏 名:"); scanf_s("%s", a[i].name,NAME_LENGTH);
        printf("身 長:"); scanf_s("%d", &a[i].height);
        printf("体 重:"); scanf_s("%f", &a[i].weight);
    }
}

int main()
{
    int i;
    Student std[NUMBER];   

    //int student_number = NUMBER;

    int student_number = 3;

    /*std[]={{"\0",0,0}};としても可。ただ、std[]の要素数が不明のままだと、
   スタックエラーが出る。
    構造体内部の初期化は行ったことになっているが、要素数は未定のままだとなんか
  エラーが出るようだ。*/
    /*なお要素の初期化はしなくていいので要素数は必ず指定すること?。*/

    struct_input(std,student_number);
   
    printf("\n構造体の中身をいったん表示します。\n");

    struct_put(std,student_number);
    
    sort_by_height(std,student_number);

    struct_put(std,student_number);

    return 0;
}

構造体についていろいろ学べた感じはした気がする。。。

実行結果

配列しか使ったことなかったですが、構造体便利ですねぇ、、、

Arduinoにめちゃめちゃセンサ付けたら値の保持に便利そうですね。

/*実行結果
1人目の情報を入力
氏 名:A
身 長:180
体 重:90
2人目の情報を入力
氏 名:B
身 長:175
体 重:87
3人目の情報を入力
氏 名:C
身 長:170
体 重:88

構造体の中身をいったん表示します。
A           180  90.0
B           175  87.0
C           170  88.0

どの項目でソートしますか ? 【9 = 身長 / 0 = 体重】:0

B           175  87.0
C           170  88.0
A           180  90.0 
*/

ソート項目の選択はなるべく同じプログラムを何度も書きたくなかったので、case文で場合分けしました。heightとweightだけ選択できるようにできればもっと簡潔なんですがまぁ、メモリにカチカチする時代でもないでしょうし、まだ練習なのでいいとしました。

バグ?なのか、いったんスタックしたところ

構造体の配列は初期化しなくても使えるようですが、中身を初期化してしまうとどうやら要素数を指定しなくても動いてしまうみたいなんですよねぇ、、、

構造体配列の宣言を行ったときに、

Student std[];

だと要素数が指定されてない的なバグが出るんですが、中身の要素を初期化して、

以下のように宣言すると、

Student std[]={0};
Student std[]={{"\0",0,0}};

とりあえず動いちゃうんですねぇ、、、。。

プログラムの最後の”}”を指して、「stdにおいてスタックしました。」的なエラーが出ました。

要素数指定しないとだめだよってのは分かるのですが、順序間違えると自分が何を間違ったのかわかんななくなっちゃううので、ちょっと注意?なのかもしれませんねぇ。。

備忘録的に、書き留めておきました。

それでは。

タイトルとURLをコピーしました