以后要搞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
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 = 0; break;
80 case BOOK_OUT : iStateIndex = 1; break;
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 = 1; break;
120 case BOOK_OP_OUT : iOpID = 0; break;
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 /* ********************************************************************** */
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 = 0; break;
80 case BOOK_OUT : iStateIndex = 1; break;
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 = 1; break;
120 case BOOK_OP_OUT : iOpID = 0; break;
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 if( 0 > (*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 }
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 if( 0 > (*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 if( 0 > (*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 }
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 if( 0 > (*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 if( 0 == strcmp(scTmp, " exit ") )
19 {
20 return FALSE;
21 }
22
23 if( 0 == strcmp(scTmp, " reboot "))
24 {
25 cmdBooksInit();
26 return TRUE;
27 }
28
29 if( 0 == strcmp(scTmp, " borrow ") )
30 {
31 scanf( " %u ",&nBookNumber);
32 cmdBooksBorrow(nBookNumber);
33 return TRUE;
34 }
35
36 if( 0 == strcmp(scTmp, " return ") )
37 {
38 scanf( " %u ",&nBookNumber);
39 cmdBooksReturn(nBookNumber);
40 return TRUE;
41 }
42
43 if( 0 == strcmp(scTmp, " query ") )
44 {
45 scanf( " %u ",&nBookNumber);
46 cmdBooksQuery(nBookNumber);
47 return TRUE;
48 }
49
50 if( 0 == 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 /* ********************************************************************** */
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 if( 0 == strcmp(scTmp, " exit ") )
19 {
20 return FALSE;
21 }
22
23 if( 0 == strcmp(scTmp, " reboot "))
24 {
25 cmdBooksInit();
26 return TRUE;
27 }
28
29 if( 0 == strcmp(scTmp, " borrow ") )
30 {
31 scanf( " %u ",&nBookNumber);
32 cmdBooksBorrow(nBookNumber);
33 return TRUE;
34 }
35
36 if( 0 == strcmp(scTmp, " return ") )
37 {
38 scanf( " %u ",&nBookNumber);
39 cmdBooksReturn(nBookNumber);
40 return TRUE;
41 }
42
43 if( 0 == strcmp(scTmp, " query ") )
44 {
45 scanf( " %u ",&nBookNumber);
46 cmdBooksQuery(nBookNumber);
47 return TRUE;
48 }
49
50 if( 0 == 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 /* ********************************************************************** */
运行截图