c++图书信息管理系统课程设计报告

         

C++语言程序

课程设计题目:图书信息管理系统         

    号:2013103120131

    名:曾智煌

    业:电气工程及其自动化

    级:13电气1

 

20##  12   12

图书管理系统

一.设计目的:

图书馆是目前生活中除了网络外的另一个获取知识的重要场所。利用图书管理系统对图书记录进行统一管理,包括新增图书记录,更改图书记录,删除图书记录等功能,实现图书管理工作的系统化,规范化和自动化,为图书管理提供便利。同时是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。有助于加深对面向对象程序设计中基础理论和基本知识的理解,培养了实践能力,促进理论与实践的结合。

二.设计要求:

1.图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。试设计一图书信息管理系统,使之能提供以下功能:

2.系统以菜单方式工作?

3.图书信息录入功能(图书信息用文件保存)--输入?

4.图书信息浏览功能--输出?

5.查询和排序功能:(至少一种查询方式)--算法?

6.按书名查询

7.按作者名查询

8.图书信息的删除与修改(可选项)?

三.设计方案及流程图:

1、类的设计

①、Book类的设计(内部函数流程图):

②、BDatabase类的设计:

③、主函数流程图:

四、程序源代码:

#define StrNum 20

#define Type 20

#include <iostream>

#include <iomanip>

#include <string>

#include <fstream>                  //输入/输出文件流类

using namespace std;

const int Maxb=100;   //最多可存储的图书

class Book

{

private:

    int lab;                        //删除标记

       int num;                        //图书编号

       int add;                        //增加标记

       char number[StrNum];            //编号

       char bookname[StrNum];              //书名

       char bookkind[Type];                //图书类型

public:

       Book(){}

       char getkind()                  //获取图书类型

       {

              return bookkind[Type];

       }                               

       char getname()                       //获取书名

       {

              return  bookname[StrNum];

       }

       int getnum()                     //获取图书编号

       {

              return num;

       }                 

       int getlab()                    //获取删除标记

       {

              return lab;

       }

void setname(char na[])         //设置书名

       {

              strcpy(bookname,na);

       }

       void setkind(char kin[])        //设置类型

       {

              strcpy(bookkind,kin);

       }

       void delbook()                  //删除图书

       {

              lab=1;

       }

       void addbook(int n,char *na,char *kin)    //增加图书

       {

              lab=0;

              num=n;

              strcpy(bookname,na);

              strcpy(bookkind,kin);

       }

       void disp()                     //输出图书        

       {

              cout.flags (ios::left);     //设置对齐的标志位为左

              cout<<setw(15)<<num<<setw(20)<<bookname<<setw(15)<<bookkind<<endl;      

       }           

};

class BDatabase

{

private:

    int top;                       

       Book book[Maxb];                //图书记录

public:

       BDatabase()                     //构造函数,将book.txt读到book[]中

       {

                     Book b;

                     top=-1;

                     fstream file("book.txt",ios::in);

                     while (1)

                     {

                            file.read((char *)&b,sizeof(b));

                            if (!file) break;

                            top++;

                            book[top]=b;

                     }

                     file.close();

       }

       void clear()                    //全删

       {

              top=-1;

       }

    int addbook(int n,char *na,char *kin)     //增加图书

       {

              Book *p=query(n);

              if(NULL==p)

              {

                     top++;

                     book[top].addbook(n,na,kin);

                     return 1;

              }

              return 0;

       }

       Book *query(int bookid)         //查找图书

       {

              for (int i=0;i<=top;i++)

                     if (book[i].getnum()==bookid &&book[i].getlab()==0)

                     {    

                            return &book[i];

                     }

                     return NULL;

       }

                   

       void disp() //图书库

       {

         for (int i=0;i<=top;i++)

                if (book[i].getlab()==0)

                       book[i].disp();

       }

       ~BDatabase()                    //析构函数,将book[]写到book.txt文件中,实现文本的写入

