简单的小型停车场管理系统程序的设计说明_第1页
简单的小型停车场管理系统程序的设计说明_第2页
简单的小型停车场管理系统程序的设计说明_第3页
简单的小型停车场管理系统程序的设计说明_第4页
简单的小型停车场管理系统程序的设计说明_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. . . . 目录1 需求分析11.1市场分析1.2设计分析2 概要设计22.1车辆信息结构体定义22.2便道(队列)结构体定义22.3 栈(停车场)结构体定义23 详细设计33.1菜单的实现33.2 在停车场中搜索是否存在出车车辆SearchParking()函数33.3 在便道中搜索是否存在出车车辆SearchWaySide()函数43.4便道车辆进入停车场WayToParkingWayToParking()函数53.5时间格式转换Conversion()函数53.6计算时间间隔ComputeTime()函数63.7输出当前车辆停车信息Check()函数73.8 函数的调用关系层次结构8

2、4 调试分析105 测试结果106 总结147 附件(源程序代码)141 需求分析1.1 市场分析目前,我国经济逐渐发达,汽车数量不断增加。因此,大量的停车场也随之而至。虽然某些大型停车场在工作中已经开始向计算机化靠拢,但仍不够完善。而中小型停车场更为稀少,旧的管理手段给顾客带来极大的不便,同时为了提高工作效率与服务质量,一套完整的停车厂管理系统的出现就十分必要了。本次设计,仅为一个简单的小型停车场管理系统。采用C语言编写,主要强调车辆的进站和出站操作,以与车场和通道之间的相互关系。根据车场车道狭长且为一边开口的特点,将车库和便道中的车辆信息记录在一个结构体数组中,这样设计可以方便的记录车辆的

3、数据,读取和删除。本程序中的数据对象是汽车,为使操作更方便,将给每辆进车道的汽车编号,根据编号出场。其中,还包括入场时间、出场时间、收取费用等项。1.2 设计分析停车场采用栈式结构,便道采用队列结构(即便道就是等候队列)。停车场的管理流程如下:(1)当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等待)。(2)当车辆要求出栈时,该车到栈顶的那些车先出栈(在它之后进入的车辆必须先退出车场为它让路),在让该车出栈,其他车辆再按原次序进栈(进入车场)。当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队头取出,压

4、入栈中。用栈模拟停车场,用队列模拟便道,按照从终读入的输人数据序列的进行模拟管理,每一组输入数据包含两个数据项:汽车车牌号以与汽车到达或离去的时刻。每次输完,进行输出操作:若是车辆到达,输出汽车在停车场或者便道上停车的信息;若是车辆离去,输出停留时间和需缴纳的费用(停车场和便道收费标准不一样),其中栈和队列均以顺序结构实现,队列为循环队列。2概要设计2.1 车辆信息结构体定义 typedef structchar numNUM;char time5;DATA,TDATA;2.2 便道(队列)结构体定义typedef struct DATA *data;int head,rear;int siz

5、e;Queue;2.3 栈(停车场)结构体定义typedef struct DATA *base;DATA *top;int size;Stack;3 详细设计3.1菜单的实现主菜单界面的实现方法主要是调用C语言中的系统函数system(),其参数不同实现不同功能。system("cls")实现清屏,system("color 1A")设置默认控制台前景和背景颜色,system("title 进程管理模拟器 Version1.0") 设置界面的标题和版本信息。其它就是对菜单项的格式输出。 Instruction1()函数的实现代码如下

6、所示。void Instruction1()cout<<"t* * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;cout<<"t"<<"*"<<"ttttttt*"<<endl;cout<<"t"<<"*"<<setw(34)<<"停车场管理系统"<<

7、;"ttt*"<<endl;cout<<"t"<<"*"<<"ttttttt*"<<endl;cout<<"t"<<"*"<<"t"<<"A 输入停车场车位数"<<"tttt*"<<endl;cout<<"t"<<"*"&l

