图书馆管理系统分析
图书管理:增加图书、修改图书、删除图书
借阅管理:查找图书、借阅图书、归还图书
读者管理:增加读者、删除读者
基于c++的应用软件基本架构
头文件
using namespace std;
数据类1{
public:
带参构造函数;
无参构造函数;
get/set函数;
一些必要的处理数据函数;
运算符重载函数;
private:
基本数据成员;
数据对象成员;
};
...
操作类1{
public:
带参/无参构造函数;//完成必要的初始化操作(例如从文件读数据初始化相关的集合对象及其他数据成员,调用菜单函数)
功能实现函数;
voidmenu();
辅助函数;
voidload();//读文件中的相关数据到集合数据成员
voidsave();//将更新的数据成员信息写到文件中
析构函数
private:
由数据类构成的集合对象;
其他数据成员;
}
....
登录验证类{
public:
构造函数;//从密码文件读取信息并初始化集合对象
//1.对用户输入的登录信息结合密码对象进行合法验证
//2.对合法用户:确定用户具体角色,并生成对应的操作类对象,执行对应操作类功能;
voidlogin();
private:
含密码信息的集合对象;
}
int main(){
定义验证类对象;
调用验证类的login函数;
return0;
}
1. #include
2. using namespace std;
3. //首先定义一系列常量
4. const int MaxRead=100;//最多的读者
5. const int MaxBook=100;//最多的图书
6. const int MaxBookRead=5;//每位读者最多借五本书
7. //读者类,实现对读者的信息的描述
8.
9. class Reader
10.{
11.//定义类的私有成员
12.private:
13. int flag; //删除标记 1:已删 0:未删
14. int no; //读者编号
15. char name[10]; //读者姓名
16. int borbook[MaxBookRead];//所借图书
17.//定义类的公有成员
18.public:
19. Reader() {}//构造函数:作用是初始化的操作
20. char *getname()
21. {
22. return name; //获取姓名
23. }
24. int gettag()
25. {
26. return flag; //获取删除标记
27. }
28. int getno()
29. {
30. return no; //获取读者编号
31. }
32. void setname(char na[]) //设置姓名
33. {
34. strcpy(name,na);
35. }
36. void delbook()
37. {
38. flag=1; //设置删除标记 1:已删 0:未删
39. }
40. void addreader(int n,char *na)//增加读者
41. {
42. flag=0;
43. no=n;
44. strcpy(name,na);
45. for(int i=0; i
46. borbook[i]=0;
47. }
48. void borrowbook(int bookid)//借书操作
49. {
50. for(int i=0; i
51. {
52. if (borbook[i]==0)
53. {
54. borbook[i]=bookid;
55. return;
56. }
57. }
58. }
59. int retbook(int bookid)//还书操作
60. {
61. for(int i=0; i
62. {
63. if(borbook[i]==bookid)
64. {
65. borbook[i]=0;
66. return 1;
67.
68. }
69. }
70. return 0;
71. }
72. void disp()//读出读者信息
73. {
74. cout << setw(5) << no <
75. for(int i=0; i
76. if(borbook[i]!=0)
77. cout << borbook[i] << "|";
78. cout << "]"<
79.
80. }
81.};
82.
83.//读者类库,实现建立读者的个人资料
84.class RDatabase
85.{
86.//定义类的私有成员
87.private:
88. int top; //读者记录指针
89. Reader read[MaxRead];//读者记录
90.//定义类的私有成员
91.public:
92. RDatabase() //构造函数,将reader.txt读到read[]中
93. {
94. Reader s;
95. top=-1;
96. fstream file("reader.txt",ios::in);//打开一个输入文件
97. while (1)//加入死循环中
98. {
99. file.read((char *)&s,sizeof(s));
100. if (!file)break;
101. top++;
102. read[top]=s;
103. }
104. file.close(); //关闭 reader.txt
105. }
106. void clear()//删除所有读者信息
107. {
108. top=-1;
109. }
110. int addreader(int n,char *na)//添加读者时先查找是否存在
111. {
112. Reader *p=query(n);
113. if (p==NULL)
114. {
115. top++;
116. read[top].addreader(n,na);
117. return 1;
118. }
119. return 0;
120.
121. }
122. Reader *query(int readerid)//按编号查找
123. {
124. for (int i=0; i<=top; i++)
125. if (read[i].getno()==readerid &&
126. read[i].gettag()==0)
127. {
128. return &read[i];
129. }
130. return NULL;
131. }
132. void disp() //输出所有读者信息
133. {
134. for (int i=0; i<=top; i++)
135. read[i].disp();
136. }
137. void readerdata();//读者库维护
138. ~RDatabase() //析构函数,将read[]写到reader.txt文件中
139. {
140. fstream file("reader.txt",ios::out);
141. for (int i=0; i<=top; i++)
142. if (read[i].gettag()==0)
143. file.write((char *)&read[i],sizeof(read[i]));
144. file.close();
145. }
146. };
147. void RDatabase::readerdata()
148. {
149.
150. char choice;
151. char rname[20];
152. int readerid;
153. Reader *r;
154. while (choice!='0')
155. {
156. cout <<"\n\n\t\t\t读 者 维 护\n\n\n\t\t 1 新 增\n\n\t\t 2 更 改\n\n\t\t 3 删 除\n\n\t\t 4 查 找\n\n\t\t 5 显 示\n\n\t\t 6 全 删\n\n\t\t 0 退 出"<
157. cin >> choice;
158. switch (choice)
159. {
160. case '1':
161. cout << "输入读者编号:";
162. cin >> readerid;
163. cout << "输入读者姓名:";
164. cin >> rname;
165. addreader (readerid,rname);
166. break;
167. case '2':
168. cout << "输入读者编号:";
169. cin >> readerid;
170. r=query(readerid);
171. if (r==NULL)
172. {
173. cout << " 该读者不存在 "<
174. break;
175. }
176. cout << "输入新的姓名:";
177. cin >> rname;
178. r->setname(rname);
179. break;
180. case '3':
181. cout << " 输入读者编号:";
182. cin >> readerid;
183. r=query(readerid);
184. if (r==NULL)
185. {
186. cout <<" 该读者不存在" << endl;
187. break;
188. }
189. r->delbook();
190. break;
191. case '4':
192. cout << "读入读者编号:";
193. cin >> readerid;
194. r=query(readerid);
195. if (r==NULL)
196. {
197. cout <<"该读者不存在"<< endl;
198. break;
199. }
200. r->disp();
201. break;
202. case '5':
203. disp();
204. break;
205. case '6':
206. clear();
207. break;
208. default:
209. cout<<"输入错误,请从新输入:";
210. break;
211. }
212. }
213. }
214.
215. //图书类,实现对图书的描述,图书的编号,书名,借出,还入等
216. class Book
217. {
218. //定义类的私有成员
219. private:
220. int tag;//删除标记 1:已删 0:未删
221. int no;//图书编号
222. char name[20];//书名
223. int onshelf;//是否再架 1:再架 2:已借
224. //定义类的私有成员
225. public:
226. Book() {}
227. char *getname()
228. {
229. return name; //获取姓名
230. }
231. int getno()
232. {
233. return no; //获取图书编号
234. }
235. int gettag()
236. {
237. return tag; //获取删除标记
238. }
239. void setname(char na[])//设置书名
240. {
241. strcpy(name,na);
242. }
243. void delbook()
244. {
245. tag=1; //删除图书
246. }
247. void addbook(int n,char *na)//增加图书
248. {
249. tag=0;
250. no=n;
251. strcpy(name,na);
252. onshelf=1;
253. }
254. int borrowbook()//借书操作
255. {
256. if (onshelf==1)
257. {
258. onshelf=0;
259. return 1;
260. }
261. return 0;
262. }
263. void retbook()//还书操作
264. {
265. onshelf=1;
266. }
267. void disp()//输出图书
268. {
269. cout << setw(6) << no << setw(18) << name << setw(10)
270. <<(onshelf==1? "在架":"已借") <
271. }
272. };
273.
274. //图书库类,实现对图书的维护,查找,删除等
275. class BDatabase
276. {
277. private:
278. int top; //图书记录指针
279. Book book[MaxBook]; //图书记录
280. public:
281. BDatabase()//构造函数,将book.txt读到book[]中
282. {
283. Book b;
284. top=-1;
285. fstream file("book.txt",ios::in);
286. while (1)
287. {
288. file.read((char *)&b,sizeof(b));
289. if (!file) break;
290. top++;
291. book[top]=b;
292. }
293. file.close();
294. }
295. void clear()//全删
296. {
297. top=-1;
298. }
299. int addbook(int n,char *na)//增加图书
300. {
301. Book *p=query(n);
302. if (NULL==p)
303. {
304. top++;
305. book[top].addbook(n,na);
306. return 1;
307. }
308. return 0;
309. }
310. Book *query(int bookid)//查找图书
311. {
312. for (int i=0; i<=top; i++)
313. if (book[i].getno()==bookid &&book[i].gettag()==0)
314. {
315. return &book[i];
316. }
317. return NULL;
318. }
319. void bookdata();//图书库维护
320. void disp()
321. {
322. for (int i=0; i<=top; i++)
323. if (book[i].gettag()==0)
324. book[i].disp();
325. }
326. ~BDatabase()//析构函数,将book[]写到book.txt文件中
327. {
328. fstream file("book.txt",ios::out);
329. for (int i=0; i<=top; i++)
330. if (book[i].gettag()==0)
331. file.write((char *)&book[i],sizeof(book[i]));
332. file.close();
333. }
334. };
335. void BDatabase::bookdata()
336. {
337. char choice;
338. char bname[40];
339. int bookid;
340. Book *b;
341. while (choice!='0')
342. {
343. cout <<"\n\n\n\t\t\t图 书 维 护 "<
344. cout<<"\t\t1 新 增\n \t\t2 更 改\n\t\t3 删 除\n\t\t4 查 找\n\t\t5 显 示\n\t\t6 全 删\n\t\t0 退 出"<
345. cin >> choice;
346. switch (choice)
347. {
348. case '1':
349. cout << "输入图书编号:"<
350. cin >> bookid;
351. cout << "输入图书书名:"<
352. cin >> bname;
353. addbook(bookid,bname);
354. break;
355. case '2':
356. cout << "输入图书编号:"<
357. cin >> bookid;
358. b=query(bookid);
359. if (b==NULL)
360. {
361. cout << " 该图书不存在 "<
362. break;
363. }
364. cout << "输入新的书名:"<
365. cin >> bname;
366. b->setname(bname);
367. break;
368. case '3':
369. cout <<" 读入图书编号:"<
370. cin >> bookid;
371. b=query(bookid);
372. if (b==NULL)
373. {
374. cout <<" 该图书不存在" << endl;
375. break;
376. }
377. b->delbook();
378. break;
379. case '4':
380. cout << " 读入图书编号:"<
381. cin >> bookid;
382. b=query(bookid);
383. if (b==NULL)
384. {
385. cout <<" 该图书不存在"<< endl;
386. break;
387. }
388. b->disp();
389. break;
390. case '5':
391. disp();
392. break;
393. case '6':
394. clear();
395. break;
396. default:
397. cout<<"输入错误,请从新输入:";
398. }
399. }
400. }
401.
402. //main() 函数的实现,程序的主界面的引导
403.
404. int main(void)
405. {
406. char choice;
407. int bookid,readerid;
408. RDatabase ReaderDB;
409. Reader *r;
410. BDatabase BookDB;
411. Book *b;
412. while(choice!='0')
413. {
414. cout <
415. cout <<"\t\t\t1 借 书\n\n\t\t\t2 还 书 \n\n\t\t\t3 图 书 维 护\n\n\t\t\t4 读 者 维 护\n\n\t\t\t0 离 开"<
416. cin >> choice;
417. switch (choice)
418. {
419. case '1':
420. cout <<" 借书 读者编号:";
421. cin >>readerid;
422. cout <<" 图书编号: ";
423. cin >>bookid;
424. r=ReaderDB.query(readerid);//按编号查找
425. if (NULL==r)
426. {
427. cout <<" 不存在该读者,不能借书"<< endl;
428. break;
429. }
430. b=BookDB.query(bookid);
431. if (b==NULL)
432. {
433. cout <<" 不存在该图书,不能借书"<< endl;
434. break;
435. }
436. if (b->borrowbook()==0)
437. {
438. cout << " 该图书已借出,不能借书"<< endl;
439. break;
440. }
441. r->borrowbook(b->getno());
442. break;
443. case '2':
444. cout<<"还书\n 读者编号:";
445. cin >>readerid;
446. cout << " 图书编号:";
447. cin >>bookid;
448. r=ReaderDB.query(readerid);
449. if (r==NULL)
450. {
451. cout <<" 不存在该读者,不能还书" << endl;
452. break;
453. }
454. b=BookDB.query(bookid);
455. if (b==NULL)
456. {
457. cout <<" 不存在该图书,不能还书" <
458. break;
459. }
460. b->retbook();
461. r->retbook(b->getno());
462. break;
463. case '3':
464. BookDB.bookdata();
465. break;
466. case '4':
467. ReaderDB.readerdata();
468. break;
469. default:
470. cout<<"输入错误,请从新输入:";
471.
472. }
473. }
474. return 0;
475. }