zoukankan      html  css  js  c++  java
  • 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 /************************************************************************/


     运行截图

  • 相关阅读:
    linux运维工程师工作中的一些常见问题解决方法 风行天下
    64位win10系统无法安装.Net framework3.5的两种解决方法 风行天下
    vsphere使用笔记 风行天下
    kvm安装及使用 风行天下
    Linux 安装MySql 5.7.21 操作步骤 风行天下
    去掉mapxtreme for java 的水印
    在MapXtreme for Java 4.8.0 中发布新制作的电子地图
    NetBeans中Tomcat服务器中的manager 为什么不能浏览呢?
    VS2008简体中文正式版序列号及破解方法
    MAPXTREME FOR JAVA中中文显示问题
  • 原文地址:https://www.cnblogs.com/GhostZCH/p/3510566.html
Copyright © 2011-2022 走看看