       {

              fstream file("book.txt",ios::out);

        for (int i=0;i<=top;i++)

                     if (book[i].getlab()==0)

                            file.write((char *)&book[i],sizeof(book[i]));

                     file.close();

       }

};

void main()

{

    BDatabase BookDB;

    char choice;

       char bname[40];

       char bkind[40];

       char newType[20];

       int bookid;

       Book *b;

       while (choice!='0')

       {  

           cout<<"\t******************************************************************\n";

              cout<<"                                           \n\n";

              cout<<"\t\t\t图  书  管  理  系  统\n\n";

              cout<<"\t\t\t1    新增图书记录\n";

        cout<<"\t\t\t2    更改图书记录\n";

        cout<<"\t\t\t3    删除图书记录\n";

              cout<<"\t\t\t4    查找图书记录\n";

              cout<<"\t\t\t5    显示图书记录\n";

              cout<<"\t\t\t6    清空全部记录(慎用)\n";

              cout<<"\t\t\t0    退出系统\n";

              cout<<"                                           \n\n";

              cout<<"\t******************************************************************\n";

        cout<<"请选择(1,2,3,4,5,6,0):";

              cin>>choice;

              switch (choice)

              {

            case '1':

                            cout<<"输入图书编号:"<<endl;

                            cin>>bookid;

                            cout<<"输入图书类型:"<<endl;

                            cin>>newType;

                cout<<"输入图书书名:"<<endl;

                            cin>>bname;

                            BookDB.addbook(bookid,bname,newType);

                            break;

            case '2':

                            cout<<"输入图书编号:"<<endl;

                            cin>>bookid;

                            b=BookDB.query(bookid);

                            if(b==NULL)

                            {

                                   cout<<"该图书不存在"<<endl;

                                break;

                            }

                            cout<<"输入新的书名:"<<endl;

                            cin>>bname;

                            b->setname(bname);

                            cout<<"输入新的类型:"<<endl;

                            cin>>bkind;

                            b->setkind(bkind);

                           break;

            case '3':

                                 cout<<"读入图书编号:"<<endl;

                                   cin>>bookid;

                                   b=BookDB.query(bookid);

                                   if(b==NULL)

                                   {

                                       cout<<"该图书不存在"<<endl;

                                       break;

                                   }

                                   char tg1;

                                   cout<<"确定要删除此记录吗?(Y/N)"<<endl;

                                   cin>>tg1;

                                   if(tg1!='n'&&tg1!='N')

                                   {

                                   b->delbook();

                                   cout<<"已成功删除该书记录!"<<endl;

                                   break;

                                   }           

                     case '4':

                            cout<<"读入图书编号:"<<endl;

                            cin>>bookid;

                            b=BookDB.query(bookid);

                            if (b==NULL)

                            {

                                   cout<<"该图书不存在"<<endl;

                                   break;

                            }    

                            cout<<"图书编号      图书名称            图书类型         \n";

                            b->disp();

                            break;

                     case '5':

                            cout<<"图书编号      图书名称            图书类型         \n";

                            b->disp();

                            break;

                     case '6':

                                char tg2;

                                   cout<<"确定要清空所有记录吗?(Y/N)"<<endl;

                                   cin>>tg2;

                                   if(tg2!='n'&&tg2!='N')

                                   {

                                   BookDB.clear();

                                cout<<"已成功清空记录!"<<endl;

                                   break;

                                   }

                     case '0':

                            break;

                     default:cout<<"输入错误,请从新输入(数字为0~6):";

              }

       }

}

五.总结:

本系统实现了图书管理系统的典型功能,包括查询所有记录的信息,添加查找等功能,基本符合设计要求,利用类的封装实现了一定的安全性,函数的实现与调用在主函数中实现。

但在记录查询上仍有缺陷,有待于完善。

六、实验心得:

