C语言课程设计|工资管理系统 一、需求分析 题目:工资管理系统总体设计目标:使用者可以利用此系统进行对工资管理的各项运算操作,如根据用户提供的客户工资自动地进行计算实发工资,查找职工信息数据,删除记录,插入记录,保存记录及按实发工资排序等,最后清晰完整的工资管理结果显现在屏幕中。大大方便使用者对工资管理的统计操作,这样不仅可以提高效率,而且方便易操作。二、总体设计1、概述 该系统采用了自上而下、层层紧扣的模块结构。对于最高模块,采用以事务为中心的设计策略,把一个大的模块逐步分解成较小的相对简单的模块。对低层模块,采用以变换为中心的设计策略。为了提高每个小模块的内聚性、降低模块间的耦合性,将每个模块设计成具有单一功能的模块(即功能内聚),使模块间的联系完全是通过主模块的控制和调用来实现(即非直接耦合)。2、计算机系统配置⑴硬件配置主板:顶星CPU: 华硕内存:80G硬盘:512M⑵软件配置操作系统:windowXP;C语言编译系统:turbo C++3、系统结构图⑴系统结构图工资管理系统的系统结构图如下所示,总共由7个模块组成,其中一个是总控模块,另外七个是分别实现不同功能的子模块: ⑵模块说明书A. 工资管理系统总控模块的模块说明书
模块名称:工资管理系统总控模块输 入:主菜单选择项输 出:整个所有学生的信息处理:1. 按以下格式显示主菜单和提示使用者选择:工资管理系统: 0计算实发工资 1查找记录 2删除记录 3插入记录 4保存文件 5按实发工资升序排序 6退出 请选择(0,2,3,4,5,6):2. 接收主菜单选择项 如果选择项的值为0,调用计算实发工资子模块。 如果选择项的值为1,调用查找记录子模块。 如果选择项的值为2,调用删除记录子模块。 如果选择项的值为3,调用插入记录子模块。 如果选择项的值为4,调用保存文件子模块。 如果选择项的值为5,调用按实发工资升序排序子模块。 如果选择项的值为6,结束操作,退出本系统。 B. 插入工资记录子模块说明书模块名称:插入工资记录模块输 入:根据给定员工的号码,姓名,基本工资进行添加输 出:该员工的工资信息处理:按以下格式显示子菜单和提示使用者选择:插入员工工资系统 ⑴请按提示输入要插入的员工的号码 ⑵在第二菜单中输入员工的号码,姓名,基本工资 ⑶回车返回主菜单
C.保存文件子模块说明书模块名称:保存文件子模块输 入:所需保存的员工的姓名输 出:保存成功该员工资料 处理: 按以下格式显示子菜单和提示使用者选择: 保存文件系统 ⑴请按提示输入要保存的员工资料的员工姓名(此员工资料之前已经确定插入) ⑵回车显示保存成功 ⑶回车返回主菜单 D.计算实发工资子模块说明书模块名称:计算实发工资子模块输 入:员工的工资扣款输 出:员工的应发工资,税金,实发工资 处理: 按以下格式显示子菜单和提示使用者选择: 计算实发工资系统 ⑴首先,要先插入、保存好员工的工资信息 ⑵按号码排序提示,输入该员工的扣款,回车得到员工的应发工资,税金,实发工资 ⑶依次填入其它员工的扣款即得到所有员工的应发工资 ⑷计算完后回车返回主菜单 E.查找记录子模块说明书模块名称:查找员工工资记录子模块输 入:要查找的员工姓名输 出:所要查找的员工的工资信息 处理: 1.按以下格式显示子菜单和提示使用者选择: 查找员工工资系统 输入所要查找的员工工资的姓名,回车2.⑴显示出所查员工的工资信息,回车返回主菜单⑵显示不出所查员工任何信息,出现查不到的情况,回车返回主菜单
F.删除记录子模块说明书模块名称:删除员工工资记录子模块输 入:根据给定员工的号码进行删除输 出:整个员工的所有工资资料 处理: 按以下格式显示子菜单和提示使用者选择: 删除员工工资记录系统 ⑴请输入要删除的员工工资的员工号码 ⑵回车确定删除 ⑶再次回车返回主菜单 G.按实发工资升序排序子模块说明书模块名称:按实发工资升序排序子模块输 入:根据给定的学生的实发工资从小到大进行排序输 出:已经排好序的员工实发工资的序列 处理: 按以下格式显示子菜单和提示使用者选择: 按实发工资升序排序系统 ⑴对已经保存过的员工资料,按提示回车 ⑵系统自动完成对员工实发工资由小到大的顺序进行排序 ⑶回车返回主菜单 三、详细设计1.“工资管理系统总控模块”的详细设计 ⑴概述 本模块的详细设计依据是:总体设计中的“A.工资管理系统的总控模块说明书”。 ⑶程序流程图如下169
C语言课程设计2.“计算实发工资子模块”的详细设计 ⑴本模块的详细设计的依据是:总体设计中的“D.计算实发工资子模块”的模块说明书。 ⑵程序流程图如下: 开始
定义整型变量x=0
显示操作项目让使用者 选择,输入员工号码
如果存在,输入扣 不存在款,返回得实发工资
返回
3.“查找记录子模块”的详细设计 ⑴本模块的详细设计的依据是:总体设计中的“E.查找记录子模块”的模块说明书。 ⑵程序流程图如下: 开始
定义整型变量x=1
输入所要查找的员工 工资姓名
显示查找结果 显示不存在
返回
4.“删除记录子模块”的详细设计⑴本模块的详细设计的依据是:总体设计中的“F.删除记录子模块”的模块说明书。⑵程序流程图如下: 开始
定义整型变量x=2
输入要删除的员工工资 的员工号码
存在对象,回车确定 不存在该对象 删除
返回
5.“插入工资记录子模块”的详细设计 ⑴本模块的详细设计的依据是:总体设计中的“B. 插入工资记录子模块”的模块说明书。 ⑵程序流程图如下: 开始
定义整型变量x=3
输入要插入的员工的号码
输入员工的号码,姓名, 基本工资
确定,退出保存 输入错误
返回
6.“保存文件子模块”的详细设计 ⑴本模块的详细设计的依据是:总体设计中的“C.保存文件子模块”的模块说明书。 ⑵程序流程图如下: 开始
定义整型变量x=4
输入所需保存的员工的姓名
保存员工工 保存不成功 资资料成功
返回
7.“按实发工资升序排序子模块”的详细设计 ⑴本模块的详细设计的依据是:总体设计中的“G.按实发工资升序排序子模块”的模块说明书。 ⑵程序流程图如下: 开始
定义整型变量x=5
根据给定的学生的实发 工资从小到大进行排序
回车排序成功
返回
四、编码1.说明 “工资管理系统总控模块” 的功能由menu_select函数实现,根据“工资管理系统总控模块” 的程序流程图编写menu_select函数。 “计算实发工资子模块” 的功能由calc函数实现,根据“计算实发工资子模块” 的程序流程图编写calc函数。 “查找记录子模块” 的功能由search函数实现,根据“查找记录子模块” 的程序流程图编写search函数。 “删除记录子模块” 的功能由delete函数实现,根据“删除记录子模块” 的程序流程图编写delete函数。 “插入记录子模块” 的功能由insert函数实现,根据“插入记录子模块” 的程序流程图编写insert函数。 “保存记录子模块” 的功能由save函数实现,根据“插入记录子模块” 的程序流程图编写save函数。 “按实发工资升序排序子模块” 的功能由sort函数实现,根据“按实发工资升序排序子模块” 的程序流程图编写sort函数。 2.选择编写程序语言/******头文件(.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 /*定义数据结构*/{ char no[11]; /*编号*/ char name[15]; /*姓名*/ char danwei[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:calc();break; /*计算实发工资*/ case 1:search();break; /*查找职工信息数据*/ case 2:delete();break; /*删除记录*/ case 3:insert();break; /*插入记录*/ case 4:save();break; /*保存文件*/ case 5:sort();break; /*按实发工资升序排序*/ case 6:exit(0); /*退出*/ } }}/*菜单函数,函数返回值为整型,代表所选的菜单项*/menu_select(){ char *f[]= { /*定义菜单字符串数组*/ "**************MENU*************", /*菜单的标题行*/ " 0. Calc the salary", /*计算实发工资*/ " 1. Search record on name", /*查找记录*/ " 2. Delete a record", /*删除记录*/ " 3. Insert record to list", /*插入记录*/ " 4. Save data to the file", /*保存文件*/ " 5. Sort on sfgz", /*排序*/ " 6. Quit", /*退出*/ }; char s[80]; int i; int key=0; /*记录所压键值*/ int c=0; gotoxy(1,25); /*移动光标*/ printf("press any key enter menu......\n");/*压任意键进入主菜单*/ getch(); clrscr(); /*清屏*/ textcolor(YELLOW); /*设置文本颜色为黄色*/ textbackground(RED); /*设置背景颜色为红色*/ gotoxy(10,2); putch(0xda); /*输出左上角边框┏*/ for(i=1;i<44;i++) putch(0xc4); /*输出上边框水平线*/ putch(0xbf); /*输出右上角边框 ┓*/ for(i=3;i<22;i++) /*输出左右两边的垂直线*/ { gotoxy(10,i);putch(0xb3); gotoxy(54,i);putch(0xb3); } gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/ for(i=1;i<44;i++) putch(0xc4); /*输出下边框水平线*/ putch(0xd9); /*输出右下角边框┛*/ window(11,3,53,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); /*清屏*/ for(i=0;i<8;i++) { gotoxy(10,i+1); cprintf("%s",f[i]); /*输出菜单项数组*/ } i=1; gotoxy(10,2); /*设置默认选项在第一项*/ textbackground(LIGHTGREEN); /*设置背景颜色为浅绿*/ cprintf("%s",f[1]); /*输出菜单项,表示选中*/ gotoxy(10,2); /*移动光标到菜单的第一项*/ while(key!=13) /*所压键不是回车键时*/ {
C语言课程设计-工资管理系统 while(bioskey(1)==0); /*查询是否压下了一个键*/ key=bioskey(0); /*返回下一个在键盘压下的键*/ key=key&0xff?key&0xff:key>>8; /*对所压的键进行判断*/ gotoxy(10,i+1); textbackground(BLUE); /*设置背景颜色为蓝色*/ cprintf("%s",f[i]); /*输出菜单项*/ if(key==72) i=i==1?17:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/ if(key==80)i=i==17?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/ gotoxy(10,i+1); /*光标移动i的下一项*/ textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/ cprintf("%s",f[i]); /*输出菜单项*/ c=i-1; /*给代表菜单选项的整数赋值*/ } textbackground(BLACK); /*设置背景颜色为黑色*/ window(1,1,80,25); /*恢复原窗口大小*/ return c; /*返回代表菜单选项的整数值*/}/*计算实发工资*/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("|"); 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"); /*输出结束行*/ printf("Press any key congtinue...\n"); getch(); }}/*按编号查找记录*/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(){ SALARY *p; /*定义临时变量,p指向要删除的结点p*/ char s[11]; /*要删除结点的编号*/ clrscr(); /*清屏*/ printf("please deleted no\n"); /*提示输入信息*/ scanf("%s",s); /*输入要删除的职工编号*/ if((p=find(s))!=NULL) /*调用查找函数,如果找到做下面的处理*/ { if(First==p) /*如果是第一个结点*/ { First=p->next; /*将头指针指向其后继结点*/ if(First) /*如头指针不为空*/ First->prior=NULL; /*将头结点的前驱设为空*/ else Last=NULL; /*否则头为空,尾也为空*/ } else /*删除的不是第一个结点*/ { p->prior->next=p->next; /*p的前驱的后继指向p原来的后继*/lwfree.cnvoid search(){ SALARY *p; /*移动指针*/ char s[15]; /*保存姓名*/ clrscr(); /*清屏*/ printf("please enter name for search\n"); /*提示输入*/ scanf("%s",s); /*输入要查找人的姓名*/ p=First; /*移动指针从头指针开始*/ while(strcmp(p->name,s)&&p!=NULL) /*做比较判断*/ p=p->next; /*没找到,指针后移继续查找*/ if(p==NULL) /*指针为空,说明没有找到*/ printf("\nlist no %s SALARY\n",s); /*显示没找到信息*/ else { printf("\n\n"); /*换行*/ print(p); /*查找成功,调用输出函数输出指针p所指记录*/ }}/*插入结点*/void insert(){ SALARY *p,*info; /* info为新结点,p为新结点的后继*/ char s[11]; /*保存查找的姓名*/ float temp; /*临时变量*/ clrscr(); /*清屏*/ printf("please enter location before the no\n"); /*提示输入在哪个结点之前插入*/ scanf("%s",s); /*输入指定结点的编号*/ printf("\nplease new record\n"); /*提示输入记录*/ 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)
C语言课程设计 { printf("\nout of memory"); /*如没有得到空间,内存溢出*/ exit(0); /*退出程序*/ } info->next=NULL; /*新结点的后继为空*/ info->prior=NULL; /*新结点的前驱为空*/ gotoxy(1,8);printf("|"); gotoxy(12,8);printf("|"); gotoxy(29,8);printf("|"); gotoxy(38,8);printf("|"); gotoxy(2,8); inputs(info->no,10); /*输入新结点的编号,并校验*/ gotoxy(13,8); inputs(info->name,14); /*输入新结点的姓名,并校验*/ gotoxy(30,8); scanf("%f",&temp); /*输入基本工资*/ info->jbgz=temp; /*给基本工资字段赋值*/ info->koukuan=0; /*扣款初始为0*/ info->yfgz=0; /*应发工资初始为0*/ info->shuijin=0; /*税金初始为0*/ 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; /*定义指向文件的指针*/ 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 sort(){ SALARY *p0,*p00,*p1,*p11,*p2; /*定义临时指针*/ int i=1; /*统计当前排第几个结点*/ clrscr(); /*清屏*/ printf("\n\n start sort....\n"); /*开始排序*/ p1=p11=p2=First; while(p1!=NULL) /*当p1不为空时*/ { p0=p1; /*待比较结点从p1开始*/ p2=p1; /*p2从当前待排序位置开始*/ while(p2->next!=NULL) /*p2的后继不为空时*/ { if(p0->sfgz>p2->next->sfgz) /*找当前最小结点*/ { p00=p2; /*找到当前最小结点记录其前驱指针*/ p0=p2->next; /*记录当前最小值结点的指针p0*/ } p2=p2->next; /*指针后移*/ } Last=p0; /*当前最小结点为尾结点*/ if(p1!=p0) /*判断最小结点是否是当前排序位置,不是则作指针修改*/ { p00->next=p0->next; /*将p00的后继指向p0的后继*/ p0->next->prior=p00; /*p0的后继的前驱为p00*/ p0->next=p1; /*p0的后继指向下个排序位置p1*/ p1->prior=p0; /*p1的前驱为p0*/ if(i==1) { First=p0; /*作头指针*/ First->prior=NULL; /*头指针的前驱为空*/ } else /*不是第一个结点*/ { p11->next=p0; /*p11的后继指向p0*/ p0->prior=p11; /*p0的前驱指向p11*/ } p11=p1=p0; /*因p0是排好序的最后一个结点,p1是下一个将要排序的位置,所以将p0赋值给p1和p11*/ } i++; /*排好序的结点数加1*/ p1=p1->next; /*p1后移指向下一个待排序位置*/ } printf("sort sucess!!!\n"); /*输出排序成功*/}
/*初始化函数*/void init(){ First=NULL; Last=NULL;}/*输入数据,创建双链表*/void create(){lwfree.cn 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");/*如没有得到空间,输出内存溢出信息*/ exit(0); /*退出程序*/
工资管理系统" info->next=NULL; /*新结点的后继为空*/ info->prior=NULL; /*新结点的前驱为空*/ gotoxy(1,8+x);printf("|"); /*输出数据间的分割线*/ gotoxy(12,8+x);printf("|"); gotoxy(29,8+x);printf("|"); gotoxy(38,8+x);printf("|"); gotoxy(2,8+x); /*光标到输入编号位置*/ inputs(info->no,10); /*输入编号,并验证长度不超过10*/ if(info->no[0]=='@') { flag=1; break; } /*编号首字符为@结束输入*/ gotoxy(13,8+x); /*光标到输入姓名位置*/ inputs(info->name,14); /*输入姓名,并验证长度不超过14*/ gotoxy(30,8+x); /*光标到输入基本工资位置*/ scanf("%f",&temp); /*输入基本工资到临时变量*/ info->jbgz=temp; /*基本工资赋值*/ info->koukuan=0; /*初始扣款为0,待计算工资时输入*/ info->sfgz=0; /*初始实发工资为0,待计算工资时计算*/ info->shuijin=0; /*初始税金为0,待计算工资时计算*/ info->yfgz=0; /*初始应发工资为0,待计算工资时计算*/ if(p==NULL) /*如果p为空,说明输入的是第一个结点*/ { First=Last=info; /*头指针和尾指针*/ First->prior=NULL; /*头指针的前驱是空*/ Last->next=NULL; /*尾指针的后继是空*/ } else /*插入的结点不是第一结点,则插入在头结点之前*/ { info->next=p; /*新结点的后继指向原来的头结点*/ info->prior=p->prior; /*新结点的前驱指向原来的头结点的前驱*/ p->prior=info; /*原来结点的前驱指向新结点*/ } p=info; /*新结点变为p结点,暂时的头结点*/ First=info; /*新结点变为头结点*/ x+=2; /*因为水平线,将光标下移两行*/ gotoxy(1,8+x); i++; /*输入记录数加1*/ if(i%9==0) break; /*输入9个记录,换一页输入*/ } 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中*/}/*显示链表*/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 print(SALARY *p){ if(p) /*如果指针不为空,则显示信息*/ { clrscr(); /*清屏*/ printf("\n\n\n"); /*换行*/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"); /*输出结束标记*/ }}/*根据应发工资,计算税率*/float fax(float x){ float f1; if(x<1000)return 0; /*小于1000,返回0*/ switch((int)(x/1000)) { case 1:f1=0.05;break; /*1000~1999,返回0.05*/ case 2:f1=0.1;break; /*2000~2999,返回0.1*/ case 3:f1=0.15;break; /*3000~3999,返回0.15*/ case 4:f1=0.2;break; /*4000~4999,返回0.2*/ default:f1=0.3;break; /*5000以上,返回0.3*/ } return f1;} 五、总结编程看起来似乎是一件很枯燥、乏味的事情,但是经历了这次大程序的编辑之后,现其实里面还是充满乐趣的,一旦真的钻研下去什么事情都可以放下,来认真研究。本来大家都认为花两个月的时间来编一个大作业未免太浪费时间了,但是事实证明两个月的时间只有真正利用起来才能做出优秀的作业。编程尤其是调试是一项细致深入的工作,需要下工夫、动脑子、善于积累经验,这往往能反映出一个人的水平、经验和科学态度。由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。为减少这样的错误后来还是用不同的变量名来表示,结果引起的那些错误解决了。大多的语法错误在通过书本参考下能够修改。主要是平时看书不仔细、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。这些语法错误有信息框的提示一般是能够排除的。在编写程序的过程中,我得到了老师的精心指导以及孜孜不倦的教诲,在老师的指导下,我的能力得到了提高,同时养成了科学、严谨的作风和习惯,在此,我对老师的精心栽培表示衷心的感谢!
工资管理系统C语言课程设计题目:搬山游戏1. 设计说明设有n座山,计算机与人为比赛的双方,轮流搬山。规定每次搬山的数止不能超 过k座,谁搬最后一座谁输。游戏开始时。计算机请人输入山的总数(n)和每次允许搬山的最大数止(k)。然后请人开始,等人输入了需要搬走的山的数目后,计算机马上打印出它搬多少座山,并提示尚余多少座山。双方轮流搬山直到最后一座山搬完为止。计算机会显示谁是赢家,并问人是否要继续比赛。若人不想玩了,计算机便会统计出共玩了几局,双方胜负如何。计算机参加游戏时应遵循下列原则:1) 当:剩余山数目-1<=可移动的最大数k 时计算机要移(剩余山数目-1)座,以便将最后一座山留给人。2)对于任意正整数x,y,一定有:0<=x%(y+1)<=y在有n座山的情况下,计算机为了将最后一座山留给人,而且又要控制每次搬山的数目不超过最大数k,它应搬山的数目要满足下列关系:(n-1)%(k+1)如果算出结果为0,即整除无余数,则规定只搬1座山,以防止冒进后发生问题。
2. 程序主要用到以下函数: main();函数scanf();函数
3. 程序清单 #include
void main(){int n,k,x,y,cc,pc,g;printf("More Mountain Game\n");lwfree.cnfor(;;){printf("No.%2d game \n",g++);printf("---------------------------------------\n");printf("How many mpuntains are there?");scanf("%d",&n);if(!n) break;printf("How many mountains are allowed to each time?");do{scanf("%d",&k);if(k>n||k<1) printf("Repeat again!\n");}while(k>n||k<1);do{printf("How many mountains do you wish movw away?");scanf("%d",&x);if(x<1||x>k||x>n) /*判断搬山数是否符合要求*/{printf("IIIegal,again please!\n");continue;}n-=x;printf("There are %d mountains left now.\n",n);if(!n){printf("...............I win. You are failure...............\n\n");cc++;}else{y=(n-1)%(k+1); /*求出最佳搬山数*/if(!y) y=1;n-=y;printf("Copmputer move %d mountains away.\n",y);if(n) printf(" There are %d mountains left now.\n",n);else{printf("...............I am failure. You win..................\n\n");pc++;}}}while(n);
}printf("Games in total have been played %d.\n",cc+pc);printf("You score is win %d,lose %d.\n",pc,cc);printf("My score is win %d,lose %d.\n",cc,pc);}