C语言职工管理表设计报告附代码.docx
《C语言职工管理表设计报告附代码.docx》由会员分享,可在线阅读,更多相关《C语言职工管理表设计报告附代码.docx(31页珍藏版)》请在冰豆网上搜索。
C语言职工管理表设计报告附代码
第一部分:
课程设计的题目与要求
1.1、问题的提出
熟悉VC6.0的开发环境,掌握基本的编程方法,熟悉用C语言的完成一个应用程序的设计过程,掌握有关编辑和调试程序的方法和技巧,主要掌握C语言中的结构体、指针及文件操作等内容,了解开发简单应用程序的全过程,包括:
分析、设计、编程、调试和编写设计报告。
1.2、功能要求
显示记录:
根据用户提供的记录或者根据职工姓名显示一个或几个职工的各项工资和进行平均工资;
修改记录:
可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示;
查找记录:
可以对数据文件的任意记录的数据进行查找并在查找前后对记录内容进行显示;
删除记录:
可删除数据文件中的任一记录;
添加记录:
可以在数据文件中添加记录并添加记录后对记录内容进行显示;
统计:
(A)计算各项工资平均工资及总工资,(B)统计符合制定条件以内的工资职工人数及占总职工人数的百分比。
(C)按字符表格形式打印全部职工工资信息表及平均工资(包括各项总的平均工资);
保存数据文件功能;
打开数据文件功能。
第二部分课程设计题目功能
2.1、系统功能模块框图设计
2.2、数据结构说明
定义结构体
intss;
structxinxi
{
charID[10];
charname[20];
intnum[5];
}person[100];
“ss”为全局变量”xinxi”为结构体名,”person”为结构体数组,”ID”、”name”、”num”均为结构体成员。
其中定义的”ID”和”num”为字符型数组,”int”为整形数组,程序中定义的i,j,folg,k,t,m变量均为整形变量。
2.3、详细设计
首先利用程序读入相关文件,然后开始编写程序,实现功能。
主函数main调用//按姓名输入函数voidxinming()//按ID号输入函数voidid()//总工资函数voidzong()//增加函数voidzhengjia()//修改数据函数voidxiugai()//统计函数voidtongji()//删除函数voidshanchu()。
voidwrite()为写函数,voidreadfile()为读取指针指向的文件的函数
//主函数
voidmain()
{
intscore;
readfile();
while(score!
=0)
{
printf("===================================\n");
printf("1职工总工资\t2按姓名查询\n3按ID号查询\t4修改数据\n5删除\t\t6增加\n7统计\t\t0退出\n");
printf("====================================\n");
scanf("%d",&score);
switch(score)
{
case0:
break;
case1:
zong();break;
case2:
xinming();break;
case3:
id();break;
case4:
xiugai();write();break;
case5:
shanchu();write();break;
case6:
zhengjia();write();break;
case7:
tongji();break;
}
}
定义整型变量score如果score!
=0则执行while循环,然后通过switch循环和case分支显示各个功能。
以按姓名输入进行查询信息为例。
//按姓名输入
voidxinming()
{
inti,j,flog=1;
chara[20];
printf("输入姓名:
\n");
scanf("%s",a);
for(i=0;iif(strcmp(a,person[i].name)==0)
{
flog=0;
printf("%s\t%s\t",person[i].ID,person[i].name);
for(j=0;j<5;j++)
{
printf("%d\t",person[i].num[j]);
}
printf("\n");
}
if(flog==1)printf("找不到数据");
}
定义整形变量,i、j、flog,并赋予flog=1,定义a字符型数组,利用for循环中的if语句对从屏幕中输入的值a和结构体数组中的成员进行比较,如2个值相同,则flog=0,并从屏幕中输出信息,如不相等则flog=1,并从屏幕上输出”找不到数据”。
查询总工资和按ID号进行查询信息功能大致如此。
写函数,并实现增加数据和修改,删除,统计功能。
//增加
voidzhengjia()
{
printf("输入信息:
");
scanf("%s%s",person[ss].ID,person[ss].name);
printf("%s%s",person[ss].ID,person[ss].name);
scanf("%d%d%d%d%d",&person[ss].num[0],&person[ss].num[1],&person[ss].num[2],&person[ss].num[3],&person[ss].num[4]);
printf("\n");
ss++;
}
末尾由于增加了一组数据,所以需要SS自加1。
//修改数据
voidxiugai()
{
inti,flog=1,t,k,m;
chara[20];
printf("输入ID:
\n");
scanf("%s",a);
for(i=0;iif(strcmp(a,person[i].ID)==0)
{
flog=0;
t=i;
}
if(flog==1)
{
printf("找不到数据");
return;
}
while(k!
=0)
{
printf("============修改信息================\n");
printf("1姓名\t\t2基本工资\n3职务工资\t4津贴\n5医疗保险\t6公基金\n\t\t0退出\n");
printf("====================================\n");
scanf("%d",&k);
switch(k)
{
case0:
break;
case1:
printf("输入新姓名:
\n");
scanf("%s",a);
strcpy(person[t].name,a);
break;
case2:
printf("输入新的基本工资:
\n");
scanf("%d",&m);
person[t].num[0]=m;
break;
case3:
printf("输入新的职务工资:
\n");
scanf("%d",&m);
person[t].num[1]=m;
break;
case4:
printf("输入新的津贴:
\n");
scanf("%d",&m);
person[t].num[2]=m;
break;
case5:
printf("输入新的医疗保险:
\n");
scanf("%d",&m);
person[t].num[3]=m;
break;
case6:
printf("输入新的公基金:
\n");
scanf("%d",&m);
person[t].num[4]=m;
break;
}
}
}
定义变量值i,flog=1,t,k,m还有字符型数组a,首先通过if(strcmp(a,person[i].name)==0)
对输入的信息进行比对,若查找到了数据,便用while里的内容进行循环,并修改,若没有找到,函数通过return返回。
以修改某人公积金为例,首先进入case分支,输出“输入新的公基金”,然后通过scanf("%d",&m)person[t].num[4]=m;实现输入新数据,对数据进行修改。
2.4调试与测试
原始文件:
程序运行后如下图所示;
图一:
运行程序
测试功能一:
查询职工总工资。
输入1,显示输入需要查询工资人的姓名
图二:
测试功能一
输入姓名,王小民。
结果如图三:
图三:
显示结果
得到结果,显示的序号:
03姓名:
王小民总工资1568平均值:
313。
然后输入0
退出程序,输入其他功能值,则继续运行其他功能。
测试按姓名查询信息功能:
输入2后,提示输入需查询信息人的姓名,如图四
图四
输入一个姓名,例:
方的飞,得到显示结果如图五:
图五
输出ID号07姓名方的飞基本工资854职务工资398津贴80医疗保险59公积
金50。
输出结果正确!
继续输入3,测试按ID号查询信息
图六:
提示输入ID号
输入07号,得到结果如图:
图七
得到输出数据无误!
继续输入4,执行修改数据功能
提示输入需要修改信息人的ID号,如图八:
图八
输入ID号为04,结果如图九
图九
输入需要修改的信息,例如,修改基本工资则输入2,提示输入新的基本工资,如图十:
图十
输入新的基本工资为1234,提示需要继续修改的项目,如图十一:
图十一
如不需修改其他信息则程序在根文件夹中得到一个新的文本文档,修改的数据保存在新的文
本中,如图十二:
图十二
测试数据删除功能,在程序主菜单中输入5,提示输入需要删除信息人的ID,如图十三
图十三
输入ID08,返回主菜单,再次使用ID号查询信息输入08时,程序提示找不到数据,如图
十四
图十四
同时在新建的文本中08号对应的信息已被删除,如图十五:
图十五
测试增加信息功能,提示输入信息
图十六
然后使用按ID号查询功能,输入ID09,得到结果如图十七所示
图十七
并在根文件夹下新建了新的文本,增加了刚刚输入的09号的信息,如图十八
图十八
测试功能无误。
测试统计功能结果
输入7得到显示结果如图所示,并输入相关数据,如图十六
按照题目要求,前三项工资和在2000以上、2000-1500、1500-1000的职工人数为4
、1、3个,所占百分比分别为50%、13%、38%。
结果显示无误,测试完成
第三部分课程设计总结
总结:
通过此次课程设计,使对以前C语言中所学的内容有了进一步的印象,并巩固了所学的知识,对C语言的实际应用有了更一步的了解,对常用的函数,语法结构,和一些数据类型的运用,及一些基本知识都进行了一次大的复习,从自己写一个程序的实践过程中,平时理论课遇不到的问题和错误,此时通通显现出来,一些小的漏洞,疏忽便会影响程序最后的运行,例如,在实现增加功能函数中,由于少打了几个取址符&,导致最后程序运行时写入不了新的数据,这些小的问题都会影响最后的运行,此次课设让我写了解到了,在C语言的程序编写中需要更加细心,而且,此次编写的程序仍有部分不足之处,需要今后的努力学习,才能编写出更好的程序。
附录:
#include
#include
#include
intss;
structxinxi
{
charID[10];
charname[20];
intnum[5];
}person[100];
charstr[70];
//读文件
voidreadfile()
{
FILE*fp;
inti=0,j;
if((fp=fopen("90226.txt","r"))==NULL)
{
printf("filecannotbeopened\n");
exit(0);
}
fgets(str,70,fp);
printf("%s",str);
while(!
feof(fp))//判断fp是否指向文件尾
{
fscanf(fp,"%s%s",person[i].ID,person[i].name);
for(j=0;j<5;j++)
{
fscanf(fp,"%d",&person[i].num[j]);
}
i++;
}
ss=i;//将i的值赋予ss,ss始终指向与结构体尾部
fclose(fp);
for(i=0;i{
printf("%s%10s",person[i].ID,person[i].name);
for(j=0;j<5;j++)
printf("%13d",person[i].num[j]);
printf("\n");
}
}
//按姓名输入
voidxinming()
{
inti,j,flog=1;
chara[20];
printf("输入姓名:
\n");
scanf("%s",a);
for(i=0;iif(strcmp(a,person[i].name)==0)
{
flog=0;
printf("%s\t%s\t",person[i].ID,person[i].name);
for(j=0;j<5;j++)
{
printf("%d\t",person[i].num[j]);
}
printf("\n");
}
if(flog==1)printf("找不到数据");
}
//按ID号输入
voidid()
{
inti,j,flog=1;
chara[20];
printf("输入ID:
\n");
scanf("%s",a);
for(i=0;iif(strcmp(a,person[i].ID)==0)
{
flog=0;
printf("%s\t%s\t",person[i].ID,person[i].name);
for(j=0;j<5;j++)
printf("%d\t",person[i].num[j]);
printf("\n");
}
if(flog==1)printf("找不到数据");
}
//总工资
voidzong()
{
inti,j,flog=1,me=0,ave;
chara[20];
printf("输入姓名:
\n");
scanf("%s",a);
for(i=0;iif(strcmp(a,person[i].name)==0)
{
flog=0;
printf("%s\t%s\t",person[i].ID,person[i].name);
for(j=0;j<5;j++)
{
me=me+person[i].num[j];
}
ave=me/5;
printf("%d%d",me,ave);
printf("\n");
}
if(flog==1)printf("找不到数据");
}
//写函数
voidwrite()
{
FILE*fp;
inti=0,j;
if((fp=fopen("90226_1.txt","w"))==NULL)
{
printf("filecannotbeopened\n");
exit(0);
}
fprintf(fp,"%s",str);
for(i=0;i{fprintf(fp,"%s%10s",person[i].ID,person[i].name);
for(j=0;j<5;j++)
fprintf(fp,"%13d",person[i].num[j]);
fprintf(fp,"\n");
}
fclose(fp);
}
//增加
voidzhengjia()
{
printf("输入信息:
");
scanf("%s%s",person[ss].ID,person[ss].name);
printf("%s%s",person[ss].ID,person[ss].name);
scanf("%d%d%d%d%d",&person[ss].num[0],&person[ss].num[1],&person[ss].num[2],&person[ss].num[3],&person[ss].num[4]);
printf("\n");
ss++;
}
//修改数据
voidxiugai()
{
inti,flog=1,t,k,m;
chara[20];
printf("输入ID:
\n");
scanf("%s",a);
for(i=0;iif(strcmp(a,person[i].ID)==0)
{
flog=0;
t=i;
}
if(flog==1)
{
printf("找不到数据");
return;
}
while(k!
=0)
{
printf("============修改信息================\n");
printf("1姓名\t\t2基本工资\n3职务工资\t4津贴\n5医疗保险\t6公基金\n\t\t0退出\n");
printf("====================================\n");
scanf("%d",&k);
switch(k)
{
case0:
break;
case1:
printf("输入新姓名:
\n");
scanf("%s",a);
strcpy(person[t].name,a);
break;
case2:
printf("输入新的基本工资:
\n");
scanf("%d",&m);
person[t].num[0]=m;
break;
case3:
printf("输入新的职务工资:
\n");
scanf("%d",&m);
person[t].num[1]=m;
break;
case4:
printf("输入新的津贴:
\n");
scanf("%d",&m);
person[t].num[2]=m;
break;
case5:
printf("输入新的医疗保险:
\n");
scanf("%d",&m);
person[t].num[3]=m;
break;
case6:
printf("输入新的公基金:
\n");
scanf("%d",&m);
person[t].num[4]=m;
break;
}
}
}
//统计
voidtongji()
{
intsum,i;floata=0,b=0,c=0;
floatave1,ave2,ave3;
for(i=0;i{
sum=person[i].num[0]+person[i].num[1]+person[i].num[2];
if(sum>=2000)
a++;
if(sum<2000&&sum>1500)
b++;
if(sum<=1500&&sum>=1000)
c++;
}
printf("%.0f%.0f%.0f",a,b,c);
printf("\n");
ave1=a/ss;ave2=b/ss;ave3=c/ss;
printf("%.2f%.2f%.2f",ave1,ave2,ave3);
printf("\n");
}
//删除
voidshanchu()
{
inti,flog=1,t,k;
chara[20];
printf("输入ID:
\n");
scanf("%s",a);
for(i=0;iif(strcmp(a,person[i].ID)==0)
{
flog=0;
t=i;
}
if(flog==1)
{
printf("找不到数据");
return;
}
for(i=t;iperson[i]=person[i+1];
ss--;
}
//主函数
voidmain()
{
intscore;
readfile();
while(score!
=0)
{
printf("===================================\n");
printf("1职工总工资\t2按姓名查询\n3按ID号查询\t4修改数据\n5删除\t\t6增加\n7统计\t\t0退出\n");
printf("====================================\n");
scanf("%d",&score);
switch(score)
{
case0:
break;
case1:
zong();break;
case2:
xinming();break;
case3:
id();break;
case4:
xiugai();write();break;
case5:
shanchu();write();break;
case6:
zhengjia();write();break;
case7:
tongji();break;
}
}
}