1、通过实验加深了对c++的了解,在程序设计上提高了自己的动手能力,在实践中增强了自己的编程水平。

2、但是因为自己独立完成且能力有限,还有部分功能未能完善,例如对书名,编号的排序等等,这些局限性都是有待逐步完善的方面。

3、而且通过这次课程设计,我培养了自己对C++编程的兴趣,编程能力也有所提高,但仍存在许多不足,不能独自写出功能很齐全的代码,写代码要参考很多资料,所以今后应培养自己独立写代码的能力。

 

第二篇:C语言课程设计报告—图书信息管理系统

C语言课程设计报告

图书信息管理系统设计

  语言程序设计

编程实践是学习C语言程序设计的一重要环节,上机实习和课程设计是提高同学们程序设计能力的有效途径,能够使同学们初步掌握程序设计的基本方法和调试技能。学校安排上机时间有限,老师也只能教给我们一些方法,而我们自己需要投入很大的时间和精力来锻炼。

1、题目要求

设计“图书信息管理系统

要求:

图书信息包括:登录号,书名,作者名,分类号,出版单位,出版时间,价格等。使之提供以下功能:

(1)  系统以菜单方式工作。

(2)       图书信息录入功能。(图书信息用文件保存)。

(3)       图书信息浏览功能。

(4)       图书信息查询功能。

(5)       图书信息的删除和修改。

2、分析:

    根据题目要求,应当把图书信息用结构体形式输入,再定义一个全局变量和文件指针进行整个程序的运行,然后把图书信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;在程序中需实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现;另外还需提供键盘式选择菜单实现功能,在运行时达到所要目的。

3、总体设计:

     根据题目要求,可以将系统分为六个模块:

(1)       管理员登录系统模块。

(2)       菜单选择模块。

(3)       图书信息录入功能模块。

(4)       图书信息浏览功能。

(5)       图书信息查询功能。

(6)       图书信息的删除和修改。

C语言课程设计报告—图书信息管理系统

4、详细设计:

头函数名:

#include

#include

#include

/*********图书信息结构体*********/

/***包括登录号,书名,作者名,分类号,出版单位,出版时间,价格等***/

struct bookinf  

{ int num; ******************************************************登录号

  char bname[20];***************************************书名

  char wname[10];***************************************作者名

  char clanum[14];***************************************分类号

  char pubcom[10];***************************************出版单位

  char pubtime[10];***************************************出版时间

  float price;*********************************************价格

};

管理员登录系统模块:

(1)   来到图书信息管理系统页面

void index() 

{

 char input;                                                          注释:运行时

 printf("\n\n\t\t\t*****************************\n");                         直接进入

 printf("\t\t\t    图书信息管理系统\n");                                     这个页面

 printf("\t\t\t*****************************\n\n\n");

 printf(" ------------------------------------------------------------------------------\n");

 printf("\t<按任意键进入>\n\t");

 input=getchar();   

}

(2)       管理员登陆进入功能菜单页面

第2页

 

FILE *fp;

struct manage pswd;

 if ((fp=fopen("password.txt","r"))==NULL) 

 {

  printf("\n\n\n\tCannot open file!\n\t");

 }

 else                                                                         

 {

  do

  {                                                 

   printf("\n\n\t请输入管理员帐号:");                            

   scanf("%s",name);                                         

   printf("\n\n\t请输入管理员密码:");

   scanf("%s",password);

   fp=fopen("password.txt","r");  

   fread(&pswd,sizeof(struct manage),1,fp);

   fclose(fp);

   w=strcmp(pswd.manage_name,name);

   k=strcmp(pswd.password,password);

   adm_servelist();

  }

  while (w!=0||k!=0);

 adm_servelist();    

 }

}

(3)来到功能菜单页面

第3页

void adm_servelist()

