以后要搞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  =  ,  /* 内部错误     */
 82     MSG_SYS_INIT_SUCCESS =  ,  /* 初始化成功   */
 83     MSG_SYS_BAD_CMD      =  ,  /* 命令错误     */
 84     MSG_BOOK_BAD_ID      = ,  /* 图书编号错误 */
 85     MSG_BOOK_NOT_IN      = ,  /* 图书已经外借 */
 86     MSG_BOOK_NOT_OUT     = ,  /* 图书没有外借 */
 87     MSG_BOOK_BRW_SCS     = ,  /* 图书外借成功 */
 88     MSG_BOOK_RTN_SCS     = ,  /* 图书归还成功 */
 89     MSG_BOOK_NOT_HAS     = ,  /* 无该书信息   */
 90     MSG_BOOK_QRY_SCS     = ,  /* 图书查询成功 */
 91     MSG_BOOK_HIS_SCS     =    /* 历史查询成功 */
 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;
 
 // 图书信息
 typedef struct tagBookInfo
 {
     BookNumber nNum;
     BOOK_STATE_EM emState;
     char szName[MAX_BOOK_NAME_LEN + ];
 } BOOK_INFO;
 
 // 图书节约历史信息
 typedef struct tagBookHistInfo
 {
    BOOK_INFO   *pstBookInfo ;
    BOOK_OP_EM   emBookOption;
    SYS_TIME     stOptionTime;
 }BOOK_HIS_INFO;
 
 // 图书节约历史信息的链表节点
 typedef struct tagBookHisNode
 {
     BOOK_HIS_INFO stBookHisInfo;
     struct tagBookHisNode *pstNext;
 }BOOK_HIS_NODE;
 
 // 生成消息集,供系统按ID打印消息
 BEGIN_MSG_SET
     ADD_MSG(MSG_SYS_INNER_ERROR , "内部错误"    )
     ADD_MSG(MSG_SYS_INIT_SUCCESS, "初始化成功"  )
     ADD_MSG(MSG_SYS_BAD_CMD     , "命令错误"    )
     ADD_MSG(MSG_BOOK_BAD_ID     , "图书编号错误")
     ADD_MSG(MSG_BOOK_NOT_IN     , "图书已经外借")
     ADD_MSG(MSG_BOOK_NOT_OUT    , "图书没有外借")
     ADD_MSG(MSG_BOOK_BRW_SCS    , "图书外借成功")
     ADD_MSG(MSG_BOOK_RTN_SCS    , "图书归还成功")
     ADD_MSG(MSG_BOOK_NOT_HAS    , "无该书信息"  )
     ADD_MSG(MSG_BOOK_QRY_SCS    , "图书查询成功")
     ADD_MSG(MSG_BOOK_HIS_SCS    , "历史查询成功")
 END_MSG_SET

