基于c++控制台程序的网上图书订购系统


项目名称:C++网上图书订购系统

 目录:

  前言

  项目介绍

  项目流程图

  项目类图

  重点函数的剖析

  流程演示

  源代码、注释及出处

 

 

 前言

   1、这是软件工程综合实践专题第一次作业所写的博客,也是我第一次尝试编写博客,如有不足之处还请在评论中指出。

   2、我完成作业的顺序是:阅读代码并添加注释、运行加以理解——>画项目流程图与类图——>做重点函数的剖析(与博客书写顺序略有不同)。

   3、编写此博客的心得:我通过此次作业尝试养成阅读他人程序的能力;并且熟练掌握了一些c++的基本语法,和运用一些数据结构的知识;增进了自己查阅资料、画流程图与类图、编写博客的能力。以后也会多多尝试编写博客。

   4、代码出处:来自本校信院李倩倩同学大一时所编的程序。

 

 项目介绍:

   图书订购系统是一个简易的系统,主要为了让图书能在c语言程序中存储信息,根据不同的用户权限能实现不同的功能。

 项目流程图:

    

 项目类图:

  一:重载运算符并且自定义string数据类型方便使用

     

  二:核心类book类

  book类主要是完成对book类的定义以及存储结构。

  三:buyer类

  buyer类主要是对购买者的信息结构的定义。

 

  四:订单类

  订单类主要是对于购买订单相关函数的调用。

 

 重点函数的剖析:

 一、void operator=(const mystring& Str);

 

 1. this指针的用处:
  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
  this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换。
  在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。
  this的目的总是指向这个对象,所以this是一个常量指针,我们不允许改变this中保存的地址。
 

 2.operator的使用

   operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。

  这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。

 

 3.void *memcpy(void *dest, const void *src, size_t n);

  memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它。

  它的功能是从src的开始位置拷贝n个字节的数据到dest。如果dest存在数据,将会被覆盖。memcpy函数的返回值是dest的指针。memcpy函数定义在string.h头文件里。

 

 二、int order::wfile()||int order::rfile()
 

 

1.C语言文件操作
1.1 打开文件
  FILE *fp = fopen("要点一","要点二");
  要点一:
  这里可以写单独的文件名,比如说“1.txt”,那么他就会在当前c文件的文件夹目录下查询文件是否存在,存在则返回这个文件的指针,不存在的话则返回NULL,
  这里也可以写一个文件的绝对路径,比如说“C:\aaa\ccc\a.txt”这样的话他就会在整个电脑里面找这个路径是否存在该文件,存在则返回文件指针,不存在则返回NULL。
  要点二:
  这里写的是打开文件之后想要操作的类型主要的类型我查了一下,有如下几种:

    “r”.为读而打开文本文件.(不存在则出错)
    “w”.为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖)
    “a”.为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加)
    “r+”.为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)

    “wb”.为写而打开二进制文件

    “rb”.为读而打开二进制文件
    “ab”.为在文件后面添加数据而打开一个二进制文件
    “rb+”.为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置

    “w+”.首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)

    “a+”.功能与”a”相同;只是在文件尾部添加新的数据后,可以从头开始读
    “wb+”.功能与”w+”同.只是在随后的读写时,可以由位置函数设置读和写的起始位置
    “ab+”.功能与”a+”相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置。

 

1.2 将数据存入文件(写文件)
  几种操作函数:
  fputc(FILE* fp,int c);        //将一字节数据写入文件,写入成功返回c,失败则返回-1
  fputs(const char* a,FILE* fp);     //将字符数组的指针或者动态申请的数组头指针指向的数据写入文件,写入成功则返回这个数组的头指针
  fprintf(FILE* fp,const char* c,….);   //比printf多了一个文件指针的形参,所以说这个函数不是讲数据输出到黑色控制台的,而是输出到文件中

 

