1、2020/12/101职工信息管理系统 C语言实践专周 指导教师: 罗佳、王春洁2020/12/102实践内容 项目需求分析 系统设计 函数设计 项目的进度计划 设计报告格式2020/12/1031.项目需求分析v随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展要高效率的把内部活动有机的组织起来,就必须建立自身特点相适应的管理信息系统。 2020/12/1041.项目需求分析v本课程设计针对现代社会企业对员工信息的管理而设计, 使员工的管理更加的简捷,更加的方便,界面友好,易于操作。 v本组要求设计
2、的是一个关于职工信息管理的数据库系统,通过这个系统,管理员可以简捷方便的对职工信息进行增加、删除、修改等功能,而用户也可以通过这个系统对职工信息进行查询等功能。 v在相应的硬盘上面进行存盘以防止部分数据的丢失;2020/12/105v对职工的基本信息进行处理,需要把职工的基本信息,包括职工号,姓名,性别等相关信息录入计算机 ,保存到相应的变量中。v由一系列具有相同类型或不同类型的数据构成的数据集合。v 它多用来描述由不同类型数据组成的“复杂类型”。 2020/12/1061.项目需求分析该职工管理系统针对员工信息数据的处理设计了以下功能该职工管理系统针对员工信息数据的处理设计了以下功能:v1编
3、写一个登录职工信息管理系统的口令检查编写一个登录职工信息管理系统的口令检查程序,由主函数来调用。功能要求如下:程序,由主函数来调用。功能要求如下:v 提示用户输入一个口令。提示用户输入一个口令。v 用户输入口令后,程序对其进行检查。用户输入口令后,程序对其进行检查。v口令正确,则提示用户:口令正确,则提示用户:“你是合法用户!你是合法用户!”。v口令错误,则提示用户:口令错误,则提示用户:“你是非法用户!你是非法用户!”。v 用户的口令输入有次数限制,连续输入错误用户的口令输入有次数限制,连续输入错误口令超过三次就关闭程序。口令超过三次就关闭程序。2020/12/107v2编写创建职工基本信息
4、的程序。职工信息编写创建职工基本信息的程序。职工信息包括姓名(包括姓名(name)、年龄()、年龄(age)、工龄)、工龄(worktime)、性别()、性别(sex)和婚姻状况)和婚姻状况(marrige)、级别()、级别(grade:1-5级)、工级)、工资(资(wage)、是否在职()、是否在职(tired)等信息。)等信息。v3编写一个对职工工资进行调整的程序。规编写一个对职工工资进行调整的程序。规定如下:退休职工增加工资定如下:退休职工增加工资50元,在职的职元,在职的职工工1到到5级的工资分别增加级的工资分别增加20、40、60、80、100,编程实现上述要求。,编程实现上述要求。
5、v4编写一个对职工信息按姓名或工龄或级别编写一个对职工信息按姓名或工龄或级别进行查询的程序。进行查询的程序。2020/12/108v5编写一个对职工信息进行添加的程序。编写一个对职工信息进行添加的程序。v6编写一个对职工信息进行修改的程序。编写一个对职工信息进行修改的程序。v7编写一个对职工信息进行删除的程序。编写一个对职工信息进行删除的程序。v8编写一个职工信息管理系统的界面程序编写一个职工信息管理系统的界面程序 v9将已完成的口令验证程序加到现在的程序将已完成的口令验证程序加到现在的程序中。程序运行时必须输入正确的口令才能进中。程序运行时必须输入正确的口令才能进行创建和工资调整操作。行创建
6、和工资调整操作。2020/12/109主菜单添加职工信息修改职工信息职工删除信息职工信息查询职工信息排序保存员工信息While( )读取数据Switch()开始main()退出2.系统设计2020/12/10101、职工的基本信息该如何存储?、职工的基本信息该如何存储? 2、如何对职工信息进行录入以及如何输出职工的信、如何对职工信息进行录入以及如何输出职工的信息?息? 3、如何对大批量的职工信息数据进行处理、如何对大批量的职工信息数据进行处理 ?职工号姓名性别年龄工作部门工资等级工资长整型字符数组字符型整型字符数组整型实型2020/12/1011说明:说明:结构体类型不是由系统预先定义的,而是
7、由用户定结构体类型不是由系统预先定义的,而是由用户定义的,凡需使用结构体类型的,都必须在程序中先义的,凡需使用结构体类型的,都必须在程序中先进行定义。进行定义。 v结构体类型定义之后就和基本数据类型一样,只规结构体类型定义之后就和基本数据类型一样,只规定了内存分配方式,并不实际占用内存的空间。某定了内存分配方式,并不实际占用内存的空间。某种结构体类型需占用的内存字节数,是各成员所占种结构体类型需占用的内存字节数,是各成员所占字节数的总和,也可以用字节数的总和,也可以用sizeof(结构体类型名)来(结构体类型名)来确定。确定。 2020/12/1012v结构体类型是可以嵌套定结构体类型是可以嵌
8、套定义的,也就说结构义的,也就说结构体中的某个数据成员也可以体中的某个数据成员也可以是结构体类型变是结构体类型变量量 。v结构体类型和结构体类型结构体类型和结构体类型变量是不同的概念,不能变量是不同的概念,不能混淆。混淆。在定义一个结构体变量时,在定义一个结构体变量时,应该首先定义它的类型,应该首先定义它的类型,然后再定义该类型的变量然后再定义该类型的变量2020/12/1013vstruct employee称为结构体类型名,即结构体的类型说明符 v结构体变量的各个成员可进行何种运算,由该成员的数据类型决定 v定义了结构体类型之后,我们就可以定义该结构体类型的变量了。(定义结构体类型变量可采
9、用3种方法。)2020/12/1014v1、间接定义。先定义结构体类型,然后再定义结构体类型变量。v2、直接定义,在定义结构体类型的同时定义结构体变量 v3、一次性定义,直接定义结构体类型变量。2020/12/1015v结构体指针结构体指针是一个指针变量,它指向一个是一个指针变量,它指向一个结构体变量,它的值是该结构体变量所分配的结构体变量,它的值是该结构体变量所分配的v存储区域的首地址。存储区域的首地址。struct employee *p; v表示指针变量p指向一个struct employee类型的结构体变量。vstruct employee *p=e1; struct employee
10、 *p; /*边定义边赋初值*/ /*先定义再赋初值*/ p=&e1;2020/12/1016w 注意:注意: 上面定义的结构体指针只说明了指针的类型,上面定义的结构体指针只说明了指针的类型,并没有确定它的指向,也就是说它是无所指的,必并没有确定它的指向,也就是说它是无所指的,必须通过初始化或赋值,把实际存在的某个结构体变须通过初始化或赋值,把实际存在的某个结构体变量或结构体数组的首地址赋给它,才确定了它的具量或结构体数组的首地址赋给它,才确定了它的具体指向,才使它与相应的变量或数组联系起来。体指向,才使它与相应的变量或数组联系起来。2020/12/1017w 在职工记录中的指定位置插入一名新
11、职工的在职工记录中的指定位置插入一名新职工的信息,假设插入到第信息,假设插入到第i个位置,共有个位置,共有N名职工,名职工,设计思路如下:设计思路如下:1、首先将第、首先将第i个位置到第个位置到第N个位置的职工往后个位置的职工往后挪一个位置,空出第挪一个位置,空出第i个位置;个位置;v2、然后将新职工的信息放入到第、然后将新职工的信息放入到第i个位置即个位置即可。可。2020/12/1018vFILE *fp; FILE 是变量类型,实际上是C语言定义的标准数据结构,用于文件。FILE *fp 是声明,声明fp是指针,用来指向FILE类型的对象。fp=fopen(yssysj.txt,r);
12、fopen标准函数,打开磁盘文件yssysj.txt, 用于读,送返指针,指向FILE类型对象2020/12/1019vif (fp=fopen(student.bin,wb)=NULL)( 如果以只写、二进制的方式打开文件student.bin失败)vif (fwrite(&studenti,sizeof(struct address),1,fp)!=1) (如果向文件指针fp指向的文件写入结构体studenti失败)2020/12/1020v strcpy():C语言标准库函数v原型声明:extern char *strcpy(char* dest, const char *src);v头
13、文件:#include v功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间v说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。v返回指向dest的指针。2020/12/1021vgetchar();v功能:从stdio流中读字符,相当于getc(stdin),它从标准输入里读取下一个字符。v用法:该函数声明在stdio.h头文件中,使用的时候要包含stdio.h头文件。如:#includeint getchar(void);2020/12/1022exit()和return的区别:v按照ANSI C,在最初调用的mai
14、n()中使用return和exit()的效果相同。v但要注意这里所说的是“最初调用”。如果main()在一个递归程序中,exit()仍然会终止程序;但return将v控制权移交给递归的前一级,直到最初的那一级,此时return才会终止程序。return和exit()的另一个区别v在于,即使在除main()之外的函数中调用exit(),它也将终止程序。2020/12/10233.函数设计 创建函数 chuanjian() 添加函数 insert(); 删除姓名信息函数 Deletename(); 删除级别函数 Deletejibie(); 删除工龄函数 Deletegongling(); 口令函
15、数 password() 工资调整函数 gongzitiaozheng(); 按姓名修改函数 updatename();等等2020/12/1024 struct 结构体名结构体名 数据类型1 成员名1; 数据类型2 成员名2; 数据类型n 成员名n;v ;lstructstruct为关键字;为关键字;l结构体名结构体名是用户定义的是用户定义的类型标识类型标识。v 中是组成该结构体中是组成该结构体的的成员成员。成员的。成员的数据类数据类型型可以是可以是C语言所允许语言所允许的任何数据类型的任何数据类型。2020/12/1025w 例如职工类型的定义:例如职工类型的定义: struct empl
16、oyee long num; /*职工号职工号*/ char name20; /*姓名姓名*/ char sex; /*性别性别*/ int age; /*年龄年龄*/ char department20; /*工作部门工作部门*/ int grade; /*工资等级工资等级*/ float salary; /*工资工资*v ;2020/12/1026/*删除第i名职工*/void dele(struct employee em,int n,int i) for(int j=i;jn;j+) /*将数据向前移*/ emj-1=emj; total-; /*职工总数减少1*/v2020/12/1
17、027v调用函数ResultsInput() ,然后设一个文件地址指针;定义说明文件指针的一般形式为: FILE* 指针变量标识符;node.dat是文件的地址及类型.dat是数据相关的文件类型,wb只写打开或建立一个二进制文件,只允许写数据。 ; if (fp=fopen(employee_list,wb)=NULL) printf (cannot open filen); exit(0); for (i=0;im;i+) /*将内存中职工的信息输出到磁盘文件中去*/ if (fwrite(&emi,sizeof(struct employee),1,fp)!=1)2020/12/1028v
18、把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 for(j=i;jm-1;j+) strcpy(emj.name,emj+1.name); emj.num=emj+1.num; emj.sex=emj+1.sex; emj.age=emj+1.age; strcpy(emj.xueli,emj+1.xueli); emj.wage=emj+1.wage; strcpy(emj.addr,emj+1.addr); strcpy(emj.tel,emj+1.tel); 2020/1
19、2/1029#include#include #include #include #define N 100struct employee int num; char name20; char sex; int age; char xueli30; int wage; char addr30; char tel20; char tired20;em100; /*定义一个结构体*/void mima();void menu();void input();void save(int);void display();void del();void add();void search();void search_num();void search_xueli();void search_tel();void modify(); /*定义各函数*/Example任务完成2020/12/10304.项目的进度计划星期一需求分析,系统设计;星期二函数设计,编码;星期三编码,程序调试;星期四调试,编写设计报告;星期五完善程序,完成设计报告。31PPT教学课件谢 谢 观 看Thank You For Watching