C语言职工信息管理系统链表.docx
- 文档编号:10242573
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:26
- 大小:292KB
C语言职工信息管理系统链表.docx
《C语言职工信息管理系统链表.docx》由会员分享,可在线阅读,更多相关《C语言职工信息管理系统链表.docx(26页珍藏版)》请在冰豆网上搜索。
C语言职工信息管理系统链表
《程序设计综合训练》
设 计 报 告
专业:
数字媒体技术
班级:
11媒体Z
学号:
11145107
姓 名:
朱毅
指导教师:
陈湘军陈明霞
成 绩:
计算机工程学院
2012年10月
第一部分
题目:
1.编写函数inthamming(intx,inty,chara[],charb[])实现以下功能:
先将形参x和y分别转换为2个合法代码并按从低位到高位的顺序为别保存2个合法代码的码距,函数返回该码距。
2.编写函数main()函数实现以下功能:
声明字符数组a、b和变量m、n输入两个整数冰保存到m和n中,若m、n的值在0~32767范围内则用m、n和数组a、b做实参调用haming函数,计算由m和n生成的两个合法代码的码距输出的到屏幕及文件myf2。
out中.最后将考生本人的准考证号输出到文件myf2.out中。
来自:
2009年(秋)上机试卷(03)的编程题。
解题的基本思路:
子函数就是将形参X,Y分别转换为2个合法的代码并按从低位到高位的顺序分别保存2个合法代码到a和b指向的数组中,在计算a数组和b数组中的两个合法代码的码距,函数返回码距.
主函数就是调用子函数,并输出结果。
设计方案:
(1)功能模块框图:
(2)程序流程图:
算法设计:
(1)算法描述:
由于hamming函数需要分别将两个整数转换为合法代码,因此编写函数“voidbin(intn,charstr[])"。
Bin函数的功能是将形参n转换为合法代码并保存到b指向的一维数组中。
Hamming函数先两次调用bin函数,分别将形参X和Y转换为合法代码并分别保存到a和b指向的一维数组中,在用循环语句从前向后遍历a和b指向的数组各元素,函数最后返回统计结果。
(2)实现方法:
用VC6.0软件进行调试,分析,输入m,n两个值,进行分析,调用函数hanmming(),在从hanmming()函数中调用函数bin(),返回count的值,输出,a,b数组中的值和返回值count的值.
源代码:
#include〈stdio.h〉
voidbin(intn,charstr[])
{
inti=15,j;
while(n!
=0)
{
str[i--]=n%2+’0’;
n/=2;
}
for(j=0;j<=i;j++)
str[j]='0';
str[16]=’\0’;
}
inthamming(intx,inty,chara[],charb[])
{
intcount=0,i;
bin(x,a);
bin(y,b);
for(i=0;i〈16;i++)
if(a[i]!
=b[i])
count++;
returncount;
}
voidmain()
{
chara[17],b[17];
intm,n,x;
FILE*fp;
fp=fopen("myf2.out",”w”);
if(fp==NULL)
printf("error”);
do{
scanf(”%d,%d”,&m,&n);
}while(m〉32767&&m〈0&&n〉32767&&n〈0);
x=hamming(m,n,a,b);
printf(”\n%s\n%s\ndistanceof%dand%dis%d\n”,a,b,m,n,x);
fprintf(fp,"\n%s\n%s\ndistanceof%dand%dis%d\n”,a,b,m,n,x);
fprintf(fp,”11145107”);
fclose(fp);
}
程序调试:
就是输入的时候,n和m的值范围问题,当输入范围不正确时候跳不出来
解决方法:
用一个do{}while;循环条件为大于32767和小于0的时候退出。
测试:
第二部分
职工信息管理系统
(1)题目名称:
职工信息管理系统
内容:
职工信息包括职工号、姓名、性别、出生年月、学历、职务、工资、住址、电话等(职工号不重复).试设计一职工信息管理系统,使之能提供以下功能:
1、职工信息录入功能(职工信息用文件保存,也可不用)
2、职工信息浏览功能
3、排序:
按工资排序
4、查询或排序功能:
(至少一种查询方式:
顺序、折半查找)
按工资范围查询
5、职工信息删除、修改功能(任选一项)
(2)解题的基本思路
程序采用模块化,每一个模块对应一种功能,调用函数予以实现,分别为7个模块,分别是创建与添加模块、显示模块、查找模块、修改模块、删除模块、存档模块、文件统计模块、退出模块,把复杂的问题分成每一个独立功能的小问题来解决。
(3)设计方案
1、功能模块图
(4)算法设计
该程序主要分为7个模块,分别是创建与添加模块、显示模块、查找模块、修改模块、删除模块、存档模块、文件统计模块、退出模块
创建与添加模块:
该模块的功能是输入职工信息。
函数为voidAdd(Node*woker)
原理:
采用尾插法,先建立链表与头结点,新增一个结点,键盘输入职工号、职工姓名、职工性别、职工出生年月、职工学历、职工职位、职工工资,将这些信息存储到新增结点中,将新增加的节点连到链表的尾端,如此以往,将尾结点的指针域置空,这样就得到了一条存储职工信息的链表,这样就完成了职工信息的创建与增加。
显示模块:
该模块功能是显示职工信息.函数为voidDisp(Node*woker)
原理:
先新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“没有记录可以显示”;若不为空,则输出它的指针域所指向节点所储存的职工信息,并将该指针向后移一个结点,直到P指向空,即输出了所有职工的信息,这样就完成了所有职工信息的显示。
查找模块:
该模块功能是查找职工信息。
函数为voidTongji(Node*woker)
原理:
该模块分为两种查找方法,分别是按职工号查找和按职工姓名查找,因为这两种查找方法雷同,所以这里将只解释按职工号查找的原理。
先键盘输入一个要查找的职工号并新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“没有资料可以统计分类”,若不为空,则判断它的指针域所指向节点所储存的职工信息中的职工号,若相等,则输出这个职工的其他所有信息,并将P指向下一个结点,再次进行判断,直到P指向空,即输出了所有查找到的信息.若不相等,则P指向下一个结点,再次进行判断,直到P指向空,即输出了所有查找到的信息,这样就完成了职工信息的查找。
修改模块:
该模块功能是修改职工信息。
函数为voidchange(Node*woker)
原理:
根据查找原理,查找到要修改信息的职工,删除这一节点,并新建一个节点,键盘输入想要修改的内容,并储存到新的结点中,将新的节点连接到链表中原先删除结点的位子,这样就完成了职工信息的修改.
删除模块:
该模块功能是删除管理职工信息.函数为voiddismiss(Node*woker)
根据查找的原理,查找到要修改信息的职工,删除这一节点,并将其前驱结点的指针域指向其后继结点,这样就完成了职工信息的删除.
存档模块:
将内存中的信息存储到文件中。
函数为voidsave(Node*woker)
原理:
打开文件,新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“无记录”,若不为空,则将这个职工的所有信息输入到文件中,并将P指向下一个结点,直到P指向空,即输入了的信息,
文件统计模块:
打开文件,统计职工数目,并输出.函数为voidload(Node*woker)
退出模块:
该模块功能是退出管理档案.
(5)程序调试与测试:
欢迎界面:
主界面:
创建与增加模块:
输入职工信息为:
职工号
职工姓名
职工性别
职工出生年月
职工学历
职工职位
职工工资
1
A
f
11
ben
a
1000
2
B
m
22
ben
b
2000
3
C
f
33
ben
c
3000
4
D
m
44
ben
d
4000
输入第一次时:
输入第二次时:
输入第三次时:
输入第四次时:
显示模块:
输入四次后显示的结果为:
查找模块:
输入查找职工号为3的职工信息:
输入查找职工姓名为c的职工信息:
修改模块:
修改职工号为3的职工信息为:
职工号
职工姓名
职工性别
职工出生年月
职工学历
职工职位
职工工资
5
E
f
55
ee
e
5000
职工信息变成:
删除模块:
删除职工号为5的职工信息:
删除后的结果为:
退出模块:
(6)总结
此次实践课编写的是一个应用程序,相对于以前我们见到的程序,它要大得多,运行的结果也没有预想中的好,数据的输出格式不太规范,而且各模块也出现了一些小问题,我很有耐心的一次又一次的进行修改,最后运行的结果基本上达到了预期的目的。
本次C语言的实习课让我对C语言的学习又有了更深入的了解,也让我更深刻地领悟到了“实践出真理”这个道理,在上机实践过程中学到的知识远远超过了在课堂上学到的,这次程序设计课让我增添了许多程序设计经验,为我们将来走上工作岗位其了不小的铺垫作用.
本次实习中遇到了很多以前没有遇到过的问题,也曾想过要放弃,但看到那些同学都在那认真的写程序,给了我继续的信心.在同学和老师的帮助下,我顺利的结束了本次实习,让我知道原来凭借自己努力取得的成功会让自己这么欣慰。
(7)附录:
源代码
#include〈stdio。
h〉
#include〈stdlib。
h》
#include〈string。
h>
structwokers//定义一个woker的结构体
{
charnum[10];//职工号
charname[15];//职工姓名
charsex[15];//职工性别
charbirthday[15];//职工出生年月
chardegree[10];//职工学历
charposition[10];//职工职位
charsalary[10];//职工工资
};
typedefstructnode
{
structwokersdata;
structnode*next;//建立一个链表。
}Node;
voidAdd(Node*woker)//添加记录
{
Node*p,*r,*s;
charn[10];//先用于输入职工号,也用于判断是否跳出循环
r=woker;
s=woker-〉next;//使s为第一个有用的结点
while(r—>next!
=NULL)//这个循环的作用是使r为最后一个有用的结点
r=r—〉next;//将指针置于最末尾
while
(1)
{
printf("〉>〉>>>〉>〉>提示:
输入0则返回主菜单!
\n”);
printf(”\n请你输入职工号:
");
scanf(”%s”,n);
if(strcmp(n,"0")==0)break;
p=(Node*)malloc(sizeof(Node));//申请空间
strcpy(p-〉data.num,n);
printf(”\n请输入姓名:
");
scanf(”%s",p—〉data.name);
printf(”\n请输入性别:
”);
scanf(”%s”,p—〉data.sex);
printf(”\n请输入出生年月:
”);
scanf(”%s”,&p-〉data。
birthday);
printf(”\n请输入学历:
”);
scanf(”%s”,&p->data。
degree);
printf(”\n请输入职位:
");
scanf(”%s”,&p—>data.position);
printf("\n请输入工资:
”);
scanf(”%s",&p—>data.salary);
printf("〉〉〉>〉〉〉〉〉>提示:
已经完成一条记录的添加。
\n");
p->next=NULL;
r-〉next=p;//这一步是必需的,将p与先前的链表连起来构成一条新链表
r=p;//也是必需的。
将r又重设为新链的最后一个有用结点
}
}
voidchange(Node*woker)//修改职工信息函数
{
Node*p;
charfind[20];
if(!
woker—〉next)
{
printf(”\n〉〉〉〉〉>〉>>>提示:
没有资料可以修改!
\n”);
return;
}
printf(”请输入要修改的职工号:
”);
scanf(”%s",find);
p=woker—>next;
while(p!
=NULL)
{
if(strcmp(p->data。
num,find)==0)//如果找到的话返回的是符合要求
break;
p=p—〉next;
}
if(p)
{
intx;
while
(1)
{
printf("完成修改请输入0否则输入任意数再进行修改:
");
scanf(”%d”,&x);
if(x==0)
{break;}
printf("请输入新职工号(原来是%s):
”,p—>data.num);
scanf("%s",p—〉data。
num);
printf("请输入新职工姓名(原来是%s):
",p—>data。
name);
scanf("%s”,p—〉data.name);
printf("请输入新职工性别(原来是%s):
”,p->data。
sex);
scanf("%s",p->data.sex);
printf("请输入新出生年月(原来是%s):
”,p->data.birthday);
scanf("%s”,p—>data.birthday);
printf("请输入新职工学历(原来是%s):
”,p-〉data.degree);
scanf(”%s”,p-〉data。
degree);
printf(”请输入新职工职位(原来是%s):
”,p—〉data.position);
scanf("%s",p—〉data。
position);
printf("请输入新职工工资(原来是%s):
”,p—>data。
salary);
scanf(”%s",p-〉data.salary);
printf("\n>>>〉>>〉〉〉〉提示:
该项记录资料已经成功修改!
\n”);
}
}
elseprintf("\n〉>〉〉〉>〉〉>〉提示:
你要修改的信息不存在!
\n”);
}
voidDisp(Node*woker)//输出职工信息
{
Node*p;
p=woker—〉next;
if(!
p)
{
printf("\n〉〉〉>〉〉〉〉〉>提示:
没有记录可以显示!
\n”);
return;
}
printf(”\t\t\t\t显示结果\n");
printf(”职工号职工姓名职工性别职工生日职工学历职工职位职工工资\n”);
while(p)
{
printf(”\n%-13s%-11s%—7s%-10s%—13s%—10s%—5s\n",p-〉data.num,p-〉data.name,p->data.sex,p->data。
birthday,p->data.degree,p->data。
position,p—〉data。
salary);
p=p—〉next;
}
}
voidTongji(Node*woker)//查找统计函数
{
Node*p;
intsel;intflag2=0,ha=0;
charfind[20];
p=woker-〉next;
if(!
woker—〉next)//若链表为空
{
printf(”\n〉>>〉>〉〉〉>〉提示:
没有资料可以统计分类!
\n”);
return;
}
printf(”〉〉〉〉>>〉〉>〉提示:
\n=====〉0退出\n=====〉1按职工号统计\n=====〉2按职工姓名名称统计\n”);
scanf(”%d”,&sel);
if(sel==1)
{
printf("\n输入你要统计分类的职工号:
”);
scanf("%s”,find);
while(p)
{
if(strcmp(p—〉data.num,find)==0)
{
flag2++;
}
if(flag2==1&&ha!
=flag2)
{printf(”职工号职工姓名职工性别职工生日职工学历职工职位职工工资\n");
printf("\n%-13s%—11s%—7s%—10s%-13s%-10s%-5s\n”,p—〉data。
num,p->data。
name,p—>data。
sex,p->data。
birthday,p—〉data。
degree,p—〉data。
position,p->data.salary);
ha=flag2;
}
elseif(flag2>ha){printf(”\n%-13s%—11s%—7s%—10s%—13s%—10s%—5s\n”,p—〉data。
num,p—>data。
name,p—>data.sex,p-〉data。
birthday,p—〉data.degree,p—>data。
position,p—〉data.salary);ha=flag2;}
p=p->next;
}
if(flag2)
{
printf(”\n*************************按设备号%s统计分类的有%d条记录:
*************************\n\n”,find,flag2);
}
else{printf(”\n按职工号%s统计的结果为0个\n\n",find);}
}
elseif(sel==2)
{
printf("\n输入你要统计分类的职工姓名:
”);
scanf(”%s",find);
while(p)
{
if(strcmp(p-〉data.name,find)==0)
{
flag2++;
}
if(flag2==1&&ha!
=flag2)
{printf(”职工号职工姓名职工性别职工生日职工学历职工职位职工工资\n”);
printf(”\n%—13s%-11s%—7s%-10s%-13s%—10s%—5s\n”,p—〉data。
num,p—〉data。
name,p-〉data。
sex,p-〉data。
birthday,p—>data.degree,p-〉data.position,p-〉data。
salary);
ha=flag2;
}
elseif(flag2〉ha){printf("\n%-13s%—11s%—7s%-10s%—13s%—10s%-5s\n”,p—〉data。
num,p—>data。
name,p-〉data。
sex,p—〉data.birthday,p—〉data.degree,p—〉data。
position,p-〉data。
salary);ha=flag2;}
p=p-〉next;
}
if(flag2)
{
printf("\n\n\n共查找到%d条记录:
\n\n",flag2);
}
else{printf(”\n按职工姓名%s统计分类的结果为0个\n\n”,find);}
}
elseif(sel==0)return;
}
voidload(Node*woker)
{Node*p,*q;
FILE*fp;//指向文件的指针
intrecordNum;//统计记录数
if((fp=fopen(”职工管理系统。
txt”,"rb”))==NULL)//打开文件
{
printf(”cannotopenfile\n”);//不能打开
}
p=woker;
recordNum=0;
while(!
feof(fp))
{q=(Node*)malloc(sizeof(Node));
fscanf(fp,”%s%s%s%s%s%s%s”,p->data。
num,p-〉data.name,p—〉data.sex,p—〉data。
birthday,p—〉data。
degree,p—〉data。
position,p->data.salary);/*从文件读入记录*/
p—>next=q;
q—>next=NULL;
p=q;
recordNum++;
}
fclose(fp);
printf(”文件里共有%d条记录:
\n”,recordNum);
}
voidsave(Node*woker)//将职工信息保存到文件
{
intn;
Node*p;
FILE*fp;//指向文件的指针
printf(”需要保存到文件吗?
(1—保存,0-不保存)”);
scanf("%d”,&n);
if(n==1)
{
if(woker—〉next==NULL)
printf(”无记录");
elsep=woker—〉next;
if((fp=fopen("职工管理系统。
txt”,"wb"))==NULL)//打开文件,并判断打开是否正常
printf("cannotopenfile\n”);//打开文件出错
while(p!
=NULL)
{
fprintf(fp,”%s%s%s%s%s%s%s”,&p-〉data。
num,&p—>data.name,&p-〉data.sex,&p—>data。
birthday,&p—>data.degree,&p->data。
position,&p-〉data。
salary);
p=p-〉next;
}
fclose(fp);//关闭文件
}
}
voiddismiss(Node*woker)//删除职工信息函数
{Node*p,*r,*s;
charfind[10];
if(!
woker-〉next)
{
printf("\n〉>〉〉〉>〉〉>>提示:
没有资料可以显示!
\n”);
return;
}
printf(”\n〉>〉〉〉〉〉>〉>提示:
请输入您要删除的职工号!
\n”);
scanf("%s”,find);
p=woker-〉next;
while(p!
=NULL)
{
if(strcmp(p—>data.num,find)==0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 职工 信息管理 系统