第一周实验——关于网上购书系统的二次开发
首先说明代码来源,源代码是我的舍友在大一学期完成的期末课程设计作业——网上购书系统,在此借用作本次实验的材料。博客的内容大致分为三部分,分别是源代码的解读、改进代码、反思感悟。
一、源代码的阅读与分析
本程序的大体构架比较清晰,主函数调用各个文件读取函数作为程序开始前的准备,再调用身份选择函数进入用户系统。用户系统可直接进行功能选用,有相应功能。再通过各个选项的函数的实现,完成各分支功能。
源码的功能主要分为以下几块:
1.类的设计
buyer类
成员函数:
(1)无参构造函数 buyer();
(2)含参构造函数 buyer(strig n,int b,string a,double p);
(3)函数返回购买者姓名 string getbuyname();
(4)函数返回购买者地址 string getaddress();
(5)函数返回购买者需付总金额 stirng getpay();
(6)函数返回购买者编号 int getid();
(7)虚函数展示函数 virtual void display()=0;
(8)虚函数设置金额函数 virtual void setpay(double)=0;
相关普通函数:
(1)函数返回buyer文件中的行数,从而可知已存的购买者人数int countbuyer();
(2)从键盘输入并存入buyer文件 int addbuyer();
(3)参数为指向buyer类地址的指针,从buyer文件中读取并创建buyer类指针数组
int getbuyer(buyer** p)
book类
成员函数:
(1)无参构造函数 book();
(2)含参构造函数 book(string b_id,string b_n,string an,string pu,double pr);
(3)展示函数,输出书号、书名、作者、出版社、定价 void display();
(4)函数返回书号 string getbook_ID();
(5)函数返回作者 string getauthor();
(6)函数返回出版社 string getpublishing();
(7)函数返回定价 double getprice();
相关普通函数:
(1)函数返回book文件中的行数,从而可知已存的书籍书目 int countbook();
(2)从键盘输入并存入book文件 int addbook();
(3)参数为指向book类地址的指针,从book文件中读取并创建book类指针数组
int getbook(book** p);
bill 类
成员函数:
(1)含参构造函数 bill(buyer* a,book** f,int c);
(2)函数返回购买者编号 int getbuyerid();
(3)函数返回购书本数 int getcount();
(4)展示函数,输出该账单中购买者的姓名、编号、地址以及所购书籍的书名、书号、定价以及该账单总价 void display_bill();
相关普通函数:
(1)函数返回bill文件中的行数,从而可知已存的书籍书目 int countbill();
(2)从键盘输入并存入bill文件 int addbill ();
(3)参数为指向bill类地址的指针,从bill文件中读取并创建bill类指针数组 int getbill(bill** p)
2.程序功能分析
以下为程序运行主界面

1)图书信息:可以查看已有的,可供选择的图书信息
cin >> t; system("cls"); if (t == "1") { cout << "\n图书信息:\n\n"; //显示book对象的信息 for (int i = 0;i < countbook();i++) c[i]->display(); system("pause"); system("cls"); menu(); } void book::display() { cout << "书号:" << book_ID << "\t"; cout << "书名:" << book_name << "\t"; cout << "作者:" << author << "\n"; cout << "出版社:" << publishing << "\t"; cout << "定价:" << price << "\n" << "\n"; }

2)创建订单:用户通过输入自己的编号和要购买的书号来创建订单

else if (t == "2") { int i; cout << "\n购书人信息:\n\n"; for (i = 0;i < countbuyer();i++)//显示继承了buyer类的对象 b[i]->display(); system("pause"); system("cls"); menu(); }
此处功能中要输入书号,但没有显示已有图书的书号,造成用户使用不便,且输错书号后没有相应的应对异常输入的函数来应对
3)订单查询

