旅游资讯管理系统

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct lvyoujilu
{
	int id;//编号
	char anpai[20];//日程安排
	float price;//费用
	int dianzan;//点赞数
};


char caidan()
{
	char xuanze;
	system("cls");
	printf("a:添加咨讯记录\n");
	printf("b:查询咨讯记录\n");
	printf("c:修改咨讯记录\n");
	printf("d:删除咨讯记录\n");
	printf("e:点赞咨讯记录\n");
	printf("q:退出\n");
	printf("请输入选择:");
	scanf("%c",&xuanze);
	return xuanze;
}

int tianjia(struct lvyoujilu ly[],int n)
{
	system("cls");
	printf("请输入编号:");
	scanf("%d",&ly[n].id);
	printf("请输入日程安排:");
	scanf("%s",ly[n].anpai);
	printf("请输入费用:");
	scanf("%f",&ly[n].price);
	printf("请输入点赞数:");
	scanf("%d",&ly[n].dianzan);
	printf("添加成功!\n");
	system("pause");
	return n+1;
}

void bianhaopaixu(struct lvyoujilu ly[],int n)
{
	int i,j;
	struct lvyoujilu temp;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(ly[i].id>ly[j].id)
			{
				temp=ly[i];
				ly[i]=ly[j];
				ly[j]=temp;
			}
		}
	}
}

void dianzanpaixu(struct lvyoujilu ly[],int n)
{
	int i,j;
	struct lvyoujilu temp;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(ly[i].dianzan<ly[j].dianzan)
			{
				temp=ly[i];
				ly[i]=ly[j];
				ly[j]=temp;
			}
		}
	}
}

void Print(struct lvyoujilu ly[],int n)
{
	int i;
	system("cls");
	printf("%-10s%-20s%-10s%-10s\n","编号","日程安排","费用","点赞数");
	for(i=0;i<n;i++)
	{
		printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
	}
	system("pause");
}

void chaxun(struct lvyoujilu ly[],int n)
{
	int i;
	int x;
	system("cls");
	printf("请输入要查询的编号:");
	scanf("%d",&x);
	for(i=0;i<n;i++)
	{
		if(ly[i].id==x)
		{
			printf("%-10s%-20s%-10s%-10s\n","编号","日程安排","费用","点赞数");
			printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
			system("pause");
			return;
		}
	}
	printf("无该编号信息!\n");
	system("pause");
}

void Printmenu(struct lvyoujilu ly[],int n)
{
	int xuanze;
	do
	{
		system("cls");
		printf("1:按编号显示\n");
		printf("2:按点赞数显示\n");
		printf("3:按编号查询\n");
		printf("0:返回\n");
		printf("请输入选择:");
		scanf("%d",&xuanze);
		switch(xuanze)
		{
		case 1:
			bianhaopaixu(ly,n);
			Print(ly,n);
			break;
		case 2:
			dianzanpaixu(ly,n);
			Print(ly,n);
			break;
		case 3:
			chaxun(ly,n);
			break;
		}
	}while(xuanze!=0);
}

void xiugai(struct lvyoujilu ly[],int n)
{
	int i;
	int x;
	system("cls");
	printf("请输入要修改的编号:");
	scanf("%d",&x);
	for(i=0;i<n;i++)
	{
		if(ly[i].id==x)
		{
			printf("%-10s%-20s%-10s%-10s\n","编号","日程安排","费用","点赞数");
			printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
			printf("请输入编号:");
			scanf("%d",&ly[i].id);
			printf("请输入日程安排:");
			scanf("%s",ly[i].anpai);
			printf("请输入费用:");
			scanf("%f",&ly[i].price);
			printf("请输入点赞数:");
			scanf("%d",&ly[i].dianzan);
			printf("修改成功!\n");
			system("pause");
			return;
		}
	}
	printf("无该编号信息!\n");
	system("pause");
}

