C图书借还示例
以后要搞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培训班内部资料 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面试现场带过来的真实笔试面试题,覆盖了主流的 ...
随机推荐
- 机器学习算法-K-means聚类
引文: k均值算法是一种聚类算法.所谓聚类.他是一种无监督学习,将类似的对象归到同一个蔟中.蔟内的对象越类似,聚类的效果越好. 聚类和分类最大的不同在于.分类的目标事先已知.而聚类则不一样. 由于其产 ...
- centos 5.4 安装nodejs + npm(转)
而在安装nodejs的时候,需要用到,所以需要手动安装bz2库. sudo yum install -y bzip2* cd Python-/Modules/zlib ./configure make ...
- 【转】Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)
http://blog.csdn.net/ccf19881030/article/details/9204801 很久以前使用博客园博主子龙山人的一篇博文<Cocos2d-x win7+vs20 ...
- 谈谈JSON数据格式
JSON 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式. 本文主要是对JS操作JSON的要领做下总结. 在JSON中,有两种结构:对 ...
- “DBUtility.DbHelperSQL”的类型初始值设定项引发异常 “DBUtility.DbHelperSQL”的类型初始值设定项引发异常
今天遇到了一个这样的问题“DBUtility.DbHelperSQL”的类型初始值设定项引发异常“DBUtility.DbHelperSQL”的类型初始值设定项引发异常 也许有和我遇到这问题的人也在这 ...
- 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 ...
- 观察者模式Demo
using System; using System.Collections.Generic; namespace Demo { #region 抽象层,定义了观察者模式 /// &l ...
- 玩转html5<canvas>画图
导航 前言 基本知识 绘制矩形 清除矩形区域 圆弧 路径 绘制线段 绘制贝塞尔曲线 线性渐变 径向渐变(发散) 图形变形(平移.旋转.缩放) 矩阵变换(图形变形的机制) 图形组合 给图形绘制阴影 绘制 ...
- .net开发---自定义页面打印区域
自定义页面打印区域 有3种办法: 办法一:将不需要打印的部位隐藏掉 Examp: <%-- (1)使用css样式,定义一个.noprint的class,将不打印的内容放入这个class内. -- ...
- 企业级搜索引擎Solr使用入门指南
由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择: 基于Lucene自己进行封装实现站内搜索. 工作量及扩展性都 ...