else if (t == "3") { int flag = 0, i; int buyerid; cout << "\n请输入购书者编号:" << endl; cin >> buyerid; for (i = 0;i < countbill();i++) if (l[i]->getbuyerid() == buyerid) { l[i]->display_bill(); flag = 1; } if (!flag) { cout << "无相关订单" << endl; } system("pause"); system("cls"); menu(); }
二、改进代码
解读完源程序之后,我认为该程序存在两个可以改进完善的地方:
1.可以新增一个添加图书的功能,使程序更加完备;
2.创建订单的功能我觉得可以稍作修改,源程序要求输入购书者编号和书号来创建订单,可以在此显示出可供选择的图书书号及其他信息,方便用户使用该功能,并且对输入错误的书号编写函数来给出提示,比较贴合实际使用情况
关于创建订单功能的改进:
int addbill() { int buyerid; string bookid[100]; int flag = 0; ofstream fout("bill.doc", ios::app); if (!fout) { cout << "Cannot open output file.\n"; return 0; } cout << endl<<"请在一行中输入购书者编号、书号,用空格分开,以0结尾" << endl; cin >> buyerid >> bookid[0]; if (buyerid == 0 || bookid[0] == "0") { return 0; } fout << buyerid << " " << bookid[0]; for (int i = 1;bookid[i - 1] != "0"; i++) { cin >> bookid[i]; fout << " " << bookid[i]; } fout << endl; fout.close(); } int getbill(bill** p) { ifstream fin("bill.doc", ios::in); if (!fin) { cout << "Cannot open input file.\n"; return 0; } int buyerid, flag = 0, m; string bookid[100]; book** t = new book * [100]; buyer* x; for (int i = 0;i < countbill();i++) { fin >> buyerid; for (m = 0;m < countbuyer();m++) if (b[m]->getid() == buyerid) { flag = 1;break; } if (!flag) { cout << "编号不存在" << endl; return 0; } else x = b[m]; flag = 0; int k, j; fin >> bookid[0]; for (int j = 1;bookid[j - 1] != "0";j++) { fin >> bookid[j]; } for (j = 0;bookid[j] != "0";j++) { for (k = 0;k < countbook();k++) { if (c[k]->getbook_ID() == bookid[j]) { flag = 1;break; } }if (!flag) { cout << "编号不存在" << endl; j -= 1; } else t[j] = c[k]; } l[i] = new bill(x, t, j); } fin.close(); } else if (t == "2") { cout << "\n图书信息:\n\n"; //显示book对象的信息 for (int i = 0; i < countbook(); i++) c[i]->display(); addbill(); getbill(l); cout<<"创建成功!"; system("pause"); system("cls"); cusmenu(); }

关于新增的添加图书功能:
int addbook() { string a, b, c, d; int x; ofstream fout("book.doc", ios::app); if (!fout) { cout << "Cannot open output file.\n"; return 0; } cout << endl<<"请依次输入书号、书名、作者、出版社、定价,以空格分开,以0结束:" << endl; cin >> a; while (a != "0") { cin >> b >> c >> d >> x; fout << a << " " << b << " " << c << " " << d << " " << x << endl; cin >> a; } fout.close(); } int getbook(book** p) { ifstream fin("book.doc", ios::in); if (!fin) { cout << "Cannot open input file.\n"; return 0; } string a, b, c, d; double x; for (int i = 0;i < countbook();i++) { fin >> a >> b >> c >> d >> x; p[i] = new book(a, b, c, d, x); } fin.close(); } else if (t == "4") { addbook(); getbook(c); system("pause"); system("cls"); menu(); }

添加图书后,将更改过的图书信息即使存入book文件,book文件里的信息变更后显示以下

三、反思和感悟
对一个项目程序进行修改时,首先应该对原项目有一个全面的了解,在不改变其核心功能的情况下,根据使用情况对其功能进行完善。在经过了此次课程实验之后,我在逆向软件开发的过程中学习到了以下几点:
1.在写代码时,一定要加入注释,否则在别人读代码时,会十分的麻烦,而且不仅仅是别人,甚至你自己过了很长一段时间后,再去看自己的代码,你自己都可能看不懂,所以写代码一定要写注释
2.我认为写代码,不要只是一个人死扣,可以多问问别人一些建议,这样会使你的相同程序好上很多。
由于时间原因,我仅对以上三点问题进行了小幅度的改进,整个系统依然存在许多需要进一步修改的地方,我相信在今后的学习过程甚至日后的工作中,对之前完成的工作进行重新审视并在从前的基础上创新发展是从事这一行业的重中之重,希望以这篇博客为起点,在接下来的每天都能更上一层楼。
浙公网安备 33010602011771号