C图书借还示例

以后要搞C了先自己练习一下,系统本身没有太大的实际用途,只是用来磨练编程规范,不足之处还望大家多多指正 。互相交流共同进步。

为了方便只使用了一个 book.c 文件,在vc6 下编译通过,其他编译器还没试过 

文件链接 : https://files.cnblogs.com/GhostZCH/Book.rar 

 

 顺便贴出代码

1

   1 /************************************************************************/

  2 /*                                                                      */
  3 /*   该文件是一个模拟的图书借还系统,通过命令行操作                     */
  4 /*                                                                      */
  5 /* 命令:                                                               */
  6 /*    1. 重启:  reboot                                                  */
  7 /*    2. 查询:  query  [book number]  例:query 1000                    */
  8 /*    3. 借书:  borrow [book number]  例:borrow 1000                   */
  9 /*    4. 还书:  return [book number]  例:return 1000                   */
 10 /*    5. 历史:  history [book number] 例:history 1000                  */
 11 /*                                                                      */
 12 /* 备注:                                                               */
 13 /*    1. 正确的图书编号 [1000, 1009]                                    */
 14 /*    2. query 和 history 命令使用参数 0 查询所有记录  例:query 0      */
 15 /*    3. vc6.0 编译通过                                                 */
 16 /*                                                                      */
 17 /* 作者: Ghost                                                          */ 
 18 /* 主页: http://www.cnblogs.com/GhostZCH                                */
 19 /*                                                                      */
 20 /************************************************************************/
 21 
 22 #include <stdio.h>
 23 #include <stdlib.h>
 24 #include <string.h>
 25 #include <MATH.H>
 26 #include <TIME.H>
 27 
 28 /************************************************************************/
 29 /*   基础数据定义                                                       */
 30 /************************************************************************/
 31 
 32 #define MAX_MSG_LEN        100 
 33 #define MAX_CMD_TMP_LEN    100
 34 #define MAX_BOOK_NAME_LEN  30
 35 #define MAX_BOOK_COUNT     10
 36 #define MIN_BOOK_NUMBER    1000
 37 #define MAX_BOOK_NUMBER    MIN_BOOK_NUMBER + MAX_BOOK_COUNT - 1
 38 #define DEFAULT_BOOK_ID    0
 39 
 40 // 生成消息集合相关的宏定义
 41 #define END_ID_OF_MSG_SET      -1
 42 #define BEGIN_MSG_SET          MSG_INFO g_szMsg[] = {
 43 #define ADD_MSG(ID,MSG_STR)    {ID,MSG_STR},
 44 #define END_MSG_SET            {END_ID_OF_MSG_SET,""}};
 45 
 46 typedef unsigned char UINT8;
 47 typedef unsigned int BookNumber;
 48 
 49 // 系统时间格式
 50 typedef struct tagSysTime
 51 {
 52     UINT8 nHour;
 53     UINT8 nMin;
 54     UINT8 nSec;
 55 }SYS_TIME;
 56 
 57 // 布尔值
 58 typedef enum emBoolVal
 59 {
 60     TRUE,
 61     FALSE
 62 }BOOL;
 63 
 64 // 图书状态
 65 typedef enum emBookState
 66 {
 67     BOOK_IN,
 68     BOOK_OUT
 69 }BOOK_STATE_EM;
 70 
 71 // 图书操作
 72 typedef enum emBookOption
 73 {
 74     BOOK_OP_IN,
 75     BOOK_OP_OUT
 76 }BOOK_OP_EM;
 77 
 78 // 消息ID 系统通过该ID打印消息
 79 typedef enum emMsgID
 80 {
 81     MSG_SYS_INNER_ERROR  = 0 ,  /* 内部错误     */
 82     MSG_SYS_INIT_SUCCESS = 1 ,  /* 初始化成功   */
 83     MSG_SYS_BAD_CMD      = 2 ,  /* 命令错误     */
 84     MSG_BOOK_BAD_ID      = 11,  /* 图书编号错误 */
 85     MSG_BOOK_NOT_IN      = 12,  /* 图书已经外借 */
 86     MSG_BOOK_NOT_OUT     = 13,  /* 图书没有外借 */
 87     MSG_BOOK_BRW_SCS     = 14,  /* 图书外借成功 */
 88     MSG_BOOK_RTN_SCS     = 15,  /* 图书归还成功 */
 89     MSG_BOOK_NOT_HAS     = 16,  /* 无该书信息   */
 90     MSG_BOOK_QRY_SCS     = 17,  /* 图书查询成功 */
 91     MSG_BOOK_HIS_SCS     = 18   /* 历史查询成功 */
 92 }MSG_ID_EM;
 93 
 94 // 消息结构体
 95 typedef struct tagMsgInfo
 96 {
 97     MSG_ID_EM emID;
 98     char szMessage[MAX_MSG_LEN];
 99 }MSG_INFO;
