校园导游咨询系统

这是我的一个数据结构课设,也是第一次做课设,做的校园导游咨询系统,相信大家很多在大学学过数据结构的同学都接触过,但是在我做的课设中对floyde和dijstra算法没有大篇幅的使用,反而自己在课设的过程中对去两点之间最短路径和途径多景点之间的最短路径以及两点之间的所有路径根据自己的想法和网上的资料进行了修改形成了自己的思想,代码如下
注:在codeblocks上进行的编写,仅供参考!

//注:在codeblocks上进行的编写,仅供参考!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define Root -1
#define COILA 1
#define M 20
#define FINITY 100000

typedef int edgetype;
typedef struct
{
    int num;
    char name[20];
    char disc[400];
} vertextype;
typedef struct
{
    vertextype vertex[M];
    edgetype edges[M][M];
    int n,e;
}Mgraph;
/**************************************************函数预览表*************************************************************************/
void Creat(Mgraph *g);                       //创建一个图
int Judge(int numb);                         //判断编号输入是否合理
void printnum(Mgraph *g);                    //输出编号以及名称yy;
void Search(Mgraph *g);                      //查看景点信息
void shortpath(Mgraph *g);                   //两景点之间最短路径
void floyde_print(Mgraph *g,int b,int e);    //Floyde求最短路径
void print_shortpath(Mgraph *g);             //最短路径输出函数
void Allpath(Mgraph *g,int b,int e);         //两景点之间所有路径
void print_Allpath(Mgraph *g);               //输出所有路径
void bestpath(Mgraph *g);                    //途经多景点最佳路径
void Dfs_coila(Mgraph *g,int i);             //关节点
void Coila_search(Mgraph *g);                //校园图关节点
void comment(Mgraph *g);                     //游客评论
void checkcomment(Mgraph *g);                //游客查看评论
int printplan();                             //输出平面图
int menu();                                  //输出主菜单
int main();                                  //主函数功能实现
/*************************************************************创建图并读入信息*********************************************************/
void Creat(Mgraph *g)
{
    int i,j,k,e;

    FILE *rf;
    rf=fopen("test.txt","r");
    if(!rf){
        printf("error!");
        return;
    }
    if(rf)
    {
        fscanf(rf,"%d%d",&g->n,&g->e);
        for(i=0;i<g->n;i++)
        {
            fscanf(rf,"%d%s%s",&g->vertex[i].num,g->vertex[i].name,g->vertex[i].disc);
        }

        for(i=0;i<g->n;i++)
        {
            for(j=0;j<g->n;j++)
            {
                if(i==j) g->edges[i][j]=0;
                else g->edges[i][j]=FINITY;
            }
        }
        for(k=0;k<g->e;k++)
        {
            fscanf(rf,"%d%d%d",&i,&j,&e);
            g->edges[i][j]=g->edges[j][i]=e;
        }
        fclose(rf);
    }
    else g->e=0;
}
/*************************************************************异常处理区********************************************************/
int Judge(int numb)
{
    if(numb==-1) return 0;
    if(numb<1||numb>12)
    {
        printf("\n");
        printf("                                                输入有误!请输入1~12之间的数\n");
        return 0;
    }
     return 1;
}

int getnum(char *op){
	int sum=0;
	int i=0;while(op[i]){
		sum=sum*10+op[i]-'0';
		i++;
	}
	return sum;
}

int check(char *op){
	int i=0;
	while(op[i]){
		if(op[i]<'0'||op[i]>'9')
		{
		    printf("\n");
		    printf("                                                您的输入有误,请输入1~12之间的数字!\n");
		    return 0;
		}
		i++;
	}
	return 1;
}

