C语言实现校园导游系统

yizhihongxing

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日

相关文章

  • 详解C++11中的线程锁和条件变量

    详解C++11中的线程锁和条件变量 C++11中提供了一系列的线程同步机制,包括线程锁和条件变量。线程锁主要是为了保护共享资源,防止多个线程同时对同一块内存区域进行操作而发生冲突;而条件变量则主要是为了线程之间的协作,当一个线程等待某个条件成立时,可以通过条件变量来阻塞当前线程,直到条件被满足为止。 线程锁 Mutex Mutex(互斥锁)是最基本的线程锁,…

    C 2023年5月22日
    00
  • springboot-dubbo cannot be cast to问题及解决

    “springboot-dubbo cannot be cast to”问题往往会在Spring Boot项目中使用Dubbo时出现。该问题出现的原因往往是因为Dubbo的版本与Spring Boot的版本不兼容导致Dubbo不能正确地使用Spring Boot的自动配置机制。下面将详细介绍该问题的解决方法。 步骤1:检查Dubbo版本与Spring Boo…

    C 2023年5月23日
    00
  • C C++ 题解LeetCode1417重新格式化字符串

    C/C++ 题解 LeetCode 1417 重新格式化字符串 题目描述 给定一个由字母、数字和空格组成的字符串 s,你需要将其重新格式化,使得任意两个相邻字符之间都有且仅有一个空格,并且首尾字符之间也不能有空格。 返回 重新格式化后的字符串,如果无法按要求重新格式化,则返回一个 空字符串。 示例说明 示例 1 输入:s = “a0b1c2″输出:”a 0b…

    C 2023年5月24日
    00
  • go Gin安装及初始化操作示例

    下面是有关“go Gin安装及初始化操作示例”的完整攻略: 安装 要安装Gin,您需要确保已经安装go(Go语言)。前往 Go官方网站 下载适用于您操作系统的版本进行安装。安装完成后,打开终端(或命令提示符)并输入以下命令,即可安装Gin: go get -u github.com/gin-gonic/gin 当命令执行完成后,您的计算机上应该已经安装了最新…

    C 2023年5月23日
    00
  • C语言实现车票管理系统

    C语言实现车票管理系统攻略 系统简介 本项目旨在通过使用C语言实现一个简单的车票管理系统,包含票务查询、购票、售票等功能,并能够通过简单的文件操作来实现信息的存储和读取。 系统设计 数据结构 本系统的重要数据结构包括车次、日期、座位号、顾客信息等。 车次包括列车编号、起始站和终点站,同一天内可以有多条相同的车次。 日期包括年、月、日,组成日期的整型和字符串等…

    C 2023年5月22日
    00
  • 真三国无双7:猛将传关银屏C技怎么追加攻击? 关银屏C技追加攻击方法介绍

    OK,让我为您详细讲解“真三国无双7:猛将传关银屏C技怎么追加攻击?关银屏C技追加攻击方法介绍”的完整攻略。 猛将传关银屏C技的追加攻击 首先,我们需要知道什么是“C技追加攻击”。在真三国无双7中,每个武将都有自己的C技能,在使用C技能的时候,可以通过按下Attack按钮来进行追加攻击,有些武将的追加攻击可以造成更高的伤害,关银屏就是其中之一。 关银屏的C技…

    C 2023年5月23日
    00
  • 黑客帝国数字雨效果VC6源代码分享

    标题:黑客帝国数字雨效果VC6源代码分享 简介 黑客帝国数字雨效果是一种很有趣的效果,本篇文章将分享数字雨效果VC6源代码,这是一篇针对VC6的C++代码,可供初学者学习参考。 实现过程 我们需要在VC6中建立一个win32应用程序。 步骤一:设置窗口 首先,我们需要设置窗口的大小和标题。这个可以在WimMain函数中完成。如下所示: int WINAPI …

    C 2023年5月24日
    00
  • Qt操作SQLite数据库的教程详解

    Qt操作SQLite数据库的教程详解 在Qt中,可以使用QSqlDatabase来操作Sqlite数据库,以下是详细的攻略。 步骤一:导入Sqlite驱动 在使用Sqlite数据库之前,需要导入Sqlite驱动。在*.pro文件中添加如下代码: QT += sql … #SQLite QT += sqlite 步骤二:连接Sqlite数据库 使用QSql…

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