ディスク管理システムコード再構築例
16105 ワード
説明:1コードはコンパイルされておらず、可読性、保守性の観点から概念上の向上を行うだけである2コードの誤りを特に修正していない(本当に我慢できないだけ修正する)3ソフトウェア設計面での修正を一時的に行う計画はない
元のコード:
#include #include #include
void add(void);//新しいスライスアップフレーム関数int check(void);//ディスククエリ関数int rent(void);//ディスク貸し出し関数void useradd(void);//会員追加関数void returnn(void);//ディスク返却関数
int user_number=1000;//会員数の定義int cd_number=1000;//ディスク数struct cd//ディスク構造体{char film_name[10];//ディスク名char country[10];//ディスク国char type[10];//ディスクタイプint;/*タグがレンタルされているかどうか、レンタル済み:0;レンタルされていない:1;このディスクがない:2*/}
struct rent//ディスク借用構造体{char username[10];//使用者名char film_name[10][10];//ディスク名int rent_timey;//借用年int rent_timem;//借用月int rent_timed;//借用日分int return_timey;//返却年int return_timem;//返却月int return_timed;//返却日int money;//家賃};struct cd CD[1000];//cd数struct rent RENTを定義する[1000];//レンタル数void main(void)//主関数{char choice;//メニューa:printf(「ディスクレンタル管理システムへようこそ-」);printf(「A:新しい映画が棚に上がる」);printf(「B:ディスククエリー」);printf(「C:ディスク貸し出し(会員以外は貸し出し不可)」);printf(「D:ディスク返却」);printf(「E:会員の追加」);printf(「F:システムを終了」);printf("----あなたの選択(大文字を入力してください)----"); rewind(stdin); scanf("%c",&choice); switch(choice)/多条件選択判断{case'A':{add();/*ディスク追加関数*/break;}Case'B':{check();/*ディスククエリー関数*/break;}case'C':{rent();/*ディスク貸し出し関数*/break;}case'D':{returnn();/*ディスク返却関数*/break;}case'E':{useradd();/*会員関数の追加*/break;}case'F':{exit(0);/*プログラムを終了*/}}goto a;//戻るメニュー}void add(void)//新しいシートに{FILE*a;//ファイルポインタprintf("ディスクの名前を入力してください");scanf("%s",CD[cd_number].film_name);printf("ディスクの国を入力してください");scanf("%s",CD[cd_number].contry);printf("ディスクのタイプ(アクション、SF、コメディなど)を入力してください);scanf("%s",CD[cd_number].type); CD[cd_number].n=1;//借用タグif(0=cd_number){a=fopen("cd.txt","wb");fwrite(&CD[cd_number],sizeof(struct cd),1,a); } else { a=fopen("cd.txt","ab"); fwrite(&CD[cd_number], sizeof(struct cd), 1, a); } cd_number++; printf(「ムービー追加成功」); fclose(a); } int check(void)/ディスククエリー{int i;FILE*a;//ファイルポインタchar cd_name[10];a=fopen("cd.txt","rb");for(i=0;i{fread(&CD[i],sizeof(struct cd),1,a)//aのcd構造体をCD[i]}printf("ディスク名を入力してクエリーしてください"); scanf("%s",cd_name); for(i=0;i{if(!(strcmp(CD[i].film_name,cd_name)//同じ映画名であれば{if(1==CD[i].n)/1{printf("ディスクはレンタルされていない");fclose(a);return 1;}else{printf("ディスクレンタル済み");fclose(a);return 1; } } } fclose(a);//aファイルreturn 0を閉じる//戻りメニュー}void useradd(void)/会員{FILE*a;//ファイルポインタprintf("新しいユーザー名を作成してください");scanf("%s",RENT[user_number].username);if(0==user_number){a=fopen("rent.txt","wb");//追加でfwrite(&RENT[user_number],sizeof(struct rent),1,a);}else{a=fopen("rent.txt","ab");fwrite(&RENT[user_number],sizeof(struct rent),1,a);//aのrent構造体をRENT[user_number]printf("おめでとう、会員追加成功"); } user_number++; fclose(a); } int rent(void)//ディスク借用{char user_name[10];char cd_name[10];FILE*a;//ファイルポインタFILE*b;//ファイルポインタint i=0;int j;int k=0;char choice;a=fopen("rent.txt","r")//読み取り専用b=fopen("cd.txt","r");//読み取り専用for(i=0;i{fread(&CD[i],sizeof(struct cd),1,b);//bの1つのcd構造体をCD[i]}for(i=0;i{fread(&RENT[i],sizeof(struct rent),1,a)//aの1つのrent構造体をRENT[i]}printf("ユーザー名を入力してください"); scanf("%s",user_name); for(i=0;i{if(!(strcmp(user_name,RENT[i].username)){a:printf("ディスク名を入力してください");scanf("%s",cd_name);printf("ディスク名を再度入力して確認してください");scanf("%s",RENT[i].film_name[k]); k++; for (j=0;j { if(!(strcmp(CD[j].film_name, cd_name))) {CD[j].n = 0;break;} }}}printf(「レンタル日を入力してください(フォーマット:中央をスペースで区切ってください.例:2012 04 10)」). scanf("%d %d %d",&RENT[i].rent_timey,&RENT[i].rent_timem,&RENT[i].rent_timed); getchar(); printf(「A:引き続きレンタル」);printf(「B:終了」); scanf("%c",&choice); switch(choice)/多条件選択判断{case'A':goto a;break;case'B':return 0; } fclose(a); fclose(b); } void returnn(void)/ディスク返却{char user_name[10];char cd_name[10];FILE*a;FILE*b;int i;int j;int k=0;char choice;a=fopen("rent.txt","r");//読み方のみb=fopen("cd.txt","r");//読み取り専用でfor(i=0;i{fread(&CD[i], sizeof(struct cd), 1, b);//bの1つのcd構造体をCD[i]}for(i=0;i{fread(&RENT[i],sizeof(struct rent),1,a);//aの1つのrent構造体をRENT[i]}printf("ユーザー名を入力してください"); scanf("%s",user_name); for(i=0;i{if(!(strcmp(user_name,RENT[i].username)){a:printf("ディスク名を入力して返してください");scanf("%s",cd_name);for(j=0;j{if(!(strcmp(CD[j].film_name,cd_name))) {CD[j].n = 1;break;} }}}printf(「返却日を入力してください(フォーマット:中央をスペースで区切ってください.例:2012 05 10)」). scanf("%d %d %d",&RENT[i].return_timey,&RENT[i].return_timem,&RENT[i].return_timed); if (0 == ((RENT[i].return_timey*360+RENT[i].return_timem*30+RENT[i].return_timed-RENT[i].rent_timey*360-RENT[i].rent_timem*30-RENT[i].rent_timed) % 3)) { RENT[i].money = (RENT[i].return_timey*360+RENT[i].return_timem*30+RENT[i].return_timed-RENT[i].rent_timey*360-RENT[i].rent_timem*30-RENT[i].rent_timed) / 3; } else { RENT[i].money = (RENT[i].return_timey*360+RENT[i].return_timem*30+RENT[i].return_timed-RENT[i].rent_timey*360-RENT[i].rent_timem*30-RENT[i].rent_timed) / 3 + 1; }printf(「観賞ありがとう.この映画で支払うべき金額は%d元」,RENT[i].money);
getchar(); printf(「A:続行」);printf(「B:終了」); scanf("%c",&choice); switch(choice) { case 'A': goto a; break; case 'B': return 0; } fclose(a); fclose(b); }
第1再構成
セカンドリファクタリング
元のコード:
#include #include #include
void add(void);//新しいスライスアップフレーム関数int check(void);//ディスククエリ関数int rent(void);//ディスク貸し出し関数void useradd(void);//会員追加関数void returnn(void);//ディスク返却関数
int user_number=1000;//会員数の定義int cd_number=1000;//ディスク数struct cd//ディスク構造体{char film_name[10];//ディスク名char country[10];//ディスク国char type[10];//ディスクタイプint;/*タグがレンタルされているかどうか、レンタル済み:0;レンタルされていない:1;このディスクがない:2*/}
struct rent//ディスク借用構造体{char username[10];//使用者名char film_name[10][10];//ディスク名int rent_timey;//借用年int rent_timem;//借用月int rent_timed;//借用日分int return_timey;//返却年int return_timem;//返却月int return_timed;//返却日int money;//家賃};struct cd CD[1000];//cd数struct rent RENTを定義する[1000];//レンタル数void main(void)//主関数{char choice;//メニューa:printf(「ディスクレンタル管理システムへようこそ-」);printf(「A:新しい映画が棚に上がる」);printf(「B:ディスククエリー」);printf(「C:ディスク貸し出し(会員以外は貸し出し不可)」);printf(「D:ディスク返却」);printf(「E:会員の追加」);printf(「F:システムを終了」);printf("----あなたの選択(大文字を入力してください)----"); rewind(stdin); scanf("%c",&choice); switch(choice)/多条件選択判断{case'A':{add();/*ディスク追加関数*/break;}Case'B':{check();/*ディスククエリー関数*/break;}case'C':{rent();/*ディスク貸し出し関数*/break;}case'D':{returnn();/*ディスク返却関数*/break;}case'E':{useradd();/*会員関数の追加*/break;}case'F':{exit(0);/*プログラムを終了*/}}goto a;//戻るメニュー}void add(void)//新しいシートに{FILE*a;//ファイルポインタprintf("ディスクの名前を入力してください");scanf("%s",CD[cd_number].film_name);printf("ディスクの国を入力してください");scanf("%s",CD[cd_number].contry);printf("ディスクのタイプ(アクション、SF、コメディなど)を入力してください);scanf("%s",CD[cd_number].type); CD[cd_number].n=1;//借用タグif(0=cd_number){a=fopen("cd.txt","wb");fwrite(&CD[cd_number],sizeof(struct cd),1,a); } else { a=fopen("cd.txt","ab"); fwrite(&CD[cd_number], sizeof(struct cd), 1, a); } cd_number++; printf(「ムービー追加成功」); fclose(a); } int check(void)/ディスククエリー{int i;FILE*a;//ファイルポインタchar cd_name[10];a=fopen("cd.txt","rb");for(i=0;i{fread(&CD[i],sizeof(struct cd),1,a)//aのcd構造体をCD[i]}printf("ディスク名を入力してクエリーしてください"); scanf("%s",cd_name); for(i=0;i{if(!(strcmp(CD[i].film_name,cd_name)//同じ映画名であれば{if(1==CD[i].n)/1{printf("ディスクはレンタルされていない");fclose(a);return 1;}else{printf("ディスクレンタル済み");fclose(a);return 1; } } } fclose(a);//aファイルreturn 0を閉じる//戻りメニュー}void useradd(void)/会員{FILE*a;//ファイルポインタprintf("新しいユーザー名を作成してください");scanf("%s",RENT[user_number].username);if(0==user_number){a=fopen("rent.txt","wb");//追加でfwrite(&RENT[user_number],sizeof(struct rent),1,a);}else{a=fopen("rent.txt","ab");fwrite(&RENT[user_number],sizeof(struct rent),1,a);//aのrent構造体をRENT[user_number]printf("おめでとう、会員追加成功"); } user_number++; fclose(a); } int rent(void)//ディスク借用{char user_name[10];char cd_name[10];FILE*a;//ファイルポインタFILE*b;//ファイルポインタint i=0;int j;int k=0;char choice;a=fopen("rent.txt","r")//読み取り専用b=fopen("cd.txt","r");//読み取り専用for(i=0;i{fread(&CD[i],sizeof(struct cd),1,b);//bの1つのcd構造体をCD[i]}for(i=0;i{fread(&RENT[i],sizeof(struct rent),1,a)//aの1つのrent構造体をRENT[i]}printf("ユーザー名を入力してください"); scanf("%s",user_name); for(i=0;i{if(!(strcmp(user_name,RENT[i].username)){a:printf("ディスク名を入力してください");scanf("%s",cd_name);printf("ディスク名を再度入力して確認してください");scanf("%s",RENT[i].film_name[k]); k++; for (j=0;j { if(!(strcmp(CD[j].film_name, cd_name))) {CD[j].n = 0;break;} }}}printf(「レンタル日を入力してください(フォーマット:中央をスペースで区切ってください.例:2012 04 10)」). scanf("%d %d %d",&RENT[i].rent_timey,&RENT[i].rent_timem,&RENT[i].rent_timed); getchar(); printf(「A:引き続きレンタル」);printf(「B:終了」); scanf("%c",&choice); switch(choice)/多条件選択判断{case'A':goto a;break;case'B':return 0; } fclose(a); fclose(b); } void returnn(void)/ディスク返却{char user_name[10];char cd_name[10];FILE*a;FILE*b;int i;int j;int k=0;char choice;a=fopen("rent.txt","r");//読み方のみb=fopen("cd.txt","r");//読み取り専用でfor(i=0;i{fread(&CD[i], sizeof(struct cd), 1, b);//bの1つのcd構造体をCD[i]}for(i=0;i{fread(&RENT[i],sizeof(struct rent),1,a);//aの1つのrent構造体をRENT[i]}printf("ユーザー名を入力してください"); scanf("%s",user_name); for(i=0;i{if(!(strcmp(user_name,RENT[i].username)){a:printf("ディスク名を入力して返してください");scanf("%s",cd_name);for(j=0;j{if(!(strcmp(CD[j].film_name,cd_name))) {CD[j].n = 1;break;} }}}printf(「返却日を入力してください(フォーマット:中央をスペースで区切ってください.例:2012 05 10)」). scanf("%d %d %d",&RENT[i].return_timey,&RENT[i].return_timem,&RENT[i].return_timed); if (0 == ((RENT[i].return_timey*360+RENT[i].return_timem*30+RENT[i].return_timed-RENT[i].rent_timey*360-RENT[i].rent_timem*30-RENT[i].rent_timed) % 3)) { RENT[i].money = (RENT[i].return_timey*360+RENT[i].return_timem*30+RENT[i].return_timed-RENT[i].rent_timey*360-RENT[i].rent_timem*30-RENT[i].rent_timed) / 3; } else { RENT[i].money = (RENT[i].return_timey*360+RENT[i].return_timem*30+RENT[i].return_timed-RENT[i].rent_timey*360-RENT[i].rent_timem*30-RENT[i].rent_timed) / 3 + 1; }printf(「観賞ありがとう.この映画で支払うべき金額は%d元」,RENT[i].money);
getchar(); printf(「A:続行」);printf(「B:終了」); scanf("%c",&choice); switch(choice) { case 'A': goto a; break; case 'B': return 0; } fclose(a); fclose(b); }
第1再構成
#include
#include
#include
#define CD_MAX 1000
#define RENT_MAX 1000
#define NAME_LEN_MAX 10
#define RENTS_ALLOWED_MAX 10
typedef enum{
RENTED,
UNRENTED,
UNAVAILABLE,
}CdStatus;
typedef struct _cd
{
char name[NAME_LEN_MAX];
char country[NAME_LEN_MAX];
char type[NAME_LEN_MAX];
CdStatus status;
}CdInfo;
typedef struct _time
{
int year;
int month;
int day;
}Time;
typedef struct _rent
{
char UserName[NAME_LEN_MAX];
char FilmName[RENTS_ALLOWED_MAX][NAME_LEN_MAX];
Time RentDate;
Time ReturnDate;
int Fee;
}RentInfo;
struct CdInfo Cds[CD_MAX];
struct RentInfo Rents[RENT_MAX];
int user_idx = 1000;
int cd_idx = 1000;
void add(void);
int check(void);
void useradd(void);
int rent(void);
void returnn (void);
void ShowMainMenu()
{
printf(" ---------WELCOME TO CD RENT MANAGEMENT SYSTEM-------
");
printf(" A: ADD NEW CD
");
printf(" B: QUERY CD
");
printf(" C: RENT CD (ONLY FOR MEMBERS)
");
printf(" D: RETURN CD
");
printf(" E: ADD NEW MEMBER
");
printf(" F: EXIT
");
printf(" -----PLEASE INPUT YOUR OPTION(UPPER CASE ONLY)-----
");
}
int GetOption()
{
int opt = 0;
rewind(stdin);
scanf("%c",&opt);
return opt;
}
void Handle(int option)
{
switch(option)
{
case 'A':
add();
break;
case 'B':
check();
break;
case 'C':
rent();
break;
case 'D':
returnn();
break;
case'E':
useradd();
break;
case'F':
break;;
}
}
void main (void)
{
char option = 0;
while( option!='F' )
{
ShowMainMenu();
option = GetOption();
Handle(option);
}
exit(0);
}
void UpdateNewCdInfo()
{
printf("please input cd name :
");
scanf("%s",Cds[cd_idx].film_name);
printf("please input cd country :
");
scanf("%s",Cds[cd_idx].country);
printf("please input cd type(such as act/fiction/comedy etc) :
");
scanf("%s",Cds[cd_idx].type);
Cds[cd_idx].status=UNRENTED;
}
#define FILE_CD "cd.txt"
#define FILE_USER "rent.txt"
#define FILE_CREATE "wb"
#define FILE_APPEND "ab"
#define FILE_READ "rb"
#define FILE_READ2 "r"
void StoreCdInfo()
{
FILE *a = NULL;
char flag = (cd_idx==0)?FILE_CREATE:FILE_APPEND;
a = fopen(FILE_NAME,flag);
fwrite(&Cds[cd_idx], sizeof(CdInfo), 1, a);
fclose(a);
}
void add(void)
{
UpdateNewCdInfo();
StoreCdInfo();
cd_idx++;
printf("cd info added successfully
");
}
void LoadCdInfos()
{
FILE *a = NULL;
int i = 0;
a = fopen(FILE_NAME,FILE_READ);
for(i = 0; i < cd_idx; i++)
{
fread(&Cds[i], sizeof(CdInfo), 1, a);
}
fclose(a);
}
#define OK 0
#define NOT_FOUNTD 1
int CheckCd(char *name,CdStatus *status)
{
int i = 0;
for(i=0; i
セカンドリファクタリング
#include
#include
#include
#define CD_MAX 1000
#define USER_MAX 1000
#define NAME_LEN_MAX 10
#define RENTS_ALLOWED_MAX 10
#define FILE_CD "cd.txt"
#define FILE_USER "rent.txt"
#define FILE_CREATE "wb"
#define FILE_APPEND "ab"
#define FILE_READ "rb"
#define FILE_READ2 "r"
#define OK 0
#define NOT_FOUNTD 1
typedef enum{
RENTED,
UNRENTED,
UNAVAILABLE,
}CdStatus;
typedef struct _cd
{
char name[NAME_LEN_MAX];
char country[NAME_LEN_MAX];
char type[NAME_LEN_MAX];
CdStatus status;
}CdInfo;
typedef struct _time
{
int year;
int month;
int day;
}Time;
typedef struct _user
{
char name[NAME_LEN_MAX];
char cds[RENTS_ALLOWED_MAX][NAME_LEN_MAX];
Time rentDate;
Time returnDate;
int fee;
}UserInfo;
/****************************************************
USER INTERFACE
****************************************************/
void UI_ShowMainMenu()
{
printf(" ---------WELCOME TO CD RENT MANAGEMENT SYSTEM-------
");
printf(" A: ADD NEW CD
");
printf(" B: QUERY CD
");
printf(" C: RENT CD (ONLY FOR MEMBERS)
");
printf(" D: RETURN CD
");
printf(" E: ADD NEW MEMBER
");
printf(" F: EXIT
");
}
void UI_ShowCdStatus(CdStatus status)
{
if( status!=UNRENTED )
{
printf("the cd is rented or unavailable
");
}
else
{
printf("the cd is available
");
}
}
int UI_GetOption(int *option)
{
printf(" -----PLEASE INPUT YOUR OPTION(UPPER CASE ONLY)-----
");
rewind(stdin);
scanf("%c",option);
}
void UI_GetCdInfo(CdInfo *cd)
{
printf("please input cd name :
");
scanf("%s",cd->name);
printf("please input cd country :
");
scanf("%s",cd->country);
printf("please input cd type(such as act/fiction/comedy etc) :
");
scanf("%s",cd->type);
}
void UI_GetCdName(char *name)
{
printf("please input the cd you wanted :
");
scanf("%s",name);
}
void UI_GetUserName(char *name)
{
printf("please input user name :
");
scanf("%s",name);
}
void UI_GetDate(Time *date)
{
printf("please input date(format :2012 04 10) :
");
scanf("%d %d %d",date->year,date->month,date->day);
}
void UI_GetSuccessiveOption(int *option)
{
getchar();
printf("A:continue
");
printf("B:finish
");
scanf("%c",option);
}
void UI_ShowCdAdded()
{
printf("cd info added successfully
");
}
void UI_ShowUserAdded()
{
if ( gUsers.Idx!=1 )
{
printf("congratualations, new user added successfully
");
}
}
void UI_ShowFee(int fee)
{
printf("thanks for patronage, you are expected to pay %d for the cd
",fee);
}
/****************************************************
LOCAL INFOs
****************************************************/
typedef struct _cd_record
{
CdInfo cds[CD_MAX];
int idx;/* why should be 1000 at first? */
}CdRecord;
typedef struct _user_record
{
UserInfo users[USER_MAX];
int idx;/* why should be 1000 at first? */
}UserRecord;
CdRecord gCds = {{0},1000};
UserRecord gUsers = {{0},1000};
int INFO_CdNum()
{
return gCds.idx;
}
CdInfo *INFO_CdPtr(const int idx)
{
return &(gCds.cds[idx]);
}
void INFO_AddCdInfo(const CdInfo *newCd)
{
memcpy( gCds.cds[gCds.idx], newCd, sizeof(*newCd) );
gCds.cds[gCds.idx].status=UNRENTED;
gCds.idx++;
}
int INFO_FindCd(const char *name)
{
int i = 0;
for(i=0; i