火车售票系统

说在前面的话: 

代码在调试过程中遇到了很多问题,感谢这三位大佬的博客。

(1)C语言文件操作https://blog.youkuaiyun.com/jamenu/article/details/85066236?ops_request_misc=&request_id=&biz_id=102&utm_term=c%E8%AF%AD%E8%A8%80%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-85066236.nonecase&spm=1018.2226.3001.4187https://blog.youkuaiyun.com/jamenu/article/details/85066236?ops_request_misc=&request_id=&biz_id=102&utm_term=c%E8%AF%AD%E8%A8%80%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-85066236.nonecase&spm=1018.2226.3001.4187

(2)easyx在vs上输出文字

https://blog.youkuaiyun.com/weixin_44822296/article/details/112325051?ops_request_misc=&request_id=&biz_id=102&utm_term=vs%E5%9C%A8easyx%E8%BE%93%E5%87%BA%E6%96%87%E5%AD%97&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-112325051.pc_search_em_sort&spm=1018.2226.3001.4187https://blog.youkuaiyun.com/weixin_44822296/article/details/112325051?ops_request_misc=&request_id=&biz_id=102&utm_term=vs%E5%9C%A8easyx%E8%BE%93%E5%87%BA%E6%96%87%E5%AD%97&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-112325051.pc_search_em_sort&spm=1018.2226.3001.4187

(3)Floyd算法 

(30条消息) floyd算法(C语言 邻接表)_cjavacjavacjava的博客-优快云博客_弗洛伊德算法c语言https://blog.youkuaiyun.com/cjavacjavacjava/article/details/73949087?ops_request_misc=&request_id=&biz_id=102&utm_term=floyd%E7%AE%97%E6%B3%95%E9%82%BB%E6%8E%A5%E8%A1%A8&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-73949087.pc_search_em_sort&spm=1018.2226.3001.4187

界面演示

 

No Code You Say a JB.

代码环节

完整项目包在我的gitee上,需要的可以去下载。这里展示关键函数代码。https://gitee.com/Albert12138666/data-structure-course-designicon-default.png?t=LBL2https://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语言文件操作有了进一步的理解,提升了对代码的调试能力。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值