《373湖北汽车工业学院电气与信息工程学院.doc》由会员分享,可在线阅读,更多相关《373湖北汽车工业学院电气与信息工程学院.doc(49页珍藏版)》请在三一办公上搜索。
1、湖北汽车工业学院电气与信息工程学院C 语言程序设计实训报告 实训题目: 职工信息管理系统 专 业: 计算机专业 班 级: T1123-1 姓 名: 张立 成 绩:一、需求分析1、问题问题描述:已知职工信息包括职工号、姓名、性别、出生日期、学历、工资、住址、电话等。设计一程序,完成以下功能:1) 能从键盘输入职工的信息(增加,输入时需要能检查该职工号的职工的记录是否已经存在,出生日期格式是否合法(格式为:YYYY-MM-DD,如 2009-01-02)2) 能从指定的文件中读入职工的信息3) 能按职工号查询职工的信息4) 能按学历统计职工数5) 能查询到指定年份需要退休的职工的信息(男:60 岁
2、,女 55 岁)6) 能删除指定职工号的职工信息7) 能将职工信息保存在指定的文件中2、系统采用C 语言实现,开发环境为VC,可以运行在操作系统windows98 及以上皆可。3、运行要求能不受限制的录入职工的信息、界面友好,操作方便,例如删除前需要提示用户是否删除容错性强,例如数据导出时,如果文件不存在需要提示用户。二、总体设计1、系统流程设计根据系统要求,设计如下的系统流程2、系统模块设计根据系统的功能设计,如下模块职工信息管理系统职工的信息的录入查询职工的信息删除职工的信息退出修改职工的信息添加职工的信息浏览所有职工的信息按职工名字查询查询是否到退休年龄主界面模块:完成系统菜单的显示功能
3、选择模块:根据用户的选择,完成其相应的功能职工信息录入:完成用户从界面输入职工信息,保存入系统的功能职工信息修改:完成用户从界面输入职工信息,在系统中查询定位,并将录入的数据保存入系统的功能职工信息查询:完成用户从界面输入查询条件,在系统查询符合条件的职工信息,并在界面上显示的功能。职工信息导入:在运行程序时会自动读取指定文件的内容,保存入系统。职工信息导出:完成用户从界面录入职工信息后,程序会自动把职工信息写入指定的文件中。职工信息删除:完成用户从界面输入需要删除的职工的信息,输入姓名,并将其从系统中删除。三、详细设计1、数据结构设计根据系统要求,系统中需要保存的数据有通讯录的信息,其结构如
4、下:数据项名称 数据项系统表示 数据类型 数据长度 备注职工号 no 整型 4姓名 name 字符串 20性别 sex 字符型 1年龄 age 整型 4出生年 int 整型 4 出生月 int 整型 4出生日 int 整型 4学历 xueli 字符串 30工资 wage 整型 4地址 address 字符串 100电话 tele 字符串 20为了能实现不受限制的增加职工信息,采用结构体的结构保存职工的信息,在增加职工的基本信息时,创建的结构体如下:struct employeeint num;char name10;char sex; int age;Int year; Int month;
5、Int date;char xueli30;int wage;char addr30;long int tel;em1000;2、界面设计主界面:根据系统要求,设计一个字符界面,显示系统的菜单,为了体现友性,将在每个菜单前显示该菜单项对应的数字用户输入菜单项前面的数字,主菜单消失,进入该模块的相应界面进行相应的操作,完成后,回到主界面。输入界面:在光标下输入通讯录的信息,用空格将信息隔开,如果出生日期输入格式不对,就系要重新输入,创建完后出现是否继续的选择。修改界面:选择修改信息后首先显示所有职工的信息,输入需要修改信息职工的姓名,显示该职工的详细信息,选择需要修改的项目,输入修改后的信息,将
6、原来信息修改,然后显示修改后的所有职工的信息。删除界面:输入需要删除的姓名,将其从职工信息中删除添加信息:输入需要添加的人数后,这一步骤基本上和信息录入是一样的,添加完成后会显示所有学生的信息查询信息:1)按职工号查询:输入职工号查询出该职工的全部信息。2)查询已到退休年龄职工信息。选择查询需退休员工的条件就得到上面的信息。3) 统计某个学历职工的个数 输入统计的学历就可以统计出个数。4)按姓名查询输入职工的名字就能后,就能够输出被查职工的信息浏览信息显示页面:浏览所有职工的信息。选择添加信息操作后就可以从界面输入添加者的信息,中间日期输入格式出现错误会有提示的3、模块实现主界面实现:调用 m
7、enu()函数,在屏幕上打印需要显示的字符信息,在主函数中实现功能选择模块:接受从键盘输入的菜单选择,判断并调用相应的功能函数,完成其对应的功能。实现功能选择。对应的函数:menu();职工信息录入模块实现:模块说明:从键盘接收输入的职工信息,把信息有顺序的村道内存中并写入到指定文件中对应函数:input(),save(int m)。通讯录信息修改模块实现:模块说明:从键盘接收输入的需要修改通讯录的姓名,遍历结构体,结构体中的姓名是否输入的姓名相等,如果相等,再输入需要修改的信息类别,然后从键盘输入修改后的信息。然后输入的信息替代原有的信息。模块流程:输入需要修改职工的姓名与系统中的姓名比较选
8、择修改的内容修改成功退出修改信息对应函数:modify()职工信息删除模块实现:模块说明:输入需要删除的职工姓名后删除,把下面的职工信息往前移动。对应函数:void del()职工信息导入模块实现:模块说明:在运行的时候第一步是自动把指定文件中的信息导入内存中,是信息可以在后面的运行过程中使用对应函数:int load()职工信息信息导出模块实现:模块说明:程序在输入信息后就会自动将输入的职工信息导入到指定的文件中使后面可以使用。对应函数:void save(int m)职工信息查询模块实现:模块说明:分为两种查询方式:1)按职工号查询;2)按退休年龄查询。选择查询方式模块流程:输入职工号输出
9、需退休的人输出查询结果对应函数:void search(); void search_num(); void search_age();职工信息浏览模块实现:模块说明:输出所有的职工的信息对应函数:void display()四、 实训总结 这个程序难度挺大的,但还是在几天的努力中诞生出来了。基本上用上了我所学的全部C语言知识,有一点点的伤脑筋。虽然对于我来说有一定难度但对于当今的科技,这个就不算什么了,科技上的程序和现实生活中应用的程序要比这难的多。对与大学生C语言是每个人都必须掌握的一门学科,我们计算机专业的学生就更应该熟练的运用C语言编写程序。通过这几个月来对计算机的了解,我对计算机这个
10、科学有了更浓的感情,虽然目前学的不是很好。这次程序的一个亮点是能够正确判断日期是否合格,运行的时候基本上是没有问题的。 通过这次课设,我对C语言有了更深的了解。更加熟息课本上的知识点。五、附录程序源代码/*职工信息管理系统*/#include #include#include #define N 1000struct workersint num;char name10;char sex; int age;int year;int month;int date;char xueli30;int wage;char addr30;long int tel;em1000; /*定义一个结构体*/v
11、oid menu();void input();void save(int);void display();void del();void add();void search();void search_num();void search_age();void search_xueli();void search_name();void modify(); /*定义各函数*/void main() int n,flag;char a;menu(); /*调用菜单函数*/doprintf(t请选择你需要操作的步骤(0-6):n);scanf(%d,&n);if(n=0&n=6)flag=1;br
12、eak;elseflag=0;printf(您输入有误,请正确输入选择!);while(flag=0);while(flag=1)switch(n)case 1:system(cls); /*清屏*/printf(nnttt*输入职工信息* n);printf(n);input();break;case 2:system(cls); /*清屏*/printf(nnttt*浏览职工信息* n);printf(n);display();break;case 3:system(cls); /*清屏*/printf(nnttt*按条件查询职工信息* n);printf(n);search();brea
13、k; case 4:system(cls); /*清屏*/printf(nnttt*删除职工信息* n);printf(n);del();break;case 5:system(cls); /*清屏*/printf(nnttt*添加职工信息* n);printf(n);add();break;case 6:system(cls); /*清屏*/printf(nnttt*修改职工信息* n);printf(n);modify();break;case 0:exit(0);break;default :break;getchar();printf(n);printf(是否继续进行(Y or N):
14、n);scanf(%c,&a);if(a=y|a=Y)flag=1;system(cls); /*清屏*/menu(); /*调用菜单函数*/printf(t请再次选择你需要操作的步骤(1-6):n);scanf(%d,&n);printf(n);else exit(0);void menu() /*菜单函数*/printf(nnnnnn);printf( tt *职工信息管理*n);printf( tt * 1.录入职工信息 *n);printf( tt * 2.浏览职工信息 *n);printf( tt * 3.查询职工信息 *n);printf( tt * 4.删除职工信息 *n);pr
15、intf( tt * 5.添加职工信息 *n);printf( tt * 6.修改职工信息 *n);printf( tt * 0.退出 *n);printf( tt *欢迎使用*n);printf(n);printf(n);void input() /*录入函数*/int i,m,n=0;printf(请输入需要创建信息的职工人数(1-1000):n);scanf(%d,&m);for (i=0;im;i+)printf(职工号: );scanf(%d,&emi.num);printf(请输入姓名: );scanf(%s,emi.name);getchar();printf(请输入性别(f-女
16、 m-男): );scanf(%c,&emi.sex);getchar();printf(请输入出生日期(1991-01-01):); don=0;printf(请输入日期n);scanf(%d-%d-%d,&emi.year,&emi.month,&emi.date);if(emi.year3000)n=1;if(emi.month12|emi.month31|emi.date29|emi.date28|emi.date31|emi.date30|emi.date31|emi.date30|emi.date31|emi.date31|emi.date30|emi.date31|emi.dat
17、e30|emi.date31|emi.date1) n=1;break;while(n=1);emi.age=2012-emi.year; printf(该职工年龄为: %dn,emi.age);getchar();printf(请输入学历: );scanf(%s,emi.xueli);getchar();printf(请输入工资: );scanf(%d,&emi.wage);getchar();printf(请输入住址: );scanf(%s,emi.addr);getchar();printf(请输入电话: );scanf(%d,&emi.tel);printf(n);printf(n创建
18、完毕!n);save(m);void save(int m) /*保存文件函数*/int i;FILE*fp;if (fp=fopen(workers_list.txt,wb)=NULL) /*创建文件并判断是否能打开*/printf (cannot open filen);exit(0);for (i=0;im;i+) /*将内存中职工的信息输出到磁盘文件中去*/if (fwrite(&emi,sizeof(struct workers),1,fp)!=1)printf(file write errorn);fclose(fp);int load() /*导入函数*/FILE*fp;int
19、i=0;if(fp=fopen(workers_list.txt,rb)=NULL)printf (cannot open filen);exit(0);else do fread(&emi,sizeof(struct workers),1,fp);i+;while(feof(fp)=0);fclose(fp);return(i-1);void display() /*浏览函数*/int i;int m=load();printf(n职工号t姓名t性别t年龄t生日t学历t工资t住址t电话n);for(i=0;im;i+)printf(n %dt%st%ct%dt%d-%d-%dt%st%dt%
20、st%ldn,emi.num,emi.name,emi.sex,emi.age,emi.year,emi.month,emi.date,emi.xueli,emi.wage,emi.addr,emi.tel); void del() /*删除函数*/int m=load();int i,j,n,t,flag;char name20;printf(n 原来的职工信息:n);display(); printf(n);printf(请输入要删除的职工姓名:n);scanf(%s,name);for(flag=1,i=0;flag&im;i+)if(strcmp(emi.name,name)=0)pr
21、intf(n已找到此人,原始记录为:n);printf(n确定删除请输入 1,不删除请输入 0n);scanf(%d,&n);if(n=1) /*如果删除,则其他的信息都往上移一行*/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);emj.tel=emj+1.tel;flag=0;printf
22、(n 浏览删除后的所有职工信息:n);save(m); /*调用保存函数*/display(); /*调用浏览函数*/if(!flag)m=m-1;elseprintf(n对不起,查无此人!n);printf(n继续删除请按1,不再删除请按0n);scanf(%d,&t);switch(t)case 1:del();break;case 0:break;default :break;void add()/*添加函数*/FILE*fp;int n;int count=0;int i;int m=load();printf(n 原来的职工信息:n);display(); /* 调用浏览函数*/pr
23、intf(n);fp=fopen(emploee_list,a);printf(请输入想增加的职工数:n);scanf(%d,&n);for (i=m;i(m+n);i+)printf(n 请输入新增加职工的信息:n);printf(请输入职工号: );scanf(%d,&emi.num);printf(n);printf(请输入姓名: );scanf(%s,emi.name);getchar();printf(请输入性别(f-女 m-男): );scanf(%c,&emi.sex);printf(请输入出生日期(1991-01-01):); don=0;printf(请输入日期n);scan
24、f(%d-%d-%d,&emi.year,&emi.month,&emi.date);if(emi.year3000)n=1;if(emi.month12|emi.month31|emi.date29|emi.date28|emi.date31|emi.date30|emi.date31|emi.date30|emi.date31|emi.date31|emi.date30|emi.date31|emi.date30|emi.date31|emi.date=1&t=4)flag=1;break;elseflag=0;printf(tt您输入有误,请重新选择!);while(flag=0);wh
25、ile(flag=1)switch(t) case 1:printf(ttt按职工号查询n);search_num();break;case 2:printf(ttt查询需退休员工n);search_age();break;case 3:printf(ttt按学历查询n);search_xueli();break;case 4:printf(ttt按姓名查询n);search_name();break;case 5:system(cls); /*清屏*/main();break;default:break;void search_num()int num;int i,t;int m=load(
26、);printf(t请输入要查找的职工号:n);scanf(%d,&num);for(i=0;im;i+)if(num=emi.num) printf(ntt已找到此人,其信息为:n);printf(n职工号t姓名t性别t年龄t生日t学历t工资t住址t电话 n);printf(n %dt%st%ct%dt%d-%d-%dt%st%dt%st%ldn,emi.num,emi.name,emi.sex,emi.age,emi.year,emi.month,emi.date,emi.xueli,emi.wage,emi.addr,emi.tel); break;if(i=m) printf(ntt对
27、不起,查无此人n);printf(n);printf(t返回查询函数请输入1,继续查询职工号请输入2,返回主菜单请输入 3n);scanf(%d,&t);while(t3)printf(输入有误,重新输入n);scanf(%d,&t);switch(t) case 1:system(cls); /*清屏*/search();break;case 2: system(cls); /*清屏*/break;case 3: system(cls); /*清屏*/main();break;default:break;void search_xueli()char xueli30;int i,t,n=0;
28、int m=load();printf(t请输入要查找的学历:n);scanf(%s,xueli);for(i=0;im;i+)if(strcmp(emi.xueli,xueli)=0) n+;break;printf(nntt该学历的人数为%dn,n);printf(t返回查询函数请输入1,继续查询学历请输入2,返回主菜单请输入 3n);scanf(%d,&t);while(t3)printf(输入有误,重新输入n);scanf(%d,&t);switch(t) case 1:system(cls); /*清屏*/search();break;case 2: system(cls); /*清
29、屏*/break;case 3: system(cls); /*清屏*/main();break;default:break;void search_name()char name20;int i,t,n=0;int m=load();printf(t请输入要查找的姓名:n);scanf(%s,name);for(i=0;im;i+)if(strcmp(emi.name,name)=0) printf(ntt该员工信息为:n);printf(n职工号t姓名t性别t年龄t生日t学历t工资t住址t电话 n);printf(n %dt%st%ct%dt%d-%d-%dt%st%dt%st%ldn,e
30、mi.num,emi.name,emi.sex,emi.age,emi.year,emi.month,emi.date,emi.xueli,emi.wage,emi.addr,emi.tel); n+;break;if(n=0)printf(未找到此人n);printf(t返回查询函数请输入1,继续查询学历请输入2,返回主菜单请输入 3n);scanf(%d,&t);while(t3)printf(输入有误,重新输入n);scanf(%d,&t);switch(t) case 1:system(cls); /*清屏*/search();break;case 2: system(cls); /*清屏*/break;case 3: system(cls); /*清屏*/main();break;default:break;void search_age()int i, t,n=0;int m=load();for(i=0;i=60&emi.sex=m|emi.age=55&emi.sex=f) printf(ntt已找到须退休员