资源描述
.C 语言课程设计题目及要求题目:职工信息管理系统设计职工信息包括职工号、性别、年龄、学历、工资、住址、电话等(职工号不重复)。试设计一职工信息管理系统,使之能提供以下功能:1、职工信息录入功能(职工信息用文件保存)。2、职工信息浏览功能。3、查询功能:可以按“职工号”、“”、“”、“工资”等方式查询记录;如果查询信息不存在,显示没有找到信息;4、删除功能:可以根据职工号或姓名删除一条已经存在的职工信息;5、排序功能:能对姓名、年龄、工资进行排序,并显示;6、修改功能:改变记录项的一个或多个属性,并用新的记录项覆盖已经存在的记录项;7、数据存、取:数据以文件形式存储在磁盘上,因此在程序运行中需要对文件进行读取操作。编程人员可以根据实际需要自己定义文件的存储格式,在数据读写时必须精确定位,以免破坏文件的正确性。除此之外,程序中还要不停处理用户的输入,对输入数据的容错性进行检查,可以保证数据的合法性,避免恶意和非恶意的操作对用户数据的破坏。8、系统以菜单方式工作。.1. 设计目的在今天这个高速信息时代,许多繁杂的办公事务都由计算机代劳,例如职工信息管理等重复劳动越来越需要计算机来处理。本系统就是为提高企业管理职工信息的效率而设计的,现在职工信息管理系统发挥无可取代的作用。职工信息管理系统是一个可以用来进行职工工号、姓名等自然信息以及各项工资构成进行录入、查询、修改、删除、增加和排序浏览等操作的应用软件。2. 设计的总体思想本系统是用Visual C 进行设计与开发,总体思想是结构化、模块化的程序设计。由于主要实现的是管理系统的增、删、改、查和排序等功能,因此应用到程序设计中的基本控制结构,如循环和选择,还使用到C 语言最具特色的语言成分指针,高效地使用数组、字符串和结构体,采用经典的排序方法冒泡法进行排序,并且包含对文件的读、写等基本操作。3. 功能模块描述职工信息管理系统是为企业进行职工信息管理提供辅助而设计的,需要为用户提供一个简单的人机界面以便操作,各功能模块如下。1) 登录模块:根据输入的登录密码判断是否允许该用户使用本系统,输入密码正确才能进入管理界面,管理职工信息。2) 创建模块:当第一次使用本系统时,根据提示输入职工的工号、 、性别、年龄、学历、职位、工资、电话和住址,可一次性输入多条职工的信息记录。浏览模块:可以浏览经输入、修改、删除、添加、排序、读取后的职工信息。3) 查询模块:分为根据工号、 、工资查询的四个具体需求,分别提示管理员要查询的职工信息的的工号、电话或工资。4) 修改模块:分为根据工号、姓名修改的两个具体需求,分别提示管理员要修改的职工信息的工号和姓名,如果有对应职工的信息记录存在,则逐项列出对应职工的信息。5) 删除模块:分为根据工号、姓名删除的两个具体需求,分别提示管理员要删除的职工信息的工号和姓名,如果有则删除此职工对应的信息记录。6) 添加模块:可在原有职工信息记录的基础上增加新的职工信息记录,并保存至磁盘中。7) 排序模块:分为根据姓名、年龄、工资排序的三个具体需求,分别提示管理员选择排序的方式。8) 保存模块 :将 2)3)4)5)6)7)8) 模块中改动的数据保存至文件中,以便进行管理、查找和备份。9) 读取模块:将文件中的数据读取至内存中。10)4.概要设计系统模块结构图根据模块功能描述,职工信息系统可以分为11 个模块,系统模块结构如图1 所示。.职工信息管理系统主程序模块登录显查修删排添保读退录入示询改除序加存取出模模模模模模模模模模模块块块块块块块块块块块图 1 系统模块结构图5. 详细设计5.1 数据结构设计本程序定义结构体staffinfo ,用于存放职工的相关信息。定义的结构体如下 (每个变量后面/*/中的内容为各个变量的含义):struct staffinfochar num10;/* 工号 */char name9;/*/char sex3;/* 性别 */char age3;/* 年龄 */char edu5;/* 学历 */char role5;/* 职位 */char salary6;/* 工资 */char tel16;/*/char addr30;/* 住址 */staN;由于工号、住址等信息是用来描述职工这个有机整体,为了表示这些字段不是孤立的,而是共同描述一个完整的事物,因此用结构体来实现。5.2 各函数说明1) void gotoxy(int x,int y)功能:用于在屏幕上定位,其中整型数x 代表列数,整型数y 代表行数,其中0 x 80, 0 y,( 0, 0 )代表左上角。2) void showtable1() void showtable2()功能:分别打印表头与表尾。3) void enter()功能:进入系统登录界面,验证管理员输入的密码。输入:登录密码。处理:接收管理员输入的密码,存放到相应变量中进行判断。判断密码是否正确,如果相符,则进入主菜单。如果不相符,则提示用户重新输入。4) int find(char str30,int t).功能:查找指定记录,str30 表示需管理员输入的职工的某一项信息,t 表示通过哪一项来查找,例如通过工号、姓名来查找。若找到与输入的信息相同的记录,则返回找到的记录号,若找不到就返回 -1 。输入:职工信息的某一项和想查找的途径。处理:接收管理员输入的职工信息与查找方式,并存入相应的变量中。将内存中的数据与输入信息逐条比对,直到找到相同的记录,返回找到的记录号。若没找到该职工的记录,就返回-1 。5) void creat()功能:创建职工信息。将管理员输入的若干条信息记录存入内存中。输入:需创建的信息记录条数。若干条职工信息记录(工号、 、职位、电话等信息) 。处理:提示管理员逐条输入职工信息。获取管理员输入的信息,存入内存中。提示管理员录入成功。6) void display()功能:浏览经过改动的信息记录,即打印出内存中的数据。7) void search()功能:查询所需职工信息记录。四种方式查询:工号、 、电话和工资。根据管理员输入的职工信息和查找方式,按不同方式查找记录,列表显示查找到的记录内容。输入:想要查找的方式。要查询的职工的某一项信息。处理:提示管理员要查询的方式和要查询职工的对应信息。循环品牌查找对应记录。如果找找,则列表显示结果。8) void modify()功能:修改原有的职工信息记录。两种查找匹配记录的方式:工号和姓名。根据管理员输入的查找方式和职工信息查找是否存在匹配记录,若存在,则将此职工的信息改为管理员输入的内容。输入:想要查找匹配记录的方式。要修改的职工的某一项信息。确认修改的选项字母。所要修改记录的内容值(工号、姓名等)。处理:接收管理员输入的查找匹配记录的方式和要修改职工的某一项信息。判断是否有匹配职工记录,若有,则列表显示该记录并提示管理员是否确认修改。提示管理员输入该职工方的各项信息。提示管理员是否修改成功。9) void delet()功能:删除指定的职工信息记录。两种查找匹配记录的方式:工号和姓名。根据管理员输入的查找方式和职工信息查找匹配记录,若找到,则列表显示,经提示后删除该条记录。输入:想要查找匹配记录的方式。要删除的职工的某一项信息。确认删除的选项字母。处理:接收管理员输入的查找匹配记录的方式和要修改职工的某一项信息。判断是否有匹配职工记录,若有,则列表显示该记录并提示管理员确认删除。提示管理员是否删除成功。10) void add()功能:增加新的职工信息记录。判断所输入的工号是否已存在,若不存在,则将管理员输入的若干条信息记录存入内存中。输入:想要添加职工的工号。新的职工信息记录(、学历等) 。处理:提示管理员输入新职工的工号。.判断职工号是否存在,若不存在,则提示管理员逐条输入职工信息。获取管理员输入的信息,存入内存中。提示管理员添加成功。11) void order()功能:给职工信息记录排序(升序) 。三种排序方式: 、年龄和工资。根据管理员输入的排序方式排序,列表显示排序结果。输入:想要的排序方式。处理:提示管理员输入排序方式。按照指定方式排序。列表显示排序结果。12) void save()功能:保存职工信息记录及记录条数至文件中。输入:确认保存的选项字母。处理:提示管理员确认保存。若确认保存,则将内存中的数据保存至指定文件中。提示管理员保存成功。13) void load()功能:从文件中读取职工信息记录及记录条数。输入:确认读取的选项字母。处理:提示管理员确认读取。将文件中的数据读取至内存中。提示管理员读取成功。14) void quit()功能:确认保存过数据后,安全退出系统。输入:确认保存的选项字母。确认退出系统的选项字母。处理:提示管理员确认保存。若确认保存,则将内存中的数据保存至指定文件中。提示管理员是否退出系统,若是则退出。15) void main()功能:根据主菜单上的各项指令,调用1)至 14)的各个函数。系统控制图如图1 所示。6. 程序分析6.1 程序预处理包括加载头文件,定义结构体,宏定义,全局变量,并对他们进行初始化。#include /* 输入 / 输出函数 */#include /* 其他说明 */#include /* 字符串函数 */#include /* 系统操作函数*/#include /* 屏幕操作函数 */#define N 20/* 系统记录的职工数,可根据不同企业的需要更改*/struct staffinfochar num10;/* 工号 */char name9;char sex3;char age3;char edu5;/* 学历 */char role5;/* 职位 */char salary6;.char tel16;/*/char addr30;/* 住址 */staN;int n=0;/* 实际录入的职工信息记录总条数*/6.2 主函数 void main()主要实现对整个程序的运行控制。详细分析可参考图3。/*主函数*/void main()void gotoxy(int x,int y);/* 光标定位 */void showtable1();/* 打印表头 */void showtable2();void enter();int find(char str30,int t);void creat();/* 录入职工信息 */void display();/* 浏览职工信息 */void search();void modify();void delet();void add();void order();void save();/void load();/* 从文件读取职工信息 */void quit();/* 退出系统 */system(color 3e);enter();while (1)int choice;system(cls);/* 清屏 */printf( 职工信息管理系统 );printf(=主菜单 =n);printf(*n);printf(002 1:录入职工信息)n);printf(002 2:浏览职工信息)n);printf(002 3:查询所需职工信息)n);printf(002 4:修改原有的职工信息)n);printf(002 5:删除原有的职工信息)n);printf(002 6:添加新的职工信息)n);printf(002 7:给职工信息排序)n);printf(002 8:保存职工信息)n);printf(002 9:读取职工信息)n);printf(002 0:退出系统)n);printf(*n);doprintf(n004 请输入指令 (09):);scanf(%d,&choice);/* 输入选择的数字*/.while(choice9);switch(choice)case 1: creat(); break;case 2: display();break;case 3: search();break;case 4: modify();break;case 5: delet();break;case 6: add();break;case 7: order();break;case 8: save();break;case 9: load();break;case 0: quit();break;default:break;6.3 光标定位函数void gotoxy(int x,int y)0x 80, 0 y,( 0, 0)代表左上角。/*光标定位*/void gotoxy(int x,int y)COORD coord;coord.X=x;/* 横坐标,表示列数*/coord.Y=y;/* 纵坐标,表示行数*/SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);6.4 表头 showtable1()和表尾 showtable2()用于打印表格的头和尾。/*表头*/void showtable1()printf(*);int i;for(i=0;i78;i+)printf(=);printf(*);printf(|工号| 性别| 年龄| 学历| 职位| 工资|住址|);printf(|-+-+-+-+-+-+-+-+-|);/*表尾*/.void showtable2()int i;printf(*);for(i=0;i78;i+)printf(=);printf(*);6.5 登录界面用于管理员登录,若密码输入正确则进入菜单。/*登录*/void enter()char str1=123;char str220;gotoxy(15,10);欢迎进入职工信息管理系统! n);gotoxy(29,12);printf(004请输入管理员登录密码:);gets(str2);if(strcmp(str1,str2)/* 字符串函数 strcmp, 指若两者相等则返回 0*/ system(cls);gotoxy(32,8);printf(004密码输入错误!);gotoxy(32,9);printf(004请重新输入 :);fflush(stdin);/* 将缓冲区的内容传送到stdin 中 ,即清理缓冲区的内容*/enter();6.6 创建职工记录用于第一次输入职工信息记录。/*创建职工信息*/void creat()/* 创建职工信息记录*/int i,r;system(cls);/* 清屏 */printf(nn004 请输入本次所录入职工信息数:);scanf(%d,&r);n+=r;/*r 为当前次输入的职工信息数,n 为录入的职工信息数总数*/for(i=0;ir;i+)system(cls);printf(n004 输入第 %d位职工的信息 :n,i+1);.printf(004请输入工号 :);scanf(%s,stai.num);printf(004请输入姓名 :);scanf(%s,stai.name);printf(004请输入性别 :);scanf(%s,stai.sex);printf(004请输入年龄 :);scanf(%s,stai.age);printf(004请输入学历 :);scanf(%s,stai.edu);printf(004请输入职位 :);scanf(%s,stai.role);printf(004请输入工资 :);scanf(%s,stai.salary);printf(004请输入电话 :);scanf(%s,stai.tel);printf(004请输入住址 :);scanf(%s,stai.addr);printf(nn002信息成功录入 !n);printf( 004请按任意键返回主菜单 :);fflush(stdin);/* 清除缓存 */getch();/* 接收任意一个字符 */6.7 浏览记录用于查看内存中的职工信息记录。/*浏览职工信息*/void display()int i;system(cls);gotoxy(16,2);printf(*全体职工信息 *n);gotoxy(0,3);showtable1();for(i=0;in;i+)printf(| %-5s| %-7s| %-5s| %-5s| %-5s| %-5s| %-5s| %-9s| %-15s|,stai.num,stai.name,stai.sex,stai.age,stai.edu,stai.role,stai.salary,stai.tel,stai.addr);showtable2();printf(n004 请按任意键返回主菜单:);fflush(stdin);getch();6.8 查询记录用于查询职工信息记录,有四种查询方式。/*.*查询所需的职工信息(4 种方式 )*/void search()int a,t;char str20;system(cls);gotoxy(26,8);printf(=查询职工信息 =n);printf(*);gotoxy(19,10);printf(002 1:按工号查询)n);gotoxy(19,11);printf(002 2:按姓名查询)n);gotoxy(19,12);printf(002 3:按电话查询)n);gotoxy(19,13);printf(002 4:按工资查询)n);gotoxy(20,14);printf(*);printf(004请输入您希望的查询方式(14):);scanf(%d,&t);system(cls);switch(t)case 1:printf(nn004请输入工号 :);break;case 2:printf(nn004请输入姓名 :);break;case 3:printf(nn004请输入电话 :);break;case 4:printf(nn004请输入工资 :);break;scanf(%s,str);a=find(str,t);/*str 与 stai.* 中的字符串比较,若一样 find() 函数返回 i 值 ,即找到第 i+1 条信息与刚输入的相同,t 表示查询方式 */if(a!=-1)printf(n002 已查到该员工信息,内容为 :n);showtable1();printf(| %-5s| %-7s| %-5s| %-5s| %-5s| %-5s| %-5s| %-9s| %-15s|,staa.num,staa.name,staa.sex,sta a.age,staa.edu,staa.role,staa.salary,staa.tel,staa.addr);showtable2();else printf(nn004 对不起,文件中没有此职工的记录。n);printf(004 请按任意键返回主菜单:);fflush(stdin);getch();6.9 查找指定记录用于查找匹配记录,将str100 与 stai.* 中的字符串比较,若两者一样返回记录号,若两者不一样返回-1。./*查找指定记录*/int find(char str30,int t)/*t 表示1 为工号2 为姓名3 为工资4 为电话 */int i;for(i=0;in;i+)if(t=1&strcmp(str,stai.num)=0)|(t=2&strcmp(str,stai.name)=0)|(t=3&strcmp(str,s tai.salary)=0)|(t=4&strcmp(str,stai.tel)=0)return(i);/* 两字符串若一样,strcmp(str,stai.* 返回零值 */return(-1);6.10 修改记录用于修改职工信息记录,有两种方式查找匹配记录。/*修改原有的职工信息*/void modify()int a,i;char str20,e;system(cls);gotoxy(26,8);printf(=修改职工信息 =n);gotoxy(20,9);printf(*);gotoxy(19,10);printf(002 1:按工号修改)n);gotoxy(19,11);printf(002 2:按姓名修改)n);gotoxy(20,12);printf(*);gotoxy(24,13);printf(004请输入您希望的修改方式(12):);scanf(%d,&i);system(cls);switch(i)case 1:printf(nn004请输入要修改的信息的工号:);break;case 2:printf(nn004请输入要修改的信息的姓名:);break;scanf(%s,str);a=find(str,i);if(a!=-1)printf(n004 您所要修改的职工信息为:n);showtable1();printf(| %-5s| %-7s| %-5s| %-5s| %-5s| %-5s| %-5s| %-9s| %-15s|,staa.num,staa.name,staa.sex,sta.a.age,staa.edu,staa.role,staa.salary,staa.tel,staa.addr);showtable2();printf( 004确认修改 ?(Y/N):);fflush(stdin);scanf(%c,&e);if(e=Y|e=y)system(cls);printf(nn004 请输入工号 :);scanf(%s,staa.num);printf(004请输入姓名 :);scanf(%s,staa.name);printf(004请输入性别 :);scanf(%s,staa.sex);printf(004请输入年龄 :);scanf(%s,staa.age);printf(004请输入学历 :);scanf(%s,staa.edu);printf(004请输入职位 :);scanf(%s,staa.role);printf(004请输入工资 :);scanf(%s,staa.salary);printf(004请输入电话 :);scanf(%s,staa.tel);printf(004请输入住址 :);scanf(%s,staa.addr);printf(nn002 修改成功 !n);printf(004请按任意键返回主菜单 :);fflush(stdin);getch();else if(e=N|e=n)printf(004 修改已取消 !n);printf(004 请按任意键返回主菜单:);fflush(stdin);getch();elseprintf(004 选择错误 ,请按任意键返回主菜单:);fflush(stdin);getch();elseprintf(nn 004 对不起,文件中没有此职工的记录。 n); printf( 004 请按任意键返回主菜单 :);fflush(stdin);getch();.6.11 删除记录用于删除指定职工信息记录,有两种方式查找匹配记录。/*删除原有的职工信息*/void delet()int a,j;char str20,e;system(cls);gotoxy(26,8);printf(=删除职工信息 =n);gotoxy(20,9);printf(*);gotoxy(19,10);printf(002 1:按工号删除)n);gotoxy(19,11);printf(002 2:按姓名删除)n);gotoxy(20,12);printf(*);gotoxy(24,13);printf(004请输入您希望的删除方式(12):);scanf(%d,&j);system(cls);switch(j)case 1:printf(nn004请输入要删除的工号:);break;case 2:printf(nn004请输入要删除的姓名:);break;scanf(%s,str);a=find(str,j);if(a!=-1)printf(n004 您所要删除的职工信息为:n);showtable1();printf(| %-5s| %-7s| %-5s| %-5s| %-5s| %-5s| %-5s| %-9s| %-15s|,staa.num,staa.name,staa.sex,sta a.age,staa.edu,staa.role,staa.salary,staa.tel,staa.addr);showtable2();printf(004 确认删除 ?(Y/N):);fflush(stdin);scanf(%c,&e);if(e=Y|e=y)for(;an;a+)staa=staa+1;n-;printf(002 删除成功 !n);.printf(004 请按任意键返回主菜单:);fflush(stdin);getch();else if(e=N|e=n)printf(004 删除已取消 !n);printf(004 请按任意键返回主菜单:);fflush(stdin);getch();elseprintf(004 选择错误 ,请按任意键返回主菜单:);fflush(stdin);getch();elseprintf(nn 004 对不起,文件中没有此职工的记录。 n); printf( 004 请按任意键返回主菜单 :);fflush(stdin);getch();6.12 添加记录用于添加新的职工信息,当新输入的职工号不与原职工号重复时才可以添加。/*添加新的职工信息*/void add()int a;char str6;for(;)system(cls);printf(nn004 请输入您想添加的新的职工信息的工号:);scanf(%s,str);a=find(str,1);if(a=-1) break;/*a=-1就是字符串不相等,即新的工号与原有的不重复,break; 使语句跳出当前for 的死循环 */else/*若 a!=-1就重新输入 */printf(004 对不起 ,您所输入的职工号已存在!n);printf(004 请按任意键重新输入:);fflush(stdin);getch();.printf(n004 输入新的职工的信息:n);strcpy(stan.num,str);printf(004 请输入姓名 :);scanf(%s,stan.name);printf(004 请输入性别 :);scanf(%s,stan.sex);printf(004 请输入年龄 :);scanf(%s,stan.age);printf(004 请输入学历 :);scanf(%s,stan.edu);printf(004 请输入职位 :);scanf(%s,stan.role);printf(004 请输入工资 :);scanf(%s,stan.salary);printf(004 请输入电话 :);scanf(%s,stan.tel);printf(004 请输入住址 :);scanf(%s,stan.addr);n+;printf(nn002 信息添加成功 !n);printf(004 请按任意键返回主菜单:);fflush(stdin);getch();6.13 排序用于职工信息记录排序,有 3 种排序方式。 使用冒泡排序法, 字符串数组比较使用strcmp() 函数。/*给职工信息排序并显示*/void order()int a,i,j;struct staffinfo str;system(cls);gotoxy(26,8);printf(=职工信息排序 =n);gotoxy(20,9);printf(*);gotoxy(19,10);printf(002 1:按姓名排序)n);gotoxy(19,11);printf(002 2:按年龄排序)n);gotoxy(19,12);printf(002 3:按工资排序)n);gotoxy(20,13);printf(*);gotoxy(24,16);printf(004请输入您希望的排序方式(13):);scanf(%d,&a);.system(cls);switch(a)case 1:gotoxy(16,2);printf(*按姓名排序 (升序 )*n);/* 冒泡排序 ,升序 */for(i=0;ii;j-)if(strcmp(staj-1.name,staj.name)0)str=staj-1;staj-1=staj;staj=str;gotoxy(0,3);showtable1();for(i=0;in;i+)printf(| %-5s| %-7s| %-5s| %-5s| %-5s| %-5s| %-5s| %-9s| %-15s|,stai.num,stai.name,stai.sex,stai .age,stai.edu,stai.role,stai.salary,stai.tel,stai.addr);showtable2();break;case 2:gotoxy(16,2);printf(*按年龄排序 (升序 )*n);/* 冒泡排序 ,升序 */for(i=0;ii;j-)if(strcmp(staj-1.age,staj.age)0)str=staj-1;staj-1=staj;staj=str;gotoxy(0,3);showtable1();for(i=0;in;i+)printf(| %-5s| %-7s| %-5s| %-5s| %-5s| %-5s| %-5s| %-9s| %-15s|,stai.num,stai.name,stai.sex,stai .age,stai.edu,stai.role,stai.salary,stai.tel,stai.addr);showtable2();break;case 3:gotoxy(16,2);printf(*按工资排序 (升序 )*n);/* 冒泡排序 ,升序 */for(i=0;ii;j-)if(strcmp(staj-1.salary,staj.salary)0)str=staj-1;staj-1=staj;staj=str;gotoxy(0,3);.showtable1();for(i=0;in;i+)printf(| %-5s| %-7s| %-5s| %-5s| %-5s| %-5s| %-5s| %-9s| %-15s|,stai.num,stai.name,stai.sex,stai.age,stai.edu,stai.role,stai.salary,stai.tel,stai.addr);showtable2();break;printf(004 请按任意键返回主菜单:);fflush(stdin);getch();6.14 保存和读取记录分别用于保存和读取文件,用到文件输入输出函数。/*保存职工信息至文件*/void save()FILE *fp1,*fp2;char e;system(cls);/* 以二进制方式创建文件*/if(fp1=fopen(Staff.dat,wb)=NULL)printf(004 文件 Staff.dat 打开
展开阅读全文