8、t;<"t"<<"B 输入车辆停车每小时花费"<<"ttt*"<<endl;cout<<"t"<<"*"<<"t"<<"C 未改变部分使用默认值(默认车位数为3 花费为6),"<<"*"<<endl;/并进入下一级操作"<<"t*"<<endl; cout<<

9、"t"<<"*"<<"t"<<" 并进入下一级操作"<<"tttt*"<<endl;cout<<"t"<<"*"<<"t"<<"D 结束停车场管理系统"<<"tttt*"<<endl;/cout<<endl;cout<<"t"

10、;<<"*"<<"ttttttt*"<<endl;cout<<"t* * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;子菜单的实现是利用Instruction2()函数,其实现方法类似主菜单的实现。在此不再赘述。3.2 在停车场中搜索是否存在出车车辆SearchParking()函数在出车时,由于不确定即将出车的车辆是否存在于停车场中,所以事先要进行判断,即在停车场钟搜索出车车辆车牌号,如果在停车场

11、中存在此,则说明此车在停车场中,函数返回真,便可在停车场中进行相应出车操作,如果不存在则说明此车不在停车场中,函数返回假,在进行下一步判断。int m,t;position=S.top-S.base;while(!Empty_Stack(S)-S.top;t=0;for(m=0;m<NUM;+m) if(S.top)->numm=numm) +t;if(t=NUM) for(m=0;m<5;+m)intimem=(S.top)->timem;return OK;-position;return ERROR;3.3在便道中搜索是否存在出车车辆SearchWaySide()

12、函数与3.2相似int m,t;position=1;while(!Empty_Queue(Q)t=0;for(m=0;m<NUM;+m) if(Q.dataQ.head.numm=numm) +t;if(t=NUM) for(m=0;m<5;+m)intimem=Q.dataQ.head.timem;return OK;+position;+Q.head;return ERROR;3.4便道车辆进入停车场 WayToParkingWayToParking() 函数在进出车时,可能存在一种情况,停车场已满,此时用户要求出车,出车后停车场便会空留一个位置,此时判断便道是否有车,如果有

13、则将1号车位的车停进停车场,如果没有车,则不进行操作。if(!Empty_Queue(Q) DATA E; OutQueue(Q,E); Push(S,E);3.5 时间格式转换Conversion()由于定义时间为长度为5的字符型数组,在显示方面有他的优势,但这样不利于计算时间间隔以与后续的花费,所以要将字符型时间转换为整形时间。hour=10*(A0-'0')+A1-'0'minute=10*(A3-'0')+A4-'0'3.6计算时间间隔ComputeTime()函数在车辆出车时,要输出相应的停车时间间隔信息。此函数便是计算

14、时间间隔的,需要判断4种情况,用小时和分钟表示。int hourA,hourB,minuteA,minuteB;Conversion(A,hourA,minuteA);Conversion(B,hourB,minuteB);if(minuteB>=minuteA && hourB>=hourA)hour=hourB-hourA;minute=minuteB-minuteA; else if(minuteB<minuteA && hourB> hourA)hour=hourB-hourA-1;minute=60-minuteA+minute

15、B;else if(minuteB>=minuteA && hourB< hourA)hour=hourB+24-hourA;minute=minuteB-minuteA;else if(minuteB<minuteA && hourB< hourA)hour=hourB+24-hourA-1;minute=60-minuteA+minuteB;3.7输出当前车辆停车信息Check()函数当用户要求查看当前停车场以与便道的车辆信息时,便要进行相应的输出。int i=1,m;DATA *t;cout<<"停车场&quo

16、t;if(Empty_Stack(Parking)cout<<"tt空 ! "<<endl;elset=Parking.base;while(t!=Parking.top)cout<<"tt"cout<<"车位 "<<i+<<" : "for(m=0;m<NUM;+m) cout<<t->numm;cout<<" , 进车时间 "for(m=0;m<5;+m)cout<<

17、t->timem;cout<<endl;+t;while(t-Parking.base<Parking.size)cout<<"tt"cout<<"车位 "<<i+<<" : 空"<<endl;+t;i=1;cout<<endl<<"便道(无限大)"if(Empty_Queue(WaySide)cout<<"t空 ! "<<endl;elsewhile(!Empty

18、_Queue(WaySide)cout<<"tt"cout<<"车位 "<<i+<<" : "for(m=0;m<NUM;+m) cout<<WaySide.dataWaySide.head.numm;cout<<" , 进车时间 "for(m=0;m<5;+m)cout<<WaySide.dataWaySide.head.timem;cout<<endl;WaySide.head=(WaySide.head

19、+1)%WaySide.size;cout<<endl;3.8 函数的调用关系层次结构系统总体可分为四个大的模块,即栈初始化,队初始化,进出车管理,第一层菜单,而进出车管理算法又可分为第二层菜单,栈中搜索出车车辆,队中搜索出车车辆,判断车牌号一致,创建输入信息,获知便道和停车场当前车辆信息,队中元素入栈等多个模块。其总体模块如图3-1所示。图3-1 系统总体模块图为实现系统以上各个模块,本模拟系统将功能相对完整的代码定义为一个函数。本系统中主要的函数与其功能如表3-1所示。表3-1 系统主要函数与其功能函数名功能说明Instruction1()显示系统一级菜单Instruction

20、2()显示系统二级菜单CreateT()创建输入信息Init_Stack(Parking,n)栈初始化Init_Queue(WaySide)队初始化FF(Parking,WaySide,cost)进出车管理FullStack(Parking)判断栈满EnQueue(WaySide,T)入队Push(Parking,T)入栈SearchParking(Parking,T.num,position,intime)在停车场搜索出车车辆SameNum(T.num,(Parking.top-1)->num)判断车牌号一致Pop(Parking,t)出栈Empty_Stack(TParking)判断

21、栈空Queue_Empty(WaySide)判断队空WayToParking(WaySide,Parking)队中元素入栈ComputeTime(intime,T.time,hour,minute)计算间隔时间Cost(hour,minute,cost)计算花费SearchWaySide(WaySide,T.num,position,intime)在便道搜索出车车辆OutQueue(WaySide,t)出队Check(Parking,WaySide)获取栈、队息4 调试分析 程序设计过程中,时间的类型曾经用过整型,但是这样不利于显示,比如用户输入12:03,输出会是12:3,这样与我们日常习惯

22、不符,所以,后期进行了调整,用长度为5的字符数组来表示时间,这样时间显示问题得到了有效的解决,但是进行实践操作的复杂度便加大了,权衡之后我们还是选择了用字符数组表示时间。 设计之初,在进行菜单选择时,我们仅仅考虑了大写字母来进行菜单项选择,但往往用户会输入小写,这样就会出现问题,所以后期我们又将小写选项编入了代码,使用户不必再纠结大小写问题。 起初进行车辆停车花费时,花费变量cost设定为整型,但是这在使用cin进行输入小数时,系统可能只读取整数部分,而小数点与其小数部分并不读取,所以,造成了系统误将小数点当做菜单选项进行操作,出现错误。为此我们将cost设定为浮点型,避免了这一错误,也将车辆

23、每小时花费扩展到小数。 在用户输入信息时,有必要将输入法事先转换为英文输入,避免不必要的错误。5 测试结果图6-1,一级菜单在一级菜单直接键入C图6-2 二级菜单在二级菜单键入A 表 6-1组数车号时间1A1112:002A1212:053A1312:114A1412:555A1513:01依表6-1,输入5组进车信息图6-3 输入了一组进车数据完成后在二级菜单键入C图6-4 进车后当前停车信息再在二级菜单键入B表6-2组数车号时间1A1113:502A1214:453A1515:09依表6-2,输入3组进车信息图6-5 输入第一组出车信息图6-6 输入第二组出车信息图6-7 输入第三组出车信

24、息再在二级菜单键入C图6-8,出车后当前停车信息6 总结 通过这次实习,让我们初步有了编写小系统的能力,我们对很多的函数有了新的认识,也学会了运用多种函数,也明白了编写程序的基本过程和基本方法。编写程序的过程中我们又学到了曾经自己不知道的函数或是自己不会的函数的用法。这次课程设计课总的来说让我受益匪浅。 在程序的设计过程中遇到了很多的困难。在代码一次一次的调试失败下,曾经想过要放弃。我们小组成员最后还是坚持了下来,毫不畏惧困难,在一起讨论论证到底是用什么函数,什么样的循环来最简单的实现程序的功能,经过几个日夜的努力我们总算是顺利的完成了程序的设计。  在程序的编写过程中我们

25、发现有很多的知识漏洞和缺陷,需要进一步努力学习来巩固完善自己的知识面。 在这几天的编写过程中我们对c语言有了更进一步的认识和了解。此次编程过程的经验和知识肯定能促进我们以后的学习,更是对我们今后进行参加电子设计类软件编程大赛有较大的帮助7 附录(源代码)#include<iostream>#include<iomanip>using namespace std;#define NUM 3/ 车牌位数#define Q_SIZE 50#define T_SIZE 50#define OK 1#define ERROR 0typedef int Status;ty

26、pedef structchar numNUM;char time5;DATA;typedef struct DATA *data;int head,rear;int size;Queue;typedef struct DATA *base;DATA *top;int size;Stack;typedef structchar numNUM;char time5;TDATA;Status Empty_Stack(Stack S)if(S.base=S.top)return OK;elsereturn ERROR;void Push(Stack &S,DATA E)*S.top+=E;v

27、oid OutQueue(Queue &Q,DATA &E)E=Q.dataQ.head;Q.head=(Q.head+1)%Q.size;Status FullStack(Stack S)/判断栈是否满if(S.top-S.base=S.size) return OK;else return ERROR;void Init_Stack(Stack &S,int n)S.base=new DATAn+1;S.top=S.base;S.size=n;void Pop(Stack &S,DATA &E)E=*-S.top;Status Empty_Queue

28、(Queue Q)if(Q.head=Q.rear)return OK;else return ERROR;void EnQueue(Queue &Q,DATA E)Q.dataQ.rear=E;Q.rear=(Q.rear+1)%Q.size;Status SameNum(char A,char B)int i,j=0;for(i=0;i<NUM;+i)if(Ai=Bi)+j;if(j=NUM)return OK;else return ERROR;void WayToParking(Queue &Q,Stack &S)/ 将便道的车停进停车库if(!Empty

29、_Queue(Q) DATA E; OutQueue(Q,E); Push(S,E);Status SearchParking(Stack S,char num,int &position,char intime)/ 在数组A中搜索,判断是否存在数据numint m,t;position=S.top-S.base;while(!Empty_Stack(S)-S.top;t=0;for(m=0;m<NUM;+m) if(S.top)->numm=numm) +t;if(t=NUM) for(m=0;m<5;+m)intimem=(S.top)->timem;ret

30、urn OK;-position;return ERROR;Status SearchWaySide(Queue Q,char num,int &position,char intime)/ 在数组A中搜索,判断是否存在数据numint m,t;position=1;while(!Empty_Queue(Q)t=0;for(m=0;m<NUM;+m) if(Q.dataQ.head.numm=numm) +t;if(t=NUM) for(m=0;m<5;+m)intimem=Q.dataQ.head.timem;return OK;+position;+Q.head;ret

31、urn ERROR;void CreateT(DATA &T)cin>>T.num>>T.time;void Check(Stack Parking,Queue WaySide)int i=1,m;DATA *t;cout<<"停车场"if(Empty_Stack(Parking)cout<<"tt空 ! "<<endl;elset=Parking.base;while(t!=Parking.top)cout<<"tt"cout<<"

32、车位 "<<i+<<" : "for(m=0;m<NUM;+m) cout<<t->numm;cout<<" , 进车时间 "for(m=0;m<5;+m)cout<<t->timem;cout<<endl;+t;while(t-Parking.base<Parking.size)cout<<"tt"cout<<"车位 "<<i+<<" : 空&q

33、uot;<<endl;+t;i=1;cout<<endl<<"便道(无限大)"if(Empty_Queue(WaySide)cout<<"t空 ! "<<endl;elsewhile(!Empty_Queue(WaySide)cout<<"tt"cout<<"车位 "<<i+<<" : "for(m=0;m<NUM;+m) cout<<WaySide.dataWaySid

34、e.head.numm;cout<<" , 进车时间 "for(m=0;m<5;+m)cout<<WaySide.dataWaySide.head.timem;cout<<endl;WaySide.head=(WaySide.head+1)%WaySide.size;cout<<endl;void Instruction2()/二级菜单cout<<"t* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;cout<

35、;<"t"<<"*"<<"tttttt*"<<endl;cout<<"t"<<"*"<<setw(32)<<"停车场管理系统"<<"tt*"<<endl;cout<<"t"<<"*"<<"t"<<"A 输入进车信息"&

36、lt;<"tttt*"<<endl;cout<<"t"<<"*"<<"t"<<"B 输入出车信息"<<"tttt*"<<endl;cout<<"t"<<"*"<<"t"<<"C 查看当前停车信息"<<"ttt*"<<e

37、ndl;cout<<"t"<<"*"<<"t"<<"D 初始化停车场系统"<<"ttt*"<<endl;cout<<"t"<<"*"<<"t"<<"E 结束停车场管理系统"<<"ttt*"<<endl;cout<<"t"&l

38、t;<"*"<<"tttttt*"<<endl;cout<<"t* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;void Instruction1()/一级菜单cout<<"t* * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;cout<<"t"<<&q

39、uot;*"<<"ttttttt*"<<endl;cout<<"t"<<"*"<<setw(34)<<"停车场管理系统"<<"ttt*"<<endl;cout<<"t"<<"*"<<"ttttttt*"<<endl;cout<<"t"<<&q

40、uot;*"<<"t"<<"A 输入停车场车位数"<<"tttt*"<<endl;cout<<"t"<<"*"<<"t"<<"B 输入停车场每小时花费"<<"tttt*"<<endl;cout<<"t"<<"*"<<"t&q

41、uot;<<"C 输入便道每小时花费"<<"tttt*"<<endl;cout<<"t"<<"*"<<"t"<<"D 未改变部分使用默认值(默认车位数为3 停车场花"<<"t*"<<endl;/并进入下一级操作"<<"t*"<<endl; cout<<"t"<

42、<"*"<<"t"<<" 费为8 便道花费为6),并进入下一级操作"<<"tt*"<<endl;cout<<"t"<<"*"<<"t"<<"E 结束停车场管理系统"<<"tttt*"<<endl;cout<<"t"<<"*"<

43、;<"ttttttt*"<<endl;cout<<"t* * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;void Conversion(char A,int &hour,int &minute)/将字符时间转换成整形时间hour=10*(A0-'0')+A1-'0'minute=10*(A3-'0')+A4-'0'void ComputeTime(char

44、 A,char B,int &hour,int &minute)/计算停车时间间隔小时数,分钟数int hourA,hourB,minuteA,minuteB;Conversion(A,hourA,minuteA);Conversion(B,hourB,minuteB);if(minuteB>=minuteA && hourB>=hourA)hour=hourB-hourA;minute=minuteB-minuteA; else if(minuteB<minuteA && hourB> hourA)hour=hourB-

45、hourA-1;minute=60-minuteA+minuteB;else if(minuteB>=minuteA && hourB< hourA)hour=hourB+24-hourA;minute=minuteB-minuteA;else if(minuteB<minuteA && hourB< hourA)hour=hourB+24-hourA-1;minute=60-minuteA+minuteB;float CostP(int hour,int minute,float cost)/计算花费if(minute>0) re

46、turn (hour+1)*cost;elsereturn hour*cost;float CostW(int hour,int minute,float cost)/计算花费if(minute>0) return (hour+1)*cost;elsereturn hour*cost;void FF(Stack &Parking,Queue &WaySide,float costp,float costw,char &M)/主要子函数Stack TParking;Init_Stack(TParking,T_SIZE);int hour,minute;int pos

47、ition;char intime5;DATA T,t;int m;char M_;Instruction2();cin>>M;while(M!='D' && M!='d')switch(M)case 'a':case 'A':dosystem("cls");cout<<"请输入进车信息,包括"<<NUM<<"位车牌号和进车时间(24小时制)"<<endl;/(include with "

48、;<<NUM<<" numbers of car and time of 24 hour system)"<<endl;CreateT(T);if(FullStack(Parking)EnQueue(WaySide,T);/T为输入数据数组for(m=0;m<NUM;+m)cout<<T.numm;cout<<" 停在便道 ,进车时间 "for(m=0;m<5;+m)cout<<T.timem;cout<<" , 车位号 "<<

49、(WaySide.rear-WaySide.head+WaySide.size)%WaySide.size;/<<Parking.top-Parking.base;cout<<endl;elsePush(Parking,T);for(m=0;m<NUM;+m)cout<<T.numm;cout<<" 停在停车场,进车时间 "for(m=0;m<5;+m)cout<<T.timem;cout<<" , 车位号 "<<Parking.top-Parking.bas

50、e;cout<<endl;while(1)cout<<"继续进车 (Y/N)? "cin>>M_;system("cls");if(M_!='Y' && M_!='y' && M_!='n'&& M_!='N')cout<<"wrong order"<<endl;else break;while(M_='Y' | M_='y');In

51、struction2();break; case 'b':case 'B':dosystem("cls");cout<<"请输入出车信息,包括"<<NUM<<"位车牌号和出车时间(24小时制)"<<endl;CreateT(T);if(SearchParking(Parking,T.num,position,intime)/SearchAB(ANUM,Ti.num)while(!SameNum(T.num,(Parking.top-1)->num)/

52、(Ti.num!=(Parking.top-1)->num)/停车场中出车时,栈顶依次元素出栈,出车后,原出栈元素再原序退回栈中 Pop(Parking,t); Push(TParking,t);Pop(Parking,t);while(!Empty_Stack(TParking)Push(Parking,*(-TParking.top); WayToParking(WaySide,Parking);for(m=0;m<NUM;+m)cout<<T.numm;cout<<" 从停车场 "<<position<<&q

53、uot; 号位出车 ,进车时间 "for(m=0;m<5;+m)cout<<intimem;cout<<" , 出车时间 "for(m=0;m<5;+m)cout<<T.timem;ComputeTime(intime,T.time,hour,minute);cout<<" , 停车时间间隔 "<<hour<<"小时"<<minute<<"分钟"cout<<" , 花费 &qu

54、ot;/<<CostP(hour,minute,costp)<<"元"printf("%.2f元",CostP(hour,minute,costp);cout<<endl;else if(SearchWaySide(WaySide,T.num,position,intime)/街道旁的车要出车时,前面的车让出位置,并依序排到队尾while(!SameNum(T.num,WaySide.dataWaySide.head.num)/(Ti.num!=WaySide.dataWaySide.head.num) OutQueu

55、e(WaySide,t); EnQueue(WaySide,t);OutQueue(WaySide,t);for(m=0;m<NUM;+m)cout<<T.numm;cout<<" 从便道 "<<position<<" 号位出车 ,进车时间 "for(m=0;m<5;+m)cout<<intimem;cout<<" , 出车时间 "for(m=0;m<5;+m)cout<<T.timem;ComputeTime(intime,T.time,hour,minute);cout<<" , 停车时间间隔 "<<hour<<"小时"<<minute<<"分钟"cout<<" , 花费 "/<<CostW(hour,minute,costw)<<"元"printf("%.2f元",CostP(hour,minute,costp);cout<<endl;else cout<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论