项目名称:C++网上图书订购系统
目录:
前言
项目介绍
项目流程图
项目类图
重点函数的剖析
流程演示
源代码、注释及出处
前言:
1、这是软件工程综合实践专题第一次作业所写的博客,也是我第一次尝试编写博客,如有不足之处还请在评论中指出。
2、我完成作业的顺序是:阅读代码并添加注释、运行加以理解——>画项目流程图与类图——>做重点函数的剖析(与博客书写顺序略有不同)。
3、编写此博客的心得:我通过此次作业尝试养成阅读他人程序的能力;并且熟练掌握了一些c++的基本语法,和运用一些数据结构的知识;增进了自己查阅资料、画流程图与类图、编写博客的能力。以后也会多多尝试编写博客。
4、代码出处:来自本校信院李倩倩同学大一时所编的程序。
项目介绍:
图书订购系统是一个简易的系统,主要为了让图书能在c语言程序中存储信息,根据不同的用户权限能实现不同的功能。
项目流程图:
项目类图:
一:重载运算符并且自定义string数据类型方便使用
二:核心类book类
book类主要是完成对book类的定义以及存储结构。
三:buyer类
buyer类主要是对购买者的信息结构的定义。
四:订单类
订单类主要是对于购买订单相关函数的调用。
重点函数的剖析:
一、void operator=(const mystring& Str);
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文件结束