{

 void book_add();

 void book_view();

 void change();

 void del();

 void book_search();

 void login();

 void pwchange();

 int in;                                                注释:菜单列出的服务种类

 char input;                                                 从1,2,3,4,5,6

 do                                                        所对应的功能进行选择

 {                                                  

  printf("\n\n\n\t--欢迎使用信息管理系统--");

  printf("\n\n\t1.图书信息录入\n");

  printf("\t2.图书信息浏览\n");

  printf("\t3.图书信息查询\n");

  printf("\t4.图书信息删除\n");

  printf("\t5.图书信息修改\n");

  printf("\t6.退出管理模式\n");

  printf("\n\t请选择服务种类:");

  scanf("%d",&in);

  if (in!=1&&in!=2&&in!=3&&in!=4&&in!=5&&in!=6)

  {

   printf("\n\t没有这项服务~\n");

   printf("\t按任意键重新选择");

   input=getchar();

  }

 }

 while (in!=1&&in!=2&&in!=3&&in!=4&&in!=5&&in!=6);

 switch (in)

 {

 case 1: book_add();  break;                                    注释:选择自己所需要

 case 2: book_view(); break;                                         后摁下数字键则

 case 3: book_search(); break;                                      则进入此功能页面

 case 4: del(); break;

 case 5: change();break;

 case 6: login();  break;

 }

}

(3)图书信息录入功能模块

void book_add()

{

                                     第4页

void adm_servelist();

 void book_add();

 int i=0,j;

 FILE *fp;

 char input;                                      注释:输入的图书信息

 struct bookinf books;                                   是通过文件进行

 struct bookinf book_taxis[30];                            保存的

  printf("\n\n\n\t---请输入图书信息---\n\n");

  printf("\t登录号:");

  scanf("%d",&books.num);

  printf("\n\t书名:");

  scanf("%s",books.bname);

  printf("\n\t作者名:");

  scanf("%s",books.wname);

  printf("\n\t分类号:");

  scanf("%s",books.clanum);

  printf("\n\t出版单位:");

  scanf("%s",books.pubcom);

  printf("\n\t出版时间:");

  scanf("%s",books.pubtime);

  printf("\n\t价格:");

  scanf("%f",&books.price);

  if ((fp=fopen("book.txt","r"))!=NULL)  

  {

   do

   {

    fread(&book_taxis[i],sizeof(struct bookinf),1,fp); 

    i=i+1;

   }

   while(!feof(fp));

   fclose(fp);

   for (j=0;j<=i;j++)

    if (books.num==book_taxis[j].num)  

    {

     printf("\n\n\n\t对不起,这个编号已经使用过了~\n");

     printf("\t按任意键返回管理菜单~");

     input=getchar();

     adm_servelist();

     break;

    }

  }

 if ((fp=fopen("book.txt","r"))==NULL)   

 {

                                   第5页

fp=fopen("book.txt","w");   

 }

 else

 {

  fclose(fp);

  fp=fopen("book.txt","a");

 }

 fwrite(&books,sizeof(struct bookinf),1,fp);  

 fclose(fp);

 printf("\n\n\n\t信息输入完毕~按任意键继续\n");

 input=getchar();

 adm_servelist();

}

(4)   图书信息浏览功能模块

void book_view()