2

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

  2 /*  界面显示  API                                                       */
  3 /************************************************************************/
  4 
  5 char g_szTimeStamp[];                                   // 系统打印时间的用的字符串
  6 
  7 char *g_szBookStateString[]  = {"库存","外借","其他"};   // 图书状态的字符串
  8 
  9 char *g_szBookOptionString[] = {"借出","归还"};          // 图书操作的字符串
 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[] = '\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 = ; 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 = , iStateIndex = ;
 65     
 66     if ( NULL == pstBookInfo ||  == 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 = ; i < iCount; i++)
 76     {
 77         switch(pstBookInfo[i].emState)
 78         {
 79             case BOOK_IN  : iStateIndex = ; break;
 80             case BOOK_OUT : iStateIndex = ; break;
 81             default: iStateIndex = ;
 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 = , iOpID = -;
 99 
     if (  > iCount)
     {
         apiPrintMsg(MSG_SYS_INNER_ERROR);
         return;
     }
 
     if ( NULL == pstBookHistroyList ||  == iCount)
     {
         apiPrintMsg(MSG_BOOK_NOT_HAS);
         return;
     }
     
     apiPrintMsg(MSG_BOOK_HIS_SCS);
     printf("====================================================================\n");
     printf("|   时间   |   图书号   |   操作   |       图书名                   \n");
     for ( i = ; i < iCount; i++)
     {
         switch( pstBookHistroyList[i].emBookOption )
         {
             case BOOK_OP_IN  : iOpID = ; break;
             case BOOK_OP_OUT : iOpID = ; break;
             default: apiPrintMsg(MSG_SYS_INNER_ERROR);return;
         }
 
         if ( NULL == pstBookHistroyList[i].pstBookInfo )
         {
             apiPrintMsg(MSG_SYS_INNER_ERROR);
             return;
         }
 
         printf("| %02d:%02d:%02d |   %6u   |   %s   |   %s\n",
                 pstBookHistroyList[i].stOptionTime.nHour,
                 pstBookHistroyList[i].stOptionTime.nMin,
                 pstBookHistroyList[i].stOptionTime.nSec,
                 pstBookHistroyList[i].pstBookInfo->nNum,
                 g_szBookOptionString[iOpID],
                 pstBookHistroyList[i].pstBookInfo->szName);
     }
     printf("====================================================================\n");
 }

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 = ;
 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 -;
 73         }
 74         nSize  += pstNode->stBookHisInfo.pstBookInfo->nNum == nBookBumber?  :  ;
 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 = ;
 90     BOOK_HIS_INFO *pstHisArrHead = NULL;
 91     BOOK_HIS_NODE *pstNode = g_pstHisLogHead;
 92     (*nCount) = GetBookHisCount(nBookNumber); // 出错时返回 -1
 93 
 94     if(  > (*nCount) )
 95     {
 96         return NULL;
 97     }
 98 
 99     pstHisArrHead = (BOOK_HIS_INFO *)malloc((*nCount) * sizeof(BOOK_HIS_INFO));
     if( NULL == pstHisArrHead )
     {
         (*nCount) = -;
         return NULL;
     }
 
     if( DEFAULT_BOOK_ID == nBookNumber )
     {
         while( NULL != pstNode )
         {
             if( NULL == pstNode->stBookHisInfo.pstBookInfo )
             {
                 (*nCount) = -;
                 free(pstHisArrHead);
                 return NULL;
             }
             pstHisArrHead[i++] = pstNode->stBookHisInfo;
             pstNode = pstNode->pstNext;
         }
         return pstHisArrHead;
     }
     
     while( NULL != pstNode )
     {
         if( NULL == pstNode->stBookHisInfo.pstBookInfo )
         {
             (*nCount) = -;
             free(pstHisArrHead);
             return NULL;
         }
         if( nBookNumber == (pstNode->stBookHisInfo.pstBookInfo->nNum) )
         {
             pstHisArrHead[i++] = pstNode->stBookHisInfo;
         }
         pstNode = pstNode->pstNext;
     }
 
     return pstHisArrHead;
 }
 
 //********************************************
 // Method      :  AddHisNode
 // Description :  向历史记录链表追加节点
 // Param       :  输入 BOOK_INFO *pstBookInfo 图书信息指针
 //             :  输入 BOOK_OP_EM emOption 操作枚举
 // Return      :  BOOL 是否成功
 //*******************************************
 BOOL AddHisNode(BOOK_INFO *pstBookInfo, BOOK_OP_EM emOption)
 {
     BOOK_HIS_NODE *pstTmp = NULL;
     BOOK_HIS_NODE *pstBookHisNode = (BOOK_HIS_NODE *)malloc(sizeof(BOOK_HIS_NODE));
 
     if ( NULL == pstBookHisNode )
     {
         return FALSE;
     }
 
     pstBookHisNode->pstNext = NULL;
     pstBookHisNode->stBookHisInfo.emBookOption = emOption;
     pstBookHisNode->stBookHisInfo.pstBookInfo  = pstBookInfo;
     pstBookHisNode->stBookHisInfo.stOptionTime = GetSysTime();
 
     if ( NULL == g_pstHisLogHead )
     {
         g_pstHisLogHead = pstBookHisNode;
         return TRUE;
     }
 
     pstTmp = g_pstHisLogHead;
     while( NULL != pstTmp->pstNext )
     {
         pstTmp = pstTmp->pstNext;
     }
     pstTmp->pstNext= pstBookHisNode;
 
     return TRUE;
 }
 
 //********************************************
 // Method      :  IsBookNumRight
 // Description :  判断输入图书编号是否正确
 // Param       :  输入 BookNumber nBookNumber 图书编号
 // Return      :  BOOL 是否正确
 //*******************************************
 BOOL IsBookNumRight(BookNumber nBookNumber)
 {
     if ( MAX_BOOK_NUMBER >= nBookNumber && MIN_BOOK_NUMBER <= nBookNumber )
     {
         return TRUE;
     }
     return FALSE;
 }
 
 //********************************************
 // Method      :  GetBookInfoByID
 // Description :  获得特定ID的图书
 // Param       :  输入 BookNumber nBookNumber 图书编号
 // Return      :  BOOK_INFO* 指向数组中图书信息的地址,禁止释放
 //*******************************************
 BOOK_INFO* GetBookInfoByID(BookNumber nBookNumbe)
 {
     return &(g_szBooks[nBookNumbe-MIN_BOOK_NUMBER]);
 }

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 = ;
 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 -;
 73         }
 74         nSize  += pstNode->stBookHisInfo.pstBookInfo->nNum == nBookBumber?  :  ;
 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 = ;
 90     BOOK_HIS_INFO *pstHisArrHead = NULL;
 91     BOOK_HIS_NODE *pstNode = g_pstHisLogHead;
 92     (*nCount) = GetBookHisCount(nBookNumber); // 出错时返回 -1
 93 
 94     if(  > (*nCount) )
 95     {
 96         return NULL;
 97     }
 98 
 99     pstHisArrHead = (BOOK_HIS_INFO *)malloc((*nCount) * sizeof(BOOK_HIS_INFO));
     if( NULL == pstHisArrHead )
     {
         (*nCount) = -;
         return NULL;
     }
 
     if( DEFAULT_BOOK_ID == nBookNumber )
     {
         while( NULL != pstNode )
         {
             if( NULL == pstNode->stBookHisInfo.pstBookInfo )
             {
                 (*nCount) = -;
                 free(pstHisArrHead);
                 return NULL;
             }
             pstHisArrHead[i++] = pstNode->stBookHisInfo;
             pstNode = pstNode->pstNext;
         }
         return pstHisArrHead;
     }
     
     while( NULL != pstNode )
     {
         if( NULL == pstNode->stBookHisInfo.pstBookInfo )
         {
             (*nCount) = -;
             free(pstHisArrHead);
             return NULL;
         }
         if( nBookNumber == (pstNode->stBookHisInfo.pstBookInfo->nNum) )
         {
             pstHisArrHead[i++] = pstNode->stBookHisInfo;
         }
         pstNode = pstNode->pstNext;
     }
 
     return pstHisArrHead;
 }
 
 //********************************************
 // Method      :  AddHisNode
 // Description :  向历史记录链表追加节点
 // Param       :  输入 BOOK_INFO *pstBookInfo 图书信息指针
 //             :  输入 BOOK_OP_EM emOption 操作枚举
 // Return      :  BOOL 是否成功
 //*******************************************
 BOOL AddHisNode(BOOK_INFO *pstBookInfo, BOOK_OP_EM emOption)
 {
     BOOK_HIS_NODE *pstTmp = NULL;
     BOOK_HIS_NODE *pstBookHisNode = (BOOK_HIS_NODE *)malloc(sizeof(BOOK_HIS_NODE));
 
     if ( NULL == pstBookHisNode )
     {
         return FALSE;
     }
 
     pstBookHisNode->pstNext = NULL;
     pstBookHisNode->stBookHisInfo.emBookOption = emOption;
     pstBookHisNode->stBookHisInfo.pstBookInfo  = pstBookInfo;
     pstBookHisNode->stBookHisInfo.stOptionTime = GetSysTime();
 
     if ( NULL == g_pstHisLogHead )
     {
         g_pstHisLogHead = pstBookHisNode;
         return TRUE;
     }
 
     pstTmp = g_pstHisLogHead;
     while( NULL != pstTmp->pstNext )
     {
         pstTmp = pstTmp->pstNext;
     }
     pstTmp->pstNext= pstBookHisNode;
 
     return TRUE;
 }
 
 //********************************************
 // Method      :  IsBookNumRight
 // Description :  判断输入图书编号是否正确
 // Param       :  输入 BookNumber nBookNumber 图书编号
 // Return      :  BOOL 是否正确
 //*******************************************
 BOOL IsBookNumRight(BookNumber nBookNumber)
 {
     if ( MAX_BOOK_NUMBER >= nBookNumber && MIN_BOOK_NUMBER <= nBookNumber )
     {
         return TRUE;
     }
     return FALSE;
 }
 
 //********************************************
 // Method      :  GetBookInfoByID
 // Description :  获得特定ID的图书
 // Param       :  输入 BookNumber nBookNumber 图书编号
 // Return      :  BOOK_INFO* 指向数组中图书信息的地址,禁止释放
 //*******************************************
 BOOK_INFO* GetBookInfoByID(BookNumber nBookNumbe)
 {
     return &(g_szBooks[nBookNumbe-MIN_BOOK_NUMBER]);
 }

