ZZULI-医院导航系统

✅简介:与大家一起加油,希望文章能够帮助各位!!!!
💬保持学习、保持热爱、认真分享、一起进步!!!

 试验任务:

请设计一个简单的医院导航系统,该医院主要有以下部门:门诊部(A)、住院部(B)、急诊部(C)、药房(D)、收费室(E)、化验室(F)、放射科(G)、手术室(H)、B超室(I)、行政楼(J),各部门之间的路径及距离如图1所示。

 

要求:

(1)请利用C/C++/Java语言定义数据类型;

(2)请利用邻接矩阵或邻接表创建带权图,以表示该医院各部门之间的关系;

(3)提供各部门信息查询,如输入“急诊部”,显示“急诊部”相关信息的介绍;

(4)输入任意部门A和部门B的名称,为患者提供从A到B的最短路径|。

思路:

  1. 数据定义:

    • 使用数组来存储部门的名称、介绍信息以及邻接矩阵来表示部门之间的距离和路径。
    • 部门信息使用两个数组 department 和 briefly 分别存储部门名称和介绍信息。
    • 邻接矩阵 distances 用于存储部门间的路径距离,其中使用最大值表示不连通。
  2. 用户交互:

    • 提供了一个菜单式的用户交互界面,用户可以选择查询部门信息或者查询两个部门之间的最短路径。
    • 用户输入被简单地使用 scanf 函数获取,也可以根据需要增加一些异常输入的处理。
  3. 查询部门信息:

    • 通过 Select_Department 函数实现了根据用户输入查询部门信息的功能。
  4. 查询最短路径:

    • 使用 Dijkstra 算法来计算最短路径,通过 Dijkstra 函数实现最短路径的查询。

 完整代码如下:

#include<stdio.h>
#include<string.h>
#define NUM 10
#define MAX 100
#define max_len 9999
	int step = 1;
	char department[NUM][10]={
		"门诊部", "住院部", "急诊部", "药房", "收费室",
		"化验室", "放射科", "手术室", "B超室", "行政楼"
	};
	
	char briefly[NUM][100]={
		"门诊部提供各种门诊服务",
	   "住院部提供住院治疗服务",
	   "急诊部提供紧急治疗服务",
	   "药房提供各种医疗用药",
	   "收费室负责收费业务",
	   "化验室提供各种化验服务",
	   "放射科提供各种放射检查服务",
	   "手术室提供各种手术治疗服务",
	   "B超室提供各种B超检查服务",
	    "行政楼提供行政服务"
	};
	// 邻接矩阵来表示医院各部门之间的距离和路径,max_len表示不连通
	int distances[NUM][NUM] = {
		{0,max_len, 100,max_len,190, 150, max_len, max_len, max_len, max_len},
       	{max_len, 0	,max_len, max_len, max_len, 60, 130, 50, 100,max_len},
       {100	, max_len, 0, 120, max_len, max_len, max_len, max_len, max_len, 80},
       {max_len,max_len,120, 0	,50, max_len, max_len, max_len,max_len, max_len},
       {max_len, max_len, max_len, 50, 0,150, max_len, max_len,max_len, max_len},
       {150, 60, max_len, max_len,150, 0, max_len, 100, max_len, max_len},
       {max_len, 130,max_len, max_len, max_len, max_len, 0, 100, 30,160},
       {max_len, 50	, max_len, max_len, max_len, 100, 100, 0, max_len, max_len},
       {max_len, max_len, max_len, max_len, max_len, max_len, 30, max_len, 0, max_len},
       {90,max_len, 80, max_len, max_len, max_len,160, max_len, max_len	, 0}
	};
void Select_Department () { 
	printf("请输入要查询的部门信息\n");
	char name[10];
	int i;
	scanf("%s",name);
	for ( i=0; i<10 && strcmp(name, department[i]); i++);
	if (i == 10) 
		printf("输入错误,即将返回首页");
	else 
		printf("%s:%s\n",department[i],briefly[i]);
} 
int PrintMinDist(int dist[], int prev[], int val) {
    if (prev[val] == -1) {
        printf("%s ", department[val]);
        return 0;
    }
    else {
        int length = PrintMinDist(dist, prev, prev[val]);
        printf("-> %s ", department[val]);
        return length + distances[prev[val]][val];
    }
}
//辅助函数,找到距离集合U最近的节点
int findMinV (int dist[], bool U[], int v) {
	int min = max_len,min_index;
	for (int i=0; i<v; i++) {
		//没有被访问 
		if (!U[i]){
			//找到最小的距离 
			if (min > dist[i]) {
				min = dist[i];
				min_index = i;
			}
		}
	}
	return min_index;
} 
void Dijkstra (int graph[][NUM], int start, int v,int end) {
	// 存储起始顶点到各顶点的最短距离
	int dist[v];
	// 记录顶点是否已被访问
	bool visited[v];
	// 记录路径上的前一个顶点
	int prev[v];
	//初始化数组
	for (int i=0; i<v; i++) {
		//初始化所有顶点距离为无穷的 
		dist[i] = max_len;
		//设置所有顶点为未访问状态
		visited[i] = false;
		//设置所有节点的前一个节点为-1,表示未知
		prev[i] = -1; 
	} 
	//设置起始顶点到自身顶点距离为0 
	dist[start] = 0;
	//查找最短路径
	for (int count = 0; count<v-1; count++) {
		
		//找到未访问节点中距离最小的节点,第一次查找一定是起始顶点 
		int u = findMinV(dist,visited,v);
		//标记顶点已访问
		visited[u] = true;
		//更新未访问顶点的最短距离和前一个顶点
		for (int n=0; n<v; n++) {
			//如果顶点n未被访问并且通过u可以到达n且路径更短
			if (!visited[n] && graph[u][n] != max_len && dist[u] + graph[u][n] < dist[n]) {
				//更新最短距离
				dist[n] = dist[u] + graph[u][n];
				//更新路径上的前一个结点
				prev[n] = u; 
			}
		} 
	}
	printf("最短路径:");
    int length = PrintMinDist(dist, prev, end);
    printf("\n最短路径长度为:%d\n", length);
}
void Select_min () {
	printf("请输入要查询起始两部门的名称 PS(A B)\n");
	char a[10],b[10];
	scanf("%s %s",a,b);
	int i,j;
	for ( i=0; i<10 && strcmp(a, department[i]); i++);
	for ( j=0; j<10 && strcmp(b, department[j]); j++);
	if (i == 10 || j == 10) {
		printf("输入错误,即将返回首页");
		return;
	}
	Dijkstra(distances,i,NUM,j);
}
int main () {
	bool IsTrue = true;
	while (IsTrue){
		printf("\n1. 查询部门信息\n");
		printf("2. 查询两地点最短路径\n");
		printf("3. 退出程序\n");
		int n;
		scanf("%d",&n);
		switch (n) {
			case 1:
				Select_Department();
				break;
			case 2:
				Select_min();
			 	break;
			case 3:
				IsTrue = !IsTrue;
				break;
			default :
				printf("请重新输入要执行的操作\n");
		}
	}
	return 0;
}

以上均是个人的理解,如果有不对的地方请各位大佬帮忙斧正!!

追光的人,终会光芒万丈!!

  • 29
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊没烦恼~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值