ディスク管理システムコード再構築例

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 

#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