100 
101 // 图书信息
102 typedef struct tagBookInfo
103 {
104     BookNumber nNum;
105     BOOK_STATE_EM emState;
106     char szName[MAX_BOOK_NAME_LEN + 1];
107 } BOOK_INFO;
108 
109 // 图书节约历史信息
110 typedef struct tagBookHistInfo
111 {
112    BOOK_INFO   *pstBookInfo ;
113    BOOK_OP_EM   emBookOption;
114    SYS_TIME     stOptionTime;
115 }BOOK_HIS_INFO;
116 
117 // 图书节约历史信息的链表节点
118 typedef struct tagBookHisNode
119 {
120     BOOK_HIS_INFO stBookHisInfo;
121     struct tagBookHisNode *pstNext;
122 }BOOK_HIS_NODE;
123 
124 // 生成消息集,供系统按ID打印消息
125 BEGIN_MSG_SET
126     ADD_MSG(MSG_SYS_INNER_ERROR , "内部错误"    )
127     ADD_MSG(MSG_SYS_INIT_SUCCESS, "初始化成功"  )
128     ADD_MSG(MSG_SYS_BAD_CMD     , "命令错误"    )
129     ADD_MSG(MSG_BOOK_BAD_ID     , "图书编号错误")
130     ADD_MSG(MSG_BOOK_NOT_IN     , "图书已经外借")
131     ADD_MSG(MSG_BOOK_NOT_OUT    , "图书没有外借")
132     ADD_MSG(MSG_BOOK_BRW_SCS    , "图书外借成功")
133     ADD_MSG(MSG_BOOK_RTN_SCS    , "图书归还成功")
134     ADD_MSG(MSG_BOOK_NOT_HAS    , "无该书信息"  )
135     ADD_MSG(MSG_BOOK_QRY_SCS    , "图书查询成功")
136     ADD_MSG(MSG_BOOK_HIS_SCS    , "历史查询成功")
137 END_MSG_SET

