• ベストアンサー

プログラムについてです。

クラスの身体計測簿をつくるプログラムを作成したいのですが、 以下のプログラムの修正点を指摘願います。 項目は、氏名 身長 体重です。 #include <stdio.h> #define MAX_氏名 50 /*maximum length of name */ #define MAX_身長 200 /*maximum length of height code */ #define MAX_体重 120 /*maximum length of weight */ struct person{ char 氏名[MAX_氏名+1]; char 身長[MAX_身長+1]; char 体重[MAX_体重+1]; }; main() { struct person Book; printf("氏名を入力してください.\n"); gets(Book.氏名); printf("身長を入力してください.\n"); gets(Book.身長); printf("体重を入力してください.\n"); gets(Book.体重); puts(Book.氏名); puts(Book.身長); puts(Book.体重); } こんなんでよろしいのでしょうか?? あと、身長順に並び変えたりするにはどのようなプログラムを用いたらよいのでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

変数名に漢字が使えるコンパイラを知らないのですが、コンパイラの名前を教えて欲しいです。 ソートはqsort関数が手軽に使えて便利だと思います。 参考まで。。 #include <stdio.h> #include <stdlib.h> #define MAX_name 50 /*maximum length of name */ #define MAX_height 200 /*maximum length of height code */ #define MAX_weight 120 /*maximum length of weight */ struct person{ char name[MAX_name+1]; char height[MAX_height+1]; char weight[MAX_weight+1]; }; /* ソートで使用する比較関数 */ int hikaku(const void *a, const void *b) { return atof((*(struct person*)a).height)-atof((*(struct person*)b).height); } main() { struct person Book[5]; int i; for (i=0; i<5; i++) { printf("%d番目の人\n",i+1); printf("氏名を入力してください.\n"); gets(Book[i].name); printf("身長を入力してください.\n"); gets(Book[i].height); printf("体重を入力してください.\n"); gets(Book[i].weight); } printf("ソート前\n"); for (i=0; i<5; i++) printf("%s %s %s\n",Book[i].name,Book[i].height,Book[i].weight); /* ソート実行 */ qsort(&Book, sizeof(Book)/sizeof(struct person), sizeof(struct person), hikaku); printf("ソート後\n"); for (i=0; i<5; i++) printf("%s %s %s\n",Book[i].name,Book[i].height,Book[i].weight); return 0; }

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

char 身長[MAX_身長+1]; char 体重[MAX_体重+1]; 身長や体重を文字として入力するために、 201バイトや121バイト必要な理由が良くわかりません。 せいぜい10バイトくらいもあれば充分("167.23cm","119.23kg")だと思います。 また、データを保持するのには、 char より、floatが良いと思います。

  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.3

まず定義名や変数名が漢字(日本語)で書かれていますが、これは大丈夫ですか? 私が知らないだけかもしれませんが、普通は日本語は使えないかと思います。(もし使えるのでしたら、ぜひともコンパイラ名を補足していただけるとうれしいです!!) 細かいことを言えば、 1.getsはあて先バッファのサイズをチェックしていないので、バッファオーバーフローの危険性がありますので使わないようにしたほうが身のためです。 2.main関数の戻り値と引数が書かれていませんが、これも正しく記述したほうが良いかと思います。(もちろんその場合には、main関数の終わりにはreturn文が必要ですが...) 並び替えについては、#2さんのクイックソートが一番簡単です。(しかも下手なコーディングするよりかも実行速度は速いはず。) 自分で作るならば、struct personの配列を渡して#2さんのhikaku関数のようなもので比較しつつ並び替えればよいでしょう。ちなみに並び替えのアルゴリズムは色々有りますが、やはりクイックソートが一番だと思います。

回答No.1

> 以下のプログラムの修正点を指摘願います。 > こんなんでよろしいのでしょうか?? コンパイル/実行してないのですか?

関連するQ&A