こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラミングの質問です

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct person{
char name[10];
int gender;
int age;
};
void printPersonList(struct person *person_p, int size);
void outputPersonList(struct person *person_p, int size);
double getAverageOfAge(struct person *person_p, int size);
int countMales(struct person *person_p, int size);
int countFemales(struct person *person_p, int size);
int main(void){
struct person *person_p;
int i, count, gender, age, maleCount, femaleCount;
char name[20];
double average;

printf("登録する人数を入力してください。\n");
scanf("%d", &count);
person_p = (struct person*)malloc(sizeof(struct person)* count);
for(i=0; i < count; i++){
printf("名前・性別(男性:0, 女性:1)・年齢をスペース区切りで入力してください。\n");
scanf("%s %d %d", name, &gender, &age);
strcpy((person_p + i) -> name, name);
(person_p + i) -> gender = gender;
(person_p + i) -> age = age;
}
printPersonList(person_p, count);
outputPersonList(person_p, count);
average = getAverageOfAge(person_p, count);
printf("平均年齢:%f\n", average);
maleCount = countMales(person_p, count);
femaleCount = countFemales(person_p, count);
printf("男性:%d名, 女性:%d名\n", maleCount, femaleCount);
free(person_p);
return 1;
}
void printPersonList(struct person *person_p, int size){
int i;
printf("登録リスト\n");
printf(" name | gender | age\n");
printf("----------+--------+-----\n");
for(i=0; i < size; i++){
printf("%10s | %1d | %2d\n",
(person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age);
}
}
void outputPersonList(struct person *person_p, int size){
FILE *output;
int i;
if((output = fopen("meibo.c", "w")) == NULL){
printf("meibo.cを開けませんでした。\n");
return;
}
for(i=0; i < size; i++){
fprintf(output, "%s, %d, %d\n",
(person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age);
}
fclose(output);
}
上は、「キーボードで入力した個人データ(名前、性別、年齢)を構造体に入れて、一覧を画面に出し、かつ、ファイルに書き出す」ことをするプログラムです。これを名前が辞書順になるようにしたいです。どう書くのか教えてください。

投稿日時 - 2010-11-30 17:31:15

QNo.6354193

すぐに回答ほしいです

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

stdlib.hヘッダーファイル定義の qsort()関数を使うのが定番かと。
http://tct.ivory.ne.jp/text/prog/C/note/qsort.htm




//プロトタイプ宣言
int myComp(const void *a, const void *b);

int main(void)
{
・・・省略・・・
qsort(person_p, count, sizeof(struct person), myComp);
・・・省略・・・
return 0;
}

int myComp(const void *a, const void *b)
{
struct person *x, *y;
x = (struct person *)a;
y = (struct person *)b;
return strcmp(x->name, y->name);
}

投稿日時 - 2010-12-05 08:24:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

入力データをリストに挿入するときに,常に順序を保ちながら,
挿入していくという考え方もありますね。

投稿日時 - 2010-11-30 23:04:27

ANo.2

名前順に並び替えればいいのです。
課題なら講師なり先生に聞けば。そのために授業料払っているのだから。

投稿日時 - 2010-11-30 19:20:13

ANo.1

一般に「名前」には 1つの書き方に対し複数の読み方が存在します. したがって, 「辞書順になるようにする」ためには「読み方」を示すデータが必要です. それを追加し, さらに入力したデータをソートしてから出力することになろうかと.
もちろんこれは最低限なので, やろうと思えばどこまでも複雑にできます.

投稿日時 - 2010-11-30 19:19:55

あなたにオススメの質問