一、 题目要求
工资信息管理系统 【要求】
该系统能够实现工资信息管理。系统包括录入、浏览、查询、统计等功能。其中录入功能 要求能够添加新的工资信息到文件; 浏览功能要求能按照工资卡号、 姓名分类浏览, 提供分 屏显示; 有排序功能, 排序后按照工资卡号升序或实发工资降序输出; 查询功能要求能够按 照工资卡号、 姓名查询; 统计功能要求能够按照月份累计统计某职工在某时间段实发工资总 金额。 【提示】
1. 文件中一行数据对应一个职工工资信息
2. 工资信息的数据结构采用结构体数组,一个数组元素对应一条工资单记录
3. 工资单信息包括工资卡号、姓名、月份、应发工资、水费、电费、税金、实发工资等 4. 实发工资 =应发工资 -水费-电费 -税金,其中税金的计算方法为
a. 应发工资 <800 元,税金 =0
b. 800<应发工资 <1400 元,税金 =(应发工资 -800) *5%
c. 应发工资 >1400 元,税金 =(应发工资 -1400) *10% 另: 课程实习报告的参考格
式
1. 题目编号
2. 写出系统总设计的思路、功能模块划分。给出合理的测试数据及运行结果,要求能够体 现程
序的正确性和完备性及对错误输入的处理。总结算法或系统的优缺点,给出算法或 系统进一步改进的设想。在附录中给出源代码,
3. 附录
二、 需求分析
根据题目要求,由于工资单信息是存放在文件中,所以应提供文件的输入、输出等操 作;在程序中需要浏览学生的信息,应提供录入、浏览、查询、统计等操作;另外还应提供 键盘式选择菜单实现功能选择。
三、 总体设计
根据上面的需求分析,可以将这个系统的设计分为以下几个模块: 数据输入,数据添加,数 据浏览,数据查询,数据统计。
工资信息
数据输入 数据添加 数据浏览 数据查询 数据统计
图一 系统功能模块图
四、详细设计
1.主函数
主函数提供输入、处理和输出部分的函数调用。其中各功能模块用菜单方式选择。 [流程图] 管 理 系 统
图二 主函数模块功能流程图
[程序] main() { int n,w;
/** 主函数 ********************
/*变量 n保存选择菜单数字, w 判断输入的数字是否在功能菜单应对数字的
范
围内 */ do{ puts(\"\\**********MENU*************************\\n\\n\");
puts(\"\\\\ 1.Enter new data\"); puts(\"\\\\ 2.add new data\"); puts(\"\\\\ 3.Browse all\");
puts(\"\\\\ 4.Search by name\"); puts(\"\\\\ 5.Search by num\"); puts(\"\\\\ 6.Count gongzi\"); puts(\"\\\\ 7.Exit\"); puts(\"\\n\\n\\
printf(\"Choice your number(1-7):[ ]\\b\\b\"); scanf(\"%d\
if(n<1||n>7) {w=1;getchar();} /* 对选择的数字作判断 */ else w=0;} while (w==1); switch(n)
{ case 1: enter();break; /* 输入模块 */ case 2: add();break; case 3: browse();break;
/* 添加模块 */
/* 浏览模块 */
**\\n\");
case 4: search_name();break; /* 查询模块 */ case 5: search_num();break; /* 查询模块 */ case 6: count();break; /* 统计模块 */ case 7: exit(0);break;
/* 退出 */
} /* 其中 4 和 5 两个模块式在查询要求的基础上加上的模块 */ }
2.各功能模块设计
(1)输入函数 【分析】
单独看各数据信息,姓名是字符型,可以采用字符型数组; 工资卡号和月份是整数, 采用 整型;实发工资,水费,电费,税金,应发工资有可能是小数可采用实型。数据信息存放在 文件中, 一条记录对应一个职工的工资单信息, 既符合习惯也方便信息管理。 同时把职工的 工资卡号,姓名,月份,应发工资,水费,电费,税金,实发工资作为结构体成员,用结构 体数组存放若干个职工的工资信息。
struct gz { int num; char name[20]; int month; long ys; long ss; long wf; long ef; long tax;
} g[N]; /*g[N] 中每个数组元素对应一个职工 */
流程图】
图三 输入模块流程图
【程序】
enter() { int i,n;
printf(\"How many gongzixinxi (0-%d)?:\scanf(\"%d\
printf(\"\\n Enter data now \\n\\n\"); for(i=0;iif(i!=0) save(n); printf_back();}
(2) 添加模块 【分析】
该模块的功能是用户需要增加新的职工工资信息记录, 从键盘输入并逐条写入到原来的输 入文件中,注意采用追加而不是覆盖的方式。 【流程图】
图四 添加模块流程图
【程序】
add() { int i,n,m,k; FILE *fp; n=load();
printf(\"Hoe mang people are you want to add(0-%d):\k=m+n; for(i=n;i{printf(\"\\ninput %dth salary record.\\n\input(i);}
sort();
save(k); printf_back();
}
(3) 浏览模块
【分析】 该模块的功能是显示所有职工工资信息记录。 【流程图】
图五 浏览模块流程图
【程序】
browse() { int i,n; n=load(); printf_face(); for(i=0;i{ if(i%10==0) {printf(\"\\n\\nPass any key to contiune...\");getch(); puts(\"\\n\\n\");} printf_one(i); printf(\"\\n\");
}
printf(\"\There are %d record.\\n\printf(\"\\nPass any key to back ... \"); getch(); menu();
}
(4) 按姓名查找模块 【分析】
该模块的功能是根据输入的职工姓名查找对应的工资信息记录。 【流程图】
图六 按姓名查找模块流程图
【程序】 search_name() { int i,n,k,w1=1;
struct gz s; n=load(); do
{ k=-1;
printf(\"\\n\\nEnte
r name that you want to search!
scanf(\"%s\printf_face(); for(i=0;iprintf_one(k);}if(k==-1)
{printf(\"\\n\\nNo exist!please\"); printf(\"\\n\\nAre you again?\\n\ 1).Again 2)No and back [ ]\\b\\b \"); scanf(\"%d\}while(k==-1&&w1==1);
menu();
}
name\");
(5) 按工资卡号查找模块
【分析】 该模块的功能是根据输入的职工工资卡号查找对应的工资信息记录。 【流程图】
图七 按工资卡号查找模块流程图
【程序】 search_num() { int i,n,k,w1=1;
struct gz s; n=load(); do
{ k=-1; printf(\"\\n\\nEnter number that you want to search! number\"); scanf(\"%d\
printf_face(); for(i=0;iprintf_one(k);}if(k==-1)
{printf(\"\\n\\nNo exist!please\"); printf(\"\\n\\nAre you again?\\n\ 1).Again 2)No and back [ ]\\b\\b \"); scanf(\"%d\}while(k==-1&&w1==1);
menu();
}
(6) 统计模块 【分析】
该模块的功能是根据用户输入的职工姓名和所统计的月份来计算得出某个时间段的工资 总额。 【流程图】
输入职工姓名 输入起始月份 输入结束月份 g[i]=g[j];
图八 统计模块流程图 统计得出结
程序】
count()
{int i,j,k,n,sum=0;
char name[20]; n=load(); printf(\"\\nEnter the enployer's name: scanf(\"%s\
printf(\"\\nEnter the first month to count! scanf(\"%d\[ ]\\\"); printf(\"\\nEnter the last month to count! scanf(\"%d\for(i=0;iprintf(\"\\nthe result of count: sum=%d\\n\}
month: [ ]\\\"); month: [ ]\\\");
if(strcmp(name,g[i].name)==0&&g[i].month>=j&&g[i].month<=k)
3.公共函数
( 1)排序函数 sort() 【程序】
sort()
{
int i,j,n;
}
g[j]=t;}
( 2)输入函数 input (int i) 【程序】
input (int i)
{ scanf(\"%d%s%d%ld%ld%ld\
}
( 3)保存函数 save(int n) 【程序】
save(int n) { FILE *fp; int i;
if((fp=fopen(\"salary.txt\{ printf(\"\\nCannot open file\\n\"); return NULL;} for(i=0;iif(fwrite(&g[i],sizeof(struct gz),1,fp)!=1) printf(\"file write error\\n\"); fclose(fp);}
( 4)税金计算函数 tax( int i) 【程序】
tax( int i)
{
if(g[i].ys<800) g[i].tax=0;
else if(800}( 5)加载函数 load() 【程序】
load() { FILE *fp; int i;
if((fp=fopen(\"salary.txt\{printf(\"\\nCannot open file\\n\"); return NULL;} for(i=0;!feof(fp);i++)
fread(&g[i],sizeof(struct gz),1,fp); fclose(fp); return(i-1);
}
( 6)显示数据结构项目的函数 printf_face() printf_face()
{ printf(\"\\n num name month ys wf ef ss tax \\n\");}
(7) 显示一个记录的函数
printf_one(int i)
{ printf(\"%5d%10s%5d%10ld%10ld%10ld%10ld%10ld\g[i].ys,g[i].wf,g[i].ef,g[i].ss,g[i].tax);}
(8) 一个任务结束时的选择浏览还是返回的函数
printf_back() { int k,w;
printf(\"\\n\\n\Successful.\\n\\n\");
printf(\"What do you want to do?\\n\\n\ 1).Browse all now 2).Back;[ ]\\b\\b\"); scanf(\"%d\else menu(); if(w==1) browse();
}
五、上机操作
1.数据源
2.编译、连接和运行
3.结果 下面是各个模块的界面图
(1) 主菜单函数
(2) 输入模块 在主界面出现后输入 1 回车看到下图
3) 添加模块
4) 浏览模块
5) 按姓名查找模块
6) 按工资卡号查找模块
7) 统计模块
六、总结
通过该实例的学习, 可以进一步理解和运用结构化程序设计的思想和方法, 初步掌握开 发一个小型实用系统的基本方法, 学会调试一个较长程序的的基本方法, 学会利用流程图表 示算法,进一步掌握和提高利用 C 语言进行程序设计的能力。