C语言实现校园导游系统

C语言实现校园导游系统攻略

1. 系统概述

本系统旨在实现校园导游功能,包括以下两个主要功能:

  1. 给出校园地图,包括景点名称、景点描述、景点图片等信息。
  2. 提供导游功能,可根据用户输入,为用户提供一条包含多个景点的导游路线,并展示每个景点的信息和图片。

本系统使用C语言实现。主要技术栈包括链表结构、图论算法、文件读写等。

2. 实现过程详解

2.1 数据存储

本系统使用链表结构存储校园地图数据。每个景点存储在一个节点中,其包括景点名称、景点描述、景点图片路径、所在位置(坐标值)等信息。

在程序启动时,我们将从文件中读入所有景点信息,创建链表。这一部分的代码示例:

struct Site {
    char name[100];
    char description[1000];
    char image_path[100];
    double x, y;
    struct Site *next;
};

struct Site *sites = NULL;

void read_sites() {
    FILE *f = fopen("sites.txt", "r");
    char buf[1000];
    while (fgets(buf, sizeof(buf), f)) {
        struct Site *s = (struct Site *)malloc(sizeof(struct Site));
        sscanf(buf, "%s%s%s%lf%lf", s->name, s->description, s->image_path, &s->x, &s->y);
        s->next = sites;
        sites = s;
    }
    fclose(f);
}

其中,sites.txt为包含景点信息的文本文件。文件中每行都包括一个景点的信息。

2.2 导游路线计算

本系统使用Prim算法计算最小生成树,进而生成导游路线。

具体实现中,我们先将所有景点看作图中的节点,两个节点间的距离为欧几里得距离。利用Prim算法计算最小生成树,然后按照DFS的顺序遍历这棵树,就是一条合适的导游路线。

这一部分的代码示例:

struct Graph {
    int n;
    double **dist;
} graph;

void build_graph() {
    int n = 0;
    for (struct Site *p = sites; p != NULL; p = p->next) {
        p->id = ++n;
    }
    graph.n = n;
    graph.dist = (double **)malloc(sizeof(double *) * (n + 1));
    for (int i = 1; i <= n; i++) {
        graph.dist[i] = (double *)malloc(sizeof(double) * (n + 1));
        for (int j = 1; j <= n; j++) {
            if (i == j) {
                graph.dist[i][j] = 0;
            } else {
                double dx = sites[i - 1].x - sites[j - 1].x;
                double dy = sites[i - 1].y - sites[j - 1].y;
                graph.dist[i][j] = sqrt(dx * dx + dy * dy);
            }
        }
    }
}

int visited[MAX_SITES];
struct Edge {
    int from, to;
    double w;
} mst[MAX_SITES];

void prim() {
    memset(visited, 0, sizeof(visited));
    int cnt = 0;
    visited[1] = 1;
    while (cnt < graph.n - 1) {
        double min_w = INF;
        int sel = -1;
        for (int i = 1; i <= graph.n; i++) {
            if (visited[i] == 0) continue;
            for (int j = 1; j <= graph.n; j++) {
                if (i == j || visited[j] == 1) continue;
                if (graph.dist[i][j] < min_w) {
                    min_w = graph.dist[i][j];
                    sel = j;
                }
            }
        }
        if (sel > 0) {
            visited[sel] = 1;
            mst[cnt++] = {min(1, sel), max(1, sel), min_w};
        }
    }
}

其中,build_graph()函数用于构建图。mst数组存储最小生成树中的所有边。

2.3 显示导游路线

最后一步,我们需要将计算得到的导游路线以及景点信息和图片,显示在用户面前。

本系统使用了Ncurses图形库,以实现全终端显示。在终端中,我们将路线用箭头连接所有景点,同时展示每个景点的图片和描述。

这一部分的代码示例:

void display_route(int lst) {
    struct Site *route[MAX_SITES];
    int len = 0;
    for (int i = lst; i > 0; i = pre[i]) {
        route[len++] = &sites[i - 1];
    }
    if (len == 0) return;
    clear();
    for (int i = 0; i < len - 1; i++) {
        struct Site *a = route[i], *b = route[i + 1];
        draw_arrow(a->y, a->x, b->y, b->x);
    }
    struct Site *last_site = route[len - 1];
    int width, height;
    getmaxyx(stdscr, height, width);
    const int image_width = 30, image_height = 20;
    int row = (height - 3 * image_height) / 2;
    print_site(last_site, row, (width - strlen(last_site->name)) / 2);
    row += 3 * image_height;
    for (int i = len - 2; i >= 0; i--) {
        struct Site *site = route[i];
        row -= image_height;
        print_description(site, row, (width - strlen(site->name)) / 2);
        row -= image_height;
        print_image(site->image_path, row, (width - image_width) / 2, image_height, image_width);
    }
    refresh();
}

其中,draw_arrow()函数用于绘制箭头;print_site()函数用于显示景点名称;print_description()函数用于显示景点描述;print_image()函数用于显示景点图片。

3. 示例

下面给出两个示例,以演示本系统的使用。

3.1 示例1:查询景点

小明想去体育馆旁边的香樟林散步,请先给他查一下这个景点的具体信息。

用户操作:

输入:查看景点 香樟林

程序输出:

