校园导游咨询系统(数据结构课程设计)
程序员文章站
2024-03-01 18:45:10
...
这是大一下学期的课程设计,也是第一次写课程设计与实验报告(论文)。
经过在老师那里答辩自己也发现了一些问题。
论文及代码已经上传资源,有需要的小伙伴可以去下载奥。
首先实验里用到了文件存取、最短路径算法(dijkstra)、深度优先搜索等算法。在实验里加了查询两景点间所有路径,嗯我用了20个景点,但是用这个用法查找的路径有很多条,有些对有些错,我也找不出来哪里有错误(有大佬的话希望能够指点指点)。然后说说实验中可以优化的地方。
-
景点简介信息
景点简介信息我并未放进结构体里,我是直接输出,等到后面发现不应该这样写的时候又不愿改了(说到底还是有点懒啊)。 -
校园平面图
可以考虑放入文件中,如果还要完美的话应该增加功能(可以让管理员增加景点或者增加路径)。用那么多printf打印平面图我是有多不容易,加油学吧。 -
路径
我是直接在程序中定义好了所有路径,老师问:“你定义死了啊?”,我一头问号,终究还是太菜,也应该将邻接矩阵放入文件中然后读取(方便修改)。
我画的校园地图,白色的路汽车专用道路,黑色的通用。
代码如下(写的很粗糙还有很多不足),仅供参考。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<conio.h>
using namespace std;
const int maxv = 50;
const int inf = 1000000;
typedef struct{
int G[maxv][maxv];
int G1[maxv][maxv];
int vis[maxv];
int d[maxv];
int pre[maxv];
}Graph;
typedef struct LNode
{
char name[10];
char pass[10];
struct LNode *next;
} LNode,*pNode;
//定义节点
int way[maxv] = {0};
int n = 20,m;
int count1 = 0;
const int maxsize = 10000;
char mean[25][15] = {"","校门","教学楼","马克思楼","超市","宿舍(40)","餐厅","菜鸟驿站","礼堂","共享单车","图书馆","养心湖"\
,"汽车站","宾馆","宿舍(20)","体育馆","医院","基础实验大楼","银行","公园","小吃街"};
pNode createList()
{
//此函数是为了构造一个链表,存储用户信息用的。
pNode pHead = (pNode)malloc(sizeof(LNode));
pHead->next=NULL;
//以读的方式打开user.txt文件
FILE *fp = fopen("D:\\user.txt","r+");
if(fp == NULL)
{
printf("文件未找到");
exit(-1);
}
//获取链表入口,也就是头结点
pNode cur = pHead;
while(1)
{
//从user.text循环读入所有数据并依次存于链表
pNode temp = (pNode)malloc(sizeof(LNode));
if(!temp)
exit(-1);
//下面fscanf是从文件读取信息,并存入节点的name变量和pass变量
//如果fscanf的返回值不是2,则说明后面没有数据了,也即是录入完毕
//检测到录入完毕后将分配的空间清除掉
if(2!=fscanf(fp,"%s%s",temp->name,temp->pass))
{
free(temp);
break;
}
cur->next=temp;
cur = temp;
cur->next = NULL;
}
return pHead;
}
//登录函数
int login(pNode head)
{
if(NULL==head->next)
{
printf("暂无用户\n");
getchar();
return 0;
}
char name[10];
char pass[10];
printf("\t\t请输入你的用户名:");
scanf("%s",name);
printf("\t\t请输入你的密码:");
scanf("%s",pass);
pNode temp = head->next;
while(temp)
{
if(0==strcmp(temp->name,name) && 0==strcmp(temp->pass,pass))
{
printf("\t\t成功登录\n");
getchar();
return 1;
}
temp = temp->next;
}
printf("未找到该用户\n");
getch();
return 1;
}
//写入txt文件,每一行存在一个用户
void writeToFile(pNode head)
{
FILE *fw = fopen("D:\\user.txt","a+");
pNode temp=head->next;
if(temp==NULL){
return;
}
while(temp){
fprintf(fw,temp->name);
fprintf(fw,"\t");
fprintf(fw,temp->pass);
fprintf(fw,"\n");
temp = temp->next;
}
}
//注册用户
void registerUser(pNode head)
{
pNode temp = head->next;
//当表中无用户直接在头结点后注册
if(!temp)
{
temp = (pNode)malloc(sizeof(LNode));
head->next = temp;
}
else
{
//表中有用户则在最后一个节点后生成新节点
while(temp->next)
{
temp = temp->next;
}
pNode last = (pNode)malloc(sizeof(LNode));
temp->next = last;
temp = last;
}
printf("\t\t请输入你的用户名:");
scanf("%s",temp->name);
printf("\t\t请输入你的密码:");
scanf("%s",temp->pass);
temp->next=NULL;
printf("\t\t注册成功\n");
}
int menu()
{
int choice;
printf("\t\t1.登录\n");
printf("\t\t2.注册\n");
printf("\t\t#.退出\n");
printf("\t\t请输入你的选择:");
scanf("%d",&choice);
return choice;
}
void comment()
{
char comm[250];
FILE *rf;
rf=fopen("D:\\comment.txt","a");
printf("\t\t请输入你的留言:\n");
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("\t\t留言成功!\n");
fclose(rf);
}
/***************************************************************查看留言********************************************************************/
void checkcomment()
{
char check[1024];
FILE *rf;
rf=fopen("D:\\comment.txt","r");
int len;
printf(" 以下为留言内容:\n");
printf("\n");
while(fgets(check,1024,rf)!=NULL)
{
len=strlen(check);
printf("\t %s\n",check);
}
printf("\n");
fclose(rf);
}
void menu1() //主菜单
{
printf("\n\n");
printf("\t\t 欢迎使用华东交通大学导游系统 \n");
printf("\t\t --------------------------------------------\n");
printf("\t\t | |\n");
printf("\t\t | O(∩_∩)O~~ |\n");
printf("\t\t | |\n");
printf("\t\t | 1.显示校园平面图. |\n");
printf("\t\t | 2.查询任意场所的相关信息. |\n");
printf("\t\t | 3.校门口到各个场所的最短路径. |\n");
printf("\t\t | 4.任意场所的问路查询. |\n");
printf("\t\t | 5.两点之间的所有简单路径 |\n");
printf("\t\t | 6.留下你对华东交通大学的评价 |\n");
printf("\t\t | 7.查看评价 |\n");
printf("\t\t | 8.退出 |\n");
printf("\t\t | |\n");
printf("\t\t | |\n");
printf("\t\t | |\n");
printf("\t\t --------------------------------------------\n");
printf("\t*******************************景点编号***************************\n");
printf("\t------------------------------------------------------------------\n");
printf("\t1.校门 2.教学楼 3.马克思楼 4.超市 5。宿舍(40)\n");
printf("\t6.餐厅 7.菜鸟驿站 8.礼堂 9.共享单车 10.图书馆\n");
printf("\t11.养心湖 12.汽车站 13.宾馆 14.宿舍(20) 15.体育馆\n ");
printf("\t16.医院 17.基础实验大楼 18.银行 19.公园 20.小吃街\n");
printf("\t------------------------------------------------------------------\n");
printf("\n\t\t\t 请输入您要进行的操作的序号 \n");
}
void mess() //查看学校中各景点信息
{
int x;
printf("请输入要查询场所的序号1 - 20(0 键结束):");
while(scanf("%d",&x) == 1)
{
if(x == 0)break;
switch(x)
{
case 1 :
printf("景点编号:1\n");
printf("景点名称:华东交通大学校门\n");
printf("景点介绍:华东交通大学校门是连接南北区的地方.\n");
break;
case 2 :
printf("景点编号:2\n");
printf("景点名称:教学楼\n");
printf("景点介绍:学生上课与老师办公的大楼.\n");
break;
case 3 :
printf("景点编号:3\n");
printf("景点名称:马克思主义楼\n");
printf("景点介绍:马克思主义好啊!马克思主义原理上课的地方.\n");
break;
case 4 :
printf("景点编号:4\n");
printf("景点名称:超市\n");
printf("景点介绍:超市卖了学生日常所需的生活用品与好吃的..\n");
break;
case 5 :
printf("景点编号:5\n");
printf("景点名称:40栋宿舍\n");
printf("景点介绍:40栋宿舍,男生的地狱,没有空调!.\n");
break;
case 6 :
printf("景点编号:6\n");
printf("景点名称:食堂\n");
printf("景点介绍:学校食堂,里面有好多好吃的,3楼黄焖鸡挺好吃.\n");
break;
case 7 :
printf("景点编号:7\n");
printf("景点名称:菜鸟驿站\n");
printf("景点介绍:每天都有许多快递进来,简直是女生的天堂!.\n");
break;
case 8 :
printf("景点编号:8\n");
printf("景点名称:礼堂\n");
printf("景点介绍:礼堂是举行活动的地方(各种晚会)以及学术讲座.\n");
break;
case 9 :
printf("景点编号:9\n");
printf("景点名称:共享单车站点\n");
printf("景点介绍:共享单车停靠点,为学生提供了许多遍历.\n");
break;
case 10 :
printf("景点编号:10\n");
printf("景点名称:图书馆\n");
printf("景点介绍:交大标志性建筑,里面有许多书,平时会有许多学生来看书和自习.\n");
break;
case 11 :
printf("景点编号:11\n");
printf("景点名称:养心湖\n");
printf("景点介绍:修身养性的地方.\n");
break;
case 12 :
printf("景点编号:12\n");
printf("景点名称:汽车站\n");
printf("景点名称:学生放假去.\n");
break;
case 13 :
printf("景点编号:13\n");
printf("景点名称:宾馆\n");
printf("景点介绍:提供休息处.\n");
break;
case 14 :
printf("景点编号:14\n");
printf("景点名称:20栋宿舍\n");
printf("景点介绍:女生的天堂,有空调.\n");
break;
case 15 :
printf("景点编号:15\n");
printf("景点名称:体育馆\n");
printf("景点介绍:里面可以做许多活动,篮球、乒乓球、网球.....\n");
break;
case 16 :
printf("景点编号:16\n");
printf("景点名称:医院\n");
printf("景点介绍:给学生提供医疗保障.\n");
break;
case 17 :
printf("景点编号:17\n");
printf("景点名称:基础实验大楼\n");
printf("景点介绍:里面可以做许多实验,是一个好去处哟.\n");
break;
case 18 :
printf("景点编号:18\n");
printf("景点名称:银行\n");
printf("景点介绍:当然是取钱的地方啦,你懂得.\n");
break;
case 19 :
printf("景点编号:19\n");
printf("景点名称:公园\n");
printf("景点介绍:有许多景色,不过不适合单身狗去玩.\n");
break;
case 20 :
printf("景点编号:20\n");
printf("景点名称:小吃店\n");
printf("景点介绍:里面有许多特色小吃呀!\n");
break;
default :break;
}
printf("\n请输入要查询场所的序号1 - 20 (0 键结束):");
}
}
void plan(){
printf("=====================================================华东交大平面图===========================================================================\n");
printf("----18--------------------------------------------------------------13----------------------4-----------------12------------------------------\n");
printf("|| 银行 ||-------------------------|| ||宿舍(20)||---------------||宾馆|| ||-------------||超市||----------||汽车站||-----------------------||\n");
printf("========= || =========14 ====== ======= ========= ||\n");
printf("|| | || || || || ======= \n");
printf("|| |==-== || || || ||==================== ==================|| 图 ||\n");
printf("|| || || || || 2 3 || 5 6 || 书 ||\n");
printf("||========||======||=======||==========||========|| ||======||---- ||=====||------||========||========||======||======= || 馆 ||\n");
printf("||基础实验大楼|| ||医院 16|| ||体育馆 15|| || 教学楼|| ||马克思|| || || 宿舍 || || 餐厅 || ======\n");
printf("||===========|| ========= | ========= ========= ======= || ====== ======== 10||\n");
printf("|| 17 | || || || || || \n");
printf("|| | ||=====|| || || ||\n");
printf("|| | ||校门 1|| || || ||\n");
printf("|| | ====== || || ||\n");
printf("|| ================ || || || ||\n");
printf("|| || || || || || ||=====||\n");
printf("|| || 养 || || || || || 礼堂||\n");
printf("|| || 心 11 || ||======|| ||======|| ||=============||=====||\n");
printf("|| || 湖 || || 20小吃店||=================|| 菜鸟 ||=========================|| 8||\n");
printf("|| ================ ||======|| || 驿站 || || ||\n");
printf("|| || | || ||======|| || ||\n");
printf("|| || | || 7 || ||\n");
printf("|| == || | || || ||\n");
printf("||=======|| | || || ||\n");
printf("||19 公园|| | || || ||\n");
printf("||=======|| | || ||\n");
printf("|| | || ||\n");
printf("|| | = | ||=========|| ||\n");
printf("||========================================================= 共享单车 9|| ||\n");
printf("||------------------------------------------------------------------------------------------------------------------------------------------||\n");
}
void dijkstra(int s,Graph &M){
fill(M.d,M.d+maxv,inf);
for(int i = 1;i <= n; i++){
M.pre[i] = i;
}
M.d[s] = 0;
for(int i = 1;i <= n; i++){
int u = -1,min = inf;
for(int j = 1;j <= n; j++){
if(!M.vis[j]&&M.d[j]<min){
min = M.d[j];
u = j;
}
}
M.vis[u] = 1;
for(int v = 1;v <= n; v++){
if(!M.vis[v]&&M.d[u]+M.G[u][v]<M.d[v]){
M.d[v] = M.G[u][v]+M.d[u];
M.pre[v] = u;
}
}
}
}
void dijkstra1(int s,Graph &M){
fill(M.d,M.d+maxv,inf);
for(int i = 1;i <= n; i++){
M.pre[i] = i;
}
M.d[s] = 0;
for(int i = 1;i <= n; i++){
int u = -1,min = inf;
for(int j = 1;j <= n; j++){
if(!M.vis[j]&&M.d[j]<min){
min = M.d[j];
u = j;
}
}
M.vis[u] = 1;
for(int v = 1;v <= n; v++){
if(!M.vis[v]&&M.d[u]+M.G1[u][v]<M.d[v]){
M.d[v] = M.G1[u][v]+M.d[u];
M.pre[v] = u;
}
}
}
}
void DFS(int s,int v,Graph &M){
if(v==s){
printf("%s",mean[s]);
return;
}
DFS(s,M.pre[v],M);
printf("->%s",mean[v]);
}
void init(Graph &M){
fill(M.G[0],M.G[0]+maxv*maxv,inf);
memset(M.vis,0,sizeof(M.vis));
M.G[1][2] = M.G[2][1] = 100;
M.G[1][4] = M.G[4][1] = 800;
M.G[1][13] = M.G[13][1] = 600;
M.G[1][7] = M.G[7][1] = 300;
M.G[1][20] = M.G[20][1] = 250;
M.G[1][11] = M.G[11][1] = 200;
M.G[1][14] = M.G[14][1] = 500;
M.G[1][15] = M.G[15][1] = 250;
M.G[2][3] = M.G[3][2] = 100;
M.G[3][5] = M.G[5][3] = 100;
M.G[3][4] = M.G[4][3] = 500;
M.G[3][7] = M.G[7][3] = 500;
M.G[4][12] = M.G[12][4] = 300;
M.G[4][13] = M.G[13][4] = 400;
M.G[4][6] = M.G[6][4] = 550;
M.G[5][6] = M.G[6][5] = 100;
M.G[6][10] = M.G[10][6] = 300;
M.G[6][7] = M.G[7][6] = 300;
M.G[6][8] = M.G[8][6] = 250;
M.G[7][20] = M.G[20][7] = 100;
M.G[7][8] = M.G[8][7] = 200;
M.G[8][10] = M.G[10][8] = 500;
M.G[9][11] = M.G[11][9] = 400;
M.G[9][19] = M.G[19][9] = 2000;
M.G[9][20] = M.G[20][9] = 200;
M.G[10][12] = M.G[12][10] = 300;
M.G[11][19] = M.G[19][11] = 500;
M.G[11][15] = M.G[15][11] = 100;
M.G[13][14] = M.G[14][13] = 250;
M.G[14][15] = M.G[15][14] = 250;
M.G[14][16] = M.G[16][14] = 500;
M.G[14][18] = M.G[18][14] = 350;
M.G[15][16] = M.G[16][15] = 300;
M.G[16][17] = M.G[17][16] = 100;
M.G[16][18] = M.G[18][16] = 500;
M.G[17][18] = M.G[18][17] = 700;
M.G[17][19] = M.G[19][17] = 1000;
}
void init1(Graph &M){
fill(M.G1[0],M.G1[0]+maxv*maxv,inf);
memset(M.vis,0,sizeof(M.vis));
M.G1[1][2] =M.G1[2][1] = 100;
M.G1[1][4] = M.G1[4][1] = 800;
M.G1[1][13] = M.G1[13][1] = 600;
M.G1[1][7] = M.G1[7][1] = 300;
M.G1[1][20] = M.G1[20][1] = 250;
//G1[1][11] = G1[11][1] = 200;
M.G1[1][14] = M.G1[14][1] = 500;
M.G1[1][15] = M.G1[15][1] = 250;
M.G1[2][3] = M.G1[3][2] = 100;
M.G1[3][5] = M.G1[5][3] = 100;
M.G1[3][4] = M.G1[4][3] = 500;
M.G1[3][7] = M.G1[7][3] = 500;
M.G1[4][12] = M.G1[12][4] = 300;
M.G1[4][13] = M.G1[13][4] = 400;
//G1[4][6] = G1[6][4] = 550;
M.G1[5][6] = M.G1[6][5] = 100;
M.G1[6][10] = M.G1[10][6] = 300;
M.G1[6][7] = M.G1[7][6] = 300;
M.G1[6][8] = M.G1[8][6] = 250;
M.G1[7][20] = M.G1[20][7] = 100;
M.G1[7][8] = M.G1[8][7] = 200;
M.G1[8][10] = M.G1[10][8] = 500;
//G1[9][11] = G1[11][9] = 400;
M.G1[9][19] = M.G1[19][9] = 2000;
M.G1[9][20] = M.G1[20][9] = 200;
M.G1[10][12] = M.G1[12][10] = 300;
M.G1[11][19] = M.G1[19][11] = 500;
//G1[11][15] = G1[15][11] = 100;
M.G1[13][14] = M.G1[14][13] = 250;
M.G1[13][15] = M.G1[15][13] = 700;
M.G1[14][15] = M.G1[15][14] = 250;
M.G1[14][16] = M.G1[16][14] = 500;
M.G1[14][18] = M.G1[18][14] = 350;
M.G1[15][16] = M.G1[16][15] = 300;
M.G1[15][18] = M.G1[18][15] = 800;
M.G1[16][17] = M.G1[17][16] = 100;
M.G1[16][18] = M.G1[18][16] = 500;
M.G1[16][19] = M.G1[19][16] = 1050;
M.G1[17][18] = M.G1[18][17] = 700;
M.G1[17][19] = M.G1[19][17] = 1000;
}
void DFSall(Graph &M,int s,int e){
int i,j;
int flag = 0;
M.vis[s] = 1;
way[count1] = s;
for(i = 1;i <= n; i++){
if(M.G[s][i]!=inf&&M.vis[i]==0&&i!=e){
count1++;
way[count1] = i;
DFSall(M,i,e);
M.vis[i] = 0;
count1--;
flag = 0;
continue;
}
if(M.G[s][i]!=inf && M.vis[i]==0 && i==e && flag==0){
count1++;
way[count1] = e;
flag = 1;
printf("\n");
printf("\t%s",mean[way[0]]);
for(j = 1;j <= count1; j++){
printf("->");
printf("%s",mean[way[j]]);
}
count1--;
return;
}
}
return;
}
void ALLpath(Graph M){
memset(M.vis,0,sizeof(M.vis));
int start,end;
printf("请输入起点:\n");
scanf("%d",&start);
printf("请输入终点:\n");
scanf("%d",&end);
printf("%s到%s的所有路径为:\n",mean[start],mean[end]);
count1 = 0;
DFSall(M,start,end);
printf("\n");
}
int main1(){
menu1();
int flag;
int flag1;
int start,end;
while(scanf("%d",&flag)==1){
Graph M;
switch(flag){
case 1: plan();break;
case 2: mess();break;
case 3:
printf("请输入你的交通方式(1:驾车,2:步行\n");
scanf("%d",&flag1);
if(flag1==1){
init1(M);
dijkstra1(1,M);
for(int i = 2;i <= n; i++){
printf("%s到%s的最短距离为%d\n",mean[1],mean[i],M.d[i]);
printf("最短路径为:\n");
DFS(1,i,M);
printf("\n");
}
}else{
init(M);
dijkstra(1,M);
for(int i = 2;i <= n; i++){
printf("%s到%s的最短距离为%d\n",mean[1],mean[i],M.d[i]);
printf("最短路径为:\n");
DFS(1,i,M);
printf("\n");
}
}
break;
case 4:
printf("请输入您的交通方式(1:驾车,2:步行)\n");
scanf("%d",&flag1);
if(flag1==1){
init1(M);
printf("请输入起点和终点:\n");
scanf("%d%d",&start,&end);
dijkstra1(start,M);
printf("%s到%s的最短距离为%d\n",mean[start],mean[end],M.d[end]);
printf("最短路径为:\n");
DFS(start,end,M);
printf("\n");
}else{
init(M);
printf("请输入起点和终点:\n");
scanf("%d%d",&start,&end);
dijkstra(start,M);
printf("%s到%s的最短距离为%d\n",mean[start],mean[end],M.d[end]);
printf("最短路径为:\n");
DFS(start,end,M);
printf("\n");
}
break;
case 5:
printf("请输入您的交通方式(1:驾车,2:步行)\n");
scanf("%d",&flag1);
if(flag1==1){
init1(M);
ALLpath(M);
}else{
init(M);
ALLpath(M);
}
break;
case 6:
comment();
break;
case 7:
checkcomment();
break;
default : return 0;
}
printf("请输入你的选择:\n");
}
system("pause");
return 0;
}
int main()
{
int choice;
pNode head = createList();
while(1)
{
choice = menu();
if(1==choice)
{
system("cls");
if(login(head))
{
main1();
}
//system("cls");
}
else if(2==choice)
{
system("cls");
registerUser(head);
writeToFile(head);
//system("cls");
}
else
{
return 0;
}
}
}
论文在资源里,更详细的讲解都在论文里,适合第一次写论文的看,可以学到许多东西。代码与论文有问题的话,欢迎各位指正。
最后
对待自己温柔一点。你只不过是宇宙的孩子,与植物、星辰没有什么两样。
下一篇: Android UI更新的几种方法总结