以后要搞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图书借还示例的更多相关文章
-
【形式化方法:VDM++系列】3.基于VDM++的图书管理系统需求定义
接前文:http://www.cnblogs.com/Kassadin/p/4091040.html 1.Before We Start: 在开始图书管理系统需求定义之前,需要先进行一些说明. 1.1 ...
-
java+swing+mysql图书管理系统
系统说明:本系统采用eclipse开发,IDEA,eclipse,myeclipse均可运行 界面采用swing实现 数据库:mysql,附sql代码,其余数据库可复制sql代码运行 数据库连接文件m ...
-
《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》
<实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明 辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...
-
SQL常见面试题(借书卡表_图书表_借书记录表)
问题描述: 本题用到下面三个关系表: CARD 借书卡: CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书: BNO 书号,BNAME 书名,AU ...
-
ngRx 官方示例分析 - 1. 介绍
ngRx 的官方示例演示了在具体的场景中,如何使用 ngRx 管理应用的状态. 示例介绍 示例允许用户通过查询 google 的 book API 来查询图书,并保存自己的精选书籍列表. 菜单有两 ...
-
python实现图书管理系统
# 用户注册 def logon(): print("欢迎来到图书管理系统注册页面~") username = input("请输入用户名:") if len( ...
-
图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)
图书管理系统数据库设计实验报告 文章目录 更新日志 1.概述 2.需求分析 2.1需要实现的功能 2.2业务流程图 2.2.1学生流程图 2.2.2管理员流程图 2.2.3超级管理员流程图 2.3功能 ...
-
[翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
-
.NET工程师面试宝典
.Net工程师面试笔试宝典 传智播客.Net培训班内部资料 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面试现场带过来的真实笔试面试题,覆盖了主流的 ...
随机推荐
-
实现php连接memcached
准备工作: 实现lnmp环境 给php添加模块,so库 下载扩展包:memcache-2.2.5.tgz wget http://pecl.php.net/get/memcache-2.2.5.tgz
-
dev GridControl实现拖拽
一.示例说明 以gridControl1和gridControl2为例,从gridControl1拖拽行到gridControl2中去. 二.属性设置 gridControl2.AllowDrop = ...
-
MVc Forms Membership rolemanage 角色权限验证管理
Forms 登录验证Membership 权限验证rolemanage 角色管理 以往的项目中只有单纯的Forms 验证今天想把这三个结合到mvc 中发现要导入aspnet_ 相关表,但是有个问题验 ...
-
django用户登录和注销
django版本:1.4.21. 一.准备工作 1.新建项目和app [root@yl-web-test srv]# django-admin.py startproject lxysite [roo ...
-
如何在断开ssh连接后仍然保持服务器正常运行程序
问题描述:当SSH远程连接到服务器上,然后运行一个Python程序(bpr.py),然后把终端开闭(切断SSH连接)之后,发现该程序执行中断. 解决方法:使用nohup命令让程序在关闭窗口(切换SSH ...
-
Learn Python The Hard Way学习笔记001
今天搜索了一下raw_input() 和 input()的区别,引用下原文部分内容 两个函数均能接收 字符串 ,但 raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收).而对于 ...
-
mongdb高级操作(group by )
首先介绍哈方法 /** * 利用java驱动自带函数分组查询 * @param key 用来分组文档的字段 [group by key] * @param cond 执行过滤的条件 [where na ...
-
JavaScript高级程序设计(五): js的关键字instanceof和typeof使用
JavaScript中instanceof和typeof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: 一.typeof 1.含义:typeof返回一个表达式的数据类型的字符 ...
-
oracle常见错误类型
http://www.cnblogs.com/whyhappy/p/6232258.html
-
bootstrap注意事项(一)
1.移动设备优先 移动设备优先是 Bootstrap 3 的最显著的变化. 在之前的 Bootstrap 版本中(直到 2.x),您需要手动引用另一个 CSS,才能让整个项目友好的支持移动设备. 现在 ...