int shanchu(struct lvyoujilu ly[],int n)
{
	int i,j;
	int x;
	system("cls");
	printf("请输入要删除的编号:");
	scanf("%d",&x);
	for(i=0;i<n;i++)
	{
		if(ly[i].id==x)
		{
			printf("%-10s%-20s%-10s%-10s\n","编号","日程安排","费用","点赞数");
			printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
			for(j=i;j<n;j++)
			{
				ly[j]=ly[j+1];
			}
			printf("删除成功!\n");
			system("pause");
			return n-1;
		}
	}
	printf("无该编号信息!\n");
	system("pause");
	return n;
}

void dianzan(struct lvyoujilu ly[],int n)
{
	int i;
	int x;
	char name[100];
	system("cls");
	printf("请输入要点赞的编号:");
	scanf("%d",&x);
	for(i=0;i<n;i++)
	{
		if(ly[i].id==x)
		{
			printf("%-10s%-20s%-10s%-10s\n","编号","日程安排","费用","点赞数");
			printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
			printf("请输入点赞人姓名:");
			scanf("%s",name);
			ly[i].dianzan++;
			printf("点赞成功!\n");
			system("pause");
			return;
		}
	}
	printf("无该编号信息!\n");
	system("pause");
}

int main()
{
	char xuanze;
	struct lvyoujilu ly[100];
	int n=0;
	do
	{
		xuanze = caidan();
		switch(xuanze)
		{
		case 'a':
			n=tianjia(ly,n);
			break;
		case 'b':
			Printmenu(ly,n);
			break;
		case 'c':
			xiugai(ly,n);
			break;
		case 'd':
			n=shanchu(ly,n);
			break;
		case 'e':
			dianzan(ly,n);
			break;
		}
	}while(xuanze!='q');
	return 0;
}

报告:
概述或引言:
当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这证实计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理旅游资讯信息而设计的。旅游资讯作为一种信息资源,用户和导游需要经常查看寻找,包含很多的信息数据的管理。现今,有很多地方的旅游业都是初步开始使用,甚至尚未使用计算机进行信息管理。由于数据繁多,容易丢失,且不易查找,总的来说,缺乏系统,规范的信息管理手段。数据处理手工操作,工作量大,出错率高,出错后不易更改。必要建立一个旅游资讯管理系统,使工作规范化,系统化,程序化,避免随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改旅游资讯情况。
本系统基于windows 10操作系统使用Visual c++ 6.0开发。完全采用C语言,且符合C89标准,能够在任何支持C语言的平台编译运行,具有良好的可移植性。
本系统已经实现的功能有:
a.添加旅游资讯记录
b.查询旅游资讯记录
c.修改旅游资讯记录
d.删除旅游资讯记录
e.点赞旅游资讯记录
本系统尚未实现的功能有:
a.将已有的旅游资讯记录保存到文件
b.重新打开程序能够导入之前的记录
c.每人只能点赞一次
运行中,当需要获取用户输入信息时,如果用户输入很长的一段信息,可能会造成数据的溢出,从而导致整个系统的奔溃。也有可能在输入时不符合类型要求,造成程序读取错误,输入缓冲区无法刷新,死循环读取错误的数据。

程序概要设计:
软件概要设计是软件开发期的第一个阶段,也是关系到软件开发成败的关键步骤。准确、完整和规范化的软件需求是软件开发成功的关键。它的重要性在于让用户完全清楚对软件系统的确切要求,它不是确定系统怎样完成它的工作,而仅仅是确定系统必须完成哪些工作。也就是对目标系统提出完整、准确、清晰、具体的要求。反复的调查和研究,了解数据库的组织的详细情况,了解管理的业务流程等系统需求,它对于设计好概念模型是至关重要的。一个好的管理系统可以将我们的管理员从繁重的工作中解脱出来,使工作更轻松。而需求分析的好坏直接影响到系统设计的好坏。
首先旅游资讯应该包含的项有:该资讯的编号,该资讯的日程安排,所需的费用以及被用户点赞的数量。
在大致确定了数据项之后,可以进行整体流程分析。程序应该能够给用户提供一个菜单,供用户选择需要使用的功能。且菜单应该能够返回用户的选择,以确定进入用户选择的功能。主程序流程图如下图1所示:

图 1 主函数流程图