{

 void adm_servelist();

 void book_view();

 int inp,i=0,n=0;

 FILE *fp;

 char input;

 struct bookinf bookview[20];

 if ((fp=fopen("book.txt","r"))==NULL)  

 {

  printf("\n\n\n\t数据尚未初始化~~\n\n\t请在管理菜单中增加图书信息~~~\n");

  printf("\n\t<按任意键返回管理菜单>\n\t");

  input=getchar();

  adm_servelist();

 }

 else   

 {

  do

  {

   fread(&bookview[i],sizeof(struct bookinf),1,fp);

   i=i+1;

  }

  while (!feof(fp));

  fclose(fp);   

  do    

   {

    printf("\n\t--------共有%d条记录--------",i-1);

    printf("\n\n\t登录号:   %d\n",bookview[n].num);

                                  第6页

printf("\n\t书名:   %s\n",bookview[n].bname);

    printf("\n\t作者名:   %s\n",bookview[n].wname);

    printf("\n\t分类号:   %s\n",bookview[n].clanum);

    printf("\n\t出版单位:   %s\n",bookview[n].pubcom);

    printf("\n\t出版时间:   %s\n",bookview[n].pubtime);

    printf("\n\t价格:   %f\n",bookview[n].price);

    printf("\n\n\t1.上一页\t2.下一页\t3.回目录\n");

    printf("\n\t请选择:");

    scanf("%d",&inp);

    switch (inp)

    {

    case 1:   

     {

      if (n==0)

      {

       printf("\n\t已到达首页\n\t按任意键重新选择");

       input=getchar();

      }

      else  n=n-1;   break;

     }

    case 2:

     {

      if (n==i-2)

      {

       printf("\n\t已到达最末页\n\t按任意键重新选择");

       input=getchar();

      }

      else n=n+1;   break;

     }

    case 3:

     {

      adm_servelist();

      break;

     }

    default:                                                                     

     {

      printf("\n\t没有这项服务\n\t按任意键重新选择");

      input=getchar();

     }

    }

   

   }

   while (inp!=3);

第7页

}

}

(5)   图书信息修改与删除功能模块

修改:

 void change(int x)