1.3 关闭文件指针
  写完之后一定莫忘关闭文件指针
  fclose(fp);


 流程演示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 源代码及注释:  

 代码出处:来自本校信院李倩倩同学大一时所编的程序。

  1 #include<iostream>
  2 #include<fstream>
  3 #include<string>
  4 #include"string.h" 
  5 using namespace std;
  6 
  7 class mystring
  8 {
  9     friend ostream& operator<<(ostream& S,const mystring& Str);         //重载<<
 10     friend istream& operator>>(istream& S,mystring& Str);              //重载>>
 11 public:
 12     mystring();
 13     mystring(const mystring& Str);
 14     void operator=(const mystring& Str);
 15     ~mystring();
 16     mystring(char* p);
 17 
 18     short m_Length;                            //字符串长度
 19     char* m_Data;                                //字符串开始地址
 20 };
 21 mystring::mystring()
 22 {
 23     m_Length=1;
 24     m_Data=new char [m_Length];
 25     memcpy(m_Data,"",m_Length);
 26 };
 27 mystring::mystring(const mystring& Str)
 28 {
 29     m_Length=Str.m_Length;
 30     m_Data=new char [m_Length];
 31     memcpy(m_Data,Str.m_Data,m_Length);
 32 };
 33 mystring::mystring(char*p)
 34 {
 35     m_Length=strlen(p)+1;
 36     m_Data=new char [m_Length];
 37     memcpy(m_Data,p,m_Length);
 38 };
 39 void mystring::operator=(const mystring& Str)
 40 {
 41     if (&Str!=this)
 42     {delete []m_Data;
 43     m_Length=Str.m_Length;
 44     m_Data=new char [m_Length];
 45     memcpy(m_Data,Str.m_Data,m_Length);
 46     }
 47     return;
 48 };
 49 mystring::~mystring()
 50 {delete[]m_Data;
 51 };
 52 ostream& operator<<(ostream& S,const mystring& Str)
 53 {
 54     short i;
 55     for(i=0;i<Str.m_Length-1;i++)
 56         S<<Str.m_Data[i];
 57     return S;
 58 };
 59 istream& operator>>(istream& S,mystring& Str)
 60 {const short BUFLEN=256;
 61 char Buf[BUFLEN];
 62 memset(Buf,0,BUFLEN);
 63 if(S.peek()=='\n')
 64 S.ignore();
 65 S.getline(Buf,BUFLEN,'\n');
 66 Str=Buf;
 67 return S;
 68 };
 69 //buy.h文件开始
 70 class buyer{
 71  protected:
 72   string name;
 73   int buyerID;
 74   string address;
 75   double pay;
 76  public:
 77   buyer();
 78   buyer(string n,int b,string a,double p);//n,b,p分别为姓名,ID,地址
 79   string getbuyname();
 80   string getaddress();
 81   double getpay();
 82   int getid();
 83   virtual void display()=0;
 84   virtual void setpay(double=0)=0;
 85 }; 
 86 class member:public buyer{
 87     int leaguer_grade;
 88 public:
 89     member(string n,int b,int l,string a,double p):buyer(n,b,a,p)
 90     {leaguer_grade=1;}
 91     void display();
 92     void setpay(double p);
 93 };
 94 class honoured_guest:public buyer
 95 { 
 96  double discount_rate;
 97  public:
 98      honoured_guest(string n,int b,double r,string a,double p):buyer(n,b,a,p)
 99     {discount_rate=r;}
100     void display();
101     void setpay(double p); 
102 };
103 class layfolk:public buyer{
104  public:
105   layfolk(string n,int b,string a,double p):buyer(n,b,a,p)
106   { }
107   void display();
108   void setpay(double p);
109 };
110 buyer::buyer()
111 {
112  name="";
113  buyerID=0;
114  address="";
115  pay=0;
116 }
117 buyer::buyer(string n,int b,string a,double p){
118  name=n;
119  buyerID=b;
120  address=a;
121  pay=p;
122 }
123 double buyer::getpay()
124    {return pay;}
125 string buyer::getaddress()
126    {return address;}
127 string buyer::getbuyname()
128    {return name;}
129 int buyer::getid()
130    {return buyerID;}
131 void member::display(){
132  cout<<"购书人姓名:"<<name<<"\t";
133  cout<<"购书人编号:"<<buyerID<<"\t";
134  cout<<"购书人为会员,级别:"<<leaguer_grade<<"\n";
135  cout<<"地址:"<<address<<"\n";
136 }
137 void member::setpay(double p){
138  if(leaguer_grade==1)
139      pay=.95*p+pay;
140  else if(leaguer_grade==2)
141      pay=.90*p+pay;
142  else if(leaguer_grade==3)
143      pay=.85*p+pay;
144  else if(leaguer_grade==4)
145      pay=.8*p+pay;
146  else if(leaguer_grade==5)
147      pay=.7*p+pay;
148  else
149      cout<<"级别错误!";
150 }
151 void honoured_guest::display(){
152  cout<<"购书人姓名:"<<name<<"\t";
153  cout<<"购书人编号:"<<buyerID<<"\t";
154  cout<<"购书人为贵宾!,折扣率为:"<<discount_rate*100<<"%\n";
155  cout<<"地址:"<<address<<"\n\n";
156 }
157 void honoured_guest::setpay(double p)
158     {pay=pay+(1-discount_rate)*p;}
159 void layfolk::display(){
160  cout<<"购书人姓名:"<<name<<"\t";
161  cout<<"购书人编号:"<<buyerID<<"\t";
162  cout<<"购书人为普通人:"<<"\n";
163  cout<<"地址:"<<address<<"\n\n";
164 }
165 void layfolk::setpay(double p)
166     {pay=pay+p;}
167 //buy.h文件结束 
168 
169 //book.h文件开始
170 class book{
171  protected:
172   string book_ID;   
173   string book_name;  
174   string author;    
175   string publishing;  
176   double price;   
177  public:
178   book();     
179   book(string b_id,string b_n,string au,string pu,double pr);
180   void display();     
181   string getbook_ID();     
182   string getbook_name();    
183   string getauthor();   
184   string getpublishing();    
185   double getprice();    
186 };
187 book::book(string b_id,string b_n,string au,string pu,double pr){
188  book_ID=b_id;
189  book_name=b_n;
190  author=au;
191  publishing=pu;
192  price=pr;
193 }
194 book::book(){
195  book_ID="";
196  book_name="";
197  author="";
198  publishing="";
199  price=0;
200 }
201 //显示书本对象书号,书名,作者,出版社和价格
202 void book::display(){
203  cout<<"书号"<<book_ID<<"\t";
204  cout<<"书名"<<book_name<<"\t";
205  cout<<"作者"<<author<<"\n";
206  cout<<"出版社"<<publishing<<"\t";
207  cout<<"定价"<<price<<"\n";
208 }
209 string book::getbook_ID()//只取书号
210     {return book_ID;}
211 string book::getbook_name() //只取书名
212     {return book_name;}
213 string book::getauthor() //只取作者
214     {return author;}
215 string book::getpublishing()//只取出版社
216     {return publishing;}
217 double book::getprice()//只取价格
218     {return price;}
219 //book.h文件结束
220 
221 class order{
222     private:
223         int b,k;//b用于控制输入编号的循环,k用于控制图书数量 
224         string ch[50];
225     public:
226         order(int a);//构造函数,确定一个对象有几本书 
227         int wfile();  //写文件生成订单的函数
228         int rfile();//读取显示订单信息
229 };
230 order::order(int a){   
231     k=a;
232 }
233 int order::wfile(){    
234     ofstream fout("order.txt",ios::app);//文件不存在时自动创建在当前目录下 
235                 if(!fout){        //文件打开检测 
236                     cout<<"Can not open file\n";
237                  return 1;
238                 } 
239                 cout<<"请依次输入需要订购的图书编号:";
240                 fout<<"所需订购图书的数量为:"<<k<<endl; 
241                 fout<<"所需订购图书的编号为:\n";
242                 string ch[50];
243                 for(b=0;b<=k-1;b++){
244                        cin>>ch[b];
245                        fout<<ch[b]<<"\n";
246                 }
247                 //fout<<"需付款金额为:";
248                 fout.close();    //文件关闭
249                 cout<<"订单已生成在当前文件目录下的order中\n"; 
250 }
251 int order::rfile(){
252                 ifstream fin("order.txt",ios::in); 
253                 if(!fin){        //文件打开检测 
254                     cout<<"Can not open file\n";
255                  return 1;
256                 }
257                 char ch;
258                 while(fin.get(ch))
259                 cout<<ch;
260                 fin.close();
261                 cout<<"\n";
262 }
263 void menu_2()
264 {
265     cout<<"****登录成功!****\n";}
266 void menu_1(){
267     int p;
268     string name,ID,code,address;
269     cout<<"\n\t********************\n";
270     cout<<"\t**   0.注册       **\n";
271     cout<<"\t**   1.直接登录   **\n";
272     cout<<"\t********************\n";
273     cout<<"请输入数字:";
274     cin>>p; 
275     if(p==0){cout<<"请输入姓名:";
276     cin>>name;
277     cout<<"请输入账号:";
278     cin>>ID;
279     cout<<"请输入密码:";
280     cin>>code;
281     cout<<"请输入地址:";
282     cin>>address;}
283     else if(p==1){
284     cout<<"请输入账号:";
285     cin>>ID;
286     cout<<"请输入密码:";
287     cin>>code;}
288     else{
289         cout<<"输入错误!请重新输入!"; 
290     }
291     menu_2();
292 }
293 
294 int main(){
295  int i=0,buyerid,flag;
296  book*c[2];
297  layfolk b1("林小茶",1,"北京",0);
298  honoured_guest b2("王遥遥",2,.6,"上海",0);
299  member b3("赵红艳",3,5,"广州",0);
300  buyer*b[3]={&b1,&b2,&b3};
301  book c1("7-302-04504-6","C++程序设计","谭浩强","清华",25);
302  book c2("7-402-03388-9","数据结构   ","徐卓群","北大",20);
303  c[0]=&c1;
304  c[1]=&c2;
305  //主菜单 
306  int t,n=0,h=0;
307  cout<<"*********欢迎进入网上图书订购系统**********\t\t";
308  menu_1();
309  cout<<"管理员输入1,用户输入2:  ";//界面分类
310  cin>>t;        //选择进入分界面
311  if(t==1){  
312     while(h!=2){
313     cout<<"*******管理员功能*******"<<endl;
314      cout<<"*  1.新增图书信息录入  *"<<endl;
315      cout<<"*  2.退出              *"<<endl;
316      cout<<"************************"<<endl; 
317      cout<<"请选择:\t";
318     cin>>n;
319     while(n>2){
320     cout<<"请重新输入1-2的功能选择:";
321     cin>>n;}
322     switch(n){
323         case 1: {int booknumber;   //书本数目的变量
324             cout<<"输入需要录入的本数:  ";
325             cin>>booknumber;
326             book* r[50];
327             string b_id,b_n,au,pu;  //依次是书号,书名,作者,出版社 
328             double pr;       //价格
329             ofstream fbookout("book.txt",ios::app);//文件不存在时自动创建在当前目录下 
330                 if(!fbookout){        //文件打开检测 
331                     cout<<"Can not open file\n";
332                  return 1;
333                 }
334             for(i=0;i<booknumber;i++){
335                cout<<"输入书号"<<i<<":  ";
336                cin>>b_id;
337                cout<<"输入书名"<<i<<":  ";
338                cin>>b_n;
339                cout<<"输入作者"<<i<<"  "; 
340                cin>>au;
341                cout<<"输入出版社"<<i<<":  ";
342                cin>>pu;
343                cout<<"输入价格"<<i<<":  ";
344                cin>>pr;
345                book r1(b_id,b_n,au,pu,pr);
346                r[i]=&r1;
347                fbookout<<"\n"<<r[i]->getbook_ID()<<"  "<<""<<r[i]->getbook_name()<<""<<"  "<<r[i]->getauthor()<<"  "<<r[i]->getpublishing()<<"  "<<r[i]->getprice()<<""<<"\n";    
348                cout<<"\n";
349             }
350             break;
351             }
352         case 2:break; 
353     }
354     h=n;
355 }//while(h!=2)
356  }//if(t==1)
357  if(t==2){
358  h=0;
359  n=0;
360  while(h!=5){
361      cout<<"****************************"<<endl;
362      cout<<"**********购书系统**********"<<endl;
363      cout<<"*   1.购书查询             *"<<endl;
364      cout<<"*   2.查询所有图书信息     *"<<endl;
365      cout<<"*   3.订购书籍             *"<<endl;
366     cout<<"*   4.优惠信息             *"<<endl;
367      cout<<"*   5.退出                 *"<<endl;
368     cout<<"****************************"<<endl;
369      cout<<"请选择:\t";
370      cin>>n;
371      while(n>5){
372     cout<<"请重新输入1-5的功能选择:";
373     cin>>n;
374 }
375      switch(n){
376          case 1:
377             {cout<<"购书人信息:\n\n";
378             for(i=0;i<3;i++)
379                b[i]->display();
380             cout<<"\n图书信息:\n\n";
381             for(i=0;i<2;i++)
382                c[i]->display();
383             cout<<"\n\n请输入购书人编号:";
384             cin>>buyerid;
385             flag=0;
386             for(i=0;i<3;i++)
387                if(b[i]->getid()==buyerid){flag=1;break;}
388             if(!flag){cout<<"编号不存在"<<endl;}
389             else
390             {
391                b[i]->setpay(c[0]->getprice());
392                b[i]->setpay(c[1]->getprice());
393                cout<<endl<<"购书人需要付费:"<<b[i]->getpay()<<"\n\n";
394                break;
395             }
396             }
397         case 2:{
398                 ifstream finbook("book.txt",ios::in); 
399                      if(!finbook){        //文件打开检测 
400                             cout<<"Can not open file\n";
401                          return 1;
402                 }//if(!finbook){  
403                 char ch;
404                 while(finbook.get(ch))
405                 cout<<ch;
406                 finbook.close();
407                 cout<<"\n";
408                 break;
409                }
410          case 3:
411             {  int a;//a用于控制图书数量
412                 cout<<"请输入需要订购图书的数量:";
413                 cin>>a;
414                 order bookorder(a);
415                bookorder.wfile();//录入订单信息
416                cout<<" 订单信息为: \n";
417                bookorder.rfile();//显示订单信息}
418                break;
419             }
420         case 4:{
421             cout<<"\n\n\t\t————————————————————————\n";
422             cout<<"\t\t                 本店优惠说明                   \n";
423             cout<<"\t\t————————————————————————\n";
424             cout<<"\t\t        会员: 在本网站购书按vip等级进行优惠  \n";
425             cout<<"\t\t                   5级:按照原价的70%收取      \n";
426             cout<<"\t\t                   4级:按照原价的80%收取      \n";
427             cout<<"\t\t                   3级:按照原价的85%收取      \n";
428             cout<<"\t\t                   2级:按照原价的90%收取      \n";
429             cout<<"\t\t                   1级:按照原价的95%收取      \n";
430             cout<<"\t\t        贵宾顾客: 按特定折扣率进行优惠        \n";
431             cout<<"\t\t        普通顾客:按原价购买,没有优惠         \n";
432             cout<<"\t\t————————————————————————\n\n\n";
433             break; }
434     }//switch(n)
435     h=n;
436 }// while (h!=5)
437 }//if(t==2)
438 }//int main()
439 //buy_book.cpp文件结束

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM