| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 803 人关注过本帖
标题:学长学姐们来看看我这个程序
只看楼主 加入收藏
SnowfoxMetal
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-6-24
收藏
 问题点数:0 回复次数:6 
学长学姐们来看看我这个程序

最近做数据结构的课程设计(交通咨询系统),小弟我下载了一段源代码,可是在TC调试的时候发现很多错误,由于小弟我学的不好,怎么也改不过来,想请各位师兄师姐帮我看看,小弟我无限感激。。。。
如果能调试运行成功还望能把正确的代码发到小弟邮箱里(snowfox_metal@sina.com),谢谢啦。。。。

设计思想
存储结构
struct Tra_Tool{
char* id;
char* start;
char* destination;
float time;/*旅途时间*/
float price;
};
主要算法的基本思想:
从题目上来分析我认为这是一个图的最短路径问题.因此决定用Dijkstra算法按路径长度递增的顺序逐步产生最短路径的方法:设置两个顶点的集合T和S,集合S中存放已找到的最短路径的顶点,集合T中存放当前还未找到的最短路径的顶点.初始状态时,集合S中只包含源点V0,然后不断从集合T中选取到顶点V0路径长度最短的顶点加入到集合S中,集合S中每加入一个新的顶点U,都要修改顶点V0到集合T中剩余顶点的最短路径长度值,集合T中各顶点新的最短路径长度值为原来的最短路径长度值与顶点U的最短路径长度只值中的较小的.此过程不断重复,直到集合T的顶点全部加入到集合S为止.

