专家信息管理软件Word格式文档下载.docx
《专家信息管理软件Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《专家信息管理软件Word格式文档下载.docx(32页珍藏版)》请在冰点文库上搜索。
为了设计和实现程序,实现专家信息管理系统,首先要将信息储存在一个文件,以便后面的查找,删除,排序的功能,因此需要用到文件的的东西,让信息存在硬盘上,为了使程序清楚易懂,存储的结构可以用单链表或者循环链表,也可以自己设计一个存储结构,还可以使用文件的可能,直接将信息录入文件当中,但是这个结构在删除信息时实现有点难度,所以建议不要用文件,但是可以尝试。
最后根据课设题目的要求,我将程序划分了三个主要功能如下所示:
(1).录入,修改和专家信息;
(2).查找:
按照姓名查找,查找时用折半查找算法;
(3).排序:
对专家的知名度排序,使用的算法不唯一;
1.2课程设计要求
为了使程序尽可能的完善,需要多的借鉴其他人的的开发实例,完成课设设计,必须要满足以下三点要求:
(1).开发工具可以选择C语言或面向对象设计的C++;
(2).按时独立完成课设任务;
(3).按照课设规范,书写好报告;
2详尽设计
2.1课设题目粗略分析
根据课设题目要求,拟将整体程序分为七大模块。
此七个模块相互联系,有嵌套调用的情况,以下是七个模块的大体分析:
1.录入模块,将专家的信息通过存储函数存储;
2.查找模块,输入一个专家的名字,然后格式化输出;
3.修改模块,查找一个专家的信息后,在修改他的信息;
4.删除模块,输入名字查找到一个专家信息后,然后删除;
5.排序模块,按照专家的知名度进行排序;
6.存储模块,将输入的专家信息存在D盘zhuanjia文件;
7.显示模块,显示专家的信息;
2.2存储结构介绍
typedefstructnode
{
charname[40];
//专家姓名
charsex[20];
//专家性别
intknown;
//专家知名度
}node;
2.3原理图和流程图介绍
2.3.1功能模块图(如图2.3.1所示)
图2.3.1功能模块图
录入专家信息:
需要录入的专家信息是专家的姓名,性别,知名度,在录入时采用的结构是数组结构。
查找专家信息:
查找时,采用的是折半查找,当查找到相关的信息后,就将与之相对应数组的下标返回来,然后调用输出将剩余的信息输出来。
修改专家信息:
修改时,采用的是逐次查找,当找到相关的信息时,讲述要修改的信息输入即可。
删除专家信息:
删除时,还是采用逐次查找的方法,找到专家信息后,采用将数组后的信息向前移动一个存储单元的形式将那个信息覆盖掉。
排序专家信息:
比较知名度的大小,利用的是冒泡的算法。
显示专家信息:
定义了一种格式化输出模式,调用即可以格式化输出。
存储专家信息:
输入一条专家信息就向文件当中记录一条信息。
2.3.2录入专家信息(如图2.3.2所示)
Y
N
图2.3.2录入模块流程图
说明:
录入专家的信息(专家的姓名,性别和知名度),如果想要结束文件的的输入,输入“00”字符时,结束输入程序,返回专家信息的条数,并调用显示函数,将文件中的信息显示出来。
2.3.3查找专家信息(如图2.3.3所示)
图2.3.3查找模块流程图
输入专家的姓名,寻找专家的信息,利用的是Locate这个函数找到存储该信息的存储位置,然后将该信息的位置给Disp这个函数。
最后利用这个位置将信息显示出来,如果显示函数返回的值不是负一时,才能输出专家信息。
如果返回的值不是负一,那么将会显示查询不成功!
2.3.4修改模块(如图2.3.4所示)
y
图2.3.4修改模块流程图
这个模块是修改专家的信息,要想修改专家的信息,我们必须找到存储该专家信息的位置,然后再将输入的信息将替换掉需要查找的信息,这个程序只允许一次更改一个信息,不能大面积的改动专家的信息,如果需要更改很多的信息,需要不停的选择删除功能!
2.3.5删除模块(如图2.3.5所示)
图2.3.5删除模块流程图
利用Locate函数将需要删除的专家信息的存储位置找到后,从这个函数当中得到信息的存储位置i,然后就将它之后的信息依次向前移动,把专家之后的信息都往前移动一位。
2.3.6排序模块(如图2.3.6所示)
图2.3.6排序模块流程图
从第一个专家信息中知名度开始比较每个信息中的专家知名度,利用冒泡的算法进行程序,使用循环的方法,如果前一个专家的知名度小于他后一个的专家的知名度,则交换专家的姓名,性别和知名度的信息,在交换的过程当中,需要另外申请一个空的存储结构,以便实现交换两者之间的信息的功能。
2.3.7显示模块(如图2.3.7所示)
图2.3.7显示模块流程图
该模块是程序中用的最多的函数,因此,为了能更好的显示出专家的信息,我决定采用了重新定义一种新的输出结构的输出方法,该输出方法只需要知道信息的条数和数组的首地址即可,从而会输出文件中的信息,知道文件中没有信息可以在输出为止。
2.3.8存储模块(如图2.3.8所示)
图2.3.8存储模块流程图
这个模块是为了更好地实现程序,使得可以查找到以前的历史记录而建立的一个函数,所用到的知识均是文件当中的信息。
3调试分析
最初在使用显示函数的时候,我是采用的指针形式,但是有时出现提示我内存read出现了错误,我不得不使用循环结构输出,这样解决了输出问题。
主函数时,因为没有采用循环结构,所以每次只能实现一个功能,就必须按0退出函数,需要实现另外一个功能时,用必须重新进入函数。
我在一本书上看见了一个通讯录的程序后,我修改了输出的格式和主函数,之后的界面就看觉好多了,而且不用退出函数就可以实现全部功能。
在输出函数时,我的想法是使用指针知道数组的首地址后,逐渐输出信息知道指针所指的信息为空时,停止向屏幕上输出信息。
编译都能过去,但是就是不能显示出来,我将指针指向头结点的下一个,输出的是乱码。
我决定不再用指针了,还是用想for循环控制输出,问题最终被解决点了。
其次就是循环控制时,需要仔细的分析。
我记得在Locate这个函数时,最初自己没有想到直接把那个信息的位置找到,我想的是找到它的前一个和后一个,就可以实现删除功能。
但是我不是采用的链式存储,这想做适合链表,不适合数组,最后我想到冒泡过程中交换过程中的方法。
只要把需要查找的信息位置找到,把他之后的信息依次向前移动,这样利用覆盖就可以把信息删除。
我在开始的时候把读入文件信息的程序写到主函数中,发现读进文件信息有问题,有的时候读进后打印信息时就少了一个人信息,后来我尝试把读入单独写成一个函数,这样读入会减少错误的可能性,我也发现到主函数信息主要就是调用各功能函数,这样错误机会更少,而且程序结构更清晰
步步调试,有时候代码能够通过编译,但是不能执行,这个时候只有一步一步的调试。
有时候修改了变量以后,忘记了在后面加‘;
’号,这个错误犯了不止一次,这个问题提醒自己每次的改动都要小心,不要心急!
4使用方法与结果
没有信息存在文件当中,选择1,开始录入信息,输入00结束(如图4.1):
图4.1
显示输入的专家信息(如图4.2):
图4.2
选择3,输入专家姓名,删除专家(如图4.3)
图4.3
显示菜单,选择功能(如图4.4):
图4.4
选择4,输入专家姓名,(下图为未找到专家信息,如图4.5):
图4.5
下图为找到专家信息,并显示(图4.6):
图4.6
选择5,修改专家信息(下图为修改之前,如图4.7):
图4.7
下图为修改之后(如图4.8):
图4.8
选择6,对专家知名度排序(下图为排序之前,如图4.9):
图5.9
下图为排序之后(如图4.10):
图4.10
选择0,结束程序(如图4.11):
图4.11
参考文献
[1]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2007.
[2]张长海,陈娟.C程序设计[M].北京:
高等教育出版社,2004.
[3]谭浩强.C程序设计[M].北京:
清华大学出版社,2005.
[4]王敬华,林萍.C程序设计[M].北京:
清华大学出版社,2011.
[5]郭翠英.C语言课程设计[M].北京:
中国水利水电出版社,2004.
[6]吴元斌,应宏.C程序设计设计简明教程[M].北京:
理工大学出版社,2011.
[7]滕国文.数据结构课程设计[M].北京:
清华大学出版社,2010.
[8]李春葆.数据结构[M].北京:
清华大学出版社,2000.
[9]王裕明,李旭芳.数据结构与程序设计[M].北京:
[10]唐发根.数据结构[M].北京:
科学出版社,2004.
[11]WalterSavitch.C++面向对象程序设计[M].北京:
附录(关键部分程序清单)
程序代码
#include"
stdafx.h"
#include<
stdio.h>
stdlib.h>
string.h>
#defineHEADER1"
@@@@@@@@@@@@@@@专家信息管理@@@@@@@@@@@@@@@\n"
#defineHEADER2"
|姓名|性别|知名度|\n"
#defineHEADER3"
|_____________|_____________|____________|\n"
#defineFORMAT"
|%12s|%12s|%10d|\n"
#defineDATAp->
name,p->
sex,p->
known
#defineN100
intsaveflag=0;
voidprintfheader();
//格式化表头
voidprintfdata(nodepp);
//格式化输出表中数据
voidmenu();
//主菜单
intlocate(nodetemp[],intn,charfindmess);
//信息查找
voidArrangename(nodetemp[],intn);
//按字典顺序对专家排序
voidDisp(nodetemp[],intn);
//显示专家记录
intAdd(nodetemp[],intn);
//录入专家信息
voidSearch(nodetemp[],intn);
//查找专家的信息
voidRevise(nodetemp[],intn);
//修改专家信息
intDel(nodetemp[],intn);
//删除专家信息
voidSort(nodetemp[],intn);
//按知名度从高到低排序
voidSave(nodetemp[],intn);
//保存文件
voidmain()
nodetele[N];
intselect;
intcount=0;
FILE*fp;
fp=fopen("
d:
\\zhuanjian"
"
a+"
);
if(fp==NULL)
{
printf("
没有打开文件"
exit(0);
}
while(!
feof(fp))
if(fread(&
tele[count],sizeof(node),1,fp)==1)//一次从文件中读取一条专家信息
count++;
fclose(fp);
//关闭文件
\n一共有%d个数据\n:
"
count);
while
(1)
menu();
选择功能,0为退出!
\n"
scanf("
%d"
&
select);
switch(select)
{
case1:
count=Add(tele,count),Save(tele,count);
break;
case2:
Disp(tele,count);
case3:
count=Del(tele,count),Save(tele,count);
case4:
Search(tele,count),Save(tele,count);
case5:
Revise(tele,count),Save(tele,count);
case6:
Sort(tele,count),Save(tele,count);
default:
printf("
谢谢使用!
}
}
voidprintfheader()//格式化表头
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
voidprintfdata(nodepp)//格式化输出表中数据
node*p;
p=&
pp;
printf(FORMAT,DATA);
voidmenu()//主菜单
********请输入数字选择功能*******\n"
1增加专家信息;
2显示专家信息;
3删除专家信息;
4查找专家信息;
5修改专家信息;
6按知名度对专家信息排序;
*********************************\n"
intlocate(nodetemp[],intn,charfindmess[20])//信息查找
intlow=0,high=n-1,mid;
Arrangename(temp,n);
while(low<
=high)
mid=(low+high)/2;
if(strcmp(temp[mid].name,findmess)==0)
returnmid;
if(strcmp(temp[mid].name,findmess)>
0)
high=mid-1;
else
low=mid+1;
return(-1);
voidArrangename(nodetemp[],intn)//姓名排序,字典顺序
inti,k;
nodenewinfo;
for(k=0;
k<
n-1;
k++)
for(i=1;
i<
n-k;
i++)
if(strcmp(temp[i-1].name,temp[i].name)>
strcpy(newinfo.name,temp[i-1].name);
strcpy(newinfo.sex,temp[i-1].sex);
newinfo.known=temp[i-1].known;
strcpy(temp[i-1].name,temp[i].name);
strcpy(temp[i-1].sex,temp[i].sex);
temp[i-1].known=temp[i].known;
strcpy(temp[i].name,newinfo.name);
strcpy(temp[i].sex,newinfo.sex);
temp[i].known=newinfo.known;
voidDisp(nodetemp[],intn)//显示专家记录
inti;
if(n==0)//没有信息
printf("
没有信息现在可以输入记录输入00结束输入\n"
return;
printfheader();
i=0;
while(i<
n)
printfdata(temp[i]);
i++;
printf(HEADER3);
intAdd(nodetemp[],intn)//录入专家信息
charname[20];
intk=0;
Disp(temp,n);
输入姓名:
\n"
scanf("
%s"
name);
if(strcmp(name,"
00"
)==0)
break;
strcpy(temp[n].name,name);
}
输入性别:
temp[n].sex);
输入知名度:
temp[n].known);
n++;
returnn;
voidSearch(nodetemp[],intn)//查找专家的信息
charsearch[40];
intp=0;
if(n<
=0)
没有这个专家信息!
return;
输入需查找的专家的名字:
search);
p=locate(temp,n,search);
if(p!
=-1)
printfheader();
printfdata(temp[p]);
else
没有找到这个专家信息!
voidRevise(nodetemp[],intn)//修改专家信息
charlookname[40];
intp=0,i=0;
没有这个专家的信息!
return;
修改专家信息\n"
你要修改的专家的名字:
lookname);
p=locate(temp,n,lookname);
temp[p].name);
\n输入性别:
temp[p].sex);
\n输入知名度:
temp[p].known);
intDel(nodetemp[],intn)//删除专家信息
没有专家信息!
全部的专家信息:
需删除专家的姓名:
for(i=p+1;
n;
strcpy(temp[i-1].name,temp[i].name);
删除成功!
n=n-1;
删除后的专家信息为\n"
else
没有找到要删除的专家信息\n"
voidSort(nodetemp[],intn)//按知名度从高到低排序
inti=0,j=0,k;
return;
if(temp[i-1].known<
temp[i].known)
{
strcpy(newinfo.name,temp[i-1].name);
newinfo.known=temp[i-1].known;
strcpy(temp[i-1].name,temp[i].name);
temp[i-1].known=temp[i].known;
strcpy(temp[i].name,newinfo.name);
temp[i].known=newinfo.known;
}
voidSave(nodetemp[],intn)//保存文件
FILE*fp;
inti=0;
w"
if(fp==NUL