完成しました!!一応、目的達成です!
ありがとうございます、、。みなさんのおかげです
泣きそうです。。
いくつか疑問あるので質問させてください。
以下が僕の完成版のコードなのですが、
コード:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct {
char name[20]; /* 名前 */
int height; /* 身長 */
int weight; /* 体重 */
} S_MEMBERS;
/*関数プロトタイプ宣言*/
void Display(char *inputname, S_MEMBERS *members); /*特定の人のデータを表示*/
void Change(char *inputname, S_MEMBERS *pmembers); /*データを更新*/
void AddData(S_MEMBERS members[]); /*データを追加*/
void AllDisplay(S_MEMBERS members[]); /*すべてのデータを表示*/
void Delete(S_MEMBERS members[]); /*データを削除*/
int kazu = 3; /*構造体配列の現在の要素数*/
int main(void)
{
S_MEMBERS members[100] = /*構造体配列*/
{
{"A",180,60},
{"B",170,50},
{"C",165,45}
};
char inputname[10]; /*ユーザー入力保存用*/
int select = 0; /*メニュー選択用*/
S_MEMBERS *pmembers;
pmembers = members; /*構造体配列の最初のアドレスを入れる*/
while(1){
printf("---------------------------------------------------------------------------\n");
printf("操作を選択してください:1.追加 2.更新 3.すべてのデータを表示 4.削除 5.終了\n"); /*メニュー*/
printf("---------------------------------------------------------------------------\n");
scanf("%d", &select);
if(select == 1){ /*入力が1ならデータを追加*/
AddData(members);
} else if(select == 2){ /*入力が2なら任意のデータを更新*/
printf("更新したい人の名前を入力してください\n");
scanf("%s", inputname); /*ユーザーが入力*/
Display(inputname, pmembers); /*まず更新したい人の現在のデータを表示させて*/
Change(inputname, pmembers); /*そのあと更新*/
}else if(select == 3){ /*入力が3ならすべてのデータを表示させる*/
AllDisplay(members);
}else if(select == 4){ /*入力が4なら任意のデータを削除*/
Delete(members);
}else if(select == 5){ /*入力が5なら終了*/
printf("\n終了します\n");
break;
}
}
return 0;
}
void Display(char *inputname, S_MEMBERS *pmembers) /*特定の人のデータを表示*/
{
while(1){
if(strcmp(pmembers->name, inputname) == 0){ /*ユーザー入力と構造体配列の名前が一致したら*/
printf("%sの身長は%d,体重は%dです。\n", pmembers->name, pmembers->height, pmembers->weight); /*その人物の名前を表示*/
break;
}
pmembers++; /*一致しなければ次の配列へ*/
}
return;
}
void AllDisplay(S_MEMBERS members[]) /*すべてのデータを表示*/
{
int count;
for (count = 0; count < kazu; count++){
printf("名前:%s 身長:%d 体重:%d\n", members[count].name, members[count].height, members[count].weight);
}
putchar('\n');
return ;
}
void Change(char *inputname, S_MEMBERS *pmembers) /*データを更新*/
{
int shincho = 0; /*体重*/
int taiju = 0; /*身長*/
printf("身長は何にしますか。:");
scanf("%d", &shincho);
printf("体重は何にしますか。:");
scanf("%d", &taiju);
while(1){
if(strcmp(pmembers->name, inputname) == 0){ /*ユーザー入力と構造体配列の名前が一致したら*/
pmembers->height = shincho; /*その人物の身長を更新*/
pmembers->weight = taiju; /*その人物の体重を更新*/
break;
}
pmembers++; /*一致しなければ次の配列へ*/
}
printf("更新されました。\n\n");
return;
}
void AddData(S_MEMBERS members[]) /*データを追加*/
{
char addname[20]; /*名前*/
int addheight = 0; /*身長*/
int addweight = 0; /*体重*/
printf("追加したい人の名前/身長/体重を入力してください\n");
printf("名前:"); scanf("%s", addname);
printf("身長:"); scanf("%d", &addheight);
printf("体重:"); scanf("%d", &addweight);
S_MEMBERS *heap;
heap = (S_MEMBERS*)malloc(sizeof(S_MEMBERS)); /*名前用にmallocで領域を確保*/
strcpy(heap[0].name, addname); /*確保した領域に名前を入れておく*/
strcpy(members[kazu].name, heap[0].name); /*名前、身長、体重を構造体配列に追加*/
members[kazu].height = addheight;
members[kazu].weight= addweight;
printf("追加しました\n\n");
free(heap); /*確保した領域は解放*/
kazu++; /*データを追加したら次の要素にインクリメント*/
return;
}
void Delete(S_MEMBERS members[]) /*データを削除*/
{
char deletename[20]; /*削除したい人の名前*/
int deletecount1;
int deletecount2;
printf("誰を削除しますか?\n");
printf("名前:");
scanf("%s", &deletename);
for (deletecount1 = 0; deletecount1 < kazu; deletecount1++){ /*要素数分だけループ*/
if(strcmp(members[deletecount1].name, deletename) == 0){ /*もし削除したい人の名前が見つかったら*/
for(deletecount2 = deletecount1; deletecount2 < kazu; deletecount2++){ /*そのあとの配列をすべて一つデクリメントしてずらす*/
members[deletecount2] = members[deletecount2+1];
}
}
}
printf("削除されました。\n\n");
kazu--; /*削除したので要素数はひとつ減る*/
return ;
}
疑問はいくつかあります。
①一番最初の構造体配列で、char name[20]; と宣言していますが、これをchar *nameと 宣言するとコンパイルエラーになるのはどうしてなのでしょうか。。
②今僕が書いたコードはリスト構造で実現可能でしょうか。自己参照構造体を使うアルゴ リズムです。
③それから僕が書いたコードはもっとスマートにできるでしょうか。。自分で見ていてもっとスマートに書ける気がするのですが、他の書き方がないか、自分ならこうするとか、不自然な点をご指摘してくれるとありがたいです。。