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++)

本文来源:https://www.bwwdw.com/article/3ydi.html

Top