5

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

 2 /*  系统函数 ,禁止其他函数调用                                         */
 3 /************************************************************************/
 4 
 5 //********************************************
 6 // Method      :  GetUserCommand
 7 // Description :  获得输入,激发系统事件 
 8 // Return      :  BOOL 是否退出命令
 9 //*******************************************
 BOOL GetUserCommand()
 {    
     BookNumber nBookNumber = ;
     char scTmp[MAX_CMD_TMP_LEN + ] = {};
 
     scanf("%s", scTmp);
     scTmp[MAX_CMD_TMP_LEN] = '\0';
 
     if(  == strcmp(scTmp, "exit") )
     {
         return FALSE;
     }
 
     if(  == strcmp(scTmp,"reboot"))
     {
         cmdBooksInit();
         return TRUE;
     }
 
     if(  == strcmp(scTmp, "borrow") )
     {
         scanf("%u",&nBookNumber);
         cmdBooksBorrow(nBookNumber);
         return TRUE;
     }
 
     if(  == strcmp(scTmp, "return") )
     {
         scanf("%u",&nBookNumber);
         cmdBooksReturn(nBookNumber);
         return TRUE;
     }
 
     if(  == strcmp(scTmp, "query") )
     {
         scanf("%u",&nBookNumber);
         cmdBooksQuery(nBookNumber);
         return TRUE;
     }
 
     if(  == strcmp(scTmp, "history") )
     {
         scanf("%u",&nBookNumber);
         cmdBooksHistory(nBookNumber);
         return TRUE;
     }
 
     apiPrintMsg(MSG_SYS_BAD_CMD);
     return TRUE;
 }
 
 //********************************************
 // Method      :  main
 // Description :  启动函数,开始主循环
 //*******************************************
 int main()
 {
     BOOL bIsRun = TRUE;
 
     cmdBooksInit();
     while ( TRUE == bIsRun )
     {
         bIsRun = GetUserCommand();
     }
 
     return ;
 }
 
 /************************************************************************/
 /*                       END OF FILE                                    */
 /************************************************************************/

