职工信息管理系统实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

职工信息管理系统
一、课题内容和要求
要求对职工信息有增加、查找功能和删除功能。

职工信息包括工号、姓名、性别、年龄。

(1)增加员工记录要求用户输入4项内容,并创建结点链入已存在的链表尾部,如果是第一个记录请创建头结点。

查找员工记录要求用户输入要查找的员工编号完成查找工作并输出该员工信息。

删除员工记录要求用户输入要删除的员工编号完成查找和拆链工作。

(2)在增加和删除完一个员工记录之后应该把所有的员工记录都打印出来。

(3)请将所有职工信息存入文件当中,并在主界面中显示一条“读取文件职工信息”,该功能可将文件中的职工信息打印至屏幕。

二、需求分析
菜单函数(表现层):包括主菜单和查询菜单。

对职工信息操作的函数(逻辑层):包括添加职工信息、删除职工信息、修改职工信息、查询职工信息和查询全部职工信息。

对文件操作的函数(数据层):把数据写入文件中,注意是把整条链表的数据都写入。

利用文件指针可以完成:从文件中读取所有数据、从文件中查找符合条件的数据、从文件中删除符合条件的数据和从文件中修改符合条件的数据。

对链表操作的函数(存储结构):新建链表或新建一个结点,插入、删除、修改结点,销毁一个链表。

其它的函数:设计光标位置函数、显示职工信息(属于表现层)、登陆函数(属于表现层)和主函数(主要进行身份识别和管理员登陆)。

