[[C言語講座第六回演習]] C言語講座第二回 解答例 *構造体 [#d04b7619] 1.以下の構造体と列挙型を作りなさい。 構造体名 Order. メンバ 型名|メンバ名 -----|--------- int|ProductID int|Date int|Number 列挙型名 Rank 要素: Gold Silver Bronze 構造体名 customer typedef Customer メンバ 型名|メンバ名 -----|--------- char*|Name char*|Phone Rank|Rank struct Order[10]|OrderList ~ #include<stdio.h> struct Order { int ProductID; int Date; int Number; }; enum Rank { Gold, Silver, Bronze }; typedef struct customer { char* Name; char* Phone; enum Rank Rank; struct Order Orderlist[20]; } Customer; void main(void) { } ~ 2.この構造体に以下のデータを入力しなさい。 但し、ProductIDが-1なら注文は無いということとする。 ~ 構造体のデータ Name CSR.Inc Phone 0801234567 Rank Silver Order 1. ProductID 22 Date 170215 Number 10 2. ProductID 53 Date 170415 Number 8 3~10: ProductID : -1 ~ #include<stdio.h> struct Order { int ProductID; int Date; int Number; }; enum Rank { Gold, Silver, Bronze }; typedef struct customer { char* Name; char* Phone; enum Rank Rank; struct Order Orderlist[20]; } Customer; void main(void) { Customer CSR; CSR.Name = "CSR.Inc"; CSR.Phone = "0801234567"; CSR.Rank = Silver; CSR.Orderlist[0].ProductID = 22; CSR.Orderlist[0].Date = 170215; CSR.Orderlist[0].Number = 10; CSR.Orderlist[1].ProductID = 53; CSR.Orderlist[1].Date = 170415; CSR.Orderlist[1].Number = 8; int i; for(i = 2; i < 10; i++) CSR.Orderlist[2].ProductID = -1; } ~ 4. 構造体のポインタdataを引数に持ち以下のように出力する関数Showを作りなさい。 その際テストとしてさっきのデータを出力させなさい。 出力形式 Customer Name: CSR.Inc Phone: 0801234567 Rank: Silver Order 1: ID: 22 Date: 170215 Number 10 Order 2: ID: 53 Date: 170415 Number 8 ~ #include<stdio.h> struct Order { int ProductID; int Date; int Number; }; enum Rank { Gold, Silver, Bronze }; typedef struct customer { char* Name; char* Phone; enum Rank Rank; struct Order Orderlist[20]; } Customer; void Show(Customer* data); void main(void) { Customer CSR; CSR.Name = "CSR.Inc"; CSR.Phone = "0801234567"; CSR.Rank = Silver; CSR.Orderlist[0].ProductID = 22; CSR.Orderlist[0].Date = 170215; CSR.Orderlist[0].Number = 10; CSR.Orderlist[1].ProductID = 53; CSR.Orderlist[1].Date = 170415; CSR.Orderlist[1].Number = 8; int i; for(i = 2; i < 10; i++) CSR.Orderlist[i].ProductID = -1; Show(&CSR); } void Show(Customer* data) { printf("Customer Name: %s\n",data->Name); printf("Phone: %s\n",data->Phone); switch(data->Rank) { case Gold: printf("Rank: Gold\n"); break; case Silver: printf("Rank: Silver\n"); break; case Bronze: printf("Rank: Bronze\n"); break; } int i; for(i = 0; i < 10; i++) { if(data->Orderlist[i].ProductID == -1) { }else{ printf("Order: %d\n",i); printf("\t ID: %d\n",data->Orderlist[i].ProductID); printf("\t Date: %d\n",data->Orderlist[i].Date); printf("\t Number: %d\n",data->Orderlist[i].Number); } } } ~ 5. 第七講をみてOrder Rank Customer Showのプロトタイプ をData.hに Showの本体をData.cに mainをmain.cに分割して書きなさい。 ~ Data.h: struct Order { int ProductID; int Date; int Number; }; enum Rank { Gold, Silver, Bronze }; typedef struct customer { char* Name; char* Phone; enum Rank Rank; struct Order Orderlist[20]; } Customer; void Show(Customer* data); Data.c: #include <stdio.h> #include "Data.h" void Show(Customer* data) { printf("Customer Name: %s\n",data->Name); printf("Phone: %s\n",data->Phone); switch(data->Rank) { case Gold: printf("Rank: Gold\n"); break; case Silver: printf("Rank: Silver\n"); break; case Bronze: printf("Rank: Bronze\n"); break; } int i; for(i = 0; i < 10; i++) { if(data->Orderlist[i].ProductID == -1) { }else{ printf("Order: %d\n",i); printf("\t ID: %d\n",data->Orderlist[i].ProductID); printf("\t Date: %d\n",data->Orderlist[i].Date); printf("\t Number: %d\n",data->Orderlist[i].Number); } } } main.c #include <stdio.h> #include "data.h" void main(void) { Customer CSR; CSR.Name = "CSR.Inc"; CSR.Phone = "0801234567"; CSR.Rank = Silver; CSR.Orderlist[0].ProductID = 22; CSR.Orderlist[0].Date = 170215; CSR.Orderlist[0].Number = 10; CSR.Orderlist[1].ProductID = 53; CSR.Orderlist[1].Date = 170415; CSR.Orderlist[1].Number = 8; int i; for(i = 2; i < 10; i++) CSR.Orderlist[i].ProductID = -1; Show(&CSR); } gcc Data.c main.c でコンパイル ~