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日

相关文章

  • C语言时间函数之strftime()详解

    C语言时间函数之strftime() 详解 概述 在C语言中,我们可以使用time.h头文件中的函数来处理时间信息。其中,strftime()函数是一个十分常用且功能强大的时间格式化函数,其可以将给定时间的分量转化成特定格式的字符串。本文将详细讲解strftime()函数的使用方法及注意事项。 strftime()函数原型 strftime()函数的原型如下…

    C 2023年5月24日
    00
  • C语言的基本编写规范你了解吗

    C语言的基本编写规范 C语言作为一门被广泛应用于系统编程、嵌入式编程等领域的编程语言,具有良好的可移植性、效率和灵活性,在编写C语言程序时,遵循基本的编写规范可以提高程序的可读性和可维护性。 以下是C语言的基本编写规范: 1. 文件命名规范 C语言源文件的文件名通常以“.c”结尾,头文件以“.h”结尾。文件名应该简单明了,避免使用中文、特殊字符和空格等,建议…

    C 2023年5月23日
    00
  • Mysql如何对json数据进行查询及修改

    MySQL 5.7及以上版本支持JSON类型,可以对JSON数据进行查询和修改。下面将详细讲解MySQL如何对JSON数据进行查询和修改的攻略。 查询JSON数据 1. 使用->符号 使用->符号可以从JSON数据中提取指定字段的值。 语法: SELECT json_column->’$.key’ FROM table_name; 其中,j…

    C 2023年5月23日
    00
  • MySQL处理JSON常见函数的使用

    下面是关于MySQL处理JSON常见函数的使用的完整攻略。 JSON类型介绍 在MySQL 5.7版本之后,MySQL开始支持JSON类型。JSON类型是一种结构化的数据类型,是一种轻量级的数据交换格式,便于人类阅读和编写,也易于机器解析和生成。JSON类型的值可以存储在JSON列中,也可以作为普通列或表达式的值使用。 处理JSON型列时的常见函数 MySQ…

    C 2023年5月23日
    00
  • C语言统计字符个数代码分享

    C语言统计字符个数代码分享 概述 统计字符个数是C语言编程中的一项基础操作,本文将分享一份C语言代码,实现统计文件中字符个数的功能。 实现过程 读取文件 首先需要打开文件,并读取其中的内容。在C语言中,可以使用stdlib库函数fopen和fclose分别打开和关闭文件,使用stdio库函数fread读取文件中的内容。 FILE *fp; // 文件指针 f…

    C 2023年5月24日
    00
  • 深入数据库通用的连接方式详解

    深入数据库通用的连接方式详解 在使用数据库时,我们需要连接数据库才能操作数据库。下面将介绍一些通用的连接方式,其中包括主流的两种数据库:MySQL和PostgreSQL。 MySQL连接方式 MySQL连接方式主要有三种:使用命令行连接、使用图形化界面连接和使用编程语言连接。下面将对三种连接方式进行介绍。 使用命令行连接 使用命令行连接MySQL需要使用My…

    C 2023年5月22日
    00
  • C语言怎么获得进程的PE文件信息

    要获取进程的PE文件信息,可以使用Windows的API函数和一些常用的数据结构。 首先需要使用OpenProcess函数打开目标进程,该函数会返回目标进程的句柄,用于后续的操作。然后再使用GetModuleInformation函数获取目标进程的所有模块信息,包括PE文件的基址、大小等信息。最后需要使用CloseHandle关闭进程句柄以释放资源。 以下是…

    C 2023年5月23日
    00
  • C++实现一个简易版的事件(Event)的示例代码

    下面我将为你详细讲解如何用C++实现一个简易版的事件(Event)。 什么是事件(Event) 在计算机编程中,事件(Event)通常用于描述程序中发生的某些事情,例如按下按钮、鼠标单击、定时器超时等等。当一个事件发生时,程序需要执行相应的操作。 实现一个简易版的事件 实现一个简易版的事件,需要明确三个核心概念:事件处理器、事件监听器和事件分发器。 事件处理…

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