一、目的与要求
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制(继承、派生及多态性)来实现系统功能。
(3)在系统的设计中,要有清晰的界面设计,同时采用文件进行读写操作。
3、创新要求: 在基本要求达到后,可进行创新设计。
二、问题描述及其功能要求
建立一个图书馆管理系统,可以处理以下对象:⑴ 图书馆基本信息。⑵ 图书馆的书籍。⑶ 图书馆管理员 。⑷ 读者信息。
程序要完成下列功能:
⑴ 查询图书馆的总信息。⑵ 查询图书馆管理员的信息。⑶ 查询图书馆藏书信息。
⑷ 存入新书(有管理员加入,需进行身份验证)。⑸ 旧书处理。⑹ 存入新的管理员的信息。⑺ 修改管理员信息(增加工龄,加薪)。⑻ 两所图书馆的最大藏书量之和。
⑼ 根据书名检索书刊信息。⑽ 查询读者的借阅信息。⑾ 查询读者信息(包括借书情况、到期时间、罚款情况。)。⑿ 管理员可以修改用户的欠款和交款的金额。
⒀ 读者分为学生、研究生和教师。学生的租期为1个月,教师的租期为2个月。
三、源代码
main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h> /*getch()函数使用的头文件*/
#include <windows.h> /*Sleep()函数使用的头文件*/
#include <string.h> /*strcmp()函数使用的头文件*/
#include"Lib.h"
void ShowMainMenu()
{
system("cls");
printf("\n\n\n\n\n");
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("\t\t请选择(0-15):");
}
int main()
{
Book* book = NULL; //定义一个Book*类型的结点 来充当头节点 为什么赋值NULL, 这个book指针并没有分配内存,防止野指针,为了安全赋值NULL;
//什么时候给他赋值;第一次创建book结点的时候
Reader* reader = NULL;
Manger* manger = NULL; //名字为manger的链表 的首结点 也就是第一个结点 的指针 这个指针 manger 指向链表中第一个结点
int iItem;
ShowMainMenu();/*调用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();/*调用ShowMainMenu函数绘制界面*/
scanf("%d", &iItem);/*提示用户输入数字*/
getchar();
}
return 0;
}
Lib.h
#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<assert.h>
#include<stdio.h>
void 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("%d\t%s\t%s\t%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("%d\t%s\t%s\t%s\t%d\n", 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("erro\n");
return NULL;
}
tmp->next = NULL;
printf("输入管理员id:");
scanf("%d", &tmp->id);
getchar();
printf("输入管理员姓名:");
gets(&tmp->name);
/*scanf("%d", &tmp->name);
getchar();*/
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);
/*scanf("%d", &tmp->name);
getchar();*/
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("%d\t%s\t%s\t%s\t%d\n", 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("%d\n", 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:%d\n", reader->iNum);
printf("读者姓名:%s\n", reader->acName);
printf("读者性别:%s\n", reader->acSex);
printf("读者职位:%s\n", reader->position);
printf("读者已借阅书的数量:%d\n", 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("输入读者职位:<student\tor\tteacher>");
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("没有找到该图书,检查图书的Id\n");
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;
}