软件工程1001班李杨3349数据结构课程设计实验报告.docx

上传人:b****6 文档编号:8502599 上传时间:2023-01-31 格式:DOCX 页数:17 大小:380.63KB
下载 相关 举报
软件工程1001班李杨3349数据结构课程设计实验报告.docx_第1页
第1页 / 共17页
软件工程1001班李杨3349数据结构课程设计实验报告.docx_第2页
第2页 / 共17页
软件工程1001班李杨3349数据结构课程设计实验报告.docx_第3页
第3页 / 共17页
软件工程1001班李杨3349数据结构课程设计实验报告.docx_第4页
第4页 / 共17页
软件工程1001班李杨3349数据结构课程设计实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

软件工程1001班李杨3349数据结构课程设计实验报告.docx

《软件工程1001班李杨3349数据结构课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《软件工程1001班李杨3349数据结构课程设计实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

软件工程1001班李杨3349数据结构课程设计实验报告.docx

软件工程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;i

if(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;i

if(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百科、维基百科等.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1