说在前面的话:
代码在调试过程中遇到了很多问题,感谢这三位大佬的博客。
(2)easyx在vs上输出文字
(3)Floyd算法
界面演示
No Code You Say a JB.
代码环节
完整项目包在我的gitee上,需要的可以去下载。这里展示关键函数代码。https://gitee.com/Albert12138666/data-structure-course-designhttps://gitee.com/Albert12138666/data-structure-course-design
int dis_money[MAX_NODE][MAX_NODE]; //存储最少钱
int dis_time[MAX_NODE][MAX_NODE]; //存储最少时间
//floyd算法分别求花费最少时间与最少钱
//其实就是一个动态规划的过程,这里不做详解
void floyd_time(GraphAdjList G)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < G.numVertexes; i++)
{
for (j = 0; j < G.numEdges; j++)
{
dis_time[i][j] = 0x3f3f3f3f;
}
dis_time[i][i] = 0;
}
for (i = 0; i < G.numVertexes; i++)
{
EdgeNode* s = G.adjlist[i].firstedge; //可能出错
while (s)
{
dis_time[i][s->adjvex] = s->weight.time;
s = s->next;
}
}
for (k = 0; k < G.numVertexes; k++)
{
for (i = 0; i < G.numVertexes; i++)
{
for (j = 0; j < G.numVertexes; j++)
{
if (dis_time[i][k] + dis_time[k][j] < dis_time[i][j])
{
dis_time[i][j] = dis_time[i][k] + dis_time[k][j];
}
}
}
}
}
void floyd_money(GraphAdjList G)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < G.numVertexes; i++)
{
for (j = 0; j < G.numEdges; j++)
{
dis_money[i][j] = 0x3f3f3f3f;
}
dis_money[i][i] = 0;
}
for (i = 0; i < G.numVertexes; i++)
{
EdgeNode* s = G.adjlist[i].firstedge; //可能出错
while (s)
{
dis_money[i][s->adjvex] = s->weight.money;
s = s->next;
}
}
for (k = 0; k < G.numVertexes; k++)
{
for (i = 0; i < G.numVertexes; i++)
{
for (j = 0; j < G.numVertexes; j++)
{
if (dis_money[i][k] + dis_money[k][j] < dis_money[i][j])
{
dis_money[i][j] = dis_money[i][k] + dis_money[k][j];
}
}
}
}
}
//以邻接表的形式存储各个城市之间的信息
void CreatALGraph(GraphAdjList* G)
{
int i = 0, j = 0, k = 0;
EdgeNode* e;
FILE* fp_map;
fp_map = fopen("map.txt", "rt");
char data[16] = { 0 };
int numVertexes = 0, numEdges = 0;
while (!feof(fp_map))
{
fscanf(fp_map, "%s", data);
strcpy(G->adjlist[i].data, data);
G->adjlist[i].firstedge = NULL;
i++;
numVertexes++; //顶点数
}
G->numVertexes = numVertexes;
int money = 0, time = 0;
FILE* fp_side;
fp_side = fopen("side.txt", "rt");
while (!feof(fp_side))
{
fscanf(fp_side, "%d %d %d %d", &i, &j, &money, &time);
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->weight.money = money;
e->weight.time = time;
e->next = G->adjlist[i].firstedge;
G->adjlist[i].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->weight.money = money;
e->weight.time = time;
e->next = G->adjlist[j].firstedge;
G->adjlist[j].firstedge = e;
numEdges++; //边数
}
G->numEdges = numEdges;
}
代码思路
代码分为五部分,用户登录或注册、搜索售票、查询余票、订单退票、个人中心。这个思路比较简单,就不再赘述。
(1)用户登录与注册
(2)搜索查票
(3)查询余票
(4)订单退票
(5)个人中心
心得体会
立项真的很重要!很重要!很重要!
你在写代码之前得知道这个项目完成之后应该是什么样子。按照这个蓝图,将项目分成架构、UI、算法、 测试。在本次项目中,都由我一个人负责。作为架构er,在写代码之前必须要有一个系统的思想,不仅仅只考虑到整体的系统架构,而且还要对架构中的函数关系有一个非常清楚的逻辑关系,具体到各个函数之间的参数传递,而且要把这些模块清楚地划分,按照时间点迭代。作为UIer,需要清楚系统完成之后展示的界面是怎么样的,紧跟架构师的思路。作为算法er,需要对代码实现过程中遇到的可优化问题进行解决,是比较重要的一环。作为测试er,需要从一个使用者的角度来对待这个项目,从而测试出Bug进行修改,防止在用户使用过程中出现问题。
对于我来说,这个项目中最痛苦的地方是UI与调试,自身审美比较差,不知道怎么设计一个好看的界面。在调试的过程中,我遇到了起码8处不一样的BUG,以至于我代码的调试时间超过了写代码的时间,往往会出现一个BUG调试好了,上一个调试好的地方又出问题了,总结了下原因,是自己平时第一遍写的时候不认真,思考不够全面,希望以后能注意一点。
收获总结
对图的操作进一步地熟悉,巩固了弗洛伊德算法,对easyx的操作进一步熟悉,对C语言文件操作有了进一步的理解,提升了对代码的调试能力。