实验设计四交通事故分析.docx
《实验设计四交通事故分析.docx》由会员分享,可在线阅读,更多相关《实验设计四交通事故分析.docx(12页珍藏版)》请在冰豆网上搜索。
![实验设计四交通事故分析.docx](https://file1.bdocx.com/fileroot1/2022-10/29/e495e175-2b62-49b2-b774-faec4b500fd6/e495e175-2b62-49b2-b774-faec4b500fd61.gif)
实验设计四交通事故分析
北京信息科技大学
实验设计报告
课程名称面向对象程序设计实验设计
题目交通事故分析
指导教师李春强
设计起止日期
设计地点
系别信息管理学院
专业___信息安全_______________
学生姓名____李继文______________
班级/学号信安1002/2010012713
成绩___________________
1.课程设计目的:
通过本实验使学生利用面向对象程序设计软件开发方法,即软件开发过程划分为明显的几个阶段:
问题分析和功能定义、对象设计及实现、核心控制设计、编码与测试、进化等实现线性衰减和数值方法分析方面的应用。
2.课程设计内容:
创建与数据最符合的两条直线。
一条直线在到达事故数量顶点时的车辆密度之前一直增加。
另一条直线从该点开始一直降低。
图4-1给出了收集的示例数据(由圆代表)及数据最相符的直线。
编写一个程序,来创建与代表12月份(详细数据请参见3.课程设计要求)交通状况的一组(x,y)数据点最符合的直线。
这些点代表观测数据,x为车辆密度,y为事故数量。
程序共应输出4个值:
直线1的斜率(m1)
直线1的截距(b1)
直线2的斜率(m2)
直线2的截距(b2)
事。
。
。
。
。
。
故。
。
。
。
。
。
。
。
数。
。
。
。
量
车辆密度(每100m的车辆数量)
图4-1事故数量与车辆密度的关系
3.课程设计要求:
(1)问题描述
对于特定长度的高速公路,公路上的车辆密度(每100米车辆的数目)与事故发生的数量有关。
一般认为,事故的数量随某一点的车辆密度的增加而增加。
然而,当车辆密度超过某一特定值时,由于拥挤,车辆平均速度下降,事故的数量也随之下降。
为了预测事故发生频率,并帮助改进高速公路设计,我们希望由观测数据来推导车辆密度及事故数量之间的关系。
(2)解决方案
在此给出最佳直线的斜率及截距的方程。
n=numberofpoints
c=∑i=1nxi
d=∑i=1nyi
e=∑i=1nxi2
f=∑i=1nyixi
注意,c为所有数据点的x坐标值的和,d为所有数据点的y坐标值的和。
变量e为x坐标值的平方和,f为数据点的xy积的和。
最佳直线的斜率(m)和截距(b)为:
m=(nf-cd)/(ne-c2)
b=(de-cf)/(ne-c2)
(3)具体示例
12月份数据如表4-1所示。
利用该数据进行计算。
表4-112月份的数据
数据点
车辆密度(x)
事故数量(y)
0
1.4
3
1
2.0
6
2
2.3
4
3
4.5
7
4
6.2
10
5
6.7
15
6
7.0
11
7
8.5
18
8
9.0
13
9
12.7
17
10
13.1
15
11
17.7
16
12
18.5
11
13
20.3
5
注意,事故数量的最大值为18(在第7个点)。
因此,我们用点0-7来创建第一条直线,用点7-13来创建另一条直线。
对于第一条直线:
c=sumofthexvalue=1.4+2.0+…+7.0+8.5=38.6
d=sumoftheyvalue=3+6+…+11+18=74
为获取e的值,将x值的平方求和:
e=1.42+2.02+…+7.02+8.52=236.08
为了获取f的值,首先求每x,y的积,然后求和:
f=1.4(3)+2.0(6)+…7.0(11)+8.5(18)=449.4
对于第二条直线:
c=8.5+9.0+…+18.5+20.3=99.8
d=18+13+…+11+5
e=8.52+9.02+…+18.52+20.32=1553.78
f=8.5(18)+9.0(13)+…18.5(11)+20.3(5)=1270.6
将这些值带入给出的求m及b的方程:
m1=1.853
b1=0.3087
m2=-0.6403
b2=22.70
这样,最佳直线y=mx+b的方程为:
直线1:
y=1.853x+0.3087从x=1.4到x=8.5
直线2:
y=-0.6403x+22.70从x=8.5到x=20.3
(4)类及对象
程序分析:
首先,在交通事故分析中,分为事故数据(Traffic)的计算类及线形衰减(Linear_regress)类两部分。
其次,类应该由什么组成。
如:
Traffic类由数据点组成。
另外,我们需要事故数量最大值的数组下标及数据点的数量。
函数成员应能通过读输入文件来初始化这些数据、
找出事故数量最大值的数组下标,并且与Linear_regress类交互以获得两条直线。
Linear_regress类需知道它使用的点的数量,它需访问这些被计算的点,它需要通过这些点的线的数据。
所以,其数据成员应为数据点(或数据点数组的起始地址)、数据点的数据及创建的直线的斜率和截距。
在此,Linear_regress类仅需要由数据创建最佳直线,为简单起见,我们仅使用一个函数成员。
注意,这些数据使用了点和直线。
在程序application4.cpp中,我们描述了简单的仅包含数据成员的Point及Line结构。
在这个程序中,我们将其用作类,这意味Point及Line对象可作为Linear_regress及Traffic的数据成员。
第三,这些数据应如何交互?
Linear_regress类包含类型为Line的普通数据成员,及可被Traffic用来执行衰减的成员函数。
Traffic包含Point类型的数组,及指向Linear_regress类对象的指针。
4.实验条件:
(1)主要设备:
586或更高机型,256MB或更高的内存,40G或更大的硬盘。
(2)主要软件:
①操作系统可为Windows9X、WinMe、Win2000或更高版本等;
②开发环境为VC++6.0或者TC++3.0。
(3)参考书目:
①C++课堂教学与编程演练作者:
(美)奥瑞兹(DOrazio,T.B)著,侯普秀译清华大学出版社
②《数据结构及应用算法教程》严蔚敏等编著清华大学出版社2001年2月第1版
5.实验方法与步骤:
实验界面:
(1)使用内置的数据:
课设中提供的数据
显示如上图;
(2)使用手动输入:
结果为:
6.实验总结:
通过这次课设的实验,学会了cout中的精度的控制,并且对于c++stl中的vector容器的概念有了一定的了解,并且对于面向对象的操作有了很深的领悟!
附录:
代码如下:
#include
#include
#include
#include
#include
#include
usingnamespacestd;
structpoint//点的结构体
{
floatx;
inty;
};
boolcmp(pointa,pointb)//判断函数
{
returna.x}
boolcmp1(pointa,pointb)//判断函数
{
returna.y}
structlr//直线的结构体
{
floatm,b;
};
classtraf//具体的分析类
{
private:
vectorpp;
intn,d;
floatc,e,f;
vectorlinder;
public:
traf(vectorp)
{
pp=p;
}
voiddeal()
{
d=0;
c=0;
e=0;
f=0;
n=0;
sort(pp.begin(),pp.end(),cmp);//排序函数
vector:
:
iteratorir=max_element(pp.begin(),pp.end(),cmp1);//找出最大值的点
cout<<"最大点:
"<<(*ir).x<<""<<(*ir).y<cout<<"----------------------------------------"<for(vector:
:
iteratorip=pp.begin();ip!
=ir+1;ip++)
{
n++;
c+=(*ip).x;
d+=(*ip).y;
e+=pow((*ip).x,2);
f+=((*ip).x*(*ip).y);
}
lrlr1;
lr1.m=(n*f-c*d)/(n*e-c*c);
lr1.b=(d*e-c*f)/(n*e-c*c);
linder.push_back(lr1);
d=0;
c=0;
e=0;
f=0;
n=0;
for(vector:
:
iteratorip=ir;ip!
=pp.end();ip++)
{
n++;
c+=(*ip).x;
d+=(*ip).y;
e+=pow((*ip).x,2);
f+=((*ip).x*(*ip).y);
}
lr1.m=(n*f-c*d)/(n*e-c*c);
lr1.b=(d*e-c*f)/(n*e-c*c);
linder.push_back(lr1);
}
voiddisplay()
{
for(vector:
:
iteratorio=linder.begin();io!
=linder.end();io++)
{
cout<<"斜率:
"<cout<<"截距:
"<cout<<"直线方程为:
y="<cout<<"------------------------------"<}
}
};
classoperate
{
private:
vectorpt;
public:
operate(vectorxx)
{
pt=xx;
}
voidprint()
{
inty,k,i,o;
floatx;
pointpn;
/*vectorpt;*/
boolmybool=true;
pointpi[14]={1.4,3,2.0,6,2.3,4,4.5,7,6.2,10,6.7,15,7.0,11,8.5,18,9.0,13,12.7,17,13.1,15,17.7,16,18.5,11,20.3,5};
do
{
pt.clear();
co