1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制(继承、派生及多态性)来实现系统功能。
(3)在系统的设计中,要有清晰的界面设计,同时采用文件进行读写操作。
3、创新要求: 在基本要求达到后,可进行创新设计。
二、问题描述及其功能要求建立一个图书馆管理系统,可以处理以下对象:⑴ 图书馆基本信息。⑵ 图书馆的书籍。⑶ 图书馆管理员 。⑷ 读者信息。
程序要完成下列功能:
⑴ 查询图书馆的总信息。⑵ 查询图书馆管理员的信息。⑶ 查询图书馆藏书信息。
⑷ 存入新书(有管理员加入,需进行身份验证)。⑸ 旧书处理。⑹ 存入新的管理员的信息。⑺ 修改管理员信息(增加工龄,加薪)。⑻ 两所图书馆的最大藏书量之和。
⑼ 根据书名检索书刊信息。⑽ 查询读者的借阅信息。⑾ 查询读者信息(包括借书情况、到期时间、罚款情况。)。⑿ 管理员可以修改用户的欠款和交款的金额。
⒀ 读者分为学生、研究生和教师。学生的租期为1个月,教师的租期为2个月。
三、源代码 main.c#define _CRT_SECURE_NO_WARNINGS #includeLib.h#include #include #include #include"Lib.h" void ShowMainMenu() { system("cls"); printf("nnnnn"); printf("t|----------------------欢迎进入---------------------------n"); printf("t| 读者管理系统 n"); printf("t| 1、查询图书馆的总信息 n"); printf("t| 2、查询图书馆管理员的信息 n"); printf("t| 3、查询图书馆藏书信息 n"); printf("t| 4、存入新书 n"); printf("t| 5、旧书处理 n"); printf("t| 6、存入新的管理员的信息 n"); printf("t| 7、修改管理员信息 n"); printf("t| 8、两所图书馆的最大藏书量之和 n"); printf("t| 9、根据书名检索书刊信息 n"); printf("t| 10、查询读者的借阅信息 n"); printf("t| 11、查询读者信息 n"); printf("t| 12、管理员可以修改用户的欠款和交款的金额 n"); printf("t| 13、读者借书 n"); printf("t| 14、读者还书 n"); printf("t| 15、读者交费 n"); printf("t| 0、退出 n"); printf("t|---------------------------------------------------------n"); printf("新打开程序需先添加管理员n"); printf("n"); printf("tt请选择(0-15):"); } int main() { Book* book = NULL; //定义一个Book*类型的结点 来充当头节点 为什么赋值NULL, 这个book指针并没有分配内存,防止野指针,为了安全赋值NULL; //什么时候给他赋值;第一次创建book结点的时候 Reader* reader = NULL; Manger* manger = NULL; //名字为manger的链表 的首结点 也就是第一个结点 的指针 这个指针 manger 指向链表中第一个结点 int iItem; ShowMainMenu(); scanf("%d", &iItem); getchar(); while (1) { switch (iItem) { case 1:ShowLibInfo(book, reader, manger); break; case 2:foundManger(manger); break; case 3:ShowLibBook(book); break; case 4:book=AddBook(book,manger); break; case 5:book=DealoldBook(book); break; case 6:manger=AddManger(manger); // 返回一个manger的指针 赋值给 manger链表的首结点 ,那么首结点就分配内存了 break; case 7:ModManger(manger); break; case 8:AddTowLib(); break; case 9:foundBook(book); break; case 10:foundReader_Info(reader); break; case 11:foundReaderInfo(reader); break; case 12:ModReaderBlance(manger ,reader); break; case 13:reader=LendBook(reader,book); break; case 14:returnBook(reader, book); break; case 15:rachage(manger,reader); break; default: printf("t输入有误,请重新输入!n"); Sleep(2000); } ShowMainMenu(); scanf("%d", &iItem); getchar(); } return 0; }
#pragma once
typedef struct Book
{
int iNum;
char acName[15];
char acAuthor[15];
char acPress[15];
int iAmount;
struct Book* next;
struct Book* tial;
}Book;
typedef struct Reader
{
int iNum;
char acName[15];
char acSex[4];
char position[20];
int iMax; //Student 20本 teacher 40本
int iAmount;
int aiBookId[100];
int balance;
int day;
struct Reader* next;
}Reader;
typedef struct Manger
{
int id;
char name[20];
int password;
char gender[3];
int salary;
struct Manger* next;
}Manger;
void ShowLibInfo(const Book*book, const Reader*reader, const Manger*manger);
void foundManger(Manger* manger);
void ShowLibBook(Book* book);
Book* AddBook(Book* book, Manger* manger);
Book* DealoldBook(Book* book);
Manger* AddManger(Manger* manger);
void ModManger(Manger* manger);
void AddTowLib();
void foundBook(Book* book);
void foundReader_Info(Reader* reader);
void foundReaderInfo(Reader* reader);
void ModReaderBlance(Manger* manger, Reader* reader);
Reader* LendBook(Reader* reader, Book* book);
void returnBook(Reader* reader,Book* book);
void rachage(Manger* manger,Reader* reader);
Lib.c
#define _CRT_SECURE_NO_WARNINGS #pragma once #include"Lib.h" #include #includevoid ShowLibInfo(const Book* book1, const Reader* reader1, const Manger* manger1) { Book* book = book1; Reader* reader = reader1; Manger* manger = manger1; int bookNUm = 0, readerNUm = 0, mangerNUm = 0; while (book != NULL) { bookNUm++; book = book->next; } while (reader != NULL) { readerNUm++; reader = reader->next; } while (manger != NULL) { mangerNUm++; manger = manger->next; } printf("本图书馆共有藏书%d本,读者%d人,管理员%d人n", bookNUm, readerNUm, mangerNUm); printf("按任意键返回n"); getchar(); return; } void foundManger(Manger* manger1) { Manger* manger = manger1; int id; printf("输入要查找的管理员编号:"); scanf("%d", &id); getchar(); while (manger != NULL) { if (id == manger->id) { printf("已找到,信息如下:n"); printf("%dt%st%st%d", manger->id, manger->name, manger->gender, manger->salary); printf("n按任意键返回n"); getchar(); return; } manger = manger->next; } printf("没有此管理员n"); printf("按任意键返回n"); getchar(); return; } void ShowLibBook(Book* book1) { Book* book = book1; while (book != NULL) { // t :制表符 printf("%dt%st%st%st%dn", book->iNum, book->acName, book->acAuthor, book->acPress, book->iAmount); book = book->next; } printf("n按任意键返回n"); getchar(); return; } Book* AddBook(Book* book1, Manger* manger1) { Book* book = book1; Manger* manger = manger1; printf("请输入管理员Id:"); int id; scanf("%d", &id); getchar(); while (manger != NULL) { if (id == manger->id) { printf("输入管理员密码:"); int pass; scanf("%d", &pass); getchar(); if (book == NULL) { if (pass == manger->password) { Book* tmp = (Book*)malloc(sizeof(Book)); tmp->next = NULL; assert(tmp); printf("输入书的编号:"); scanf("%d", &tmp->iNum); getchar(); printf("输入书的名称:"); gets(&tmp->acName); printf("输入书的作者:"); gets(tmp->acAuthor); printf("输入书的出版社:"); gets(tmp->acPress); printf("输入书的库存量:"); scanf("%d", &tmp->iAmount); book = tmp; printf("按任意键返回n"); getchar(); return book; } printf("密码错误!n"); printf("按任意键返回n"); getchar(); return; } if (pass == manger->password) { while (1) { while (book->next == NULL) { int flag = 1; while (flag) { Book* tmp = (Book*)malloc(sizeof(Book)); tmp->next = NULL; assert(tmp); printf("输入书的编号:"); scanf("%d", &tmp->iNum); getchar(); printf("输入书的名称:"); gets(&tmp->acName); printf("输入书的作者:"); gets(tmp->acAuthor); printf("输入书的出版社:"); gets(tmp->acPress); printf("输入书的库存量:"); scanf("%d", &tmp->iAmount); book->next = tmp; printf("是否继续输入:1==>继续t0==>结束t"); scanf("%d", &flag); getchar(); if (flag == 0) { printf("按任意键返回n"); getchar(); return book1; } } } book = book->next; } } printf("密码错误!n"); printf("按任意键返回n"); getchar(); return book1; } manger = manger->next; } printf("没有找到该管理员"); printf("按任意键返回n"); getchar(); return; } Book* DealoldBook(Book* book1) { Book* book = book1; Book* prev = book1; printf("输入要处理旧书的编号:"); int id; scanf("%d", &id); getchar(); while (book != NULL) { if (id == book->iNum) { if (book1 == book) { book = book->next; free(prev); return book; } prev->next = book->next; free(book); // free():释放资源 printf("已将旧书处理掉!n"); printf("按任意键返回n"); getchar(); return book1; } prev = book; book = book->next; } printf("没有找到该图书n"); printf("按任意键返回n"); getchar(); return book1; } Manger* AddManger(Manger* manger1) //形参,是manger链表的指针或地址 { Manger* manger = manger1; // while (1) { if (manger == NULL) { Manger* tmp = (Manger*)malloc(sizeof(Manger)); //动态内存分配: 开辟一个 Manger类型大小的空间 返回一个 Manger*类型的指针 if (tmp == NULL) { printf("erron"); return NULL; } tmp->next = NULL; printf("输入管理员id:"); scanf("%d", &tmp->id); getchar(); printf("输入管理员姓名:"); gets(&tmp->name); printf("输入管理员密码:"); scanf("%d", &tmp->password); getchar(); printf("输入管理员性别:"); gets(tmp->gender); printf("输入管理员工资:"); scanf("%d", &tmp->salary); getchar(); manger= tmp; printf("按任意键返回n"); getchar(); return manger; } else { while (manger->next == NULL) { Manger* tmp = (Manger*)malloc(sizeof(Manger)); tmp->next = NULL; printf("输入管理员id:"); scanf("%d", &tmp->id); getchar(); //吸收一个字符,也就是把scanf输入时存留的回车吸收掉 printf("输入管理员姓名:"); gets(&tmp->name); printf("输入管理员密码:"); scanf("%d", &tmp->password); getchar(); printf("输入管理员性别:"); gets(tmp->gender); printf("输入管理员工资:"); scanf("%d", &tmp->salary); getchar(); manger->next = tmp; printf("按任意键返回n"); getchar(); return manger1; } } manger = manger->next; } } void ModManger(Manger* manger1) { Manger* manger = manger1; printf("输入要修改的管理员id:"); int id; scanf("%d", &id); getchar(); while (manger != NULL) { if (id == manger->id) { printf("输入管理员id:"); scanf("%d", &manger->id); getchar(); printf("输入管理员姓名:"); scanf("%s", &manger->name); getchar(); printf("输入管理员密码:"); scanf("%d", &manger->password); getchar(); printf("输入管理员性别:"); gets(manger->gender); printf("输入管理员工资:"); scanf("%d", &manger->salary); getchar(); printf("按任意键返回n"); getchar(); return; } manger = manger->next; } } void AddTowLib() { } void foundBook(Book* book1) { Book* book = book1; printf("输入要查找的书的id:"); int id; scanf("%d", &id); getchar(); while (book != NULL) { if (id == book->iNum) { printf("该书的信息如下:n"); printf("%dt%st%st%st%dn", book->iNum, book->acName, book->acAuthor, book->acPress, book->iAmount); printf("按任意键返回n"); getchar(); return; } book = book->next; } printf("没有找到该书!n"); printf("按任意键返回n"); getchar(); return; } void foundReader_Info(Reader* reader1) { Reader* reader = reader1; //备份 printf("输入读者的id:"); int id; scanf("%d", &id); getchar(); while (reader) { if (id == reader->iNum) { printf("借阅的书的编号如下:n"); for (int i = 0; i < reader->iMax; i++) //根据读者可以借阅的数量作为循环终止条件 { if (reader->aiBookId[i] != 0) //数组里不为0,证明有一条记录,因为:数组初始化为0,并且书的编号不可能为0 { printf("%dn", reader->aiBookId[i]); } } printf("按任意键返回n"); getchar(); return; } reader = reader->next; } printf("没有该读者!n"); printf("按任意键返回n"); getchar(); return; } void foundReaderInfo(Reader* reader1) { Reader* reader = reader1; printf("输入读者的id:"); int id; scanf("%d", &id); getchar(); while (reader) { if (id == reader->iNum) { printf("读者id:%dn", reader->iNum); printf("读者姓名:%sn", reader->acName); printf("读者性别:%sn", reader->acSex); printf("读者职位:%sn", reader->position); printf("读者已借阅书的数量:%dn", reader->iAmount); printf("按任意键返回n"); getchar(); return; } reader = reader->next; } printf("没有找到该读者n"); printf("按任意键返回n"); getchar(); return; } void ModReaderBlance(Manger* manger1, Reader* reader1) { Manger* manger = manger1; Reader* reader = reader1; printf("登录管理员账号:"); int id_M; scanf("%d", &id_M); getchar(); while (manger) { if (id_M == manger->id) { printf("请输入管理员账号密码:"); int passW; scanf("%d", &passW); getchar(); if (passW == manger->password); { printf("登录成功!n"); printf("输入要读者的id:"); int id_r; scanf("%d", &id_r); getchar(); while (reader) { if (id_r == reader->iNum) { printf("输入修改后的金额:"); int balance; scanf("%d", &balance); getchar(); reader->balance = balance; printf("修改成功!n"); printf("按任意键返回n"); getchar(); return; } reader = reader->next; } } printf("密码错误!n"); printf("按任意键返回n"); getchar(); return; } } printf("没有该管理员n"); printf("按任意键返回n"); getchar(); return; } Reader* LendBook(Reader* reader1, Book* book1) { Reader* reader = reader1; Book* book = book1; Reader* prev = reader1; Reader* tmpp = reader1; printf("输入读者id:"); int id; scanf("%d", &id); getchar(); if (reader == NULL) { Reader* tmp = (Reader*)malloc(sizeof(Reader)); tmp->next = NULL; tmp->iAmount = 0; tmp->iNum = id; printf("输入读者名字:"); scanf("%s", &tmp->acName); getchar(); printf("输入读者性别:"); scanf("%s", &tmp->acSex); getchar(); printf("输入读者职位: "); scanf("%s", &tmp->position); getchar(); if (strcmp(tmp->position, "student") == 0) { tmp->iMax = 20; tmp->day = 30; } else { tmp->iMax = 40; tmp->day = 60; } for (int i = 0; i < tmp->iMax; i++) { tmp->aiBookId[i] = 0; } printf("输入要借的书的编号:"); int id_book; scanf("%d", &id_book); getchar(); while (book != NULL) { if (id_book == book->iNum) { if (book->iAmount <= 1) { printf("借阅失败,该图书库存不足.n"); printf("按任意键返回n"); getchar(); return NULL; } if ((tmp->iAmount) + 1 > tmp->iMax) { printf("借阅失败,该读者借阅图书数量已达上线.n"); printf("按任意键返回n"); getchar(); return NULL; } book->iAmount--; tmp->aiBookId[tmp->iAmount] = id_book; tmp->iAmount; reader = tmp; printf("借阅成功!n"); printf("按任意键返回n"); getchar(); return reader; } book = book->next; } printf("没有找到该书!n"); printf("按任意键返回n"); getchar(); return reader1; } if (reader != NULL) { while (reader != NULL) { if (id == reader->iNum) { printf("图使馆当前的书籍册:n"); ShowLibBook(book); printf("输入要借的书的编号:"); int id_book; scanf("%d", &id_book); getchar(); while (book != NULL) { if (id_book == book->iNum) { if (book->iAmount <= 1) { printf("借阅失败,该图书库存不足.n"); printf("按任意键返回n"); getchar(); return reader1; } if (tmpp->iAmount + 1 > tmpp->iMax) { printf("借阅失败,该读者借阅图书数量已达上线.n"); printf("按任意键返回n"); getchar(); return reader1; } reader->iAmount++; reader->aiBookId[tmpp->iAmount] = id_book; return reader1; } book = book->next; } printf("没有找到该书!n"); printf("按任意键返回n"); } reader = reader->next; } } } void returnBook(Reader* reader1, Book* book1) { Reader* reader = reader1; Book* book = book1; printf("请输入读者的id:"); int id; scanf("%d", &id); getchar(); if (reader != NULL) { while (reader != NULL) { if (id == reader->iNum) { printf("请输入要还的书的编号:"); int id_book; scanf("%d", &id_book); getchar(); for (int i = 0; i < reader->iMax; i++) { if (reader->aiBookId[i] == id_book) { reader->aiBookId[i] = 0; while (book) { if (id_book == book->iNum) { book->iAmount++; printf("还书成功!n"); printf("按任意键返回n"); getchar(); return reader1; } book = book->next; } } } printf("没有找到该图书,检查图书的Idn"); printf("按任意键返回n"); getchar(); return reader1; } reader = reader->next; } printf("没有找到该读者,检查读者id是否输入有误n"); printf("按任意键返回n"); getchar(); return reader1; } } void rachage(Manger* manger1, Reader* reader1) { Manger* manger = manger1; Reader* reader = reader1; printf("登录管理员账号:"); int id_M; scanf("%d", &id_M); getchar(); while (manger) { if (id_M == manger->id) { printf("请输入管理员账号密码:"); int passW; scanf("%d", &passW); getchar(); if (passW == manger->password); { printf("登录成功!n"); printf("输入要读者的id:"); int id_r; scanf("%d", &id_r); getchar(); while (reader) { if (id_r == reader->iNum) { printf("输入充值的金额:"); int balance; scanf("%d", &balance); getchar(); reader->balance = balance; printf("充值成功!n"); printf("按任意键返回n"); getchar(); return; } reader = reader->next; } } printf("密码错误!n"); printf("按任意键返回n"); getchar(); return; } } printf("没有该管理员n"); printf("按任意键返回n"); getchar(); return; }



