据结构c语言设计校园导航系统程序并且要求功能如下:(1) 输出顶点信息:将校园内各
时间: 2023-11-23 16:03:37 浏览: 156
个地点以顶点的形式输出,包括地点的名称、地点的简要描述、地点的坐标等信息。(2) 输出边信息:将校园内不同地点之间的路径以边的形式输出,包括路径的起点、终点、距离等信息。(3) 导航功能:根据用户输入的起点和终点,输出一条从起点到终点的最短路径,并显示路径的具体步骤。程序要求能够支持多种寻路算法,以便用户可以选择不同算法来获取导航结果。 (4) 扩展功能:可以对校园地图进行编辑,添加新的地点和路径,删除原有地点和路径,修改地点和路径的信息等。 (5) 用户界面友好:设计简洁直观的操作界面,提供用户友好的交互体验。(6) 数据持久化:将录入的地点和路径信息保存在文件中,从文件中读取信息并进行导航计算。 (7) 错误处理:对用户输入的错误信息进行处理,提示用户输入正确的内容。
实现校园导航系统,首先需要构建与校园地图有关的数据结构,包括地点和路径。可以使用图的数据结构来表示校园地图,校园内的地点作为图的顶点,不同地点之间的路径作为图的边。可以使用邻接表或者邻接矩阵来存储地点和路径的信息,并且采用相应的算法来实现导航功能,例如Dijkstra算法或者A*算法。同时需要设计用户界面来实现用户与程序的交互,提供地点信息的录入、路径信息的录入以及导航结果的展示等功能。最后,为了实现数据持久化,需要将地点和路径的信息保存在文件中,并且设计相应的读取和写入文件的功能。通过以上功能的实现,可以设计一个高效、方便的校园导航系统,方便师生在校园内进行导航和查找相关地点。
相关问题
用C语言设计校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此
我们可以使用邻接矩阵来存储校园平面图。下面是一个简单的设计:
1. 定义景点结构体
```c
typedef struct {
char name[20]; // 景点名称
char intro[100]; // 景点介绍
} Site;
```
2. 定义邻接矩阵
```c
#define MAX_SITES 8 // 最多景点数
#define INF 0x7fffffff // 无穷大
int graph[MAX_SITES][MAX_SITES]; // 邻接矩阵
Site sites[MAX_SITES]; // 景点数组
```
3. 读取数据
我们可以将景点信息和路径信息保存在一个文件graph.txt中,每行一个景点或路径信息。
```txt
景点1名称
景点1介绍
景点2名称
景点2介绍
...
路径1起点路径1终点路径1长度
路径2起点路径2终点路径2长度
...
```
读取数据的代码如下:
```c
void read_data() {
FILE *fp = fopen("graph.txt", "r");
if (fp == NULL) {
printf("无法打开文件graph.txt\n");
exit(1);
}
// 读取景点信息
for (int i = 0; i < MAX_SITES; i++) {
fgets(sites[i].name, 20, fp);
sites[i].name[strlen(sites[i].name)-1] = '\0'; // 去掉换行符
fgets(sites[i].intro, 100, fp);
sites[i].intro[strlen(sites[i].intro)-1] = '\0';
}
// 初始化邻接矩阵
for (int i = 0; i < MAX_SITES; i++) {
for (int j = 0; j < MAX_SITES; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = INF;
}
}
}
// 读取路径信息
int x, y, len;
while (fscanf(fp, "%d%d%d", &x, &y, &len) != EOF) {
graph[x][y] = len;
graph[y][x] = len;
}
fclose(fp);
}
```
4. 显示景点信息
```c
void show_sites() {
printf("校园景点信息:\n");
for (int i = 0; i < MAX_SITES; i++) {
printf("%d. %s:%s\n", i, sites[i].name, sites[i].intro);
}
}
```
5. 寻找最短路径
这里我们使用Dijkstra算法来寻找最短路径。
```c
void dijkstra(int start, int end) {
int dist[MAX_SITES]; // 距离数组
int visited[MAX_SITES]; // 已访问数组
int path[MAX_SITES]; // 路径数组
// 初始化
for (int i = 0; i < MAX_SITES; i++) {
dist[i] = graph[start][i];
visited[i] = 0;
if (dist[i] < INF) {
path[i] = start;
} else {
path[i] = -1;
}
}
visited[start] = 1;
// 循环n-1次
for (int i = 0; i < MAX_SITES-1; i++) {
// 找到距离起点最近的未访问点
int min_dist = INF, min_index = -1;
for (int j = 0; j < MAX_SITES; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_index = j;
}
}
if (min_index == -1) {
break;
}
// 标记该点已访问
visited[min_index] = 1;
// 更新距离数组和路径数组
for (int j = 0; j < MAX_SITES; j++) {
if (!visited[j] && graph[min_index][j] < INF && dist[min_index]+graph[min_index][j] < dist[j]) {
dist[j] = dist[min_index] + graph[min_index][j];
path[j] = min_index;
}
}
}
// 输出结果
printf("从%s到%s的最短路径为:", sites[start].name, sites[end].name);
int p = end;
int stack[MAX_SITES], top = 0;
while (p != start) {
stack[top++] = p;
p = path[p];
}
stack[top++] = start;
while (top > 0) {
printf("%s", sites[stack[--top]].name);
if (top > 0) {
printf("->");
}
}
printf("\n");
printf("路径长度为:%d米\n", dist[end]);
}
```
6. 主函数
```c
int main() {
read_data();
show_sites();
dijkstra(0, 7);
return 0;
}
```
这样,我们就实现了一个简单的校园平面图的设计。
实验内容与要求: 用C语言设计江西服装学院的校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。 1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图; 2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍; 3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。
这是一个比较典型的图的应用,可以用邻接矩阵表示图,对于每个景点可以用一个结构体来存储它的名称、介绍等信息。在读取文件时,可以按照一定的格式将景点和路径信息存储到对应的数组中,然后初始化邻接矩阵。景点信息查询可以根据输入的景点名称查找对应的结构体,并输出其中的信息。问路查询可以使用Dijkstra算法来解决,找到两个景点之间的最短路径。
以下是一个参考代码,仅供参考:
```c
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INF INT_MAX
typedef struct {
char name[50];
char desc[200];
} Vertex;
Vertex vertices[MAX_VERTICES];
int adj_matrix[MAX_VERTICES][MAX_VERTICES];
int num_vertices = 0;
void add_vertex(char* name, char* desc) {
Vertex v;
strcpy(v.name, name);
strcpy(v.desc, desc);
vertices[num_vertices++] = v;
}
int get_vertex_index(char* name) {
for (int i = 0; i < num_vertices; i++) {
if (strcmp(vertices[i].name, name) == 0) {
return i;
}
}
return -1;
}
void add_edge(char* from, char* to, int cost) {
int i = get_vertex_index(from);
int j = get_vertex_index(to);
adj_matrix[i][j] = cost;
}
void init_graph() {
FILE* fp = fopen("graph.txt", "r");
if (!fp) {
printf("Failed to open file.\n");
return;
}
char line[256];
while (fgets(line, sizeof(line), fp)) {
if (line[0] == '#') {
continue;
}
char from[50], to[50];
int cost;
sscanf(line, "%s %s %d", from, to, &cost);
if (get_vertex_index(from) == -1) {
add_vertex(from, "");
}
if (get_vertex_index(to) == -1) {
add_vertex(to, "");
}
add_edge(from, to, cost);
add_edge(to, from, cost);
}
fclose(fp);
}
void print_vertex_info(char* name) {
int i = get_vertex_index(name);
if (i == -1) {
printf("Vertex not found.\n");
return;
}
printf("Name: %s\n", vertices[i].name);
printf("Description: %s\n", vertices[i].desc);
}
void print_path(int path[], int n, int start, int end) {
if (path[end] == -1) {
printf("No path found.\n");
return;
}
int p[MAX_VERTICES], len = 0;
for (int i = end; i != -1; i = path[i]) {
p[len++] = i;
}
printf("Shortest path from %s to %s: ", vertices[start].name, vertices[end].name);
for (int i = len - 1; i >= 0; i--) {
printf("%s", vertices[p[i]].name);
if (i > 0) {
printf(" -> ");
}
}
printf("\n");
}
void dijkstra(int start, int end) {
int dist[MAX_VERTICES], prev[MAX_VERTICES], visited[MAX_VERTICES];
for (int i = 0; i < num_vertices; i++) {
dist[i] = INF;
prev[i] = -1;
visited[i] = 0;
}
dist[start] = 0;
for (int i = 0; i < num_vertices; i++) {
int u = -1;
for (int j = 0; j < num_vertices; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
if (u == -1 || u == end) {
break;
}
visited[u] = 1;
for (int v = 0; v < num_vertices; v++) {
if (adj_matrix[u][v] != 0) {
int alt = dist[u] + adj_matrix[u][v];
if (alt < dist[v]) {
dist[v] = alt;
prev[v] = u;
}
}
}
}
print_path(prev, num_vertices, start, end);
}
int main() {
init_graph();
printf("Welcome to Jiangxi University of Fashion and Engineering!\n");
printf("Please enter command:\n");
char cmd[50];
while (fgets(cmd, sizeof(cmd), stdin)) {
if (strncmp(cmd, "quit", 4) == 0) {
break;
} else if (strncmp(cmd, "info", 4) == 0) {
char name[50];
sscanf(cmd + 5, "%s", name);
print_vertex_info(name);
} else if (strncmp(cmd, "path", 4) == 0) {
char from[50], to[50];
sscanf(cmd + 5, "%s %s", from, to);
dijkstra(get_vertex_index(from), get_vertex_index(to));
} else {
printf("Invalid command.\n");
}
}
return 0;
}
```
在graph.txt文件中,每一行表示一条路径,格式为“起点 终点 路径长度”,如下所示:
```
图书馆 教学楼1 300
教学楼1 机房楼 200
机房楼 实验楼 100
实验楼 食堂 150
食堂 小卖部 50
小卖部 宿舍楼1 100
宿舍楼1 宿舍楼2 50
宿舍楼2 篮球场 200
篮球场 操场 100
操场 教学楼2 300
教学楼2 教学楼1 200
```
运行程序后,可以输入“info 景点名称”查询景点信息,输入“path 起点 终点”查询最短路径。
阅读全文