2

   1 /************************************************************************/

  2 /*  界面显示  API                                                       */
  3 /************************************************************************/
  4 
  5 char g_szTimeStamp[10];                                   // 系统打印时间的用的字符串
  6 
  7 char *g_szBookStateString[3]  = {"库存","外借","其他"};   // 图书状态的字符串
  8 
  9 char *g_szBookOptionString[2] = {"借出","归还"};          // 图书操作的字符串
 10 
 11 //********************************************
 12 // Method      :  GetLocalTime
 13 // Description :  将时间戳打印到 g_szTimeStamp
 14 // Returns     :  BOOL 是否打印成功
 15 //*******************************************
 16 BOOL GetLocalTime()
 17 {
 18     time_t ulTime ;
 19     struct tm *stTime = NULL;    
 20     char *pcTimeStr = NULL;
 21     
 22     time(&ulTime);
 23     stTime = localtime(&ulTime); // 此处根据系统原理,不会返回空指针,故不作检测
 24     
 25     sprintf(g_szTimeStamp, "%02d:%02d:%02d", stTime->tm_hour, stTime->tm_min, stTime->tm_sec);
 26     g_szTimeStamp[9] = '';
 27     // localtime 实现的原理不是每次申请内存,而是使用一个全局变量所以返回得指着不需要释放!!!
 28     // free(stTime); 
 29     
 30     return TRUE;
 31 }
 32 
 33 //********************************************
 34 // Method      :  apiPrintMsg
 35 // Description :  按消息ID(MSG_ID_EM)打印系统消息
 36 // Param       :  输入 MSG_ID_EM emMsgID 消息ID
 37 // Returns     :  BOOL 是否打印成功
 38 //*******************************************
 39 void apiPrintMsg(MSG_ID_EM emMsgID)
 40 {
 41     int i;
 42     char *pcTimeStr = NULL;
 43     for ( i = 0; END_ID_OF_MSG_SET != g_szMsg[i].emID; i++ )
 44     {
 45         if ( g_szMsg[i].emID == emMsgID )
 46         {
 47             if ( TRUE == GetLocalTime() )
 48             {
 49                 printf("[%s]>> %s ", g_szTimeStamp, g_szMsg[i].szMessage);    
 50             }
 51             break;
 52         }
 53     }
 54 }
 55 
 56 //********************************************
 57 // Method      :  apiPrintBookInfo
 58 // Description :  打印图书详情
 59 // Param       :  输入 BOOK_INFO* pstBookInfo 图书数组指针
 60 //             :  输入 int iCount  数组长度
 61 //*******************************************
 62 void apiPrintBookInfo(BOOK_INFO* pstBookInfo, int iCount)
 63 {
 64     int i = 0, iStateIndex = 2;
 65     
 66     if ( NULL == pstBookInfo || 0 == iCount)
 67     {
 68         apiPrintMsg(MSG_BOOK_NOT_HAS);
 69         return;
 70     }
 71     
 72     apiPrintMsg(MSG_BOOK_QRY_SCS);
 73     printf("========================================================= ");
 74     printf("|   图书号   |   状态   |       图书名                    ");
 75     for ( i = 0; i < iCount; i++)
 76     {
 77         switch(pstBookInfo[i].emState)
 78         {
 79             case BOOK_IN  : iStateIndex = 0break;
 80             case BOOK_OUT : iStateIndex = 1break;
 81             default: iStateIndex = 2;
 82         }
 83         printf("|   %6u   |   %s   |   %s "
 84                 pstBookInfo[i].nNum, g_szBookStateString[iStateIndex],
 85                 pstBookInfo[i].szName);
 86     }
 87     printf("========================================================= ");
 88 }
 89 
 90 //********************************************
 91 // Method      :  apiPrintBookHistoryInfo
 92 // Description :  打印图书详情 只使用数据 不释放空间
 93 // Param       :  输入 BOOK_HIS_INFO *pstBookHistroyList 图书历史记录数组指针
 94 //             :  输入 int iCount  数组长度
 95 //*******************************************
 96 void apiPrintBookHistoryInfo(BOOK_HIS_INFO *pstBookHistroyList, int iCount)
 97 {
 98     int i = 0, iOpID = -1;
 99 
100     if ( 0 > iCount)
101     {
102         apiPrintMsg(MSG_SYS_INNER_ERROR);
103         return;
104     }
105 
106     if ( NULL == pstBookHistroyList || 0 == iCount)
107     {
108         apiPrintMsg(MSG_BOOK_NOT_HAS);
109         return;
110     }
111     
112     apiPrintMsg(MSG_BOOK_HIS_SCS);
113     printf("==================================================================== ");
114     printf("|   时间   |   图书号   |   操作   |       图书名                    ");
115     for ( i = 0; i < iCount; i++)
116     {
117         switch( pstBookHistroyList[i].emBookOption )
118         {
119             case BOOK_OP_IN  : iOpID = 1break;
120             case BOOK_OP_OUT : iOpID = 0break;
121             default: apiPrintMsg(MSG_SYS_INNER_ERROR);return;
122         }
123 
124         if ( NULL == pstBookHistroyList[i].pstBookInfo )
125         {
126             apiPrintMsg(MSG_SYS_INNER_ERROR);
127             return;
128         }
129 
130         printf("| %02d:%02d:%02d |   %6u   |   %s   |   %s ",
131                 pstBookHistroyList[i].stOptionTime.nHour,
132                 pstBookHistroyList[i].stOptionTime.nMin,
133                 pstBookHistroyList[i].stOptionTime.nSec,
134                 pstBookHistroyList[i].pstBookInfo->nNum,
135                 g_szBookOptionString[iOpID],
136                 pstBookHistroyList[i].pstBookInfo->szName);
137     }
138     printf("==================================================================== ");
139 }