{

 int inp,i=0,j;

 void book_search();

 FILE *fp,*fp1;

 char input;

 struct bookinf books,book_taxis[20];

 do

 {   

  printf("\n\n\n\t注意:您确定要修改该记录吗?\n");

  printf("\n\t1.是\t2.否\n");

  printf("\n\t请输入:");

  scanf("%d",&inp);

  if (inp!=1&&inp!=2)

  {

   printf("\n\t对不起~没有这项服务~\n");

   printf("\t按任意键重新选择\n\t");

   input=getchar();

  }

 }

 while (inp!=1&&inp!=2);

 if (inp==2)

  book_search();

  if (inp==1)   

 {

   printf("\n\n\n\t---请输入图书信息---\n\n");

   printf("\t登录号:");

   scanf("%d",&books.num);

   printf("\n\t书名:");

   scanf("%s",books.bname);

   printf("\n\t作者名:");

   scanf("%s",books.wname);

   printf("\n\t分类号:");

   scanf("%s",books.clanum);

   printf("\n\t出版单位:");

   scanf("%s",books.pubcom);

   printf("\n\t出版时间:");

   scanf("%s",books.pubtime);

                                     第8页

printf("\n\t价格:");

   scanf("%f",&books.price);

  

   if ((fp1=fopen("book.txt","r"))!=NULL)   

   {

    do

    {

     fread(&book_taxis[i],sizeof(struct bookinf),1,fp1); 

     i=i+1;

    }

    while(!feof(fp1));

    fclose(fp1);

  

    for (j=0;j

     if (books.num==book_taxis[j].num)

     {

      printf("\n\n\n\t对不起,这个编号已经使用过了~\n");

      printf("\t按任意键返回管理菜单~");

       printf("0");

      input=getchar();

      book_search();  

      break;

     }

    for (j=x+1;j

     if (books.num==book_taxis[j].num)

     {

      printf("\n\n\n\t对不起,这个编号已经使用过了~\n");

      printf("1");

      printf("\t按任意键返回管理菜单~");

      input=getchar();

      book_search();

     break;

     }

   }

   book_taxis[x]=books;  

   fp=fopen("book.txt","w");

   for (j=0;j

   fwrite(&book_taxis[j],sizeof(struct bookinf),1,fp);

   fclose(fp);

   printf("\n\n\t信息修改完成!按任意键返回");

   input=getchar();

   book_search();  

第9页

}

}

S删除:

void del(int y)

{

 char input;

 FILE *fp;

 int inp,i=0,j;

 struct bookinf book_taxis[20];

 void book_search();

 void adm_servelist();

 do   

 {

  printf("\n\n\n\t注意:您确定要删除该记录吗?\n");

  printf("\n\t1.是\t2.否\n");

  printf("\n\t请输入:");

  scanf("%d",&inp);

  if (inp!=1&&inp!=2)

  {

   printf("\n\t对不起~没有这项服务~\n");

   printf("\t按任意键重新选择\n\t");

   input=getchar();

  }

 }

 while (inp!=1&&inp!=2);

 if (inp==2)

  book_search();

 if (inp==1)   

 {

   if ((fp=fopen("book.txt","r"))!=NULL)

   {

    do

    {

     fread(&book_taxis[i],sizeof(struct bookinf),1,fp);

     i=i+1;

    }

    while(!feof(fp));

    fclose(fp);

   }

   if (i>2)  

   {

    fp=fopen("book.txt","w"); 

                                第10页

 for (j=0;j

      fwrite(&book_taxis[j],sizeof(struct bookinf),1,fp);

     fclose(fp);

    fp=fopen("book.txt","a");

     for (j=y+1;j

      fwrite(&book_taxis[j],sizeof(struct bookinf),1,fp);

     fclose(fp);

   } 

   else   

   {

    remove("book.txt");

   }

  printf("\n\n\t记录已删除!\n\n\t按任意键返回\n\t");

  input=getchar();

  adm_servelist();  

 }

}

(6)      图书信息查询功能模块

void book_search()      

{

 void adm_servelist();

 void id_search();

 void wr_search();

 void bn_search();

 char input;

 FILE *fp;

 int inp;

 if ((fp=fopen("book.txt","r"))==NULL)

 {

  printf("\n\n\n\t数据尚未初始化~~\n\n\t请在管理菜单中增加图书信息~~~\n");

  printf("\n\t<按任意键返回管理菜单>\n\t");

  input=getchar();

  adm_servelist();

 }

 else     

 {

  do

  {

   printf("\n\n\n\t1.按图书登录号查询\n");

   printf("\n\t2.按图书作者查询\n");

                                    第11页

printf("\n\t3.按图书名查询\n");

   printf("\n\t4.回到主菜单\n");

   printf("\n\n\t请选择查询类别:");

   scanf("%d",&inp);

   if (inp!=1&&inp!=2&&inp!=3&&inp!=4)

   {

    printf("\n\n\t没有这项服务~\n\t按任意键重新选择~");

    input=getchar();

   }

  }

  while (inp!=1&&inp!=2&&inp!=3&&inp!=4);

  fclose(fp);

  switch (inp)

  {

  case 1: id_search();  break;

  case 2: wr_search();  break;

  case 3: bn_search();  break;

  case 4: adm_servelist(); break;

  }

 }

}

5运行与测试报告:

第12页

第13页

三 后记/课程设计过程中遇到的问题以及解决方法,课程设计的体会。

这次课程设计让我掌握了许多的有用知识。首先通过不断地学习和锻炼更加熟练地掌握应用软件Microsoft Visual C++ 6.0 了。设计正确及合适的程序对于我们初学者来说是很大的难题,出现一丁点儿错误就得非很大的努力去修改,正式者一步步一点点的努力让我对C语言游乐更深的认识。同时我掌握了解决问题的方法,这无论是对以后的学习、生活都有无比重要的价值。

在设计中,每个同学都会遇到一些困难,或多或少,这些困难常常让我心情烦躁,比如不能清晰的建立设计模块,不会修改出现的错误等等,然后我向同学寻求帮助,向他们学习,最终通过自己努力建立了模块。不可避免地程序中肯定依然存在者某些问题,我希望在以后的学习和应用中不断提高自己的能力,攻克遇到的困难。

第14页

相关推荐