一、主要功能
M . 主 界面
1.查找图书
2.添加新书
3.删除旧书
4.修改信息
5.输出信息
6.保存信息
0.退出系统
二、运行环境
Code::Blocks 17.12
三、全部代码
/* 2019.12.15 21:23:17 _7 */
/* Mi */
#include <iostream>
#include <string>
#include <fstream>
#include <time.h>
#include <conio.h>
#include <windows.h>
using namespace std;
fstream fp,gp;
void color(short x=7,short y=0,short z=0,short u=0){
if(z!=0)z=8;if(u!=0)u=128;
if(x>=0 && x<=15){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x|y*16|z|u);
return;
}
else{
color();
return;
}
}
class Data{
protected:
int year;
int month ;
int day;
public:
~Data(){}
Data(){}
int reyear();
int remonth();
int reday();
void set1(int yearr,int monthh,int dayy);
void sety(int yearr);
void setm(int monthh);
void setd(int dayy);
void disp();
};
Data Gettime()
{
int yeartime=0,monthtime=0,daytime=0;
Data B;
long t;
struct tm *lt;
time(&t);
lt=localtime(&t);
yeartime=lt->tm_year+1900;
monthtime=lt->tm_mon+1;
daytime=lt->tm_mday;
B.set1(yeartime,monthtime,daytime);
return B;
}
class Book:public Data{
protected:
string IDname;
string bookname;
string authorname;
string other;
public:
Data showtime;
Data savetime;
Book(){}
~Book(){}
string reIDname();
string reBook();
Book(int);
int set2(string,string,string,string,string);
void setID(string IDnamee);
void setbook(string booknamee);
void setauthor(string authornamee);
void setother(string otherr);
void disp();
};
class Lib{
public:
Book book;
Lib *next;
Lib(){}
~Lib(){}
void initlist(Lib**l);
int CreateFromTail(Lib*l);
void Out(Lib*l);
int ListLength(Lib*l);
Lib *Locate(Lib*l,string key);
int InsList(Lib*l,Book);
int DelList(Lib*l,string key,Book *e);
int change(Lib*l,string key,int z);
int savenow(Lib*l);
int changedata(Lib*l,string ,int );
};
int Data::reyear(){
return year;
}
int Data::remonth(){
return month;
}
int Data::reday(){
return day;
}
void Data::set1(int yearr,int monthh,int dayy){
year=yearr;
month=monthh;
day=dayy;
}
void Data::sety(int yearr){
year=yearr;
}
void Data::setm(int monthh){
month=monthh;
}
void Data::setd(int dayy){
day=dayy;
}
void Data::disp(){
cout<<"时间:";
cout<<year<<"."<<month<<"."<<day<<endl;
}
string Book::reIDname(){
return IDname;
}
string Book::reBook(){
return IDname+"\n"+bookname+"\n"+
authorname+"\n"+other+"\n";
}
Book::Book(int n){
string IDnamee,booknamee,authornamee,otherr;
color(14);cout<<"输入编号:";color();
cin>>IDnamee;
color(14);cout<<"输入书名:";color();
cin>>booknamee;
color(14);cout<<"输入作者:";color();
cin>>authornamee;
color(14);cout<<"输入出版年份:";color();
cin>>otherr;
IDname=IDnamee;
bookname=booknamee;
authorname=authornamee;
other=otherr;
savetime=Gettime();
}
int Book::set2(string IDnamee,string booknamee,
string authornamee,string otherr,string ee){
IDname=IDnamee;
bookname=booknamee;
authorname=authornamee;
other=otherr;
ee+=" ";
int al=0,bl=0,cl=0;
int i=12,x=1;
while(ee[i]==' '){
i--;
}
while(ee[i]!=' '){
cl+=(ee[i]-'0')*x;
x*=10;
i--;
}
i--;x=1;
while(ee[i]!=' '){
bl+=(ee[i]-'0')*x;
x*=10;
i--;
}
i--;x=1;
while(i>=0){
al+=(ee[i]-'0')*x;
x*=10;
i--;
}
savetime.set1(al,bl,cl);
return 1;
}
void Book::setID(string IDnamee){
IDname=IDnamee;
}
void Book::setbook(string booknamee){
bookname=booknamee;
}
void Book::setauthor(string authornamee){
authorname=authornamee;
}
void Book::setother(string otherr){
other=otherr;
}
void Book::disp(){
cout<<"图书信息:"<<endl;
cout<<"编号:"<<IDname<<endl;
cout<<"书名:"<<bookname<<endl;
cout<<"作者:"<<authorname<<endl;
cout<<"其它:"<<other<<"出版"<<endl;
cout<<"入库";savetime.disp();
}
int Lib::CreateFromTail(Lib *l){
Lib *r,*s;
Book ch;
string a,b,c,d,e;
r=l;
fp.open("1.txt",ios::in);
if(!fp)
return 0;
while(!fp.eof()){
getline(fp,a);
getline(fp,b);
getline(fp,c);
getline(fp,d);
getline(fp,e);
if(ch.set2(a,b,c,d,e)==1){
s=new Lib;
s->book=ch;
r->next=s;
r=s;
}
}
r->next=NULL;
fp.close();
return 1;
}
void Lib::Out(Lib *l){
Lib *p;
p=l->next;
while(p!=NULL){
color(9);
p->book.disp();
cout<<"******************"<<endl;
color();
p=p->next;
}
}
int Lib::savenow(Lib*l){
Lib *output;
output=l->next;
string move;
int movedata;
gp.open("1.txt",ios::out);
if(!gp)
return 0;
while(1){
move=output->book.reBook();
gp<<move;
movedata=output->book.savetime.reyear();
gp<<movedata<<" ";
movedata=output->book.savetime.remonth();
gp<<movedata<<" ";
movedata=output->book.savetime.reday();
gp<<movedata;
output=output->next;
if(output==NULL){
break;
}
else gp<<"\n";
}
gp.close();
return 1;
}
int Lib::changedata(Lib*l,string key,int z){
Lib *ff;
ff=l->Locate(l,key);
if(ff==NULL){
color(12);cout<<"没有这个编号"<<endl;color();
return 0;
}
int b,n,m;
switch(z){
case 1:
cin>>b>>n>>m;
ff->book.savetime.set1(b,n,m);
break;
case 2:
cin>>b;
ff->book.savetime.sety(b);
break;
case 3:
cin>>b;
ff->book.savetime.setm(b);
break;
case 4:
cin>>b;
ff->book.savetime.setd(b);
break;
}
return 1;
}
int Lib::change(Lib*l,string key,int z){
Lib *f;
f=l->Locate(l,key);
if(f==NULL){
color(12);cout<<"没有这个编号"<<endl;color();
return 0;
}
string change_befor;
switch(z){
case 1:
cin>>change_befor;
f->book.setID(change_befor);
break;
case 2:
cin>>change_befor;
f->book.setbook(change_befor);
break;
case 3:
cin>>change_befor;
f->book.setauthor(change_befor);
break;
case 4:
cin>>change_befor;
f->book.setother(change_befor);
break;
}
return 1;
}
Lib *Lib::Locate(Lib*l,string key)
{
Lib *p;
p=l->next;
while(p!=NULL)
if(p->book.reIDname()!=key){
p=p->next;
}
else break;
return p;
}
int Lib::InsList(Lib*l,Book e){
Lib *pre,*s;
int k=0;
pre=l;
int lenth=ListLength(l);
while(pre!=NULL&&k<lenth){
pre=pre->next;
k++;
}
s=new Lib;
s->book=e;
s->next=pre->next;
pre->next=s;
return 1;
}
int Lib::ListLength(Lib*l){
int j=0;
Lib *p;
p=l->next;
while(p!=NULL){
p=p->next;
j++;
}
return j;
}
void Lib::initlist(Lib **l){
*l=new Lib;
(*l)->next=NULL;
}
int Lib::DelList(Lib*l,string key,Book *e){
int m=1;
Lib *p;
p=l->next;
while(p!=NULL)
if(p->book.reIDname()!=key){
p=p->next;
m++;
}
else break;
if(p==NULL){
return 0;
}
int i=m;
Lib *pre,*r;
int k=0;
pre=l;
while(pre->next!=NULL&&k<i-1){
pre=pre->next;
k++;
}
r=pre->next;
pre->next=r->next;
*e=r->book;
delete(r);
return 1;
}
void meal(){
color(14);cout<<"\t操作列表"<<endl;
color(15);cout<<"1.查找图书"<<endl;
color(14);cout<<"2.添加新书"<<endl;
color(15);cout<<"3.删除旧书"<<endl;
color(14);cout<<"4.修改信息"<<endl;
color(15);cout<<"5.输出信息"<<endl;
color(14);cout<<"6.保存信息"<<endl;
color(15);cout<<"0.退出系统"<<endl;
color(14);cout<<"请输入编号进行操作"<<endl;
color();
}
void meal2(){
color(14);
cout<<"\t操作列表*"<<endl;
cout<<"1.修改编号"<<endl;
cout<<"2.修改书名"<<endl;
cout<<"3.修改作者"<<endl;
cout<<"4.修改出版时间"<<endl;
cout<<"5.修改入库时间"<<endl;
cout<<"0.退出修改"<<endl;
cout<<"请输入编号进行操作"<<endl;
color();
}
void meal3(){
color(14);
cout<<"\t操作列表******"<<endl;
cout<<"1.修改时间"<<endl;
cout<<"1.修改年份"<<endl;
cout<<"2.修改月份"<<endl;
cout<<"3.修改日份"<<endl;
cout<<"0.退出操作"<<endl;
cout<<"请输入编号进行操作"<<endl;
color();
}
void show(){
Lib *l;
l->initlist(&l);
l->CreateFromTail(l);
l->Out(l);
int x;
meal();
while (1){
if(_kbhit()){
system("cls");
x=_getch();
if(x=='1'){/////////////////
string keyword;
color(14);
cout<<"进入查找操作"<<endl;
cout<<"输入编号:";color();
cin>>keyword;
Lib *df;
df=l->Locate(l,keyword);
if(df==NULL){
color(12);
cout<<"没有这个编号"<<endl;color();
}
else {
color(14);
cout<<"当前图书信息:"<<endl;
color(9);
df->book.disp();
color();
}
meal();
}
else if(x=='2'){/////////////////////
color(14);
cout<<"进入添加操作"<<endl;color();
string keys;
loop:
Book A(1);
keys=A.reIDname();
if(l->Locate(l,keys)!=NULL){
color(12);
cout<<"已有这个图书编号"<<endl;color();
goto loop;
}
else {
if(l->InsList(l,A)==1){
color(10);cout<<"添加成功"<<endl;
color(14);
cout<<"信息如下"<<endl;
color(9);A.disp();color();
}
}
meal();
}
else if(x=='3'){//////////////////
color(14);cout<<"进入删除操作"<<endl;
cout<<"输入编号:";color();
Book A;
string keyword;
cin>>keyword;
int s3=l->DelList(l,keyword,&A);
if(!s3){
color(12);
cout<<"删除失败,信息不存在"<<endl;color();
}
else{
color(10);cout<<"删除成功"<<endl;
color(14);cout<<"被删除图书信息"<<endl;
color(9);A.disp();color();
string move;
int movedata;
gp.open("2.txt",ios::out|ios::app);
if(!gp){
color(12);
cout<<"文件打开失败"<<endl;color();
return ;
}
move=A.reBook();
gp<<move;
movedata=A.savetime.reyear();
gp<<movedata<<" ";
movedata=A.savetime.remonth();
gp<<movedata<<" ";
movedata=A.savetime.reday();
gp<<movedata<<"\n";
Data BB;
BB=Gettime();
A.showtime=BB;
movedata=A.showtime.reyear();
gp<<movedata<<" ";
movedata=A.showtime.remonth();
gp<<movedata<<" ";
movedata=A.showtime.reday();
gp<<movedata<<"\n";
gp.close();
color(10);cout<<"保存成功"<<endl;color();
}
meal();
}
else if(x=='4'){//////////////////
color(14);cout<<"进入修改操作"<<endl;
string keyword;
lap:
cout<<"输入编号:";color();
cin>>keyword;
if(l->Locate(l,keyword)==NULL){
color(12);
cout<<"没有这个编号"<<endl;color();
goto lap;
}
color(14);meal2();color();
int x1;
while(1){
if(_kbhit()){
system("cls");
x1=_getch();
if(x1=='1'){
color(14);
cout<<"进入修改编号操作"<<endl;
cout<<"输入新编号:";color();
l->change(l,keyword,1);
goto lap;
}
else if(x1=='2'){
color(14);
cout<<"进入修改书名操作"<<endl;
cout<<"输入新书名:";color();
l->change(l,keyword,2);
meal2();
}
else if(x1=='3'){
color(14);
cout<<"进入修改作者操作"<<endl;
cout<<"输入新作者:";color();
l->change(l,keyword,3);
meal2();
}
else if(x1=='4'){
color(14);
cout<<"进入修改出版时间操作"<<endl;
cout<<"输入新年份:";color();
l->change(l,keyword,4);
meal2();
}
else if(x1=='5'){
color(14);
cout<<"进入修改入库时间操作"<<endl;
meal3();
int x2;
while(1){
if(_kbhit()){
system("cls");
x2=_getch();
if(x2=='1'){
color(14);
cout<<"进入修改时间操作"<<endl;
cout<<"输入新时间:";color();
l->changedata(l,keyword,1);
meal3();
}
else if(x2=='2'){
color(14);
cout<<"进入修改年份操作"<<endl;
cout<<"输入新年份:";color();
l->changedata(l,keyword,2);
meal3();
}
else if(x2=='3'){
color(14);
cout<<"进入修改月份操作"<<endl;
cout<<"输入新月份:";color();
l->changedata(l,keyword,3);
meal3();
}
else if(x2=='4'){
color(14);
cout<<"进入修改日期操作"<<endl;
cout<<"输入新日期:";color();
l->changedata(l,keyword,4);
meal3();
}
else if(x2=='0'){
color(14);
cout<<"退出修改时间操作"<<endl;
color();break;
}
else {
color(12);
cout<<"输入编号错误!" "请重新输入!"<<endl;
color();
meal3();
}
}
}
meal2();
}
else if(x1=='0'){
color(14);
cout<<"退出修改操作"<<endl;
color();break;
}
else {
color(12);
cout<<"输入编号错误!请重新输入!"<<endl;
color();meal2();}
}
}
meal();
}
else if(x=='5'){///////////////////
color(14);
cout<<"进入输出操作"<<endl;color();
l->Out(l);
meal();
}
else if(x=='6'){///////////////////
color(14);cout<<"进入保存操作"<<endl;color();
int s=l->savenow(l);
if(s){
color(10);cout<<"保存成功"<<endl;color();
}
meal();
}
else if(x=='0'){///////////////////
color(14); cout<<"是否保存之前所有操作?Y/N"<<endl;color();
char chs;
cin>>chs;
if(chs=='Y'||chs=='y'){
int s1=l->savenow(l);
if(s1){
color(10);cout<<"保存成功"<<endl;
}
}
else{
color(12);cout<<"您没有保存数据"<<endl;
}
color(12);cout<<"退出系统"<<endl;color();
exit(0);
}
else if(x==' '){
system("start 2.txt");
meal();
}
else if(x=='9'){
system("start 1.txt");
meal();
}
else {
color(12);
cout<<"输入编号错误!请重新输入!"<<endl;
color();meal();
}
}
}
}
int main(){
show();
return 0;
}
四、结果截图
M . 主界面 ---- 返回页面顶部
蓝色部分为原始数据,来自文件1.txt,入库时间从添加操作时系统获取。
下面是操作列表,输入对应编号直接进入操作。
1.查找图书 ---- 返回页面顶部
输入图书对应编号,查找对应图书,信息描述为蓝色部分。
2.添加新书 ---- 返回页面顶部
输入唯一编号添加图书,失败则显示红色字体提示,重新输入,成功显示绿色添加成功,继续列表。
3.删除旧书 ---- 返回页面顶部
输入需要删除编号,未找到,显示红色字体提示,然后重新输入,找到则删除成功,然后保存已经删除的信息到数据文件2.txt。
4.修改信息 ---- 返回页面顶部
输入要修改信息的图书编号进行修改,修改内容为已知信息列表。
5.输出信息 ---- 返回页面顶部
输出所有图书当前信息。
6.保存信息 ---- 返回页面顶部
进行一次文件写操作。保存当前图书内容。
0.退出系统 ---- 返回页面顶部
退出前询问是否保存之前所有操作,若之前保存过则无影响,未保存则可以选择放弃之前所有操作,或者保存到1.txt(文件写操作)。
结束语
看到这里也就结束了,希望对大家有所帮助,本文代码中有些许错误,读者请自行更正!感谢阅读!
相关资源连接:图书管理系统CPP