/*************************************************************输出编号以及名称************************************************************/
void printnum(Mgraph *g)
{
    int i=0;
    printf("\n");
    for(i=0;i<g->n;i++)
    {
        printf("                                                                                景点编号及名称:%d.%s\n",g->vertex[i].num,g->vertex[i].name);
        printf("\n");
    }
}
/**************************************************************输出景点信息****************************************************************/
void Search(Mgraph *g)
{
    int flag=0;
    char oper[300];
    int s=0;
    while(1)
    {
        printf("请输入要查询的景点编号:");
        scanf("%s",oper);
        if(check(oper))
        {
            s=getnum(oper);
            if(Judge(s))
            {
                flag=1;
            }
            if(1==flag)break;
        }
    }
    printf("\n景点名称:%s\n",g->vertex[s-1].name);
    printf("\n景点介绍:%s\n",g->vertex[s-1].disc);
    printf("\n");
}
/***********************************************************寻找两景点之间的最短距离******************************************************/
int dist[M][M];
int path[M][M];
void shortpath(Mgraph *g)
{
    int i,j,k;
    for(i=0;i<g->n;i++)
        for(j=0;j<g->n;j++)
    {
        dist[i][j]=g->edges[i][j];
        if(i!=j&&dist[i][j]<FINITY) path[i][j]=i;
        else
            path[i][j]=-1;
    }
    for(k=0;k<g->n;k++)
        for(i=0;i<g->n;i++)
            for(j=0;j<g->n;j++)
            {
                if(dist[i][j]>(dist[i][k]+dist[k][j]))
                    {
                        dist[i][j]=dist[i][k]+dist[k][j];
                        path[i][j]=k;
                    }
            }
}
void floyde_print(Mgraph *g,int b,int e)
{
    if(path[b][e]==-1||path[b][e]==e||path[b][e]==b)
        return;
    else
    {
        floyde_print(g,b,path[b][e]);
        printf("%s->",g->vertex[path[b][e]].name);
        floyde_print(g,path[b][e],e);
    }
}
void print_shortpath(Mgraph *g)
{
    char opera[300];
    char operat[300];
    int b,e;
    int flag;
    flag=0;
    while(1)
    {
        printf("\n");
        printf("                                                请输入起点编号:");
        scanf("%s",opera);
        if(check(opera))
        {
                b=getnum(opera);
                if(Judge(b))
                {
                    flag=1;
                }

        }
        if(flag==1)break;
    }
    printf("\n");
    flag=0;
    while(1)
    {
        printf("\n");
        printf("                                                请输入终点编号:");
        scanf("%s",operat);
        if(check(operat))
        {
                e=getnum(operat);
                if(Judge(e))
                {
                     flag=1;
                }

        }
        if(1==flag)break;
    }

    printf("\n                                                %s到%s的最短距离为:%dm\n\n",g->vertex[--b].name,g->vertex[--e].name,dist[b-1][e-1]);
    printf("                                                最佳游览路线:");
    printf("%s->",g->vertex[b].name);
    floyde_print(g,b,e);
    printf("%s\n\n",g->vertex[e].name);
    printf("\n");

}
/*****************************************************两景点之间的所有路径******************************************************************/
int pathstack[M],top,count;
int visited[M];
void Allpath(Mgraph *g,int b,int e)
{
    int i,j,dis=0;
    pathstack[top]=b;
    top++;
    visited[b]=1;
    for(i=0;i<g->n;i++)
    {
        if(g->edges[b][i]>0&&g->edges[b][i]!=FINITY&&!visited[i])
        {
            if(i==e)
            {
                printf("                                                第%d条道路:",count++);
                for(j=0;j<top;j++)
                {
                    printf("%s->",g->vertex[pathstack[j]].name);
                    if(j<top-1)
                        dis=dis+g->edges[pathstack[j]][pathstack[j+1]];
                }
                dis=dis+g->edges[pathstack[top-1]][e];
                printf("%s\n",g->vertex[e].name);
                printf("                                                总长度为: %dm\n\n",dis);
            }
            else
            {
                Allpath(g,i,e);
                top--;
                visited[i]=0;
            }
        }
    }
}
void print_Allpath(Mgraph *g)
{
    int flag=0;
    char operati[300];
    char operatio[300];
    int b,e;
    count =1;
    top=0;
    memset(pathstack,0,sizeof(pathstack));
    memset(visited,0,sizeof(visited));
    while(1)
    {
        printf("\n");
        printf("                                                请输入起点编号:");
        scanf("%s",operati);
        if(check(operati))
        {
            b=getnum(operati);
            if(Judge(b))
            {
                flag=1;
            }
            if(1==flag) break;
        }
    }
    flag=0;
    while(1)
    {
        printf("\n");
        printf("                                                请输入终点编号:");
        scanf("%s",operatio);
        if(check(operatio))
        {
            e=getnum(operatio);
            if(Judge(e))
            {
                flag=1;
            }
            if(1==flag)break;
        }
    }
    printf("\n");
    Allpath(g,b-1,e-1);
    printf("\n");
}
/*********************************************************多景点求最佳路径*****************************************************************/
void bestpath(Mgraph *g)
{
    int flag=0;
    char operatii[300];
    int vnum[M]={0},j=1;
    int i,d=0;
    while(1)
    {
        printf("\n");
        printf("                                                请输入要查询的第%d个景点的编号(输入0结束输入):",j);
        scanf("%s",operatii);
        if(check(operatii))
        {
            vnum[j-1]=getnum(operatii);
            if(Judge(vnum[j-1]))
            {
                flag=1;
            }
        }
        if(1==flag)break;
    }
    printf("\n");
    flag=0;
    while(vnum[j-1]!=0&&j<12)
    {
        if(vnum[j-1]==-1) break;
        j++;
        while(1)
        {
            printf("\n");
            printf("                                                请输入要游览的第%d个景点编号:",j);
            scanf("%s",operatii);
            if(check(operatii))
            {
                vnum[j-1]=getnum(operatii);
                if(Judge(vnum[j-1]))
                {
                    flag=1;
                }
            }
            if(1==flag)break;
        }
        printf("\n");
    }
    printf("                                                这是最佳访问路径:");
    for(i=0;vnum[i]>0&&vnum[i+1]>0;i++)
    {
        printf("%s->",g->vertex[vnum[i]-1].name);
        floyde_print(g,vnum[i]-1,vnum[i+1]-1);
        d+=dist[vnum[i]-1][vnum[i+1]-1];
    }

    printf("%s\n\n",g->vertex[vnum[j-2]-1].name);
    printf("\n");
    printf("                                                全程路径为: %dm\n",d);
}
/*********************************************************深度遍历寻找关节点***************************************************************/
int visi[M],coila[M]={0};
int coilanum;
void Dfs_coila(Mgraph *g,int i)
{
    int child=0;
    int j;
    if(visi[i]!=Root)
    {
        visi[i]=1;
    }
    for(j=0;j<g->n;j++)
    {
        if(g->edges[i][j]!=0&&g->edges[i][j]!=FINITY&&!visi[j])
        {
            child++;
            Dfs_coila(g,j);   
        }
    }
    if(visi[i]==Root&&child>=2)  
    {
        coilanum++;
        coila[i]=COILA;
    }
}