运行截图

C图书借还示例的更多相关文章

  1. 【形式化方法:VDM++系列】3.基于VDM++的图书管理系统需求定义

    接前文:http://www.cnblogs.com/Kassadin/p/4091040.html 1.Before We Start: 在开始图书管理系统需求定义之前,需要先进行一些说明. 1.1 ...

  2. java+swing+mysql图书管理系统

    系统说明:本系统采用eclipse开发,IDEA,eclipse,myeclipse均可运行 界面采用swing实现 数据库:mysql,附sql代码,其余数据库可复制sql代码运行 数据库连接文件m ...

  3. 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》

    <实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明    辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...

  4. SQL常见面试题(借书卡表_图书表_借书记录表)

    问题描述: 本题用到下面三个关系表: CARD 借书卡:          CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书:           BNO 书号,BNAME 书名,AU ...

  5. ngRx 官方示例分析 - 1. 介绍

    ngRx 的官方示例演示了在具体的场景中,如何使用 ngRx 管理应用的状态. 示例介绍 示例允许用户通过查询 google 的 book  API  来查询图书,并保存自己的精选书籍列表. 菜单有两 ...

  6. python实现图书管理系统

    # 用户注册 def logon(): print("欢迎来到图书管理系统注册页面~") username = input("请输入用户名:") if len( ...

  7. 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)

    图书管理系统数据库设计实验报告 文章目录 更新日志 1.概述 2.需求分析 2.1需要实现的功能 2.2业务流程图 2.2.1学生流程图 2.2.2管理员流程图 2.2.3超级管理员流程图 2.3功能 ...

  8. [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  9. .NET工程师面试宝典

    .Net工程师面试笔试宝典 传智播客.Net培训班内部资料 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面试现场带过来的真实笔试面试题,覆盖了主流的 ...

随机推荐

  1. 机器学习算法-K-means聚类

    引文: k均值算法是一种聚类算法.所谓聚类.他是一种无监督学习,将类似的对象归到同一个蔟中.蔟内的对象越类似,聚类的效果越好. 聚类和分类最大的不同在于.分类的目标事先已知.而聚类则不一样. 由于其产 ...

  2. centos 5.4 安装nodejs + npm(转)

    而在安装nodejs的时候,需要用到,所以需要手动安装bz2库. sudo yum install -y bzip2* cd Python-/Modules/zlib ./configure make ...

  3. 【转】Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)

    http://blog.csdn.net/ccf19881030/article/details/9204801 很久以前使用博客园博主子龙山人的一篇博文<Cocos2d-x win7+vs20 ...

  4. 谈谈JSON数据格式

    JSON 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.        本文主要是对JS操作JSON的要领做下总结.           在JSON中,有两种结构:对 ...

  5. “DBUtility.DbHelperSQL”的类型初始值设定项引发异常 “DBUtility.DbHelperSQL”的类型初始值设定项引发异常

    今天遇到了一个这样的问题“DBUtility.DbHelperSQL”的类型初始值设定项引发异常“DBUtility.DbHelperSQL”的类型初始值设定项引发异常 也许有和我遇到这问题的人也在这 ...

  6. install lua client for redis-server on Mac

    1. lua client library for redis-server https://github.com/nrk/redis-lua 2. dependent luasocket https ...

  7. 观察者模式Demo

    using System; using System.Collections.Generic; namespace Demo {     #region 抽象层,定义了观察者模式     /// &l ...

  8. 玩转html5<canvas>画图

    导航 前言 基本知识 绘制矩形 清除矩形区域 圆弧 路径 绘制线段 绘制贝塞尔曲线 线性渐变 径向渐变(发散) 图形变形(平移.旋转.缩放) 矩阵变换(图形变形的机制) 图形组合 给图形绘制阴影 绘制 ...

  9. .net开发---自定义页面打印区域

    自定义页面打印区域 有3种办法: 办法一:将不需要打印的部位隐藏掉 Examp: <%-- (1)使用css样式,定义一个.noprint的class,将不打印的内容放入这个class内. -- ...

  10. 企业级搜索引擎Solr使用入门指南

    由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择: 基于Lucene自己进行封装实现站内搜索. 工作量及扩展性都 ...