程序中主要有如下几个函数:
主函数:
控制整个程序的运行流程,是图1的具体实现。
主菜单函数:
供用户选择需要使用的功能。且菜单应该能够返回用户的选择,以确定进入用户选择的功能。
添加旅游资讯记录:
为数据的录入提供了接口,依次获取该资讯的编号,该资讯的日程安排,所需的费用以及被用户点赞的数量。由于记录增加了,所以应该返回一个新的总记录数。
查询旅游资讯记录
查询分为3种不同的查询:
1:按编号大小升序排列
2:按点赞数量降序排列
3:根据记录编号,单独显示
由于记录的数据量庞大,用户想要选择自己需要的记录,所以提供了这三种不同的接口。分别满足用户不同的需求。
修改旅游资讯记录:
由于操作失误或者信息更迭的原因,系统中某些记录的数据失去了准确性,需要进行修改。所以提供了修改函数接口,使用户能够及时的修改记录。
删除旅游资讯记录:
当某些数据被废弃后,应该从系统中舍去。如去年的旅游讯息,放在今年已经过时,失去了时效性,需要从系统中删除。所以提供了删除函数,使得用户能够将不需要的记录从系统中舍去。
点赞旅游资讯记录:
用户根据自己的喜好,可以为某条或者多条旅游信息进行点赞。其他用户可以借此,比较出更受大众喜爱的旅游资讯。

程序详细设计:
确定数据结构:
本系统使用的是顺序表,由于考虑到旅游信息大多数是每天添加以及修改,删除工作并不多,所以使用顺序表,可以方便的查询以及修改添加操作。
旅游资讯记录的定义如下:
struct lvyoujilu
{
int id;//编号
char anpai[20];//日程安排
float price;//费用
int dianzan;//点赞数
};

添加旅游资讯记录:
添加旅游记录时,考虑到顺序表在末尾添加的时间复杂度是O(1),所以具体实现代码如下:
int tianjia(struct lvyoujilu ly[],int n)
{
system(“cls”);
printf(“请输入编号:”);
scanf("%d",&ly[n].id);
printf(“请输入日程安排:”);
scanf("%s",ly[n].anpai);
printf(“请输入费用:”);
scanf("%f",&ly[n].price);
printf(“请输入点赞数:”);
scanf("%d",&ly[n].dianzan);
printf(“添加成功!\n”);
system(“pause”);
return n+1;
}

查询旅游资讯记录:
查询分为3种不同的查询:
1:按编号大小升序排列
2:按点赞数量降序排列
1,2的输出都是全体数据,所不同的是输出的顺序不同,所以在输出之前按功能要求进行排序。分别对编号和点赞量排序后输出,排序使用的是简单选择排序法。具体输出即遍历顺序表输出,具体输出代码如下:
void Print(struct lvyoujilu ly[],int n)
{
int i;
system(“cls”);
printf("%-10s%-20s%-10s%-10s\n",“编号”,“日程安排”,“费用”,“点赞数”);
for(i=0;i<n;i++)
{
printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
}
system(“pause”);
}
3:根据记录编号,单独显示
单独查询时,需要遍历顺序表,进行一一比较,满足条件则输出,其关键代码如下:
if(ly[i].id==x)
{
printf("%-10s%-20s%-10s%-10s\n",“编号”,“日程安排”,“费用”,“点赞数”); printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
system(“pause”);
return;
}

修改旅游资讯记录:
修改时,需要遍历顺序表,进行一一比较,满足条件则输出并提示用户重新输入信息,其代码如下:
void xiugai(struct lvyoujilu ly[],int n)
{
int i;
int x;
system(“cls”);
printf(“请输入要修改的编号:”);
scanf("%d",&x);
for(i=0;i<n;i++)
{
if(ly[i].id==x)
{
printf("%-10s%-20s%-10s%-10s\n",“编号”,“日程安排”,“费用”,“点赞数”);
printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
printf(“请输入编号:”);
scanf("%d",&ly[i].id);
printf(“请输入日程安排:”);
scanf("%s",ly[i].anpai);
printf(“请输入费用:”);
scanf("%f",&ly[i].price);
printf(“请输入点赞数:”);
scanf("%d",&ly[i].dianzan);
printf(“修改成功!\n”);
system(“pause”);
return;
}
}
printf(“无该编号信息!\n”);
system(“pause”);
}