3

  1 /************************************************************************/
  2 /*  数据存储和基础功能  被cmd函数调用 不允许调用 api                    */
  3 /************************************************************************/
  4 
  5 BOOK_INFO g_szBooks[MAX_BOOK_COUNT];    // 图书信息数组
  6 
  7 BOOK_HIS_NODE *g_pstHisLogHead = NULL;  // 历史记录链表头指针(包含数据)
  8 
  9 //********************************************
 10 // Method      :  GetSysTime
 11 // Description :  获得系统时间
 12 // Return      :  包含时分秒的时间结构体
 13 //*******************************************
 14 SYS_TIME GetSysTime()
 15 {
 16     SYS_TIME stSysTime;
 17     time_t ulTime ;
 18     struct tm *stTime = NULL;    
 19     
 20     time(&ulTime);
 21     stTime = localtime(&ulTime);// 这里不需要检测空指针
 22 
 23     stSysTime.nHour = stTime->tm_hour;
 24     stSysTime.nMin  = stTime->tm_min;
 25     stSysTime.nSec  = stTime->tm_sec;
 26 
 27     return stSysTime;
 28 }
 29 
 30 //********************************************
 31 // Method      :  FreeHisList
 32 // Description :  释放历史记录内存
 33 // Param       :  输入 BOOK_HIS_NODE *pstHead 头指针
 34 //*******************************************
 35 void FreeHisList(BOOK_HIS_NODE *pstHead)
 36 {
 37     BOOK_HIS_NODE *pstNode = NULL;
 38 
 39     while( NULL != pstHead)
 40     {
 41         pstNode = pstHead;
 42         pstHead = pstHead->pstNext;
 43         free( pstNode );
 44     }
 45 }
 46 
 47 //********************************************
 48 // Method      :  GetBookHisCount
 49 // Description :  图书历史记录数量,nBookBumber = 0 时返回总长度
 50 // Param       :  输入BookNumber nBookBumber 图书号
 51 // Return      :  int 历史记录数量
 52 //*******************************************
 53 int GetBookHisCount(BookNumber nBookBumber)
 54 {
 55     int nSize = 0;
 56     BOOK_HIS_NODE *pstNode = g_pstHisLogHead;
 57 
 58     if ( DEFAULT_BOOK_ID == nBookBumber )
 59     {
 60         while( NULL != pstNode )
 61         {
 62             pstNode = pstNode->pstNext;
 63             nSize ++ ;
 64         }
 65         return nSize;
 66     }
 67 
 68     while( NULL != pstNode )
 69     {
 70         if ( NULL == pstNode->stBookHisInfo.pstBookInfo )
 71         {
 72             return -1;
 73         }
 74         nSize  += pstNode->stBookHisInfo.pstBookInfo->nNum == nBookBumber? 1 : 0 ;
 75         pstNode = pstNode->pstNext;
 76     }
 77     return nSize;
 78 }
 79 
 80 //********************************************
 81 // Method      :  GetHisNodeByBookID
 82 // Description :  复制图书历史记录信息到数组并返回,出错时 nCount 等于 -1
 83 // Param       :  输入 BookNumber nBookNumber
 84 //             :  输出 int *nCount  数组长度,由调用函数保证非空
 85 // Return      :  BOOK_HIS_INFO* 数组首地址
 86 //*******************************************
 87 BOOK_HIS_INFO *GetHisNodeByBookID(BookNumber nBookNumber,int *nCount)
 88 {
 89     int i = 0;
 90     BOOK_HIS_INFO *pstHisArrHead = NULL;
 91     BOOK_HIS_NODE *pstNode = g_pstHisLogHead;
 92     (*nCount) = GetBookHisCount(nBookNumber); // 出错时返回 -1
 93 
 94     if0 > (*nCount) )
 95     {
 96         return NULL;
 97     }
 98 
 99     pstHisArrHead = (BOOK_HIS_INFO *)malloc((*nCount) * sizeof(BOOK_HIS_INFO));
