软件工程1001班李杨3349数据结构课程设计实验报告.docx
《软件工程1001班李杨3349数据结构课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《软件工程1001班李杨3349数据结构课程设计实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
![软件工程1001班李杨3349数据结构课程设计实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/31/ff1aa06b-974a-4904-bbfe-114cb13731ec/ff1aa06b-974a-4904-bbfe-114cb13731ec1.gif)
软件工程1001班李杨3349数据结构课程设计实验报告
数据结构课程设计
总结报告
专业软件工程
班级1001班
学号20103349
姓名李杨
日期2012/09/09
东北大学软件学院
第一章需求分析
问题的定义:
本次实验任务是在给定的框架下,独立完成一个网上拍卖系统。
整个实验分为6个部分,每个部分分别是上一个部分的完善,增加相应的功能、特性,逐步优化系统。
问题的分析及研究意义:
对于网上拍卖系统,要完成的主要是网上的拍卖流程,要求对拍卖信息的发布查询都能在线进行,而且,对于用户满意的拍卖品,要求能够在线出价。
因为拍卖是一种公开的投标方式,所以竞价人在竞价的同时也应该可以查看历史记录。
对于拍卖商来说,他应该可以随时掌握拍卖产品的拍卖情况,所以也应该为拍卖商提供一个查看价格的空间。
网上拍卖系统所需要实现的功能可以分为如下几个部分:
注册、登录、发布信息、竞拍商品。
注册:
按照要求填写电子邮件、姓名、密码在内的信息进行注册。
登录:
输入注册时使用的电子邮箱、密码进行登录。
通过验证后,登录成功。
发布信息:
用户登录成功后,可以在网站上发布所要拍卖的商品的信息:
标题、商品种类、拍卖开始结束时间、拍卖数量以及对商品的描述。
用户可以通过创建商品种类、添加商品子类合理管理自己的商品,方便买家和自己查看在架商品。
竞拍商品:
用户还可以查看所有在售商品,并能够使用该模块提供的检索方式检索待售商品。
比如通过时间、价格、数量分类等检索。
还可以使用关键字检索,查找自己所需要的产品。
找到自己喜欢的商品后便可竞拍该商品,只需在该模块填写竞拍价格、数量即可。
我们在已给框架下开发次系统主要是锻炼我们对数据结构及C++的熟练掌握程度,以及熟悉系统开发框架。
第二章系统设计
1、总体设计
设计思想:
本系统主要是实现一个提供在线拍卖交易的平台,因此既不站在一般的商品供应商,也不站在一般的商品采购商的角度。
从某一点来说,是基于第三方的拍卖系统。
对系统而言,所有的用户都是顾客Customer,所以是一个C2C模式的电子商务拍卖交易系统。
目前主要面对的顾客是一般的消费者。
因此设计出的系统是基于C2C的电子商务模式开展的、利用面向对象程序设计思想(oop)的编程架构的网上拍卖系统。
这样可以随时随地进行查询、浏览等业务处理。
业务扩展简单方便,通过增加网页即可增加服务器功能。
维护简单方便,只需要改变网页,即可实现所有用户的同步更新。
开发简单,共享性强。
基本的数据结构及抽象数据类型的定义:
迭代器:
iterator;
集合类容器:
vector,STLmap,STLset;
队列:
priority_queue;
STL函数模板:
sort,for_each,remove_if。
类的定义:
1·Advertisement类:
2·Bid类:
3·Categoriy类:
4·Categories类:
5·Client类:
6·Date类:
7·Group类:
8·Listing类:
2、程序设计
Advertisement类:
主要函数的声明
函数功能极其基本实现方法
istream&operator>>(istream&stream,Advertisement&a)
重载操作符“>>”使用输入流来修改对象a的信息
booloperator==
(constAdvertisement&)const
重载操作符“==”判断两个广告是否相等
priority_queue&getBids(void)
返回一个优先级队列,队列中按照顺序排列了该广告所有的竞拍信息
vectorgetTopDutchBids(void)const
返回该商品所有竞拍中获胜的竞拍者
Bid类:
主要函数的声明
函数功能极其基本实现方法
booloperator<(constBid&rhs)const;
重载操作符"<"根据竞拍者出价amount大小判断两竞拍者的大小
booloperator==(constBid&rhs)const;
重载操作符"=="根据amount判断两个竞拍者是否相等
Categories类:
主要函数的声明
函数功能极其基本实现方法
Category*operator[](constint&number)
重载操作符“[]”,根据Category的ID返回Category的指针
voidadd(Category*ptr)
添加Category类对象
Category类:
主要函数的声明
函数功能极其基本实现方法
voidaddSubCategory(Category*)
向该Category中添加新的Category
voidaddItem(int)
想该Categoty中添加广告
VoidfindOfferings
(Listing:
:
iteratorstart,Listing:
:
iteratorfinish,Listing&matches);
查找当前分类中的所有广告
findOfferingsRecursive(Listing:
:
iteratorstart,Listing:
:
iteratorfinish,Listing&matches)
使用递归的方法查找所有的广告
booloperator==
(constCategory&rhs)
重载操作符“==”判断两个Category是否相等
Client类:
函数声明
函数功能极其基本实现方法
voidaddBid(intitem)
添加参与该用户广告的竞拍信息
voidaddOffering(intitem)
添加该用户参加的竞拍信息
boolverifyPasswd(stringpasswd)
登录时验证密码
Date类:
函数声明
函数功能极其基本实现方法
booloperator==(constDate&rhs)
重载操作符“==”判断两个date日期是否相等
booloperator<(constDate&left)
重载操作符“<”判断两个日期的先后
Group类:
函数声明
函数功能及基本实现方法
Client*operator[](conststring&email)
根据email查找用户并返回其指针
voidadd(Client*ptr)
向该group中添加用户
Listing类:
函数声明
函数功能及基本实现方案
Advertisement*operator[](constint&number)
返回ID为number的广告的指针
voidadd(Advertisement*ptr)
向该Listing中添加广告
Listingsort(stringfield);
将该Listing按照关键字field排序并返回(使用stl中的sort()方法)排序后的列表
Listingfilter(stringkeyword);
将该Listing中包含keyword关键字的广告排列到一个新的Listing中并返回(使用stl中的remove_if()方法)
第三章系统实现与调试
主要代码分析:
1·Advertisement类中获取获胜竞拍者的方法:
getTopDutchBids();
的算法分析:
vectorAdvertisement:
:
getTopDutchBids(void)const{
intqt=this->getQuantity();
vectorwinner;
priority_queuetbids;
tbids=this->bids;
winner.clear();
while(qt&&!
tbids.empty()){
if(qt>=tbids.top().getQuantity()){
winner.push_back(tbids.top());
qt-=tbids.top().getQuantity();
tbids.pop();
}elseif(!
tbids.empty()){
tbids.pop();
}
}
returnwinner;
}
时间复杂度:
O(n);空间复杂度O(n);
2·Categories类中findOfferings()方法的算法分析:
voidCategories:
:
findOfferings(intcategory,Listing:
:
iteratorstart,Listing:
:
iteratorfinish,Listing&matches){
map:
:
const_iteratorcIter;
cIter=this->objects.find(category);
for(vector:
:
iteratoriter=start;
iter!
=finish;++iter){
for(vector:
:
iteratoriter1=cIter->second->itemsBegin();
iter1!
=cIter->second->itemsEnd();++iter1){
if((*iter)->getNumber()==*iter1)
matches.add(*iter);
}
}
}
时间算法复杂度:
O(lgn);空间算法复杂度:
O(n);
3·Categories类中findOfferingsRecursive()方法的算法分析:
voidCategories:
:
findOfferingsRecursive(intcategory,Listing:
:
iteratorstart,Listing:
:
iteratorfinish,Listing&matches){
map:
:
const_iteratorcIter;
cIter=this->objects.find(category);
Categories:
:
findOfferings(category,start,finish,matches);
for(vector:
:
iteratoriter=cIter->second->subCategoriesBegin();
iter!
=cIter->second->subCategoriesEnd();iter++){
Categories:
:
findOfferings(category,start,finish,matches);
}
}
时间算法复杂度:
O(lgn);空间算法复杂度:
O(n);
4·Date类中重写操作符">>"的算法分析:
//mm/dd/yyyyhh:
nn:
ss\n
istream&operator>>(istream&stream,Date&date){
stringtemDate1,temDate2;
stream>>temDate1>>temDate2;
intlen1=0;
intsdate1[5],st1=0;
memset(sdate1,0,sizeof(sdate1));
len1=temDate1.length();
for(inti=0;iif(temDate1[i]-'0'>=0&&temDate1[i]-'0'<=9){
sdate1[st1]=sdate1[st1]*10+temDate1[i]-'0';
}else{
st1++;
}
}
date.setMonth(sdate1[0]);
date.setDay(sdate1[1]);
date.setYear(sdate1[2]);
intlen2=0;
intsdate2[5],st2=0;
memset(sdate2,0,sizeof(sdate2));
len2=temDate2.length();
for(inti=0;iif(temDate2[i]-'0'>=0&&temDate2[i]-'0'<=9){
sdate2[st2]=sdate2[st2]*10+temDate2[i]-'0';
}else{
st2++;
}
}
date.setHour(sdate2[0]);
date.setMinute(sdate2[1]);
date.setSecond(sdate2[2]);
returnstream;
}
时间复杂度:
O(n);空间复杂度:
O(n);
这个方法的实现由于我不会使用strtok()方法,便使用了自己想到的方法,对输入流中的数据进行处理,遍历该字符串,判断每位字符是数字还是其他字符,如果是数字则储存到之前声明的整型数组中,下一位如果还是数字则该位数组元素*10再加上当前读取的数值。
如果遇到其他字符则数组下标+1.
5·Listing类中的filter()方法的算法分析:
ListingListing:
:
filter(stringkeyword){
key=keyword;
filtered.objects.clear();
for_each(this->begin(),this->end(),work);
returnfiltered;
}此算法中用到STL标准类库中的for_each()方法,时间复杂度为:
O(n);
6·Listing类中的sort()方法的算法分析:
ListingListing:
:
sort(stringfield){
Listingsorted;
sorted.objects=this->objects;
if(field=="email"){
std:
:
sort(sorted.begin(),sorted.end(),email_cmp);
}
if(field=="start"){
std:
:
sort(sorted.begin(),sorted.end(),start_cmp);
}
if(field=="close"){
std:
:
sort(sorted.begin(),sorted.end(),close_cmp);
}
if(field=="quantity"){
std:
:
sort(sorted.begin(),sorted.end(),quantity_cmp);
}
returnsorted;
}此函数中使用了STL标准类库中的sort()函数,时间复杂度为:
O(nlog(n));
第四章系统测试
1·运行程序,显示网页主页面:
2·注册用户:
测试方法:
白盒测试
测试用例:
测试结果:
注册成功。
3·登录使用:
测试方法:
白盒测试
测试用例:
测试结果:
成功登录。
4·添加类别:
测试方法:
白盒测试
测试用例:
添加多种类别,丰富商品种类:
测试结果:
成功添加多种类别、及子目录。
5·发布广告:
测试方法:
白盒测试
测试用例:
发布多个广告,切换账号发布多个广告:
测试结果:
成功使用多个账号发布不同、多个广告。
6·为现有广告排序,测试sort功能:
测试方法:
白盒测试
测试用例:
测试结果:
成功按照所选依据排序,测试Byquantity、Bysellermail、Byclosedate、Bystartdate、ByhighestBid、BylowestBid,均可得到想要的结果。
出现的问题及解决办法:
第五章结论
程序的最终实现结果:
该系统成功通过了测试,实现了用户注册及登录,添加广告,查看广告,竞标广告,添加子目录等功能。
客户通过在该系统正确注册,即可成为该系统的用户;注册成功后客户可通过注册的邮箱和密码登录系统。
客户在登录的状态下,可以在iCarnegieAuctions系统页面右侧的PostanAd模块上发布自己的商品广告,其中广告信息包括产品名称,所放置的分类目录以及广告有效时间,数量和简短的产品信息介绍;分类目录可以再下方的AddSub-Category栏中添加。
iCarnegieAuctions系统页面左侧将显示所有用户添加的子分类目录和商品广告,
左上方的检索模块可以通过多种方式对已有广告进行排序,能够根据关键字查找自己想要的广告信息。
用户可以在线竞拍,为自己满意的产品出价竞标。
主要创新点:
1·在实验指导书的基础上,完成了对所有广告按照竞拍价格排序;
2·添加了未被竞拍的商品数量。
遇到的困难:
对C++不能做到熟练掌握,需要经常翻书查阅资料。
对STL没有能够熟练运用,尤其是map、set,更是看了好久XX百科及牛人博客才勉强使用。
红黑树那看了好久都不是很懂。
系统遗留的问题及可能解决的途径:
1·各模块的界面不够美观、通过学习网页设计应该可以更合理的美化。
2·该系统只实现了增加广告,但没有实现对广告的修改和删除功能。
3·STL的模板只是处于能够使用一部分的程度,之后我还是要多多学习,争取弄明白原理,在熟知原理的基础上,才能更好的使用。
参考文献
例:
[1]ThomasH.CormenCharlesE.Leiseron、RonaldL.RivestCliffortStein著.潘金贵、顾铁成、李成法、叶懋译。
算法导论(原书第2版)[M].北京:
机械工业出版社,2006.9.
[2]XX百科、维基百科等.