调试分析:
此程序结构体虽然简单,但是算法中的调用和实现并不简单,因此调试过程中还是花了不少心血,尤其是在多个城市间选择最短路径时,时常出错,权值总是输入与运算相差很远,但工夫不负有心人,终于调试成功.
源程序清单:
#include
#include
#include
const float max=FLT_MAX;/* */
struct Tra_Tool{
char* id;
char* start;
char* destination;
float time;/*旅途时间*/
float price;
};
int search(char citytable[][20],char* city,int cn)
{
/*在城市数组中查找某个城市*/
int i;
for(i=0;i if(strcmp(citytable,city)==0)
return i;
}
return -1;
}
/*最优线路*/
void short_path(struct Tra_Tool* timetable,char* start,char* dest,char city[][20],int tn,int cn,int choice)
{
/*start表示出发地,dest表示目的地,tn表示表示航班或车次的总次数,cn表示城市的总数*/
/*choice=0表示求最短时间路线,choice=1表示求最少花费路线*/
int i,j,k,st,et;
float min,t;
char pcity[10][20];
float edge[15][15],dist[15];
int path[15],s[15];
for(i=0;i for(j=0;j{
edge[j]=max;
}
for(i=0;i{
j=search(city,timetable.start,cn);
k=search(city,timetable.destination,cn);
if(choice==0)
{/*最短时间*/
t=timetable.time;
if(t }
else
{/*最少花费*/
t=timetable.price;
if(t }
}
st=search(city,start,cn);
et=search(city,dest,cn);
for(i=0;i dist=edge[st];
s=0;
if(i!=st&&dist else path=-1;
}
s[st]=1; dist[st]=0;
for(i=0;i min=max;
k=st;
for(j=0;j if(!s[j]&&dist[j]{k=j;min=dist[j];}
s[k]=1;
for(j=0;j if(!s[j]&&edge[k][j] printf("%s\t",pcity[j]);
printf("\n");
if(choice==0) printf("total time is:%5.1f\n",dist[et]);
else printf("total money is:%7.2f\n",dist[et]);
printf("\n");
}
void main(){
int i,j,k,m,n,cn=5,tn=6,fn=6;
char city[15][20]={"北京","上海","天津","武汉","广州"};//最多15个城市
struct Tra_Tool train[20]={{"T1","武汉","北京",10,90},{"T2","上海","北京",8,70},
{"T3","北京","天津",3,30},{"T4","广州","北京",25,200},{"T5","广州","武汉",14,120},
{"T6","武汉","上海",8,80}};
struct Tra_Tool flight[20]={{"F1","武汉","北京",3,500},{"F2","上海","北京",2.5,400},
{"F3","北京","天津",1,200},{"F4","广州","北京",6,1400},{"F5","广州","武汉",5,700},
{"F6","武汉","上海",3,450}};
label1:
printf("资料来源:天地格 请保留此信息,谢谢\n");
printf("系统功能:\n");
printf("1.编辑城市信息\n2.编辑火车时刻表\n3.编辑飞机航班表\n4.选择出游路线\n5.退出\n");
printf("请选择:");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1:{
label2:
printf("现有城市:\n");
for(j=0;j printf("%d.%s\t",j+1,city[j]);
printf("\n\n");
printf("功能:1.添加\n2.删除\n3.返回\n");
printf("请选择:");
scanf("%d",&j);
printf("\n");
if(j==1)
{
printf("请输入城市名:");
scanf("%s",city[cn]);
cn++;
goto label2;
}
if(j==2)
{
printf("请选择要删除的城市的编号:");
scanf("%d",&k);
if(k==cn) cn--;
else{
for(m=k-1;m strcpy(city[m],city[m+1]);
cn--;}
goto label2;}
else goto label1;}
case 2:{
label3:
printf("火车时刻表:\n");
printf("资料来源:\n");
printf(" 车次\n起点站\n终点站\n路途时间\n票价\n");
for(j=0;j printf("%d: %s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,train[j].id,train[j].start,train[j].destination,
train[j].time,train[j].price);
printf("\n\n");
printf("功能:1.添加\t2.删除\t3.返回\n");
printf("请选择:");
scanf("%d",&j);
printf("\n");
if(j==1){
printf("现有城市:\n");
for(k=0;k printf("%d.%s\t",k+1,city[k]);
printf("\n");
printf("请输入数据:\n");
printf("火车时刻表:\n");
printf("车次\n起点站\n终点站\n路途时间\n票价\n");
scanf("%s%s%s%f%f",train[tn].id,train[tn].start,train[tn].destination,&train[tn].time,&train[tn].price);
tn++;
goto label3;}
else if(j==2){
printf("请选择编号:");
scanf("%d",&k);
if(k==tn) tn--;
else{
for(m=k-1;m train[m]=train[m+1];
tn--;}
goto label3;}
else goto label1; }
case 3:{
label4:
printf("飞机航班表:\n");
printf(" 班次\t起点\t终点\t路途时间\t票价\n");
for(j=0;j printf("%d: %s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,flight[j].id,flight[j].start,flight[j].destination,
flight[j].time,flight[j].price);
printf("\n\n");
printf("功能:1.添加\t2.删除\t3.返回\n");
printf("资料来源:");
printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 ");
printf("请选择:");
scanf("%d",&j);
printf("\n");
if(j==1){
printf("现有城市:\n");
for(k=0;k printf("%d.%s\t",k+1,city[k]);
printf("\n");
printf("请输入数据:\n");
printf("车次\t起点站\t终点站\t路途时间\t票价\n");
printf("资料来源:");
printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 ");
scanf("%s%s%s%f%f",flight[fn].id,flight[fn].start,flight[fn].destination,&flight[fn].time,&flight[fn].price);
fn++;
goto label4;}
else if(j==2){
printf("请选择编号:");
scanf("%d",&k);
if(k==fn) fn--;
else{
for(m=k-1;m flight[m]=flight[m+1];
fn--;}
goto label4;}
else goto label1;}
case 4:{
printf("请选择交通工具(1.火车 2.飞机):");
scanf("%d",&j);
printf("请选择决策方案(1.最短时间 2.最少花费):");
printf("资料来源:");
printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 ");
scanf("%d",&k);
printf("现有城市:\n");
for(i=0;i printf("%d.%s\t",i+1,city);
printf("\n");
printf("出发地:");
scanf("%d",&m);
printf("目的地:");
scanf("%d",&n);
printf("\n");
if(j==1&&k==1)
if(j==1&&k==2) short_path(train,city[m-1],city[n-1],city,6,5,1);
if(j==2&&k==1) short_path(flight,city[m-1],city[n-1],city,6,5,0);
if(j==2&&k==2) short_path(flight,city[m-1],city[n-1],city,6,5,1);
goto label1;
}
case 5:
return;}}

搜索更多相关主题的帖子: 学长 
2007-06-24 16:11
killer_l
Rank: 2
等 级:新手上路
威 望:3
帖 子:1139
专家分:0
注 册:2007-5-25
收藏
得分:0 
my god....

2007-06-24 18:50
love154139
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-5-6
收藏
得分:0 
把这样的程序贴出来....牛X

2007-06-25 08:49
风动
Rank: 1
等 级:新手上路
帖 子:66
专家分:0
注 册:2007-6-25
收藏
得分:0 

#include <iostream.h>
#include <cstring>
#include <stdlib.h>
#include<stdio.h>
#include <conio.h>
#include <ctype.h>
#define MAXVTXNUM 20 //图中顶点数的最大值
#define MAXSIZE 1000
#define MAX 30
#ifndef x
#define x 1
typedef struct
{
char *name; //该顶点的名称
char *info; //景点信息
}VertexType; //顶点类型
#endif

#ifndef xx
#define xx 1
typedef struct
{
int lengh; //边的权值
int ivex,jvex; //边两端的顶点号
}EdgeType; // 变的类型
#endif

#ifndef xxx
#define xxx 1
typedef struct EdgeNode
{
EdgeType elem;
EdgeNode *ilink,*jlink;
}EdgeNode, *EdgePtr; //边的结点类型
#endif

#ifndef xxxx
#define xxxx 1
typedef struct
{
VertexType data;
EdgePtr firstEdge; //指向第一条依附于该顶点的边的指针类型
}VNode; //顶点类型
#endif

#ifndef xxxxx
#define xxxxx 2
typedef struct
{
VNode Adjmulist[MAXVTXNUM]; //邻接多重表
int vexNum, edgeNum; //图中的顶点数和边数
}GraphType; //图的类型
#endif

#ifndef xxxxxx
#define xxxxxx 3
typedef struct
{
int vx, vy;
}Edge;

typedef struct
{
Edge edges[MAXVTXNUM]; //路径中边的序列
int len; //路径中边的数目
}PathType;
#endif

#ifndef xxxxxxx
#define xxxxxxx 4
typedef struct
{
char *Vertices[MAXSIZE]; //路径中景点的序列
int num;
}PType;
#endif

void InitGraph(GraphType &g); //初始化邻接多重表,表示一个空图
//在途中查找其景点名和uname相同的顶点。若存在,则以i返回其在临界多重表中的位置并返回TURE;
bool LocateVex(GraphType &g, char *uname, int &i);
void GetVex(GraphType g, int i, VertexType &v);
EdgePtr FirstEdge(GraphType g, int vi);
void NextEdge(GraphType g, int vi, EdgePtr p, int &vj, EdgePtr &q);
void InsertVex(GraphType &g, VertexType v);
void InsertEdge(GraphType &g, EdgeType e);
void DeleteVex(GraphType &g, VertexType v);
void DeleteEdge(GraphType &g, EdgeType e);

void InitPath(PathType &pa); //初始化pa为一条空路径
void CopyPath(PathType &p1, PathType &p2); //复制路径p1=p2
void InsertPath(PathType &pa, int v, int w); //在路径pa中插入一条边(v,w)
int PathLength(PathType pa); //返回路径pa的长度
void OutPath(GraphType g, PathType pa, PType &vtxes); //将路径转化为景点的名序列

void Initialization();
void ReadCommand(char &cmd);
void Interpret(char cmd);
void CreatGraph(GraphType &g, FILE *f);
void GetShortestPath(GraphType g, char *sname, char *tname,
int &pathLength, PType &PathInfo);
void ShortestPath(GraphType g, int st, int nd,
int &pathLength, PType &PathInfo);



#include "GraphUnit.h"
//#include<string>
/////////////////////////////////////////////////////////////
////////////////////// 图设计部分 ///////////////////////
/////////////////////////////////////////////////////////////

void InitGraph(GraphType &g)
{
g.vexNum = g.edgeNum = 0;

}//InitGraph

bool LocateVex(GraphType &g, char *uname, int &i)
{
for(i=0; i<g.vexNum; i++)
if(!strcmp(uname, g.Adjmulist[i].data.name))
{
return true;
break;
}
return false;

}//LocateVex

EdgePtr FirstEdge(GraphType g, int vi)
{//返回图g中指向依附于顶点vi的第一条边的指针g.Adjmulist[i].data

return
g.Adjmulist[vi].firstEdge;

}//FirstEdge

void GetVex(GraphType g, int i, VertexType &v)
{
if(i<0)
cout<<"这两点间无路径可通!"<<endl;
else
v = g.Adjmulist[i].data;

}//GetVex

void NextEdge(GraphType g, int vi, EdgePtr p, int &vj, EdgePtr &q)
{
if(p->elem.ivex==vi )
{
q = p->ilink;
vj = p->elem.jvex;
}
else
{
q = p->jlink;
vj = p->elem.ivex;
}

}//NextEdge

void InsertEdge(GraphType &g, EdgeType e)
{

EdgePtr p;
p = (EdgePtr)malloc(sizeof(EdgeNode));
p->elem =e;
p->ilink = FirstEdge(g,e.ivex);
p->jlink = FirstEdge(g, e.jvex);
g.Adjmulist[e.ivex].firstEdge = g.Adjmulist[e.jvex].firstEdge = p;
}//InsertEdge

void InsertVex(GraphType &g, VertexType v, int i)
{
//在图g的邻接多重表中添加一个顶点v
g.Adjmulist[i].data.name = new char[MAXSIZE];
g.Adjmulist[i].data.info = new char[MAXSIZE];
strcpy(g.Adjmulist[i].data.name,v.name);
strcpy(g.Adjmulist[i].data.info,v.info);
g.Adjmulist[i].firstEdge = NULL;
}

///////////////////////////////////////////////////////////////////////
///////////////////////// 路径类型 ////////////////////////////////
///////////////////////////////////////////////////////////////////////

void InitPath(PathType &pa)
{
pa.len = 0;
}//InitPath

int PathLengh(PathType pa)
{
return pa.len;
}//PathLengh

void CopyPath(PathType &p1, PathType &p2)
{
//复制路径p1=p2
for(int i =0; i<p2.len; i++)
{
p1.edges[i].vx = p2.edges[i].vx;
p1.edges[i].vy = p2.edges[i].vy;
}
p1.len = p2.len;
}//CopyPath

void InsertPath(PathType &pa, int v, int w)
{
//在路pa径中插入一条边(v,w)
pa.edges[pa.len].vx = v;
pa.edges[pa.len].vy = w;
pa.len++;
}//InsertPath

void OutPath(GraphType g, PathType pa, PType &vtxes)
{
//将路径转化为景点的名序列
int m = 0;
VertexType vtx;
vtx.info = new char[MAXSIZE];
vtx.name = new char[MAXSIZE];
for(int i=0; i<pa.len; i++)
{
vtxes.Vertices[m] = new char[MAXSIZE];
GetVex(g, pa.edges[i].vx, vtx);
strcat(vtx.name,vtx.info);
strcpy(vtxes.Vertices[m++], vtx.name);
}
GetVex(g, pa.edges[pa.len-1].vy, vtx);
vtxes.Vertices[m] = new char[MAX];
strcpy(vtxes.Vertices[m] , vtx.name);
strcat(vtxes.Vertices[m] , vtx.info);
vtxes.num = m;
}//OutPath

/////////////////////////////////////////////////////////
//////////////// 主程序部分//////////////////////////////
/////////////////////////////////////////////////////////

void Initialization(GraphType &ga)
{
system("cls");
FILE *fin = fopen("test.txt", "r");
CreatGraph(ga, fin);
}//Initialization

void PrintScenery(char *sname, GraphType g)
{
for(int j=0; j<g.vexNum;j++)
if(!strcmp(sname,g.Adjmulist[j].data.name))
{
cout<<"输出的景点名为:"<<sname<<endl;
cout<<"景点信息为: "<<g.Adjmulist[j].data.info<<endl;
break;
}
}//PrintScenery

void ReadCommand(char &cmd)
{
do{
cout<<"读入操作符命令:(s/S/V/v/Q/q ?)" ;
cin>>cmd;
}
while (cmd!='s'&& cmd!='S'&& cmd!='v'&& cmd!='V'&& cmd!='q'&& cmd!='Q');
}//ReadCommand

void PrintPath(PType spath, int pathlen)
{
cout<<"输出所经历路径信息为:"<<endl;
for(int i=0; i<spath.num; i++)
cout<<"----"<<spath.Vertices[i]<<"----";
cout<<endl;
cout<<"所经历的最短路径长度为:"<<pathlen<<endl;

}//PrintPath
void Interpret(char cmd, GraphType g)
{
char *sname=new char[MAXSIZE];
char *tname=new char[MAXSIZE];
int pathlen;
PType spath;
switch(cmd)
{
case 's':
cout<<"读入景点名称: ";
cin>>sname;
PrintScenery(sname, g);
break;
case 'S':
cout<<"读入景点名称: ";
cin>>sname;
PrintScenery(sname,g);
break;
case 'v':
cout<<"读入起点名称: " ;
cin>>sname;
cout<<"读入终点名称: ";
cin>>tname;
GetShortestPath(g, sname,tname,pathlen,spath);
PrintPath(spath, pathlen);
break;
case 'V':
cout<<"读入起点名称: " ;
cin>>sname;
cout<<"读入终点名称: ";
cin>>tname;
GetShortestPath(g, sname,tname,pathlen,spath);
PrintPath(spath, pathlen);
break;
case 'q':
break;
case 'Q':
break;
}
}//Interpret

void CreatGraph(GraphType &g, FILE *f)
{
VertexType v;
InitGraph(g);
EdgeType e;
v.info = new char[MAXSIZE];
v.name = new char[MAXSIZE];
fscanf(f,"%d",&g.edgeNum);
fgetc(f);
fscanf(f,"%d",&g.vexNum);
for(int i=0; i<g.vexNum; i++)
{
fscanf(f, "%s",v.name);
fgetc(f);
fscanf(f, "%s",v.info);
InsertVex(g,v,i);
}
for(int k=0; k<g.edgeNum; k++)
{
fscanf(f,"%d",&e.ivex);
fgetc(f);
fscanf(f,"%d",&e.jvex);
fgetc(f);
fscanf(f,"%d",&e.lengh);
if(e.lengh)
InsertEdge(g,e);
}
}//CreatGraph

void GetShortestPath(GraphType g, char *sname, char *tname,
int &pathLengh,PType &PathInfo)
{
int sv,tv;
LocateVex(g,sname,sv);
LocateVex(g, tname, tv);
ShortestPath(g,sv,tv,pathLengh,PathInfo);
}//GetShortestPath

void InitSet(bool *ss, GraphType g)
{
for(int i=0; i<g.vexNum; i++)
ss[i] = false;
}

void PutInSet(int st, bool ss[MAXVTXNUM])
{
ss[st] = true;
}//PutInSet

int minval(int *dist, GraphType g, bool *ss)
{
int min = -1;
for(int i =0; i<g.vexNum; i++)
if(!ss[i])
{
if(min == -1)
min = i;
else if(dist[min]>dist[i])
min = i;
}
return min;
}//minval

bool InSet(int w, bool *ss)
{
if(ss[w])
return true;
else
return false;
}
void ShortestPath(GraphType g, int st, int nd, int &pathLengh,
PType &PathInfo)
{
unsigned int maxint = 10000000;
int dist[MAXVTXNUM];
PathType path[MAXVTXNUM];
int adjvex;
bool ss[MAXVTXNUM];
int min,v,w;
int count=0;
EdgePtr p,q;
for(int i=0; i<g.vexNum; i++)
{
dist[i] = maxint;
InitPath(path[i]);
}
p = FirstEdge(g, st);
while(p)
{
NextEdge(g,st,p,adjvex,q);
dist[adjvex] = p->elem.lengh;
InsertPath(path[adjvex],st,adjvex);
p = q;
}
bool found = false;
InitSet(ss,g);
PutInSet(st,ss);
w = st;
while(!found)
{
min = minval(dist,g,ss);
if(min==nd)
{
InsertPath(path[nd],nd,w);
found = true;
}
else
{
v = min;
PutInSet(v,ss);
p = FirstEdge(g,v);
while(p)
{
NextEdge(g,v,p,w,q);
if(!InSet(w,ss) && dist[v]+p->elem.lengh<dist[w])
{
dist[w] = dist[v]+p->elem.lengh;
CopyPath(path[w], path[v]);
InsertPath(path[w], v, w);
}
p = q;
}//while(p)
}//else
}//while(!found)
pathLengh = dist[nd];
OutPath(g, path[nd], PathInfo);
}//ShortestPath

//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////

void main()
{

GraphType ga;
char cmd;
Initialization(ga);
cout<<"****************************************************************"<<endl;
cout<<"******* 班级:030524班 学号:03051433 ********"<<endl;
cout<<"******* 制作人:王甲楼 西安电子科技大学 ********"<<endl;
cout<<"***************** 符命令注解:S/s表示显示 *****************"<<endl;
cout<<"***************** V/v表示开始查询最短路径 ****************"<<endl;
cout<<"***************** Q/q 表示退出 ****************"<<endl;
cout<<"****************************************************************"<<endl;
cout<<endl<<endl<<endl;
do
{
ReadCommand(cmd);
Interpret(cmd, ga);
}
while(cmd!= 'q' && cmd!='Q');

}//main

////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////


打框架,做需求分析---敲代码的前提
2007-06-25 11:26
风动
Rank: 1
等 级:新手上路
帖 子:66
专家分:0
注 册:2007-6-25
收藏
得分:0 
你把代码写成那样让人就无法看,哈哈,建议你注意下书写风格!那个程序思想却是不太容易想,希望我的程序能作为你的参考可不要直接交了完事,哈哈!

打框架,做需求分析---敲代码的前提
2007-06-25 11:32
风动
Rank: 1
等 级:新手上路
帖 子:66
专家分:0
注 册:2007-6-25
收藏
得分:0 
说明:我的程序一部分在.h文件中放着,(#include "GraphUnit.h"以前的)。接着是。cpp文件。
文本测试文件为: 24 18 SouthGate 南门 NorthGate 北门 28#Building 二十八号楼 10thRestaurant 第十食堂 3rdTeachBuilding 三教
TrafficTower 交通岗 JinChunYuan 近春园 WestPlaygroud 西大操场 Library 图书馆 30#Building 30号楼 Hospital 医院
MainBuliding 主楼 WestPlayGround 西大操场 EastPlayGround 东大操场 zhuyuancanting 竹园餐厅 haitanggongyu 海棠公寓
chaoshi 超市 yinshuashi 印刷室 0 1 100 0 3 200 1 2 500 1 8 120 2 5 390 2 7 370 3 5 150 3 4 40 4 16 130 4 12 250
5 12 470 5 6 600 6 11 210 6 10 130 7 8 240 7 9 160 9 10 420 10 13 510 10 18 98 13 17 196 13 11 78 11 14 780
12 15 1000 11 12 200

文件名为:text.txt
如有问题再来探讨!哈哈!

打框架,做需求分析---敲代码的前提
2007-06-25 11:40
SnowfoxMetal
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-6-24
收藏
得分:0 
回复:(SnowfoxMetal)学长学姐们来看看我这个程序

我也不知道怎么一上传就成这样了。。。
哎。不过要谢谢你的程序,我先研究下,要是有什么问题还希望能请你帮忙啊。

2007-06-25 22:18
快速回复:学长学姐们来看看我这个程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017195 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved