C语言课程实习报告职工信息管理系统设计Word文档下载推荐.docx
《C语言课程实习报告职工信息管理系统设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C语言课程实习报告职工信息管理系统设计Word文档下载推荐.docx(14页珍藏版)》请在冰点文库上搜索。
为了减少误操作的副作用,当用户对数据进行修改操作时,都会出现提示信息,请用户确认,然后才自动保存修改后的内容。
二、总体设计
整个管理系统可根据功能划分为:
数据输入模块,数据修改模块,数据查询模块,数据浏览模块,数据添加模块,数据删除模块。
图1.系统功能模块图
本系统定义了结构体类型structpeople,它用来存放职工的基本信息。
在系统许多数函数中都要用到这个数据类型,其数据结构定义是
structpeople
{
charnum[100];
charname[15];
charsex[20];
charage[20];
chardegree[20];
charsalary[20];
charaddress[20];
chartelephone[20];
}people[N];
。
系统中使用了该类型的全局变量数组people。
为了方便数据输入与简化程序设计,将各数据信息均采用字符型数组。
数据信息存放在文件中,一条记录对应一个职工,既符合习惯也方便管理。
结构体数组people[N]中的N采用宏定义的方式,可以随时在源程序宏定义中修改,本程序宏定义#defineN100。
本系统中的职工数据是以文件的形式存储在磁盘上的,可以永久保存。
文件名是Pro.txt。
该文件中的数据是以结构体类型structpeople为单位组织起来,以二进制文件的形式存放的。
在系统首次提交给用户时,文件中有十条职工信息。
三、详细分析
1.主函数
将main()函数体内的界面选择部分语句单独抽取出来作为一独立函数,目的在于系统执行完每部分功能模块后能够方便返回系统界面。
即
main()函数如下:
voidmenu()/*菜单函数,显示各项操作的选项供用户选择*/
intn,w1;
do
printf("
\t\t************************************************\n\n"
);
\t\t***选择执行项目************\n\n"
\t\t***1输入数据************\n\n"
\t\t***2修改数据************\n\n"
\t\t***3查询(按学历查询或者按职工号查询)*****\n\n"
\t\t***4浏览数据************\n\n"
\t\t***5删除数据************\n\n"
\t\t***6添加数据************\n\n"
\t\t***7退出************\n\n"
选择执行项目(1-7):
[]\b\b"
scanf("
%d"
&
n);
if(n<
1||n>
7)
w1=1;
elsew1=0;
}
while(w1==1);
/*输入的数字为1-7时跳出循环*/
switch(n)
{case1:
enter();
break;
case2:
modify();
case3:
search();
case4:
browse();
case5:
del();
case6:
add();
case7:
exit(0);
}
main()
{system("
cls"
menu();
}
2.各功能模块设计
1).输入模块
输入模块有enter()函数执行,在输入用户所需要的所有数据之后调用save(intn)函数保存所有输入的数据。
2).查询模块
该模块的功能是根据输入的职工信息找到对应的记录,提供了两种查找途径,一种是按职工学历查找,另外一种是按职工号查找。
在用户选择了相应的查找方式之后调用对应的cultsearch()函数与numsearch()函数进行查找。
用户查询成功之后可以选择继续查询另一个数据或者返回主菜单。
用户查询的记录是系统中不存在的时系统会提示用户此记录不存在,用户可以选择再次输入或者返回主菜单。
3).浏览模块
该模块的功能是浏览所有职工信息。
主要是调用Printf_face()函数显示数据结构,在调用printf_one(inti)函数显示各个数据。
由于职工人数太多,因此采用了分屏显示。
4).修改模块
该模块的功能是显示所有职工信息,考虑到记录较多,采用分屏显示。
显示完所有记录后,用户输入要修改职工的职工号,根据职工号查找职工记录,若用户输入的职工号不存在,系统会提示该数据不存在并提示用户在再次输入职工号。
输入正确的职工号之后系统调用modify_data()函数,并提示用户修改该记录的哪部分信息,是职工号、姓名、性别、年龄、学历、工资、住址、电话还是所有信息都修改,根据用户选择修改相应信息。
用户修改完毕之后系统会提示用户是否确认修改,并根据用户的选择执行下一步程序。
图2.修改模块程序流程图
程序:
modify()
{structpeoplep;
FILE*fp;
inti,n,k,w0=1,w1,w2=0;
/*变量i用于分屏显示的操作,变量n用于接受从加载函数load()中返回的值,变量k用于存放要修改的数据的位置并控制程序中的查找循环*/
n=load();
k=-1;
/*给用户看全部记录以便确认要修改的记录*/
printf_face();
/*调用显示数据结构项目函数*/
for(i=0;
i<
n;
i++)
{if((i!
=0)&
&
(i%10==0))/*用于分屏显示*/
{printf("
\n\n记住你要修改的数据号码,按任意键继续"
getch();
puts("
\n\n"
printf_one(i);
/*调用显示一个记录的函数*/
\n\n输入你想要修改的职工号:
"
%s"
p.num);
/*输入要修改的数据的职工号*/
i++)/*查找要修改的数据*/
if(strcmp(p.num,people[i].num)==0)
{k=i;
/*找到要修改的数据*/
p=people[i];
/*把people[i]备份给s,以便用户反悔时恢复*/
if(k==-1)printf("
\n\n没有找到数据,请再次输入"
}while(k==-1);
/*当k=-1表示没有找到*/
printf_one(k);
w1=modify_data(k,n);
/*修改学生记录并且返回保存控制值w1,w1=1表示用户以确认修改*/
if(w1==1)
\n操作成功^_^.\n\n是否修改另外的数据?
\n\n\t1).是2).返回并保存\t[]\b\b"
w0);
w2=1;
/*用来控制保存,是w2=1是标记已有过修改*/
else
{w0=0;
if(w2==1)
people[k]=p;
if(w0!
=1&
w2==1)/*w0!
=1表示正常返回,w2=1表示在此之前有过修改,保存用户已确认的修改并返回*/
save(n);
/*程序从Pro文件中将数据读给结构体people用于数据的修改操作,在用户对数据进行完修改操作之后系统保存已经修改了的所有数据并覆盖在原文件上*/
}while(w0==1);
5).删除模块
该板块的功能与修改板块一样先显示所有职工信息,同样考虑到记录较多,采用分屏显示。
显示完所有记录后,用户输入要删除职工的职工号,根据职工号找到职工记录并删除。
该模块采用的删除方法是将要删除的数据的后一个数据的内容覆盖在要删除的数据上,以此类推后一个数据覆盖前一个数据。
删除的记录在保存的时候少保存一个数据项。
图3.删除模块程序流程图
源程序:
del()
{
inti,n,k,w1=1,w2,w4,a;
structpeoplep;
n=load();
/*加载函数,可以用来加载所有记录,并且可以返回所有记录的个数*/
do
{k=-1;
printf("
\n\n输入你要删除的职工号"
scanf("
printf_face();
/*显示数据结构项目*/
for(i=0;
if(strcmp(p.num,people[i].num)==0)/*查询要删除的职工号*/
{k=i;
printf_one(k);
/*显示一个记录的具体内容*/
if(k==-1)
{printf("
\n\n没有找到相应的数据"
\n\n是否再次输入\n\t1).再次输入2).不再输入,返回[]\b\b"
w1);
if(w1==2)
printf_back();
/*一个任务结束时的选择浏览还是返回的函数*/
while(k==-1&
w1==1);
\n你确认删除吗?
\n\t1).确认2).不确认并返回[]\b\b"
w4);
if(w4==1)
for(a=k;
a<
a++)/*删除数据的操作*/
{strcpy(people[a].num,people[a+1].num);
strcpy(people[a].name,people[a+1].name);
strcpy(people[a].sex,people[a+1].sex);
strcpy(people[a].age,people[a+1].age);
strcpy(people[a].degree,people[a+1].degree);
strcpy(people[a].salary,people[a+1].salary);
strcpy(people[a].address,people[a+1].address);
strcpy(people[a].telephone,people[a+1].telephone);
}
save(n-1);
/*系统在进行完删除操作之后只保存n-1个数据,最后一个记录由于删除操作而变成空记录,将不进行保存*/
\n\n操作成功.^_^."
\n\n你想进行哪种操作\n\t1).删除另一个数据2).返回[]\b\b"
);
w2);
if(w2==1)del();
elsemenu();
6).添加模块
该模块的功能是用户需要增加新的职工记录,从键盘输入并逐条写到原来的输入文件中,采用的是追加而不是覆盖的方式。
图4.添加模块程序流程图
add()
inti,n,m,k;
FILE*fp;
/*加载函数,用来加载所有记录,并且可以返回所有记录的个数*/
你要增加多少个职工信息(0-%d)?
:
N-1-n);
m);
/*输入要追加的记录个数*/
k=m+n;
for(i=n;
k;
{
printf("
\n输入第%d个职工信息\n"
i-n+1);
input(i);
/*调用输入函数*/
if((fp=fopen("
Pro.txt"
"
ab"
))==NULL)/*以ab方式打开文件,追加保存*/
不能打开文件\n"
i++)/*输出到文件*/
if(fwrite(&
people[i],sizeof(structpeople),1,fp)!
=1)
printf("
文件读入错误\n"
fclose(fp);
printf_back();
/*一个任务结束时的选择浏览或是返回*/
四、调试程序/程序测试
程序在调试过程中曾经出现了不少error和warn,后来经过程序的修改把error都改正了但是却依然还有7个warn,个人觉得是在各个函数在预定义的时候没有加上void、int之类的前缀所致。
在数据输入的时候调用input(inti)函数,若输入职工号002的数据之后接着再输入职工号002,此时函数调用了no_input(intI,intn)函数确认职工号是不可重复的,并提示用户此记录已存在,用户需要重新输入。
在input(inti)函数中,no_input(inti,intn)的应该在职工号输入之后才调用,之前曾经试过职工号在no_input()函数中输入,可是程序没有能够运行成功,后期之后回到输入职工号与验证职工号在两个函数中执行这种思想。
添加函数add()采用的是追加的方式保存数据,而输入函数enter()采用的是覆盖的方式保存数据,也就是说如果程序中已有数据再进行输入操作的时候会覆盖掉原先位置上的数据。
可以的话应该在输入函数上有所提示,或者只允许用户进行一次输入操作。
进行删除函数del()之后应该调用保存函数save(),注意保存函数中的参数应该是n-1,即保存删除之后的数据。
在最开始编写程序的时候没有注意到这个问题,save()函数中的参数一直是n,导致的结果是最后一个数据是空白而占据了一个记录的空间。
五、小结
这次上机实习让我学到了很多有用的东西,巩固了之前的学习,让我学到了在教室和做题中学不到的一些知识,通过这个程序的学习,使我进一步理解和运用结构化程序设计的思想和方法。
初步掌握开发一个小型实用系统的基本方法,基本学会调试一个比较长程序的基本方法,进一步掌握和提高利用C语言进行程序设计的能力。
并且,C语言是需要有一定基础、而且动手能力强的学科。
上机实验是学习程序设计语言必不可少的实践环节,特别是C语言灵活、简洁,更需要通过编程的实践来真正掌握它。
对于程序设计语言的学习目的,可以概括为学习语法规定、巩固贯穿系统知识、掌握程序设计方法、提高程序设计能力,这些都必须通过充分的实际上机操作才能完成。
但是,在此次实习中,我也发现了对一些计算机C语言知识掌握的不足。
对里面的好多东西还是很陌生,并不是很熟练,有着许多欠缺,更多的在运用起来的时候还是感到很不好动手。
还不能熟练的掌握即运用知识,甚至对一些基本知识混淆,以至于在编程时浪费了很多时间,操作中还出现了一些问题,这些都是我需要改进的地方。
而正是这次实习给了我这次机会,让我更清楚地认识了自己的不足,及时地改正并完善自己,使知识熟练的掌握。
而且,C语言是计算机的基础,它功能丰富,表达能力强,应用面广泛,因此掌握好C语言十分重要。
不仅如此,对于我的专业来说也十分重要,因为我所学的专业有许多课程需要运用计算机,通过学习C语言使得我对计算机有了一定了解,熟练了一些操作,这些对我学习专业也有一定帮助。
因此,我认为这次实习对于我是非常有意义的,对我个人的影响比较大,对我的动手能力有了很大的提高,复习了以前所学的知识,掌握了一些陌生知识,并且还对我有关专业的学习提供了帮助,这次C语言课程设计实习让我受益匪浅。