100     if( NULL == pstHisArrHead )
101     {
102         (*nCount) = -1;
103         return NULL;
104     }
105 
106     if( DEFAULT_BOOK_ID == nBookNumber )
107     {
108         while( NULL != pstNode )
109         {
110             if( NULL == pstNode->stBookHisInfo.pstBookInfo )
111             {
112                 (*nCount) = -1;
113                 free(pstHisArrHead);
114                 return NULL;
115             }
116             pstHisArrHead[i++] = pstNode->stBookHisInfo;
117             pstNode = pstNode->pstNext;
118         }
119         return pstHisArrHead;
120     }
121     
122     while( NULL != pstNode )
123     {
124         if( NULL == pstNode->stBookHisInfo.pstBookInfo )
125         {
126             (*nCount) = -1;
127             free(pstHisArrHead);
128             return NULL;
129         }
130         if( nBookNumber == (pstNode->stBookHisInfo.pstBookInfo->nNum) )
131         {
132             pstHisArrHead[i++] = pstNode->stBookHisInfo;
133         }
134         pstNode = pstNode->pstNext;
135     }
136 
137     return pstHisArrHead;
138 }
139 
140 //********************************************
141 // Method      :  AddHisNode
142 // Description :  向历史记录链表追加节点
143 // Param       :  输入 BOOK_INFO *pstBookInfo 图书信息指针
144 //             :  输入 BOOK_OP_EM emOption 操作枚举
145 // Return      :  BOOL 是否成功
146 //*******************************************
147 BOOL AddHisNode(BOOK_INFO *pstBookInfo, BOOK_OP_EM emOption)
148 {
149     BOOK_HIS_NODE *pstTmp = NULL;
150     BOOK_HIS_NODE *pstBookHisNode = (BOOK_HIS_NODE *)malloc(sizeof(BOOK_HIS_NODE));
151 
152     if ( NULL == pstBookHisNode )
153     {
154         return FALSE;
155     }
156 
157     pstBookHisNode->pstNext = NULL;
158     pstBookHisNode->stBookHisInfo.emBookOption = emOption;
159     pstBookHisNode->stBookHisInfo.pstBookInfo  = pstBookInfo;
160     pstBookHisNode->stBookHisInfo.stOptionTime = GetSysTime();
161 
162     if ( NULL == g_pstHisLogHead )
163     {
164         g_pstHisLogHead = pstBookHisNode;
165         return TRUE;
166     }
167 
168     pstTmp = g_pstHisLogHead;
169     while( NULL != pstTmp->pstNext )
170     {
171         pstTmp = pstTmp->pstNext;
172     }
173     pstTmp->pstNext= pstBookHisNode;
174 
175     return TRUE;
176 }
177 
178 //********************************************
179 // Method      :  IsBookNumRight
180 // Description :  判断输入图书编号是否正确
181 // Param       :  输入 BookNumber nBookNumber 图书编号
182 // Return      :  BOOL 是否正确
183 //*******************************************
184 BOOL IsBookNumRight(BookNumber nBookNumber)
185 {
186     if ( MAX_BOOK_NUMBER >= nBookNumber && MIN_BOOK_NUMBER <= nBookNumber )
187     {
188         return TRUE;
189     }
190     return FALSE;
191 }
192 
193 //********************************************
194 // Method      :  GetBookInfoByID
195 // Description :  获得特定ID的图书
196 // Param       :  输入 BookNumber nBookNumber 图书编号
197 // Return      :  BOOK_INFO* 指向数组中图书信息的地址,禁止释放
198 //*******************************************
199 BOOK_INFO* GetBookInfoByID(BookNumber nBookNumbe)
200 {
201     return &(g_szBooks[nBookNumbe-MIN_BOOK_NUMBER]);
202 }