/**********************************************************求校园图交通图关节点************************************************************/
void Coila_search(Mgraph *g)
{
    int i;
    coilanum=0;

    for(i=0;i<g->n;i++)
    {
        memset(visi,0,sizeof(visi));
        visi[i]=Root;   
        Dfs_coila(g,i);
    }
    printf("                                                校园图关节点个数为: %d\n\n                                                分别为:",coilanum);
    for(i=0;i<g->n;i++)
    {
        if(coila[i]==COILA)
        {
            printf("%s\t",g->vertex[i].name);
        }
    }
    printf("\n");
}

/**************************************************************留言*************************************************************************/
void comment(Mgraph *g)
{
    char comm[250];
    FILE *rf;
    rf=fopen("D:\\comment.txt","a");
    printf("                                               请输入你的留言:");
    scanf("%s",comm);
    printf("\n");
    time_t t;
    struct tm *tim;
    t=time(NULL);
    tim=localtime(&t);
    fprintf(rf,"留言时间:%s留言内容: %s\n",asctime(tim),comm);
    printf("                                               留言成功!\n");
    fclose(rf);
}
/***************************************************************查看留言********************************************************************/
void checkcomment(Mgraph *g)
{
    int len;
    char check[1024];
    FILE *rf;
    rf=fopen("D:\\comment.txt","r");

    printf("                                                以下为留言内容:\n");
    printf("\n");
    while(fgets(check,1024,rf)!=NULL)
    {
        len=strlen(check);
        printf("\t                                        %s\n",check);
    }
    printf("\n");
    fclose(rf);
}
/*******************************************************平面图******************************************************************************/
int printplan()
{
    printf("                                                                                                                                                         \n");
	printf("                                                                                    中北大学校园景点平面图                                               \n");
	printf("                                                                                                                                                         \n");
	printf("                                                                                                                                                         \n");
	printf("                                                ===================================================================================================      \n");
	printf("                                                            |                  |     * 7.游泳馆                          | * 12.东区食堂 |               \n");
	printf("                                                            |                  |                                         |               |               \n");
	printf("                                                            |                  |                                         |               |               \n");
	printf("                                                            |                  |      * 6.图书馆    * 9.10号教学楼      * 8.篮球场       |               \n");
	printf("                                                ===================================================================================================      \n");
	printf("                                                2.二龙山 *  |   *        *     |                                                         |               \n");
	printf("                                                            | 4.文赢9 5.四食堂 |                                                         |               \n");
	printf("                                                            |                  |                                                         |               \n");
	printf("                                                            |                  |                                                         |* 11.田园      \n");
	printf("                                                            |                  |                                                         |               \n");
	printf("                                                3.柏林园 *  |                  |                                                         |               \n");
	printf("                                                            |===================                                                         |               \n");
	printf("                                                            |                                                                            |* 10.文韬      \n");
	printf("                                                            |                                                                            |               \n");
	printf("                                                            |                                                                            |               \n");
	printf("                                                            |                                                                            |               \n");
	printf("                                                   =========|                                                                            |               \n");
	printf("                                                            |                                                                            |               \n");
	printf("                                                1.德怀楼  * |                                                                            |               \n");
	printf("                                                            |                                                                            |               \n");
	printf("                                                ===================================================================================================      \n");
	return 0;
}

