辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
目 录
第1章 课程设计的目的与要求 ................................................ 1
1.1 课程设计目的 ........................................................ 1
1.2 课程设计的实验环境 .................................................. 1
1.3 课程设计的预备知识 .................................................. 1
1.4 课程设计要求 ........................................................ 1
第2章 课程设计内容 ........................................................ 2
2.1课程设计题目 ........................................................ 2
2.2课程设计整体设计说明 ................................................ 2
2.2.1课程设计内容 .................................................. 2
2.2.2系统功能模块结构图 ........................... 错误!未定义书签。
2.2.3数据结构设计及用法说明 ........................................ 2
2.2.4程序结构(画流程图) .......................................... 3
2.2.5各模块的功能 .................................................. 6
2.3程序源代码及注释 .................................................... 6
第3章 课程设计总结 ........................................................ 16
参考资料 .................................................................. 16
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第1章 课程设计的目的与要求
1.1 课程设计目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。本课程设计的目的和任务:
1. 巩固和加深学生对C语言课程的基本知识的理解和掌握
2. 掌握C语言编程和程序调试的基本技能
3. 利用C语言进行基本的软件设计
4. 掌握书写程序设计说明文档的能力
5. 提高运用C语言解决实际问题的能力
1.2 课程设计的实验环境
硬件要求能运行Windows 2000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识
熟悉C语言及C语言开发工具。
1.4 课程设计要求
1. 分析课程设计题目的要求
2. 写出详细设计说明
3. 编写程序代码,调试程序使其能正确运行
4. 设计完成的软件要便于操作和使用
5. 设计完成后提交课程设计报告
1
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第2章 课程设计内容
2.1程序功能介绍
该系统的主要功能是实现职工工资的录入,包括(录入职工的基本工资、实发工资、津贴、岗贴、补贴、房帖、交通补贴、储蓄、汇费)。对职工的工资信息进行删除、修改、个人所得税的计算。并统计职工的所有信息。
2.2程序整体设计说明
该程序的功能主要是实现职工工资的录入,并对工资的相应信息进行个人所得税的计算。主函数是整个程序的核心。子函数之间也是有联系的,对个人所得税的计算、职工工资信息的修改、删除、查询、统计,必须是在职工工资录入的情况下进行的。因此对职工工资信息的录入是非常重要的。
2.2.1设计思路
运行程序进入到主菜单后,显示一个职工工资管理系统主菜单窗口,然后分别按所提示的在1-8中选择,分别输入相应的数字后按Enter键即可。例如按数字键1后,是对职工工资的录入,然后分别输入相应的工资信息。按数字键2,是删除职工信息,输入相应的职工编号即可,当你输入的编号不存在,会提示你没有你要删除的内容。
2.2.2数据结构设计及用法说明
现行系统情况:该组织的发展历史。目前的组织规模、工作状况、管理水平、与外界的主要联系等。调查该项内容的目的主要是为了划分系统界限、系统与外界的输入输出接口等。
组织结构图:该组织的组织结构图,弄清组织的行政关系、人员编制、工作范围、地理位置等,发现不合理的问题及新系统启动后可能对现有组织的影响。
业务流程:按照业务种类的不同和处理时间的先后不同,深入了解现行系统的业务流程,画出现行系统业务流程图,并与业务人员反复讨论,得到认可。调查中要注意定性和定量相结合,注意人、财、物、信息的流向、规格、频率、要求以及需要解决的问 2
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
题等。
报表、数据处理:了解各种统计报表、数据格式、内容、处理时间以及上报时间、频率、规律、存在的问题,对新系统的要求、希望等并收集各种报表。
问题:现行系统中存在的主要问题和薄弱环节,可以按照严重程度分成不同等级。新系统的建立应该能解决大部分问题,并改善薄弱环节。
新系统的功能和目标:了解各级领导和各类业务工作人员对新系统功能的要求,系统分析(又称逻辑设计)是管理信息系统开发的关键环节,要求在系统调研的基础上,对新系统的功能进行细致分析,并建立一个新系统的逻辑模型。
2.2.3程序结构(流程图)
图 流程图
2.2.4各模块的功能及程序说明
1)/* 结构体声明 */
这是对职工工资信息录入的一个结构体的申明,申明该职工的工资信息有哪些。Id 3
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
为职工编号,jbgz为职工的基本工资,jt为职工的津贴,gt为职工的岗帖,bt为职工的补贴,ft为职工的房帖,jtbt为职工的交通补贴,cx为职工的储蓄,hf为职工的汇费,grsds为职工的个人所得税,yks为职工的应扣数,sfs为职工的实发数,Sfgz为实发工资。
/* 建立50个元素的结构体数组 */
struct zhigong zg[50];
/* 建立结构体变量 */
struct zhigong zgone;
/* 职员列表中的数量 */
int n=0;
/* 获得字符串 */
char numstr[50];
这是对职工的工资录入的主要数据结构,zg[50]是可以录入50个职工的工资信息,char numstr[50]为在录入职工的工资信息时,可输入的字符串的最大是50位。
主函数程序运行界面:
图 1 主函数界
4
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
图2 删除职工记录程序界面
图3删除职工记录程序界面
图4 修改个人记录的运行界面
5
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
图5统计出所有的职工信息的运行界面
2.2.5程序结果
图 6 程序结果
2.3程序源代码及注释
/******头文件(.h)***********/
#include "stdio.h" /*I/O函数*/
# include "bios.h" /*ROM基本输入输出函数*/ #include "dos.h" /*dos接口函数*/
#include "conio.h" /*屏幕操作函数*/ #include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/ /****变量定义*******/
typedef struct z1 /*定义数据结构*/{
6
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
char no[11]; /*编号*/
char name[15]; /*姓名*/
float jbgz; /*基本工资*/
float koukuan; /*扣款*/
float yfgz; /*应发工资*/
float shuijin; /*税金*/
float sfgz; /*实发工资*/
struct z1 *prior;/*前驱指针*/
struct z1 *next;/*后继指针*/}
SALARY; /*结构体类型名*/
struct z1 *First; /*双链表头指针*/
struct z1 *Last; /*双链表尾指针*/
/******函数原型*********/
void init(); /*初始化*/
void create(); /*创建链表*/
void calc(); /*计算应发工资*/
void delete(); /*删除*/
void search(); /*查找*/
void save(); /*保存文件*/
void load(); /*读取文件*/
void computer(); /*计算所需各种票面张数*/
void insert(); /*插入*/
void append(); /*追加*/
void copy(); /*复制文件*/
void sort(); /*排序*/
void index(); /*索引*/
void total(); /*分类合计*/
void list(); /*显示所有数据*/
void print(SALARY *p); /*输出单条记录*/
void display(); /*随意逐条显示*/
float fax(float x); /*计算税金*/
int menu_select(); /*主菜单*/
/*******主函数开始**********/
main(){
int i;
clrscr();
for(;;){
switch(menu_select()) /*调用菜单函数返回一个整数值*/{ case 0:init();break; /*初始化*/
case 1:create();break; /*输入数据创建双链表*/
case 2:list();break; /*显示所有数据*/
case 3:display();break; /*单条显示*/
case 4:calc();break; /*计算实发工资*/
case 5:search();break; /*查找职工信息数据*/
7
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
case 6:delete();break; /*删除记录*/
case 7:insert();break; /*插入记录*/
case 8:append();break; /*追加记录*/
case 9:save();break; /*保存文件*/
case 10:load(); break; /*读取文件*/
case 11:copy();break; /*复制文件*/
case 12:sort();break; /*按实发工资升序排序*/
case 13:computer();break; /*计算所需票面数*/
case 14:index();break; /*按职工号索引*/
case 15:total();break; /*按部门求合计*/
case 16:exit(0); /*退出*/}}}
/*菜单函数,函数返回值为整型,代表所选的菜单项*/
menu_select(){
char *f[]= { /*定义菜单字符串数组*/
"**************MENU*************", /*菜单的标题行*/
" 0. init list", /*初始化双链表*/
" 1. Enter list", /*输入数据,创建双链表*/
" 2. List all \n", /*显示所有记录*/
" 3. Display record by step", /*显示单条记录*/
" 4. Calc the salary", /*计算实发工资*/
" 5. Search record on name", /*查找记录*/
" 6. Delete a record", /*删除记录*/
" 7. Insert record to list", /*插入记录*/
" 8. Append record to file", /*追加记录*/
" 9. Save data to the file", /*保存文件*/
" 10. Load data from the file",/*读取文件*/
" 11. Copy the file to new file", /*复制文件*/
" 12. Sort on sfgz", /*排序*/
" 13. Computer ticket number", /*计算所需票面数*/
" 14. Index on number", /*索引*/
" 15. Total on number", /*分类合计*/
" 16. Quit" }; /*退出*/
char s[80];
int i;
int key=0; /*记录所压键值*/
int c=0;
gotoxy(1,25); /*移动光标*/
printf("press any key enter menu......\n");/*压任意键进入主菜单*/ getch();
clrscr(); /*清屏*/
window(1,1,80,25); /*恢复原窗口大小*/
return c; /*返回代表菜单选项的整数值*/}
/*初始化函数*/
8
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
void init(){
First=NULL;
Last=NULL;}
/*输入数据,创建双链表*/
void create(){
int x; /*记录行坐标*/
int i; /*记录输入记录数*/
int flag=0; /*做结束标记*/
float temp; /*定义临时变量*/
SALARY *info,*p; /*定义临时变量*/
if(First!=NULL)
init();/*如果头指针为空,调用初始化函数*/
p=First; /*从头指针开始*/
for(;;){
if(flag==1)
break; /*如果flag=1,结束输入*/
i=0;
x=0; /*确定移动的行坐标*/
clrscr(); /*清屏*/
gotoxy(1,3);
printf("*************gongziguanli*************");/*输出标题*/
gotoxy(1,4);
printf(" --Enter @ end--");/*提示输入@结束*/ gotoxy(1,5);
printf("|------------------------------------|");/*输出表格的起始线*/ gotoxy(1,6);
printf("| no | name | jbgz |");/*输出字段标题,注意空格数*/
for(;;){
gotoxy(1,7+x);
printf("|----------|----------------|--------|");/*输出表格的水平线*/
info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/
if(!info){
printf("\nout of memory");/*如没有得到空间,输出内存溢出信息*/
gotoxy(1,8+x);}
printf("|----------|----------------|--------|");/*输出结尾水平线*/} /*字符串输入和验证函数*/
inputs(char *s, int count){
char p[255];do{
scanf("%s",p);/*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n");/*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/}
9
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
/*显示链表*/
void list(){
int i=0,n; /*记录输出行数*/
SALARY *p; /*定义移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(i%10==0&&p!=NULL) /*外循环控制换页*/{
i=0; /*记录一页的输出行数*/
clrscr(); /*清屏*/
printf("\n\n\n"); /*换行三次*/
printf("*************************************SALARY***********************************\n"); /*输出大标题*/
printf("|nO | name | jbgz | koukuan | yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出水平线*/
while(p!=NULL) /*当p不为空时*/{
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n",
p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);
p=p->next; /*指针后移*/
i++; /*输出行数加1 */
if(i%10==0)
break; /*如果满10行,跳出内循环*/}
printf("****************************************end***********************************\n"); /*输出本页的结束行*/
printf("Press any key congtinue...\n");
getch(); /*输出一页暂停一下,压任意键继续*/} /*返回到外循环,准备下一页的输出*/}
/*单条显示记录*/
void display(){
int ch; /*菜单选项字符*/
SALARY *p; /*定义临时指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
if(p==NULL) /*指针为空,即链表为空,返回主函数*/{
printf("record is empty!\n");
return; }
else{
print(p); /*调用输出函数显示头结点信息*/
for(;;) /*循环开始*/{
printf("\n\n\n"); /*换行*/
10
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
printf("************************************SALARY************************************\n"); /*输出标题信息*/
printf("|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出分割线*/
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n", p->no,p->name, p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/
printf("***************************************end***************************** *******\n"); /*输出结束标记*/}}
/*计算实发工资*/
void calc(){
int x; /*行坐标*/
int i=0; /*记录数*/
float temp; /*临时变量扣款*/
SALARY *p; /*移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(p!=NULL) /*当p不为空时,也就是有记录时,外循环控制换页*/{
x=0;
clrscr();
gotoxy(1,3);
printf("***************************gongziguanli************************************"); /*输出标题*/
gotoxy(1,5);
printf("|--------------------------------------------------------------------------|");
gotoxy(1,6);/*下面输出字段标题*/
printf("| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |");
while(p!=NULL) /*当p不为空时,也就是有记录时,内循环控制处理9条*/{ gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|");
gotoxy(1,8+x);printf("|");
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(49,8+x);printf("|");
gotoxy(58,8+x);printf("|");
11
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
gotoxy(67,8+x);printf("|");
gotoxy(76,8+x);printf("|");
gotoxy(2,8+x);
printf("%-10s",p->no); /*输出编号*/
gotoxy(13,8+x);
printf("%-15s",p->name); /*输出姓名*/
gotoxy(30,8+x);
printf("%.2f",p->jbgz); /*输出基本工资*/
gotoxy(39,8+x);
scanf("%f",&temp); /*输入扣款*/
p->koukuan=temp; /*扣款字段赋值*/
p->yfgz=p->jbgz-p->koukuan; /*计算应发工资=基本工资-扣款*/
gotoxy(50,8+x);
printf("%.2f",p->yfgz); /*输出应发工资*/
gotoxy(59,8+x);
p->shuijin=(p->yfgz-1000)*fax(p->yfgz); /*否则按税率计算税金*/
printf("%.2f",p->shuijin); /*输出税金*/
gotoxy(68,8+x);
p->sfgz=p->yfgz-p->shuijin; /*计算实发工资*/
printf("%-8.2f",p->sfgz); /*输出实发工资*/
x+=2; /*行坐标下移两行*/
i++; /*记录数加1*/
if(i%9==0)break; /*记录数超过9条,跳出内循环*/
p=p->next; /*指针后移,处理下一条*/}
gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|\n");
t10=(int)(t/10); /*计算10元张数*/
a[3]=a[3]+t10; /*累加保存*/
t=t-t10*10; /*剩余工资*/
t5=(int)(t/5); /*计算5元张数*/
a[4]=a[4]+t5; /*累加保存*/
t=t-t5*5; /*剩余工资*/
t2=(int)(t/2); /*计算2元张数*/
a[5]=a[5]+t2; /*累加保存*/
t=t-t2*2; /*剩余工资*/
t1=(int)(t); /*计算1元张数*/
a[6]=a[6]+t1; /*累加保存*/
p=p->next; /*指针后移,处理下一条记录*/}
clrscr(); /*清屏*/
printf("\n\n\n***********ticket number***************\n"); /*输出标题*/ printf("--100-----50------20-----10-----5------2------1------\n"); /*输出张数标题*/
for(i=0;i<7;i++)
12
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
printf("%5d ",a[i]);/*输出所需的张数*/
printf("\n");/*换行*/}
/*按编号查找记录*/
SALARY *find(char *no){
SALARY *p; /*定义移动指针*/
p=First; /*从头指针开始*/
while(p) /*当p不为空时*/{
if(!strcmp(no,p->no))
return p; /*比较相等,查找成功,返回指针*/
p=p->next; /*不相等指针后移*/}
printf("not found\n"); /*没有找到*/
return NULL; /*返回为空指针*/}
/*删除结点*/
void delete(){
info->sfgz=0; /*实发工资初始为0*/
printf("|----------|----------------|--------|");
p=First; /*移动指针从头指针开始*/
while(strcmp(p->no,s)&&p!=NULL) /*查找结点确定插入位置*/
p=p->next; /*指针后移,继续查找*/
if(p==NULL) /*如p为空*/
if(p==First) /*如p为头指针,说明链表为空*/{
First=info; /*新结点为头指针*/
First->prior=NULL; /*头结点的前驱为空*/
Last=First; /*唯一结点,尾指针等于头指针*/}
else /*新结点插在尾部*/{
Last->next=info;
info->prior=Last;
Last=info; /*尾指针指向新结点*/}
else
if(p==First) /*p不为空,但p为头指针,新结点插在第一个结点位置*/{ info->prior=NULL; /*新结点的前驱为空*/
info->next=p; /*新结点的后继为p*/
p->prior=info; /*p的前驱是新结点*/
First=info; /*修改头指针指向新结点*/}
else /*新结点插入在中间某一个位置p之前*/{
info->next=p; /*新结点的后继是p*/
info->prior= p->prior; /*新结点的前驱是p的前驱*/
p->prior->next=info; /*p的前驱的后继是新结点*/
p->prior=info; /*p的前驱是新结点*/}
printf("\n\n\n ----have inserted %s SALARY----\n",info->name); printf("\n---Don't forget save---\n"); /*提醒调用保存文件存盘*/} /*保存文件*/
void save(){
FILE *fp; /*定义指向文件的指针*/
13
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
SALARY *p; /*定义移动指针*/
char outfile[10]; /*保存输出文件名*/
clrscr();/*清屏*/
printf("Enter outfile name,for example c:\\f1\\te.txt:\n");/*提示输入文件名格式信息*/
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件*/{
printf("can not open file\n");
return; /*返回*/}
printf("\nSaving file......\n");
p=First; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/{
fwrite(p,sizeof(SALARY),1,fp); /*写入一条记录*/
p=p->next; /*指针后移,处理下一条记录*/}
fclose(fp); /*关闭文件*/
printf("-----save success!!-----\n");/*显示保存成功*/}
/*读文件*/
void load(){
SALARY *p,*q=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[10]; /*保存文件名*/
clrscr();/*清屏*/
printf("Enter infile name,for example c:\\f1\\te.txt:\n");/*输入文件名格式*/
scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/{ printf("can not open file\n"); /*如不能打开,则结束程序*/
return; /*返回*/}
while(First) /*当表不为空时,清空链表*/{
p=First; /*从头指针开始*/
First=First->next; /*删除头结点*/
free(p); /*释放空间*/}
printf("\n -----Loading file!-----\n"); /*显示正在读文件*/
First=(SALARY *)malloc(sizeof(SALARY)); /*为头指针申请空间*/
if(!First) /*如果没有得到空间 显示内存溢出*/{
printf("out of memory!\n");
return; /*返回*/}
p=First; /*将头指针赋值给p*/
while(!feof(fp)) /*当文件不空时*/{
if(1!=fread(p,sizeof(SALARY),1,fp))break; /*将记录读到p所指的结点*/ p->next=(SALARY *)malloc(sizeof(SALARY));/*为p的后继申请空间*/
if(!p->next) /*如果没有得到空间显示内存溢出*/{
printf("out of memory!\n");
14
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
return; /*返回*/}
p->prior=q; /*得到空间,则链接指针关系p的前驱为q*/
q=p; /*保存p做为新的p结点的前驱*/
p=p->next; /*p指针后移*/}
q->next=NULL; /*q的后继为空*/
Last=q; /*尾指针为q*/
First->prior=NULL; /*头指针的前驱为空*/
fclose(fp); /*关闭文件*/
printf("---You have success read data from file!!!---\n"); /*显示成功读入记录*/}
/*追加记录*/
void append(){
FILE *fp; /*定义指向文件的指针*/
SALARY *info; /*指向追加信息的指针*/
char infile[10]; /*保存文件名*/
float temp; /*临时变量*/
clrscr(); /*清屏*/
gotoxy(1,3);
printf("**************gongziguanli************");
gotoxy(1,5);
printf("|------------------------------------|");
gotoxy(1,6);
printf("| no | name | jbgz | ");
gotoxy(1,7);
printf("|----------|----------------|--------|");
info=(SALARY *)malloc(sizeof(SALARY)); /*申请追加信息的空间*/
if(!info){
printf("\nout of memory"); /*没有空间,内存溢出*/
exit(0); /*结束程序*/ }
15
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第3章 课程设计总结
参考资料
[1]谭浩强.C程序设计.北京:清华大学出版社,2005
[2]赵克林.C语言实例教程.重庆:西南师范大学出版社,2006
[3]杨正校.C语言程序设计.南京:河海大学出版社,2008
[4]谢乐军.C语言程序设计及应用.北京:冶金工业出版社,2004
[5]崔武子.C语言程序设计实训教程.北京:清华大学出版社,2008
[6]向艳.C语言程序设计.北京:清华大学出版社,2008
[7]姚合生.C语言程序设计.北京:清华大学出版社,2008
[8]崔武子.C语言程序设计.北京:清华大学出版社,2004
[9]孙辉.C语言程序设计教程.北京:人民邮电出版社,2004
[10]刘兆宏.C语言程序设计案例教程.北京:清华大学出版社,2008
[11]杨旭.C语言程序设计案例教程.北京:人民邮电出版社,2005
16