景点名称:香樟林
描述:香樟林位于体育馆北边,里面树木葱茏,空气清新,是散步的好去处。
图片路径:images/xiangzhanglin.jpeg

3.2 示例2:导游路线

小明来到校园游玩,想要一条游览全校的路线。请返回一条经过所有景点,总长度最短的路径,并展示每个景点的图片和描述。

用户操作:

输入:导游路线

程序输出:

正在计算导游路线,请稍等...
已经计算出最短路径如下:
主楼 -> 大礼堂 -> 泰山花园 -> 体育馆 -> 香樟林 -> 北图书馆 -> 西操场 -> 东区餐厅 -> 南门 -> 机械实验楼 -> 材料实验楼 -> 物理实验楼 -> 同济楼
请按Enter继续...

用户再次操作:

输入:Enter

程序输出:

开始展示导游路线...
正在显示景点:同济楼
正在显示景点:物理实验楼
正在显示景点:材料实验楼
正在显示景点:机械实验楼
正在显示景点:南门
正在显示景点:东区餐厅
正在显示景点:西操场
正在显示景点:北图书馆
正在显示景点:香樟林
正在显示景点:体育馆
正在显示景点:泰山花园
正在显示景点:大礼堂
正在显示景点:主楼
请按Enter继续...

用户再次操作:

输入:Enter

程序退出。此时,界面上已经显示了导游路线,并展示了每个景点的图片和描述。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现校园导游系统 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 利用idea搭建SSM项目看这一篇就够了

    以下是详细讲解“利用idea搭建SSM项目看这一篇就够了”的完整攻略,其中包含两个示例说明。 1. 确定开发环境 要开发SSM项目,需要先确定好我们的开发环境。我们需要安装以下软件: JDK:Java Development Kit。 Tomcat:Web服务器,用于部署项目。 MySQL:关系型数据库系统。 Maven:Java项目的构建工具。 IDEA:…

    C 2023年5月23日
    00
  • C语言内存分布与heap空间分别详细讲解

    针对这个问题,我根据如下步骤进行讲解: 1. C语言内存分布 C语言是一种直接操作内存的语言,因此内存管理对于程序的运行效率和安全性都非常重要。C语言内存分布主要包括以下几个部分: 栈区(Stack) 栈区相对于堆区来说是一块连续的内存地址,在程序运行时自动分配和释放。栈区主要用于函数调用和参数传递。每调用一个函数时,都会在栈区中创建一个函数帧,存储函数的参…

    C 2023年5月23日
    00
  • C#中使用SQLite数据库的方法介绍

    C#中使用SQLite数据库的方法介绍 什么是SQLite数据库? SQLite是一个轻量级的、开源的、关系型数据库管理系统(RDBMS)。 它包括C库、命令行工具和多种语言的API,主要使用在嵌入式设备和小型应用程序中。 SQLite不需要单独的服务器进程或者操作系统的支持,因为SQLite直接在应用程序中存储数据。 在C#中使用SQLite数据库的方法 …

    C 2023年5月22日
    00
  • php中serialize序列化与json性能测试的示例分析

    PHP中的serialize和json都是用于数据序列化和反序列化的工具,但它们的运行效率存在巨大的差异。 本攻略着重分析serialize和json序列化及反序列化的各种用法和效率,提供PHP序列化和反序列化的最佳实践。 示例1:serialize序列化和反序列化方法的使用 PHP中的serialize方法可以将一个对象或者数组序列化成字符串。 序列化之后…

    C 2023年5月23日
    00
  • C# XML与Json之间相互转换实例详解

    C# XML与Json之间相互转换实例详解 本文将详细讲解在C#中如何实现XML与Json之间的相互转换。 1. XML转Json实例 首先我们需要引入System.Xml和Newtonsoft.Json两个命名空间,代码如下: using System.Xml; using Newtonsoft.Json; 我们首先需要创建一个XML文档,然后将其转换成J…

    C 2023年5月23日
    00
  • 如何在 C++ 中实现一个单例类模板

    当我们在开发一个项目时,有时需要一个只能被实例化一次的类,这种情况下就需要使用单例模式。C++中实现单例模式可以通过单例类模板来实现。 下面详细讲解如何在C++中实现一个单例类模板: 1. 定义单例类 template<typename T> class Singleton { public: static T& instance() {…

    C 2023年5月23日
    00
  • C语言局部数据指针

    当我们在写C语言程序时,经常会定义一些变量,这些变量可以是全局变量,也可以是局部变量。而局部变量是指定义在函数内部或代码块内部的变量,这些变量的作用域仅限于定义它们的函数或代码块内部。那么在定义局部变量时,我们可以定义一个指针变量,它可以指向局部变量的地址。这就是C语言局部数据指针的使用方法。 如下是C语言局部数据指针的使用攻略: 1. 定义局部变量和指针变…

    C 2023年5月9日
    00
  • 使用C语言求二叉树结点的最低公共祖先的方法

    当我们需要寻找二叉树中两个结点的最近公共祖先时,可以使用C语言实现一种基于递归的算法来解决这个问题。具体的方法为: 算法思路 从根结点开始遍历二叉树,如果当前结点是NULL,则直接返回NULL; 如果当前结点等于其中任意一个目标结点,则直接返回这个结点; 如果没有找到目标结点,则分别在其左右子树中递归查找; 如果左右子树均找到了目标结点,则当前结点即为它们的…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部