/********************************************************主菜单*****************************************************************************/
int menu()
{
    printf("                                                -----------------------------------------------------------------------------------------\n");
    printf("                                                          *         *     ****     *      ****    ****      *   *      ****  \n");
    printf("                                                          *    *    *     *        *      *       *  *     **   **     *     \n");
    printf("                                                           *  * *  *      ****     *      *       *  *    *  * *  *    ****  \n");
    printf("                                                            **   **       *        *      *       *  *   *    *    *   *     \n");
    printf("                                                             *   *        ****     ****   ****    ****   *         *   ****  \n");
    printf("                                                -----------------------------------------------------------------------------------------\n");
    printf("                                                                                                         \n");
    printf("                                                * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("                                                * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("                                                * *                         欢迎使用中北大学校园导航系统                              * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *                             请选择您需要的功能:                                   * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *             1.学校平面图                      6.途径多景点的最短距离              * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *             2.显示景点编号                    7.校园图关节点                      * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *             3.主要景点信息介绍                8.留下您对中北大学的评论            * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *             4.寻找两景点之间的最短距离        9.查看评论                          * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *             5.两景点之间所有路径              10.退出系统                         * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * *                                                                                   * *\n");
    printf("                                                * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("                                                * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("\n\n");
    return 0;
}
/**************************************************************功能选择*********************************************************************/
void select()
{
    char  operation[300];
    int i=0,j=1,flag=0;
    Mgraph g;
    Creat(&g);
    shortpath(&g);
    while(j)
    {
        menu();
        while(1)
        {
            printf("\n");
            printf("                                                输入你想要的操作:");
            scanf("%s",operation);
            if(check(operation))
            {
                i=getnum(operation);
                if(Judge(i))
                {
                    flag=1;
                }
            }
            if(1==flag)break;
        }
        printf("\n");
        switch(i)
        {
            case 1:
                printplan();
                system("pause");
                system("cls");
                break;
            case 2:
                system("cls");
                printplan();
                printnum(&g);
                system("pause");
                system("cls");
                break;
            case 3:
                system("cls");
                printplan();
                Search(&g);
                system("pause");
                system("cls");
                break;
            case 4:
                system("cls");
                printplan();
                print_shortpath(&g);
                system("pause");
                system("cls");
                break;
            case 5:
                system("cls");
                printplan();
                print_Allpath(&g);
                system("pause");
                system("cls");
                break;
            case 6:
                system("cls");
                printplan();
                bestpath(&g);
                system("pause");
                system("cls");
                break;
            case 7:
                system("cls");
                printplan();
                Coila_search(&g);
                system("pause");
                system("cls");
                break;
            case 8:
                system("cls");
                printplan();
                comment(&g);
                system("pause");
                system("cls");
                break;
            case 9:
                system("cls");
                printplan();
                checkcomment(&g);
                system("pause");
                system("cls");
                break;
            case 10:
                system("cls");
                j=0;
                break;
            default:
                printf("\t\t                                对不起,没有您对应的操作。\n\n");
                system("pause");
                system("cls");
                break;
        }
    }
}
/************************************************************测试(主函数)*****************************************************************/
int main()
{
    system("color f4");
    select();
    return 0;
}

  • 26
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li_jeremy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值