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日

相关文章

  • vue中虚拟DOM与Diff算法知识精讲

    Vue中虚拟DOM与Diff算法知识精讲 一、Vue中的虚拟DOM 1.1 什么是虚拟DOM 虚拟DOM是一个JavaScript对象,用来描述真实的DOM节点。Vue中的虚拟DOM是VNode(虚拟节点)的实例,它具有以下特点:- 虚拟DOM可以很快的进行diff算法的比较,从而找到不同,不需要进行昂贵的DOM操作,从而提高性能。- 虚拟DOM可以在不重新…

    C 2023年5月23日
    00
  • C语言实现小学生计算机辅助教学系统

    C语言实现小学生计算机辅助教学系统攻略 目标 本攻略将指导您如何使用C语言编写一个小学生计算机辅助教学系统,该教学系统可以帮助小学生进行加减乘除练习,并评估他们的表现。 步骤 设计用户界面 首先,您需要设计一个用户界面。您可以使用如下的代码块来创建用户界面。该用户界面将会展示程序的功能菜单和用户可以选择的操作。在此示例中,我们提供了四个选项,分别对应加、减、…

    C 2023年5月30日
    00
  • vs2019+win10配置boost库的详细教程

    下面我将为你详细讲解如何在vs2019+win10上配置boost库。 环境准备 在开始配置boost库之前,需要先准备好以下环境: windows10操作系统 Visual Studio 2019 IDE boost库源代码 建议下载完整版的boost库源代码,并解压到一个方便访问的目录下。 配置boost库 1. 编译Boost库 首先需要使用CMD进入…

    C 2023年5月22日
    00
  • 神乐千鹤在拳皇97、98中的高级用法

    神乐千鹤在拳皇97、98中的高级用法攻略 什么是神乐千鹤? 神乐千鹤是拳皇系列游戏中的一位角色,拥有快速的移动速度和敏捷的攻击方式。她在拳皇97和98中的操作难度较高,但是如果掌握了她的高级用法,就可以轻松地击败对手。 神乐千鹤的高级用法 1. 投掷连击 神乐千鹤的投掷连击是一种非常强大的攻击方式。要进行投掷连击,首先需要进行一次投掷攻击(按下前+C),然后…

    C 2023年5月22日
    00
  • JsonCpp中double的问题解决

    JsonCpp是一个开源的C++库,用于处理JSON数据的解析和生成。在JsonCpp中,double类型的数据会存在一些问题:当double类型的数值非常大时,解析会出现错误,例如解析出的值可能会变成inf(无穷大)。这有可能发生在从互联网下载或接收JSON数据时,因此解决这个问题是非常重要的。 下面是解决这个问题的攻略,步骤如下: 1. 使用RapidJ…

    C 2023年5月23日
    00
  • Java异常 Exception类及其子类(实例讲解)

    Java异常 Exception类及其子类(实例讲解) 在Java中,异常是指在程序运行过程中发生的不正常情况,需要由程序对其进行处理以保障程序正常运行。Java异常类型分为Error和Exception,其中Error是指不可恢复的错误,如内存不足等;Exception则是可被捕获和处理的异常。 在Exception类中,又存在多个子类,每个子类可以处理不…

    C 2023年5月23日
    00
  • c语言实现奇偶排序算法

    下面是详细讲解“c语言实现奇偶排序算法”的完整攻略: 什么是奇偶排序算法 奇偶排序算法,也称为奇偶交换排序算法,是一种简单的排序算法。它的特点是同时进行奇数与偶数位置的元素比较和交换,直到序列有序为止。 奇偶排序算法的实现 奇偶排序算法的实现过程可以分为两个阶段,一阶段是进行奇偶位置上元素的比较和交换,二阶段是将相邻的元素比较和交换,两个阶段交替执行,直到序…

    C 2023年5月23日
    00
  • C++调用C函数实例详解

    C++调用C函数实例详解 C++调用C函数是一种常见的操作,有很多场合需要这种操作。下面详细讲解C++调用C函数的完整攻略。 1. 头文件引入 要在C++中调用C函数,首先要引入对应的C函数的头文件。例如,要调用标准库中的函数,需要在C++源文件中使用如下代码: extern "C" { #include <stdio.h> …

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