📄 源文件.cpp
字号:
void Book::setname(char newname[])
{
strcpy_s(name,newname);
}
void Book::setprice(float price)
{
prices=price;
}
int Book::jieshu()
{
if (noborrow==1)
{
borrowtime=time(NULL); //开始借书计时
noborrow=0; //将书本置为已借状态
return 1;
}
return 0;
}
void Book::huanshu()
{
rettime=time(NULL);
times=(float)(rettime - borrowtime); //算出借书总时间
noborrow=1;
}
void Book::addbook(char *n,char *newname,float price)
{
delflag=0;
strcpy_s(num,n);
prices=price;
strcpy_s(name,newname);
noborrow=1; //将新书置为未借状态
}
//请保留版权信息:编写者:贵州大学刘二腾,指导老师:曾劼
void Book::delbook()
{
delflag=1;
}
void Book::display()
{
if(noborrow==1)
{
cout<< setw(6) <<"图书"<<bh<< num << setw(10) <<"\t图书书名:"<<setw(13)<< name << setw(5)
<<"在架"<<setw(7)<<"价格:"<< prices <<endl;
}
if(noborrow==0)
{
cout<< setw(6) <<"图书"<<bh<< num << setw(10) <<"\t图书书名:"<<setw(13)<< name << setw(5)
<<"已借"<<setw(7)<<"价格:"<< prices <<endl;
}
}
Book::~Book()
{
}
class BookDatabase //图书数据库类
{
private:
int top; //定义书本数组记录指针
int mid; //用于折半查找分区变量
Book *bk; //定义书本记录数组
public:
BookDatabase(); //定义BookDatabase类构造函数,用于读取上次程序保存的b.333到书本记录数组bk[]中
void bookdata(); //定义书本维护函数
int addbook(char *n,char *newname,float price); //定义增加书本记录函数
Book *chaxun(char *bookid); //定义查找书本函数
void clear(); //定义图书记录数组清空函数
void display(); //定义显示当前书本记录函数
~BookDatabase(); //定义BookDatabase类析构函数,将当前书本记录数组bk[]的数据写到b.333文件中
};
//请保留版权信息:编写者:贵州大学刘二腾,指导老师:曾劼
BookDatabase::BookDatabase()
{
bk=new Book [pageview.bkmax];
Book temp; //读取bk[]数组记录时使用的临时变量
top=-1;
fstream file("b.333",ios::in);
while (1)
{
file.read((char *)&temp,sizeof(temp));
if (!file) break;
top++;
bk[top]=temp;
}
file.close();
}
void BookDatabase::bookdata()
{
char choice='1';
char queren; //定义全部删除时确认变量
char bname[booknamemax];
float price;
char bookid[booknum];
Book *b;
while (choice!='0')
{
cout<<"图书维护 "<<caidan;
choice=_getche();
cout<<endl;
if(choice=='c')
choice='7';
switch (choice)
{
case '1':
cout<<"输入新书"<<bh;
cin>> bookid;
b=chaxun(bookid); //查询书本是否存在
if (b==NULL)
{
cout<<"输入新书书名:";
cin>>bname;
cout<<"输入新书价格:";
cin>>price;
addbook(bookid,bname,price); //调用addbook函数添加新书
}
else
{
cerr<<"该图书"<<bh<<"已经存在,请使用更改菜单操作"<<endl;
}
break;
case '2':
cout<<"输入要更改的图书"<<bh;
cin >> bookid;
b=chaxun(bookid);
if (b==NULL)
{
cout <<nobook<<endl;
break;
}
cout <<"输入新的书名:";
cin >> bname;
b->setname(bname); //设置书名
cout<<"输入新的价格:";
cin>>price;
b->setprice(price); //设置书本价格
cout<<"更改图书资料成功"<<endl;
break;
case '3':
//请保留版权信息:编写者:贵州大学刘二腾,指导老师:曾劼
cout <<"读入图书"<<bh;
cin >> bookid;
b=chaxun(bookid);
if (b==NULL)
{
cout <<nobook<< endl;
break;
}
b->delbook(); //标记书本为以删状态
cout<<"删除"<<bookid<<"号图书成功!"<<endl;
break;
case '4':
cout << "读入图书"<<bh;
cin >> bookid;
b=chaxun(bookid);
if (b==NULL)
{
cout <<nobook<< endl;
break;
}
b->display();
break;
case '5':
cout<<endl;
display();
cout<<endl;
break;
case '6':
cout<<"确定要删除全部数据吗?(Y|other)";
cin>>queren;
if(queren=='y'||queren=='Y')
{
clear();
cout<<"已经删除全部图书数据!"<<endl;
}
else
{
}
break;
case '7':
system("cls");
break;
default:
if(choice=='0')
system("cls");
else
{
system("cls");
cerr<<"您的输入有误,请重试"<<endl;
}
break;
}
}
}
//请保留版权信息:编写者:贵州大学刘二腾,指导老师:曾劼
int BookDatabase::addbook(char n[],char newname[],float price)
{
Book *p=chaxun(n);
if (p==NULL)
{
top++;
if(top>=pageview.bkmax)
{
cout<<"对不起,已经达到您设定的书本存储上限,请使用系统维护菜单修改"<<endl;
return 0;
}
else
{
bk[top].addbook(n,newname,price);
cout<<"添加学生成功"<<endl;
return 1;
}
}
return 0;
}
Book *BookDatabase::chaxun(char bookid[])
{
i0;
int j=top;
mid=top/2;
while(i<=mid&&j>=mid) //折半查找分区
{
if (strcmp(bk[i].getnum(),bookid)==0&&bk[i].getdelflag()==0) //如果找到和编号一样的图书而且标记为未删除
{
return &bk[i]; //返回书本信息
}
if(strcmp(bk[j].getnum(),bookid)==0&&bk[j].getdelflag()==0)
{
return &bk[j];
}
i++;
j--;
}
return NULL;
}
void BookDatabase::clear()
{
top=-1;
}
//请保留版权信息:编写者:贵州大学刘二腾,指导老师:曾劼
void BookDatabase::display()
{
i0;
while(i<=top)
{
if (bk[i].getdelflag()==0) //如果标记是未删除状态才显示该书
bk[i].display();
i++;
}
}
BookDatabase::~BookDatabase()
{
fstream file("b.333",ios::out);
i0;
while(i<=top)
{
if (bk[i].getdelflag()==0) //存储未删除的书本
file.write((char *)&bk[i],sizeof(bk[i]));
i++;
}
file.close();
}
class Students //学生类
{
private:
char num[studentnum]; //定义学生编号
char name[studentnamemax]; //定义学生姓名数组
char grades[gradesmax]; //定义学生所在年级
int delflag; //定义学生在库中的删除标记 1:已删 0:未删
class Bookborrow
{
public:
char bookborrow[booknamemax]; //定义存放学生所借书的数组
};
Bookborrow bookbw[maxbookborrow]; //老师,这里我不准备再用动态数组限制,直接在借书环节通过限制数组下标来限制每人最多借的书本数
int controlview; //该变量用于控制借书数为1时不显示"|"
int full; //检查学生借书的本数是否超过规定
public:
Students(); //Students类构造函数,留空
int getborrowmax(); //获取能每人能借的最多书本数
char *getname(); //定义获取姓名函数
char *getnum(); //定义获取获取学生编号函数
char *getgrades(); //定义获取所在年级函数
void setname(char newname[]); //定义设置学生姓名函数
void setgrades(char grade[]); //定义设置学生年级函数
void addStudents(char *n,char *newname,char *grade);//增加学生函数
int jieshu(char bookid[]); //定义借书函数,将所借书本放入学生借书数组并检测是否超过规定借书本数
int huanshu(char bookid[]); //定义还书函数
void delstudent(); //设置删除标记
int getdelflag(); //定义获取删除标记函数数
void display(); //定义显示学生信息函数
~Students(); //Students类析构函数,留空
};
//请保留版权信息:编写者:贵州大学刘二腾,指导老师:曾劼
Students::Students()
{
}
int Students::getborrowmax()
{
return pageview.borrowmax;
}
char *Students::getname()
{
return name;
}
char *Students::getnum()
{
return num;
}
char *Students::getgrades()
{
return grades;
}
int Students::jieshu(char bookid[])
{
i0;
int count=0; //检查借书总数计数变量
while(i<maxbookborrow) //控制第二次进入程序时限制能借书本数减少而之前又借了超过当前限制
{ //必须还书到限制借的书本数内才能再借
if (strcmp(bookbw[i].bookborrow,"0")!=0)
count++;
i++;
}
i=0;
if(count>=pageview.borrowmax)
{
full=1;
return full;
}
while(i<pageview.borrowmax) //借书时将书本的ID传递给借书数组
{
if (strcmp(bookbw[i].bookborrow,"0")==0)
{
strcpy_s(bookbw[i].bookborrow,bookid);
full=0;
return full; //full为1时证明借书已经满
}
else
full=1; //返回已经借满限制借的书本数
i++;
}
return full;
}
//请保留版权信息:编写者:贵州大学刘二腾,指导老师:曾劼
int Students::huanshu(char bookid[])
{
i0;
while(i<maxbookborrow) //还书时将借书数组中的对应元素置0
{
if(strcmp(bookbw[i].bookborrow,bookid)==0)
{
strcpy_s(bookbw[i].bookborrow,"0");
return 1;
}
i++;
}
return 0;
}
void Students::setname(char newname[])
{
strcpy_s(name,newname);
}
void Students::setgrades(char grade[])
{
strcpy_s(grades,grade);
}
void Students::delstudent()
{
delflag=1;
}
int Students::getdelflag()
{
return delflag;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -