文章目录
职工管理系统
因为这是在学习了一段时间后才写的程序,一些知识都是前面学过的,所以我有关前面所学只是没有写的特别详细,只是把我在写的过程中被提醒或者被检查出来的错误写了上去。
一、职工管理系统详解
该系统基于结构体与链表创建,有链表基本的增删查改,排序,查找,插入,文件的创建,保存,读取和一些小功能。
也同样优缺点:插入指定位置,能够插入到指定位置,但退不出循环,创建的临时指针并未释放,可能指向该电脑未知内存,萌新慎重copy,不建议copy全部代码。
有些代码粘贴过来原有层次分类没有粘贴上。
二、职工管理系统功能详解
1.头文件与结构体定义
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
typedef struct Worker{
int number;
char name[20];
char sex[2];
int year;
int month;
int day;
char degree[20];
struct Worker *next;
}WOR;
在结构体中定义数值域与指针域,数值域储存员工信息,指针域储存要连接的结构体地址,
2.使用的函数声明
代码如下(示例):
void menu();//菜单
void showall(WOR *head);//显示所有员工信息
void attend(WOR *head); //添加员工信息
void print(WOR *head);//查找某一员工信息
void save(WOR *head);//保存职工信息(只有值,用于文件读取)
void save1(WOR *head);//保存职工信息(有值对应的具体信息,用于用户查阅)
void delte(WOR *head);//删除职工信息
void change(WOR *head);//改变职工信息
void order(WOR *head);//对职工信息排序
void read(WOR *head);//读取职工信息
void insert(WOR *head);//插入职工信息
void save2(WOR *head);//保存职工信息(排序后的文件)
在调用函数中需要加个小程序:进入函数需要有直接退出功能,以便不进行任何修改便可以直接退出。
3.主函数与菜单函数的声明
代码如下(示例):
在主函数中对头指针申请空间,后面所有函数定义void类型传入参数头指针,引用头指针时最好不要直接使用,定义一个指针为头指针再进行使用。
如果链表为空或者文件为空都要有一一对应错误提示
int main()
{
WOR *head;
head=(WOR*)malloc(sizeof(WOR));
head->next=NULL;
while(1){
menu();
char n[1000];
printf("请选择");
scanf("%s",n);
int a=strlen(n);
if(a>=2)
{
printf("你输入的什么东西,拉出去,糟蹋了\n");
system("pause");
continue;
}
switch(n[0])
{
case '1':
read(head);
system("pause");
showall(head);
system("pause");
break;
case '2':
attend(head);
save(head);
save1(head);
system("pause");
break;
case '3':
delte(head);
save(head);
save1(head);
system("pause");
break;
case '4':
change(head);
save(head);
save1(head);
system("pause");
break;
case '5':
read(head);
print(head);
system("pause");
break;
case '6':
system("cls");
order(head);
save2(head);
system("pause");
break;
case '7':
insert(head);
save(head);
save1(head);
system("pause");
break;
case '8':
printf("欢迎下次使用\n");
system("pause");
exit(1);
break;
default:printf("别瞎输,只能输1-8\n");system("pause");break;
}
}
return 0;
}
void menu()//制作菜单
{
system("cls");//清屏
printf(" 请规范输入操作,不要输入乱七八糟的的东西 \n");
printf("**************************************************\n");
printf("-------------欢迎来到喵喵嗷的管理系统-------------\n");
printf(" 1-查看当前所有的职工信息 \n");
printf(" 2-添加职工信息 \n");
printf(" 3-删除职工信息 \n");
printf(" 4-修改职工信息 \n");
printf(" 5-查看某一员工信息 \n");
printf(" 6-按职工号对职工排序 \n");
printf(" 7-插入职工信息 \n");
printf(" 8-退出 \n");
return;
}
注:只能输入具有该指令的数字,输入其他具有相对应的报错提示
乱打:
输入不是1-8
输入超过个位数
注:因为我定义的是指字符数组输入,并且输入超过数组第一位就自动报出乱打错误
4.添加函数
代码如下(示例):
添加解析:在主函数中定义的头指针进行调用,定义新的临时指针用头指针依次链接,这是头插法
在添加函数中根据结构体中的定义,对职工号要有查重操作,性别不能有除男女外其他,出生年月天都应该有他的限定,不能不符合常理,学位也要有对应的真是学位限制。
我没有对月份是30天还是31天的判断,以及是否是闰年对应2月天数限制,有精力和能力的人可以加以限制,完善代码。
void attend(WOR *head)//添加员工信息
{
int flag,i,a;
char n[20];
WOR *p=head;
WOR *s;//临时储存职工数据
printf("输入0退出,其他继续\n");
scanf("%s",n);
if(n[0]=='0')
return;
else
{
printf("请选择要添加职工信息的个数");
scanf("%d",&i);
if(i<=0)
return;
else
while(i)
{
s=(WOR*)malloc(sizeof(WOR));
tp:printf("请输入职工号");
scanf("%d",&s->number);
WOR *q=head->next;
while(q)
{
a=q->number;
if(s->number==a)
{
printf("该职工号已被使用,其选择其他喜欢的职工号");
goto tp;
}
q=q->next;
}
printf("请输入姓名:");
scanf("%s",s->name);
getchar();
printf("请输入性别: w/m ");
while(1)
{
scanf("%s",s->sex);
if(strcmp("w",s->sex)==0)
break;
if(strcmp("m",s->sex)==