删除旅游资讯记录:
删除时,由于顺序表删除不像链表一样是释放空间,所以必须使用后一个元素,覆盖前一个元素,依次覆盖,最后长度减小1,达到删除的效果。其关键代码如下所示:
for(j=i;j<n;j++)
{
ly[j]=ly[j+1];
}
点赞旅游资讯记录:
遍历查询到要点赞的记录,将其点赞数量在原有的基础上进行加一。其关键代码如下:
if(ly[i].id==x)
{
printf("%-10s%-20s%-10s%-10s\n",“编号”,“日程安排”,“费用”,“点赞数”);
printf("%-10d%-20s%-10.2f%-10d\n",ly[i].id,ly[i].anpai,ly[i].price,ly[i].dianzan);
printf(“请输入点赞人姓名:”);
scanf("%s",name);
ly[i].dianzan++;
printf(“点赞成功!\n”);
system(“pause”);
return;
}

程序使用说明:
首先打开程序,展现给用户的是主菜单,用户根据需要选择相应的功能并进入。主菜单如图2所示:

图2 主菜单

随后选择a向系统中添加若干条旅游资讯记录,其中一条如图3所示:

图3 添加旅游资讯记录

添加旅游资讯记录后,系统已经存在旅游资讯记录,我们进入查询资讯记录选项进行查询刚刚录入的旅游资讯记录是否存在。若存在,则说明程序录入验证成功。选择b,进入查询主菜单,如图4所示:
图4 查询主菜单

查询分为三种情况我们对其一一验证。
1:按编号显示
按编号由小到大排序,然后依次输出,具体操作后的显示如图5:

图5 按编号显示
2:按点赞数显示
按点赞数由大到小排序,然后依次输出,具体操作后的显示如图6:

图6 按点赞数显示

3:按编号查询
可以通过编号单独显示需要的旅游资讯记录,去除其它记录的干扰,其具体操作显示如图7:

图7 按编号查询

修改旅游资讯记录:
通过用户输入的旅游资讯记录编号,定位到具体要修改的旅游资讯记录,并输出已有资讯记录,提示用户输入新数据修改。其具体操作结果如图8:

图8 修改旅游资讯记录

删除旅游资讯记录:
通过用户输入的旅游资讯记录编号,定位到具体要删除的旅游资讯记录,并输出已有资讯记录。系统根据设计中描述的覆盖流程,将记录覆盖达到删除的效果。其具体操作结果如图9:

图9 删除旅游资讯记录

点赞旅游资讯记录:
通过用户输入的旅游资讯记录编号,定位到具体要删除的旅游资讯记录,并输出已有资讯记录。根据找到的记录,对其点赞数量进行加一操作。其具体操作结果如图10:

图10 点赞旅游资讯记录
退出程序:
选择功能q退出,程序将执行退出步骤,界面关闭。

总结:
从系统的需求分析开始,到后来的每一步,都需要围绕着一个整体的思路,一个工程的概念进行,需要逐层的将系统一步步分解,细化。然后,分别实现每一个功能,每一个模块,最后将全部模块整合起来,系统便成型了。在这段时间的软件设计中,遇到了各种各样的问题, 特别是实现。 由于第一次接触相关的数据结构知识,所以使用起来相当的吃力,几乎每一步都可能发生错误。为了解决这样那样的问题,我翻阅了不同的书籍,在网上搜索了大量的资料,一个一个的将问题解决掉。在这期间,无形中锻炼了我分析问题,解决问题的能里,锻炼了我自主学习的能力。

参考文献:
【1】谭浩强, C 程序设计 . 第三版 . 北京:清华大学出版社,2005
【2】谭浩强,C语言程序设计题解与上机指导. 清华大学出版社,2000
【3】陈朔鹰,C语言程序设计基础教程,兵器工业出版社,1994
【4】严蔚敏,数据结构(C语言版),清华大学出版社,2012

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值