C图书借还示例

时间:2022-06-22 17:47:36

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

 

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

 

文件链接 : http://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] =  ' \0 ';
 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\n\n ", 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( " =========================================================\n ");
 74     printf( " |   图书号   |   状态   |       图书名                   \n ");
 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\n "
 84                 pstBookInfo[i].nNum, g_szBookStateString[iStateIndex],
 85                 pstBookInfo[i].szName);
 86     }
 87     printf( " =========================================================\n\n ");
 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( " ====================================================================\n ");
114     printf( " |   时间   |   图书号   |   操作   |       图书名                   \n ");
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\n ",
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( " ====================================================================\n ");
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] =  ' \0 ';
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  /* ********************************************************************** */


 运行截图

C图书借还示例