C语言职工信息管理系统链表.docx

上传人:b****8 文档编号:10242573 上传时间:2023-02-09 格式:DOCX 页数:26 大小:292KB
下载 相关 举报
C语言职工信息管理系统链表.docx_第1页
第1页 / 共26页
C语言职工信息管理系统链表.docx_第2页
第2页 / 共26页
C语言职工信息管理系统链表.docx_第3页
第3页 / 共26页
C语言职工信息管理系统链表.docx_第4页
第4页 / 共26页
C语言职工信息管理系统链表.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

C语言职工信息管理系统链表.docx

《C语言职工信息管理系统链表.docx》由会员分享,可在线阅读,更多相关《C语言职工信息管理系统链表.docx(26页珍藏版)》请在冰豆网上搜索。

C语言职工信息管理系统链表.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1