4

   1 /************************************************************************/

  2 /*  数据存储和基础功能  被cmd函数调用 不允许调用 api                    */
  3 /************************************************************************/
  4 
  5 BOOK_INFO g_szBooks[MAX_BOOK_COUNT];    // 图书信息数组
  6 
  7 BOOK_HIS_NODE *g_pstHisLogHead = NULL;  // 历史记录链表头指针(包含数据)
  8 
  9 //********************************************
 10 // Method      :  GetSysTime
 11 // Description :  获得系统时间
 12 // Return      :  包含时分秒的时间结构体
 13 //*******************************************
 14 SYS_TIME GetSysTime()
 15 {
 16     SYS_TIME stSysTime;
 17     time_t ulTime ;
 18     struct tm *stTime = NULL;    
 19     
 20     time(&ulTime);
 21     stTime = localtime(&ulTime);// 这里不需要检测空指针
 22 
 23     stSysTime.nHour = stTime->tm_hour;
 24     stSysTime.nMin  = stTime->tm_min;
 25     stSysTime.nSec  = stTime->tm_sec;
 26 
 27     return stSysTime;
 28 }
 29 
 30 //********************************************
 31 // Method      :  FreeHisList
 32 // Description :  释放历史记录内存
 33 // Param       :  输入 BOOK_HIS_NODE *pstHead 头指针
 34 //*******************************************
 35 void FreeHisList(BOOK_HIS_NODE *pstHead)
 36 {
 37     BOOK_HIS_NODE *pstNode = NULL;
 38 
 39     while( NULL != pstHead)
 40     {
 41         pstNode = pstHead;
 42         pstHead = pstHead->pstNext;
 43         free( pstNode );
 44     }
 45 }
 46 
 47 //********************************************
 48 // Method      :  GetBookHisCount
 49 // Description :  图书历史记录数量,nBookBumber = 0 时返回总长度
 50 // Param       :  输入BookNumber nBookBumber 图书号
 51 // Return      :  int 历史记录数量
 52 //*******************************************
 53 int GetBookHisCount(BookNumber nBookBumber)
 54 {
 55     int nSize = 0;
 56     BOOK_HIS_NODE *pstNode = g_pstHisLogHead;
 57 
 58     if ( DEFAULT_BOOK_ID == nBookBumber )
 59     {
 60         while( NULL != pstNode )
 61         {
 62             pstNode = pstNode->pstNext;
 63             nSize ++ ;
 64         }
 65         return nSize;
 66     }
 67 
 68     while( NULL != pstNode )
 69     {
 70         if ( NULL == pstNode->stBookHisInfo.pstBookInfo )
 71         {
 72             return -1;
 73         }
 74         nSize  += pstNode->stBookHisInfo.pstBookInfo->nNum == nBookBumber? 1 : 0 ;
 75         pstNode = pstNode->pstNext;
 76     }
 77     return nSize;
 78 }
 79 
 80 //********************************************
 81 // Method      :  GetHisNodeByBookID
 82 // Description :  复制图书历史记录信息到数组并返回,出错时 nCount 等于 -1
 83 // Param       :  输入 BookNumber nBookNumber
 84 //             :  输出 int *nCount  数组长度,由调用函数保证非空
 85 // Return      :  BOOK_HIS_INFO* 数组首地址
 86 //*******************************************
 87 BOOK_HIS_INFO *GetHisNodeByBookID(BookNumber nBookNumber,int *nCount)
 88 {
 89     int i = 0;
 90     BOOK_HIS_INFO *pstHisArrHead = NULL;
 91     BOOK_HIS_NODE *pstNode = g_pstHisLogHead;
 92     (*nCount) = GetBookHisCount(nBookNumber); // 出错时返回 -1
 93 
 94     if0 > (*nCount) )
 95     {
 96         return NULL;
 97     }
 98 
 99     pstHisArrHead = (BOOK_HIS_INFO *)malloc((*nCount) * sizeof(BOOK_HIS_INFO));