三、概要设计
职工信息包括以下几点:
1.工号
2.姓名
3.性别
4.年龄
其中对职工信息的操作包括以下几点:
1.增加职工信息
2.修改职工信息
3.删除职工信息
4.查询职工信息
四、源程序代码
//包含的头文件
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"Conio.h"
#include"windows.h"
#include"math.h"
//职工结构体的定义
struct employee
{
char num[30];//职工编号,唯一标识这个职工,不能重复char name[30];//姓名
char sex[30];//性别
char age[30];//年龄
};
//链表结点的定义
typedef struct node
{
struct employee e;
struct node * next;
}ListNode,*LinkList;
//函数声明
void Gotoxy(int x,int y);
int addInfo(LinkList pnode);
int delInfo(LinkList pnode);
int modInfo(LinkList pnode);
LinkList searchInfo(LinkList pnode);
void addFile(LinkList head);
LinkList getFile();
LinkList getByNode(LinkList pnode);
int deleteByNode(LinkList pnode);
int modifyByNode(LinkList oldNode,LinkList newNode); LinkList creatListOrNode();
void addNode(LinkList head,LinkList pnode);
int delNode(LinkList head,LinkList pnode);
int modNode(LinkList head,LinkList pnode,LinkList newNode); void displayInfo(LinkList head);
int login();
void mainMenu();
void searchMenu();
LinkList searchAllInfo();
void destroy(LinkList head);
/************* 以下是菜单函数(表现层)**************/
//主菜单
void mainMenu()
{
LinkList pnode=creatListOrNode();
LinkList p=creatListOrNode();
int nChoice=1;
while(nChoice)
{
strcpy(pnode->e.num,"null");
strcpy(pnode->,"null");
strcpy(pnode->e.sex,"null");
system("cls");//清屏
Gotoxy(25,3);
printf("**********************************");
Gotoxy(25,4);
printf("** 职工信息管理系统**");
Gotoxy(25,5);
printf("**********************************");
Gotoxy(25,6);
printf("** —操作选单—**");
Gotoxy(25,7);
printf("添加职工信息——————————1");
Gotoxy(25,8);
printf("删除职工信息——————————2");
Gotoxy(25,9);
printf("修改职工信息——————————3");
Gotoxy(25,10);
printf("查询职工信息——————————4");
Gotoxy(25,11);
printf("返回——————————————0");
Gotoxy(25,12);
printf("**********************************");
Gotoxy(25,13);
printf("** 请用数字键选择操作**");
Gotoxy(25,14);
scanf("%d",&nChoice);
Gotoxy(25,15);
switch(nChoice)
{
case 1:
Gotoxy(25,16);
printf("请按顺序输入职工信息\n(职工号姓名性别年龄)");
Gotoxy(0,18);
scanf("%s%s%s%s" ,pnode->e.num,pnode->,pnode->e.sex,pnode->e.age);
if(addInfo(pnode))
{
Gotoxy(25,19);
printf("添加成功! 按任意键后重新选择!");
getch();
}
else
{
Gotoxy(25,19);
printf("此工号已存在,添加失败! 按任意键后重新选择!");
getch();
}
break;
case 2:
Gotoxy(25,16);
printf("请按顺序输入职工号:");
Gotoxy(25,18);
scanf("%s",pnode->e.num);
if(delInfo(pnode))
{
Gotoxy(25,19);
printf("删除成功! 按任意键后重新选择!");
getch();
}
else
{
Gotoxy(25,19);
printf("此工号不存在,删除失败! 按任意键后重新选择!");
getch();
}
break;
case 3:
Gotoxy(25,16);
printf("请按顺序输入职工号:");
Gotoxy(25,18);
scanf("%s",pnode->e.num);
p=searchInfo(pnode)->next;
if(p!=NULL)
{
Gotoxy(0,19);
printf("%-8s%-8s%-8s%-8s","工号","姓名","性别","年龄");
Gotoxy(0,20);
printf("%-8s%-8s%-8s%-8s",p->e.num,p->,p->e.sex,p->e.age);
Gotoxy(0,21);
printf("请按顺序输入职工信息\n(姓名性别年龄)");
Gotoxy(0,23);
scanf("%s%s%s%s" ,pnode->,pnode->e.sex,pnode->e.age);
modInfo(pnode);
Gotoxy(25,24);
printf("修改成功! 按任意键后重新选择!");
getch();
}
else
{
Gotoxy(25,19);
printf("此工号不存在,修改失败! 按任意键后重新选择!");
getch();
}
break;
case 4:
searchMenu();
break;
case 0:
nChoice=0;
break;
default :
Gotoxy(25,22);
printf("输入错误!请重新输入!");
Gotoxy(25,23);
printf("按任意键后重新选择!");
getch();
}
}
}
//查询菜单
void searchMenu()
{
LinkList pnode=creatListOrNode();
LinkList p=creatListOrNode();
int nChoice=1;
while(nChoice)
{
strcpy(pnode->e.num,"null");
system("cls");//清屏
Gotoxy(25,3);
printf("**********************************"); Gotoxy(25,4);
printf("** 查询菜单**"); Gotoxy(25,5);
printf("**********************************"); Gotoxy(25,6);
printf("** —操作选单—**"); Gotoxy(25,7);
printf("按工号查找———————————1"); Gotoxy(25,8);
printf("显示全部职工信息————————2"); Gotoxy(25,9);
printf("返回上一级菜单—————————0"); Gotoxy(25,10);
printf("**********************************"); Gotoxy(25,11);
printf("** 请用数字键选择操作**"); Gotoxy(25,12);
scanf("%d",&nChoice);
Gotoxy(25,13);
switch(nChoice)
{
case 1:
Gotoxy(25,14);
printf("请按顺序输入职工工号:");
Gotoxy(25,15);
scanf("%s",pnode->e.num);
p=searchInfo(pnode);
displayInfo(p);
break;
case 2:
p=searchAllInfo();
displayInfo(p);
break;
case 0:
nChoice=0;
break;
default :
Gotoxy(25,19);
printf("输入错误!请重新输入!");
Gotoxy(25,20);
printf("按任意键后重新选择!");
getch();
}
}
}
/************* 以上是菜单函数(表现层)**************/
/************* 以下是对职工信息操作的函数(逻辑层)**************/ //添加职工信息
int addInfo(LinkList pnode)
{
LinkList head=getFile();
LinkList p=creatListOrNode();
strcpy(p->e.num,pnode->e.num);
if(getByNode(p)->next!=NULL)//说明此工号已经存在,不能添加
{
return 0;
}
else//此工号没记录,可以添加
{
addNode(head,pnode);
addFile(head);
return 1;
}
}
//删除职工信息
int delInfo(LinkList pnode)
{
return deleteByNode(pnode);
}
//修改职工信息
int modInfo(LinkList pnode)
{
return modifyByNode(getByNode(pnode)->next,pnode);
}
//查询职工信息
LinkList searchInfo(LinkList pnode)
{
return getByNode(pnode);
}
//查询出全部职工信息
LinkList searchAllInfo()
{
return getFile();
}
/************* 以上是对职工信息操作的函数(逻辑层)**************/
/************* 以下是对文件操作的函数(数据层)**************/
//把数据写入文件中,注意是把整条链表的数据都写入
void addFile(LinkList head)
{
//文件指针
FILE *fp;
LinkList p=head->next;
if((fp=fopen("employeeInfo.txt","w"))==NULL)
{
printf("不能打开该文件!\n");
exit(0);
}
while(p!=NULL)
{
fprintf(fp,"%-8s%-8s%-8s%-8s\n",p->e.num,p->,p->e.sex,p->e.age);
p=p->next;
}
if(fclose(fp))
{
printf("不能关闭文件!\n");
exit(0);
}
}
//从文件中读出所有数据
LinkList getFile()
{
LinkList newList=creatListOrNode();
FILE *fp;
if((fp=fopen("employeeInfo.txt","r"))==NULL)
{
fp=fopen("employeeInfo.txt","a+");
}
while(!feof(fp))
{
LinkList pnode=creatListOrNode();
fscanf(fp,"%s%s%s%s\n",pnode->e.num,pnode->,pnode->e.sex,pnode->e.age);
if(ftell(fp)!=0)
{
addNode(newList,pnode);
}
}
if(fclose(fp))
{
printf("不能关闭文件!\n");
exit(0);
}
return newList;
}
//从文件中查找符合条件的数据
LinkList getByNode(LinkList pnode)
{
LinkList newList=creatListOrNode();
LinkList p=getFile();
p=p->next;
while(p!=NULL)
{
LinkList q=creatListOrNode();
if(strcmp(p->e.num,pnode->e.num)==0 || strcmp(p->,pnode->)==0 || strcmp(p->e.sex,pnode->e.sex)==0 )
{
q->e=p->e;
addNode(newList,q);
}
p=p->next;
}
return newList;
}
//从文件中删除符合条件的数据
int deleteByNode(LinkList pnode)
{
int f=0;
LinkList head=getFile();
LinkList p=head->next;
while(p!=NULL)
{
if(strcmp(p->e.num,pnode->e.num)==0)
{
delNode(head,p);
f=1;
break;
}
p=p->next;
}
if(f==1)
{
addFile(head);
return 1;
}
else
return 0;
}
//从文件中修改符合条件的数据
int modifyByNode(LinkList oldNode,LinkList newNode)
{
int f=0;
LinkList head=getFile();
LinkList p=head->next;
while(p!=NULL)
{
if(strcmp(p->e.num,oldNode->e.num)==0)
{
modNode(head,p,newNode);
f=1;
break;
}
p=p->next;
}
if(f==1)
{
addFile(head);
return 1;
}
else
return 0;
}
/************* 以上是对文件操作的函数(数据层)**************/
/************* 以下是对链表操作的函数(存储结构)**************/ //新建链表或新建一个结点
LinkList creatListOrNode()
{
LinkList head=(LinkList)malloc(sizeof(ListNode));
head->next=NULL;
return head;
}
//往链表中插入一个结点
void addNode(LinkList head,LinkList pnode)
{
if(head->next==NULL)
{
head->next=pnode;
pnode->next=NULL;
}
else
{
pnode->next=head->next;
head->next=pnode;
}
}
//删除一个结点
int delNode(LinkList head,LinkList pnode)
{
LinkList p,q;
p=head->next;
q=head;
while(p!=NULL)
{
if(p==pnode)
{
break;
}
q=p;
p=p->next;
}
if(p!=NULL)
{
q->next=p->next;
free(p);
return 1;
}
else
return 0;
}
//修改一个结点
int modNode(LinkList head,LinkList pnode,LinkList newNode) {
LinkList p;
p=head->next;
while(p!=NULL)
{
if(p==pnode)
{
break;
}
p=p->next;
}
if(p!=NULL)
{
p->e=newNode->e;
return 1;
}
else
return 0;
}
//销毁一个链表
void destroy(LinkList head)
{
LinkList p=creatListOrNode();
p=head->next;
while(p!=NULL)
{
free(p);
p=p->next;
}
}
/************* 以上是对链表操作的函数(存储结构)**************/
/************* 以下是其它的函数**************/
//设置光标位置函数
void Gotoxy(int x,int y)
{
COORD c;//坐标结构体
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);//设置光标位置
}
//显示职工信息(属于表现层)
void displayInfo(LinkList head)
{
int i=21;
LinkList p=head->next;
if(p==NULL)
{
Gotoxy(25,20);
printf("没有记录!");
}
else
{
Gotoxy(0,20);
printf("%-8s%-8s%-8s%-8s","工号","姓名","性别","年龄");
while(p!=NULL)
{
Gotoxy(0,i);
printf("%-8s%-8s%-8s%-8s",p->e.num,p->,p->e.sex,p->e.age);
p=p->next;
i++;
}
}
Gotoxy(25,i);
printf("按任意键继续!");
getch();
}
//登陆函数(属于表现层)
int login()
{
char username[50];
char password[50];
Gotoxy(25,10);
printf("请输入用户名:");
Gotoxy(25,11);
scanf("%s",username);
Gotoxy(25,12);
printf("请输入密码:");
Gotoxy(25,13);
scanf("%s",password);
if((strcmp(username,"caofei")==0)&&(strcmp(password,"10002732")==0))
{
return 1;
}
else
{
return 0;
}
}
//主函数(主要进行身份识别和管理员登陆)
void main()
{
int m;
int nChoice=1;
while(nChoice)
{
system("cls");//清屏
Gotoxy(25,2);
printf("_____________________________");
Gotoxy(25,3);
printf("欢迎进入职工信息管理系统!");
Gotoxy(25,4);
printf(" 学号:10002732 姓名:曹飞");
Gotoxy(25,5);
printf("-----------------------------");
Gotoxy(25,7);
printf("请按数字键选择你的身份:");
Gotoxy(25,8);
printf("管理员—1,普通员工—2,退出—0");
Gotoxy(25,9);
scanf("%d",&m);
if(m==1)
{
if(login())
{
mainMenu();
}
else
{
Gotoxy(25,14);
printf("输入的用户名或密码错误!请重新输入!");
Gotoxy(25,15);
printf("按任意键后重新选择!");
getch();
}
}
else if(m==2)
{
searchMenu();
}
else if(m==0)
{
nChoice=0;
Gotoxy(25,10);
printf("谢谢使用!");
Gotoxy(25,11);
}
else
{
Gotoxy(25,10);
printf("输入错误!请重新输入!");
Gotoxy(25,11);
printf("按任意键后重新选择!");
getch();
}
}
}
/************* 以上是其它的函数**************/
五、测试数据及其结果分析
首次打开程序的欢迎界面,包括管理员、普通职工和退出三个选项。

首先以管理员进入,用户名:caofei,密码:10002732。

进入管理员系统,可以添加、删除、修改和查询职工信息。

进入普通职工管理系统,有按工号查询和显示全部职工信息。

最后是退出界面。

六、调试过程中的问题
在利用文件指针中的运用中遇到了一些运行问题。

把数据写入文件中时注意到是要把整条链表的数据都写入。

七、课程设计总结
通过本次实验,对建立查询系统的过程有了更加深刻的理解,同时对系统建立的各种操作掌握的更加熟练,又一次熟悉结点和链表的建立。

将书上的理论付诸实践对于提高自己的动手能力有很大的帮助。

相关文档
最新文档