天天看点

图书管理系统代码

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

继续阅读