C言語講座第二回 解答例
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 でコンパイル