C语言职工档案管理系统 500多行代码
更新时间:2023-08-28 18:06:01 阅读量: 教育文库 文档下载
- 职工健康档案管理系统推荐度:
- 相关推荐
500多行代码,加了排序功能
C语言程序设计 课程设计报告
设计题目:职工档案管理系统设计
学 号班 级 电信一班 姓 名 陈文凯
2010年 2 月29 日
500多行代码,加了排序功能
1.程序的总体设计
职工档案管理系统设计,每个职工是一条记录,包括编号,姓名,性别,出生年月,所在
部门,职称,工资级别、电话等。系统可实现以下功能: 1、输入功能:输入每一位职工记录,将其信息存入文件中。 2、显示功能:完成全部职工记录的显示。
3、查找功能:完成按编号或姓名查找职工的相关记录,并显示。
2. 数据结构
对于这个职工档案系统的设计,我主要采用结构体存放不同类型的数据,运用数组对各数据进行控制,而所有数据(除ID外)都以字符型的形式存放,这样方便存入中文数据。本程序用指针相对较少,事实上,我只在文件的保存函数上用了指针。只要是因为我们对指针了解相对较少,而且指针相对容易出错误,而这个程序用结构体和数组就可以很好地完成。
3. 函数原型声明的说明(功能,参数,返回值)
500多行代码,加了排序功能
1.主函数 void main()
主函数的主意作用是调用函数以实现程序的预期功能,主函数有各函数的声明调用。主函数用switch语句对各函数进行调用。
2添加函数:void append()
该函数是无参函数,主要功能是添加职工,由于界面为DOS的命令界面,为了使添加更加人性化,我采用先确认添加人数,再对每个员工的每条信息,逐个添加,这样可以减少错误的发生和加快输入速度。员工添加后可用保存函数,将其数据保存到指定文件中。
3查找函数: void search()
该函数是无参函数,主要功能是查找员工,可按编号或姓名查找职工的相关记录,按姓名查找时采用字符串处理函数strcmp()进行比较,这样可以用两种方法查找职工信息。
4输出函数:void output()
该函数是无参函数,主要功能是输出全部员工的信息,用for语句进行输出。
5删除函数:void delete()
该函数是无参函数,主要功能是删除指定员工的全部信息,该函数相对较复杂,用for语句对删除后该员工后的员工的序号进行排列。
6修改函数:void modify()
该函数是无参函数,主要功能是修改指定员工的信息,该函数有密码操作,要输入密码后才能进入修改界面,密码操作采用while语句,用getch()输入密码,可以将密码隐藏。这里getch()函数要调用conio.h文件。
7保存函数:void save()
该函数是无参函数,主要功能是保存添加的员工信息到指定文件,该函数用到了指针和文件的内容。
8主菜单函数:void showmenu()
该函数是无参函数,主要功能是提供美观的菜单界面。
9文档导入函数:void read()
该函数是无参函数,主要功能是导入文件中的职工档案信息。
9数据排序函数:void sort()
500多行代码,加了排序功能
该函数是无参函数,主要将职工数据排序,分按编号排序和工资排序,工资排序又分从高到低和从低到高两种。
二、详细设计 1.main()流程图
500多行代码,加了排序功能
三、测试及调试(程序运行截图,测试方案、存在的问题及解决方法) (写明测试软件的时候采用的测试方法、测试数据,并说明在你软件设计、调试过程中
的遇到的问题和解决方案)
1.程序运行截图
a.这是添加数据的程序运行截图
500多行代码,加了排序功能
b.这是查找数据中的按姓名查找的程序运行截图
c.这是修改数据的程序运行截图,需要输入9个密码才能够修改。
500多行代码,加了排序功能
d.这是删除数据的程序运行截图,我们删除了职工
e.这是排序数据的程序运行截图
500多行代码,加了排序功能
2.测试方案、存在的问题及解决方法
我用的是visual C++ 6.0进行编译和测试的,主要观察程序运行的错误及找出错误发
生的原因,还有各函数的功能的实现以及部分变量在程序运行时的变化。采取逐个函数测验的方法 ,虽然比较耗时间,但是我实在没有找到可以检查我的海量错误的方法。下面是某此调试的截图。
可以看到,这时候几乎什么错误都有,低级的错误数不清,高级的错误无法数,在这样的
500多行代码,加了排序功能
局势下,我仍然心静如水地检查错误,下面介绍我遇到的问题及其解决方案。
我主要遇到了三个函数问题,第一,我原本想用数组代替指针,这样可以更好的检查错误,但是后来的的数据保存就遇到了问题,老是无法正确的保存数据,所以还是用了个FILE *fp,当然也为此狂看了文件一章,最后在数据导入也用到了指针和文件。第二,题目本没有要求写删除函数也没有要求写排序函数,也许修改函数能够代替删除函数的一部分功能,但是无法减少职工的数目,这个对于想裁员的公司不利,所以,我又想了一个删除函数。写删除函数遇到的问题是,我删除了编号为2的函数,如何把2后面的同志移到前面来,而1不动,后来还是用最笨的for语句搞定了,据说这里可以用链表很美妙地完成,但是也可以不用链表。排序函数是最后加上去的,一个原因是我的程序不够500行,就完成了功能,后来要求尽情发挥,我就用了排序函数,这个函数相对简单,用的是我们学过的起泡法排序,有按照编号和工资排序两种方式,也用到了switch语句,这样是程序的功能更加完善了。第三,密码的问题,密码函数是个比较严肃的函数,为此不能敷衍了事用个while语句和字符串处理函数搞定,这样密码是明文的,很别扭。所以,我又加了一个不熟悉的头文件#include <conio.h>,调用了这个文件里的getch()函数,这个函数能够不显示你输入的字符,很有保密特性。
程序设计其实是最大的问题,起初的两三天我根本就不知道从哪里入手,后来参考到可以用switch语句对各功能函数很好的利用,这里还用到了break语句,感觉,课堂上没讲的东西就是这么有用啊!
关于如何输入数据信息的问题,我起初准备用一个scanf语句,输入全部的职工信息,都是后来发现这样极易出现输入格式不正确的问题,后来就考虑用一个一个数据输入的方法,虽然这样做使代码长度加长了一些,但是这样输入简单明了更加人性化,所以我最终采用了逐个数据输入的方法。
我还用宏定义定义了一个最大员工数MAX_NUM,这样能够使程序更高效率更准确地运行,而且改变最大员工数业很方便。
最后谈谈调试错误的问题,上面已经晒了我的错误截图,感觉这些错误确实很震撼人,有时候就一个字符串函数应用错误,找了半天,居然发现strcmp前面忘记加“!”了,还有诸如忘记写“;”“}”,最头痛的还是把%s写成%d,这样程序能够运行,就是系统告诉你内存错误,搞得我以为电脑坏了,调了半天电脑,这就足够悲剧的。最后还是一点一点地去检查,不怕花费时间,就怕那些小东西太不入眼了。越是小的问题,可能浪费的时间就越让人感到悲愤,所以,细心检查永远是解决此类问题的良方。
四、小结(收获和建议)
通过本次课程设计我不仅温习了C程序设计课程的主体知识,还锻炼了对错误的承受能力,而且这个题目是我这辈子做过的最大的题目,搞了一个多星期才有一点点眉目,让人感到前途特别渺茫,也催迫着我不断前进。
开始时,对这个题目完全无从下手,后来列出了主函数和结构体,就慢慢算入门了,成天趴在电脑里,电脑前放着那本绿色的程序设计的书,外面冷风嗖嗖,鞭炮响起。明天就是除夕了,我要赶在春节前把这个题目做完。而现在函数全部写出来了,且运行的相当成功,几个特殊的功能函数也奇迹般的起作用了,小小的成功给了我大大的喜悦。这个时候,电脑不是机器,数据不是抽象,一切都像春风一样。
调试程序的时候情绪一直十分难控,一声声叹息加上使劲敲打键盘的声音还有怒目对视屏幕,这样感觉在无尽的黑暗中寻找黎明。现在黎明的曙光已经出现,感觉一切的努力都是那么值得,心胸豁然开朗。
当然也有没有解决的问题,就是我的密码不能够在程序运行的时候修改只能够在源程序
500多行代码,加了排序功能
上修改,后来想了很久也没有找到好的办法。
建议,由于在学校时没有上过几次实验课,理论的东西已经慢慢淡忘。所以建议以后此类的课尽量在实验室上好些,还有感觉只有一个题目没有啥挑战性,应该多布置几个
附件:主要源程序代码(需打印)
/*C语言课程设计任务书:职工档案管理系统设计*/ #include <stdio.h> #include<string.h> #include <stdlib.h> #include <conio.h> #include <stdlib.h>
#define MAX_NUM 900 struct worker {
int ID;
char Birth[20]; char Sex[20]; char Name[30]; char Telenum[20]; int Wage;
char Department[30]; char Job[30]; }
work[MAX_NUM];
void main() {
void showmenu(); /* 声明主菜单函数 */
void append(); /* 声明添加函数 */ void search(); /* 声明查找函数 */ void output(); /* 声明输出函数 */ void modify(); /* 声明修改函数 */ void deletes(); /* 声明删除函数 */ void save(); /* 声明保存函数 */ void read(); /* 声明录入函数 */ void sort(); /* 声明排序存函数 */ int m;
showmenu();
500多行代码,加了排序功能
scanf("%d",&m); for(;m>=0&&m<=8;) {
switch(m) {
case 1: append(); /* 用户选择 1 号菜单,程序执行 添加的数据文件的函数 */ break;
case 2: search();/* 用户选择 2号菜单,程序执行 查找数据的函数 */ break;
case 3: modify();/* 用户选择 3 号菜单,程序执行 修改数据的函数 */ break;
case 4: deletes();/* 用户选择 4号菜单,程序执行 删除数据的函数 */ break;
case 5: output();/* 用户选择 5号菜单,程序执行输出数据录的函数 */ break;
case 6: save();/* 用户选择 6 号菜单,程序执行保存数据的函数 */ break;
case 7: read();/* 用户选择7 号菜单,程序执行 读取文件的函数 */ break;
case 8: sort();/* 用户选择8 号菜单,程序执行 排序数据的函数 */ break;
case 0: exit(0);/* 用户选择 3 号菜单,程序执行退书的函数 */
printf("\n\n操作完毕,请再次选择!"); default:printf("错误,重新输入\n");} showmenu(); scanf("%d",&m); } }
/* 主菜单函数 */
void showmenu()/* 显示 主菜单,并返回用户所选择的 菜单项 的 编号 */ {
printf(" ********************************************************************\n"); printf(" ^^^^^^^^^^^^^^^^^^^^^^^职工档案管理系统^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf(" ----------------------------------设计者:陈文凯---------------------\n");
printf(" *******************************************************************\n"); printf(" \n"); printf("
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& \n"); printf(" & 1,添加职工 5,输出职工 & \n"); printf(" & 2,查找职工 6,保存职工 & \n"); printf(" & 3,修改职工 7,读取档案 & \n"); printf(" & 4,删除职工 8,职工排序 & \n"); printf("
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& \n");
500多行代码,加了排序功能
printf("--------------------------------------------退出,请按0----------------\n");
printf("请选择(0--8):"); }
/* 添加函数 */ void append() {int number,i; FILE *fp; char filepn[MAX_NUM];
system("cls"); printf("\n您选择的是添加职工!\n"); printf("\n请输入本次添加的职工人数: ");
scanf("%d",&number); if(number>MAX_NUM) {
printf("您输入的人数太多,大于 %d 人!\n",MAX_NUM); }
for(i=0;i<number;i++) {
printf("\n请输入第%d个职工的编号:\t",i+1); scanf("%d",&work[i].ID); printf("\t职工档案:\n"); printf("\t\t姓名:");
scanf("%s",&work[i].Name); printf("\t\t出生年月:"); scanf("%s",&work[i].Birth); printf("\t\t电话:");
scanf("%s",&work[i].Telenum); printf("\t\t性别:");
scanf("%s",&work[i].Sex); printf("\t\t工资:");
scanf("%d",&work[i].Wage); printf("\t\t部门:");
scanf("%s",&work[i].Department); printf("\t\t职称:");
scanf("%s",&work[i].Job); }
printf("\n您的输入是:\n");
printf(" **********************************职工档案信息库*************************\n"); printf(" 序号 编号 姓名 出生年月 电话\t 性别 \t工资\t部门\t职称\n"); for(i=0;i<number;i++)
500多行代码,加了排序功能
{
printf(" %d %d %s %s\t%s\t%s\t%d\t%s\t%s\n",i+1,work[i].ID,work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); }
printf(" *************************************************************************\n"); printf("\n");}
/* 查找函数 */ void search() {
system("cls"); int number=MAX_NUM,findID,v,i; char findName[30]; printf("\n您选择的是档案查询!\n");
printf(" *****************************请选择查询方式********************************\n");
printf("\t \t 1--按编号查找;\t \t \t \t 2--按姓名查找\n"); /*以下可以修改为子菜单方式:1--按编号查找,2--按姓名查找*/
printf(" ***************************************************************************\n"); printf("请选择:");scanf("%d",&v); switch(v) { case 1:
system("cls");
printf("\n您选择的是按编号查找!\n"); printf("\n请输入职工的编号: "); scanf("%d",&findID); for(i=0;i<number;i++) {
if(work[i].ID==findID) break; }
if(i<number) {
printf("查找结果如下:\n");
printf("\t编号\t姓名 \t出生年月\t电话\t 性别\t工资\t部门\t职称\n"); printf("\t%d\t%s
\t%s\t%s\t %s\t%d\t%s\t%s\n",work[i].ID,work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); }
else printf("您输入的编号不存在!\n"); break;
case 2:
500多行代码,加了排序功能
system("cls");
printf("\n您选择的是按姓名查找!\n"); printf("\n请输入职工的姓名: "); scanf("%s",&findName);; for(i=0;i<number;i++) {
if(!strcmp(work[i].Name,findName)) break; }
if(i<number) {
printf("查找结果如下:\n");
printf("\t编号\t姓名 \t出生年月\t电话\t 性别\t工资\t部门\t职称\n"); printf("\t%d\t%s
\t%s\t%s\t %s\t%d\t%s\t%s\n",work[i].ID,work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); }
else printf("您输入的姓名不存在!\n"); break; } }
/* 输出函数 */ void output()
{int i,number=MAX_NUM; system("cls"); printf("查找结果如下:\n");
printf("\t编号\t姓名 \t出生年月\t电话\t 性别\t工资\t部门\t职称\n"); for(i=0;i<number;i++) {
printf("\t%d\t%s
\t%s\t%s\t %s\t%d\t%s\t%s\n",work[i].ID,work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); } }
void deletes()
{int findID,i,j,number=MAX_NUM; system("cls"); printf("\n您选择的是档案删除!\n"); printf("\n请输入职工的编号: "); scanf("%d",&findID); for(i=0;i<number;i++) {
if(work[i].ID==findID) break; }
500多行代码,加了排序功能
printf("\t编号\t姓名 \t出生年月\t电话\t 性别\t工资\t部门\t职称\n"); if(i<number)
{ for(j=i;j<number-1;j++) { work[j].ID=work[j+1].ID; strcpy(work[j].Name,work[j+1].Name); strcpy(work[j].Telenum,work[j+1].Telenum); strcpy(work[j].Birth,work[j+1].Birth); strcpy(work[j].Sex,work[j+1].Sex); work[j].Wage=work[j+1].Wage;
strcpy(work[j].Department,work[j+1].Department); strcpy(work[j].Job,work[j+1].Job); }
for(i=0;i<number-1;i++) { printf("\t%d\t%s
\t%s\t%s\t %s\t%d\t%s\t%s\n",work[i].ID,work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); } } else
for(i=0;i<number-1;i++) printf("\t%d\t%s
\t%s\t%s\t %s\t%d\t%s\t%s\n",work[i].ID,work[i].Name,work[i].Telenum,work[i].Birth,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); number--; }
/* 修改函数 */ void modify() { int findID,i,number=MAX_NUM; system("cls"); char yz[9],psw[9]={"12345678"}; printf("\n您选择的是档案修改!\n"); while(1) {
printf("\n请输入密码!\n"); for(i=0;i<9;i++) {
yz[i]=getch(); printf("*");
500多行代码,加了排序功能
if(yz[i]=='\r') {
yz[i]='\0'; break; } }
if(!strcmp(psw,yz)) {
printf("\n密码正确!\n"); break; } else
printf("密码错误,请重输!\n"); }
printf("\n请输入职工的编号: "); scanf("%d",&findID); for(i=0;i<number;i++) {
if(work[i].ID==findID) break; }
if(i<number) {
printf("\t姓名 \t出生年月电话\t\t 性别\t工资\t部门\t职称\n"); printf("原档案:\n\t%d \t%s\t%s\t %s\t%d\t%s\t%s\n",work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); printf("请输入新档案:\n "); printf("\t\t姓名:");
scanf("%s",&work[i].Name); printf("\t\t出生年月:"); scanf("%s",&work[i].Birth); printf("\t\t电话:");
scanf("%s",&work[i].Telenum); printf("\t\t性别:");
scanf("%s",&work[i].Sex); printf("\t\t工资:");
scanf("%d",&work[i].Wage); printf("\t\t部门:");
scanf("%s",&work[i].Department); printf("\t\t职称:");
scanf("%s",&work[i].Job);
printf("\n您的输入是:\n");
printf(" **********************************职工档案信息库*************************\n");
500多行代码,加了排序功能
printf(" 序号 编号 姓名 出生年月 电话\t 性别 \t工资\t部门\t职称\n"); for(i=0;i<number;i++) {
printf(" %d %d %s %s\t%s\t%s\t%d\t%s\t%s\n",i+1,work[i].ID,work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); }
printf(" *************************************************************************\n"); printf("\n");} else printf("您输入的编号不存在!\n"); }
/* 保存函数 */ void save() { FILE *fp; char filepn[MAX_NUM]; int number=MAX_NUM,i; system("cls"); printf("您选择的是职工档案的保存!\n"); printf("请输入文件路径及文件名:"); scanf("%s",filepn);
if((fp=fopen(filepn,"w+"))==NULL) {
printf("不能打开文件!\n"); }
for (i=0;i<number;i++) {
if (fwrite(&work[i],sizeof(struct worker),1,fp)!=1) {
printf("写入文件错误!\n"); } } fclose(fp);
printf("文件已经保存!\n"); }
/* 读取档案函数 */ void read() { FILE *fp; char filepn[MAX_NUM];
500多行代码,加了排序功能
int number=MAX_NUM,i; system("cls"); printf("您选择的是职工档案的读取!\n"); printf("请输入文件路径及文件名:");
scanf("%s",filepn);/*输入文件路径及名称*/ if((fp=fopen(filepn,"r+"))==NULL) {
printf("不能打开文件!\n"); } i=0;
while(!feof(fp)) {
fread(&work[i++],sizeof(struct worker),1,fp); }
number=i-1; }
/*排序函数*/ void sort() {
int i,j,n=MAX_NUM,s,v; char temp[20];
printf("\n您选择的是数据排序!\n");
printf(" *****************************请选择排序方式********************************\n");
printf("\t \t 1--按编号排序;\t \t \t \t 2--按工资排序\n"); /*以下可以修改为子菜单方式:1--按编号排序,2--按工资排序*/
printf(" ***************************************************************************\n"); printf("请选择:"); scanf("%d",&v); switch(v) { case 1:
for(i=0;i<=n;i++) {
for(j=i+1;j<=n;j++)
if(work[j].ID<work[i].ID) {
strcpy(temp,work[i].Birth);
strcpy(work[i].Birth,work[j].Birth); strcpy(work[j].Birth,temp); strcpy(temp,work[i].Name);
strcpy(work[i].Name,work[j].Name); strcpy(work[j].Name,temp);
500多行代码,加了排序功能
strcpy(temp,work[i].Sex);
strcpy(work[i].Sex,work[j].Sex); strcpy(work[j].Sex,temp); s=work[i].Wage;
work[i].Wage=work[j].Wage; work[j].Wage=s;
strcpy(temp,work[i].Telenum);
strcpy(work[i].Telenum,work[j].Telenum); strcpy(work[j].Telenum,temp); strcpy(temp,work[i].Department);
strcpy(work[i].Department,work[j].Department); strcpy(work[j].Department,temp); strcpy(temp,work[i].Job);
strcpy(work[i].Job,work[j].Job); strcpy(work[j].Job,temp); s=work[i].ID;
work[i].ID=work[j].ID; work[j].ID=s; } }
printf(" 新的排序如下:\n");
printf("\t编号\t姓名 \t出生年月\t电话\t 性别\t工资\t部门\t职称\n"); for(i=0;i<n;i++) {
printf("\t%d\t%s
\t%s\t%s\t %s\t%d\t%s\t%s\n",work[i].ID,work[i].Name,work[i].Birth,work[i].Telenum,work[i].Sex,work[i].Wage,work[i].Department,work[i].Job); }
break ; case 2: int k; printf("\n您选择的是按工资排序!\n");
printf(" *****************************请选择排序方式********************************\n");
printf("\t \t 1--按工资从高到低排序;\t \t \t \t 2--按工资从低到高排序\n"); /*以下可以修改为子菜单方式:1--按工资从高到低排序;2--按工资从低到高排序*/
printf(" ***************************************************************************\n"); printf("请选择:"); scanf("%d",&k); switch(k) { case 1:
for(i=0;i<=n;i++) {
for(j=i+1;j<=n;j++)
正在阅读:
C语言职工档案管理系统 500多行代码08-28
计算机原理(含综合答案)12-22
2017年修订版粮油仓储设施新建项目建设可行性研究报告05-15
2017-2018高中语文复习-高考新材料作文的拟题-导学案03-08
瘦身广告语02-07
学校2022年开展健康教育活动方案范文03-25
安全评价课程设计04-27
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 多行
- 管理系统
- 职工
- 语言
- 代码
- 档案
- 500
- 城市轨道交通建设工程验收管理暂行办法建质〔2014〕42号
- 初三上册数学教学工作总结
- 幼儿园大班周计划表8888
- C++实验题
- 半年度报告内容及格式指引
- 2018-2023年中国床上用品行业市场深度调研分析与投资机会研究报告
- 临床心电图学教程
- 冶金清洁生产的基本特征与方法
- 2010司考卷四真题及答案
- 2019-2020年高二上学期地理第一次月考试卷
- 蜂蜜知识大全
- 2015年湖北省职称计算机考试模拟软件及合格标准
- 2011年全国中考英语八大时态试题汇编之一——现在进行时和一般现在时
- 014单元13:养成良好的工作习惯
- 《环境监测技术》考试题及答案B
- 第3章UGIS空间数学模型
- 策划一场完美婚礼
- 韩国音乐完整版3
- 空气悬架项目可行性研究报告(专业经典案例)
- 王河煤矿10806工作面底板加固钻探设计