100     if( NULL == pstHisArrHead )
101     {
102         (*nCount) = -1;
103         return NULL;
104     }
105 
106     if( DEFAULT_BOOK_ID == nBookNumber )
107     {
108         while( NULL != pstNode )
109         {
110             if( NULL == pstNode->stBookHisInfo.pstBookInfo )
111             {
112                 (*nCount) = -1;
113                 free(pstHisArrHead);
114                 return NULL;
115             }
116             pstHisArrHead[i++] = pstNode->stBookHisInfo;
117             pstNode = pstNode->pstNext;
118         }
119         return pstHisArrHead;
120     }
121     
122     while( NULL != pstNode )
123     {
124         if( NULL == pstNode->stBookHisInfo.pstBookInfo )
125         {
126             (*nCount) = -1;
127             free(pstHisArrHead);
128             return NULL;
129         }
130         if( nBookNumber == (pstNode->stBookHisInfo.pstBookInfo->nNum) )
131         {
132             pstHisArrHead[i++] = pstNode->stBookHisInfo;
133         }
134         pstNode = pstNode->pstNext;
135     }
136 
137     return pstHisArrHead;
138 }
139 
140 //********************************************
141 // Method      :  AddHisNode
142 // Description :  向历史记录链表追加节点
143 // Param       :  输入 BOOK_INFO *pstBookInfo 图书信息指针
144 //             :  输入 BOOK_OP_EM emOption 操作枚举
145 // Return      :  BOOL 是否成功
146 //*******************************************
147 BOOL AddHisNode(BOOK_INFO *pstBookInfo, BOOK_OP_EM emOption)
148 {
149     BOOK_HIS_NODE *pstTmp = NULL;
150     BOOK_HIS_NODE *pstBookHisNode = (BOOK_HIS_NODE *)malloc(sizeof(BOOK_HIS_NODE));
151 
152     if ( NULL == pstBookHisNode )
153     {
154         return FALSE;
155     }
156 
157     pstBookHisNode->pstNext = NULL;
158     pstBookHisNode->stBookHisInfo.emBookOption = emOption;
159     pstBookHisNode->stBookHisInfo.pstBookInfo  = pstBookInfo;
160     pstBookHisNode->stBookHisInfo.stOptionTime = GetSysTime();
161 
162     if ( NULL == g_pstHisLogHead )
163     {
164         g_pstHisLogHead = pstBookHisNode;
165         return TRUE;
166     }
167 
168     pstTmp = g_pstHisLogHead;
169     while( NULL != pstTmp->pstNext )
170     {
171         pstTmp = pstTmp->pstNext;
172     }
173     pstTmp->pstNext= pstBookHisNode;
174 
175     return TRUE;
176 }
177 
178 //********************************************
179 // Method      :  IsBookNumRight
180 // Description :  判断输入图书编号是否正确
181 // Param       :  输入 BookNumber nBookNumber 图书编号
182 // Return      :  BOOL 是否正确
183 //*******************************************
184 BOOL IsBookNumRight(BookNumber nBookNumber)
185 {
186     if ( MAX_BOOK_NUMBER >= nBookNumber && MIN_BOOK_NUMBER <= nBookNumber )
187     {
188         return TRUE;
189     }
190     return FALSE;
191 }
192 
193 //********************************************
194 // Method      :  GetBookInfoByID
195 // Description :  获得特定ID的图书
196 // Param       :  输入 BookNumber nBookNumber 图书编号
197 // Return      :  BOOK_INFO* 指向数组中图书信息的地址,禁止释放
198 //*******************************************
199 BOOK_INFO* GetBookInfoByID(BookNumber nBookNumbe)
200 {
201     return &(g_szBooks[nBookNumbe-MIN_BOOK_NUMBER]);
202 }

5

  1 /************************************************************************/

 2 /*  系统函数 ,禁止其他函数调用                                         */
 3 /************************************************************************/
 4 
 5 //********************************************
 6 // Method      :  GetUserCommand
 7 // Description :  获得输入,激发系统事件 
 8 // Return      :  BOOL 是否退出命令
 9 //*******************************************
10 BOOL GetUserCommand()
11 {    
12     BookNumber nBookNumber = 0;
13     char scTmp[MAX_CMD_TMP_LEN + 1] = {0};
14 
15     scanf("%s", scTmp);
16     scTmp[MAX_CMD_TMP_LEN] = '';
17 
18     if0 == strcmp(scTmp, "exit") )
19     {
20         return FALSE;
21     }
22 
23     if0 == strcmp(scTmp,"reboot"))
24     {
25         cmdBooksInit();
26         return TRUE;
27     }
28 
29     if0 == strcmp(scTmp, "borrow") )
30     {
31         scanf("%u",&nBookNumber);
32         cmdBooksBorrow(nBookNumber);
33         return TRUE;
34     }
35 
36     if0 == strcmp(scTmp, "return") )
37     {
38         scanf("%u",&nBookNumber);
39         cmdBooksReturn(nBookNumber);
40         return TRUE;
41     }
42 
43     if0 == strcmp(scTmp, "query") )
44     {
45         scanf("%u",&nBookNumber);
46         cmdBooksQuery(nBookNumber);
47         return TRUE;
48     }
49 
50     if0 == strcmp(scTmp, "history") )
51     {
52         scanf("%u",&nBookNumber);
53         cmdBooksHistory(nBookNumber);
54         return TRUE;
55     }
56 
57     apiPrintMsg(MSG_SYS_BAD_CMD);
58     return TRUE;
59 }
60 
61 //********************************************
62 // Method      :  main
63 // Description :  启动函数,开始主循环
64 //*******************************************
65 int main()
66 {
67     BOOL bIsRun = TRUE;
68 
69     cmdBooksInit();
70     while ( TRUE == bIsRun )
71     {
72         bIsRun = GetUserCommand();
73     }
74 
75     return 0;
76 }
77 
78 /************************************************************************/
79 /*                       END OF FILE                                    */
80 /************************************************************************/


 运行截图

原文地址:https://www.cnblogs.com/GhostZCH/p/3510566.html