C语言实现的工资管理系统

好久都没有现看我喜爱的C了,纯是看看,熟练熟练!按《计算机语言  综合实训》上面和校改的,不多说了,贴码:

//preProcess.h
/*
*源文件编译预处理命令,包括加载头文件,定义结构体、常量和变量,并对它们进行初始化
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

#define HEADER1 "----------------------GongZi--------------------------------------------------\n"
#define HEADER2 "|number|	name	|	jbgz	|	jj	|	kk	|	yfgz	|	sk	|	sfgz	|\n"
#define HEADER3 "|------|-----------|-----------|-------|-------|-----------|-------|-----------|\n"
#define FORMAT "|%-5s|%-10s|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|\n"
#define DATA p->num,p->name,p->jbgz,p->jj,p->kk,p->yfgz,p->sk,p->sfgz
#define END "------------------------------------------------------------------------------\n"
#define N 60

//事实上,这个saveflag全局变量虽然是全局使用,但不应放在预编译中
//int saveflag=0;				/*需要存盘的标志变量*/

/*定义员工数据结构,各成员名在数据库中也称为字段*/
typedef struct employee
{
	/* data */
	char num[10];		/*员工编号*/
	char name[15];		/*员工姓名*/
	float jbgz;			/*基本工资*/
	float jj;			/*奖金*/
	float kk;			/*扣款*/
	float yfgz;			/*应发工资*/
	float sk;			/*税款*/
	float sfgz;			/*实发工资*/
}ZGGZ;
//main.c
#pragma once
#include "preProcess.h"
int saveflag=0;				/*需要存盘的标志变量*/
int main(){
	

	ZGGZ gz[N];			/*定义ZGGZ结构体*/
	FILE *fp;			
	int select;		/*保存选择结果变量*/
	char ch;		/**/
	int count=0;		/*定义保存记录数*/

	void menu();		/*主菜单界面*/
	void printheader();
	void PRINTdata(ZGGZ pp);
	void disp(ZGGZ tp[],int n);
	void wrong();
	void nofind();
    void stringinput(char *t,int lens,char *notice);/*输入字符串,并进行长度验证明,长度必须小于lens,*/
	float numberinput(char *notice);/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
	void save(ZGGZ tp[],int n);	/*存储记录*/
	int add(ZGGZ tp[],int n);/*增加记录*/
	int insert(ZGGZ tp[],int n);/*插入记录*/

	fp=fopen("E:\zggz\gzgl.data","ab+");	/*追加方式打开二进制文件,可读/写。此文件若不存在则新建*/
	if (fp==NULL)
	{
		/* code */
		printf("\n Can not open file!\n");
		exit(0);
	}
	while(!feof(fp)){
		if(fread(&gz[count],sizeof(ZGGZ),1,fp)==1)
			count++;
	}
	fclose(fp);
	printf("\n==>open file success,the total records number is:%d.\n",count);
	getchar();
	
	//system("pause");
	menu();
	while(1){
		system("cls");
		menu();			//调用主菜单
		printf("\n 	Please Enter your choice(0~9):");
		scanf("%d",&select);
		if (select==0)
		{
			/* code */
			if (saveflag==1)	/*若对数组中数据修改过且未存盘,则此标志为1*/
			{
				/* code */
				getchar();
				printf("\n==>Whether save the modified records to file?(y/n)");
				scanf("%c",&ch);
				if (ch=='y'||ch=='Y')
				{
					save(gz,count);
					/* code */
				}
			}
			printf("\n===>Thank you for useness!\n");
			getchar();
			break;
		}
		switch(select){
			case 1:count=add(gz,count);break;			/*增加记录*/
			//case 2:count=del(gz,count);break;			/*删除记录*/
			//case 3:qur(gz,count);break;					/*查询记录*/
			//case 4:modify(gz,count);break;				/*修改记录*/
			case 5:count=insert(gz,count);break;		/*插入记录*/

			default:wrong();getchar();break;			/*按键有误,或功能还未实现*/
		}
	}
	system("pause");
	return 0;
}

//mainMenu.c
#pragma once
#include "preProcess.h"
/*主菜单界面*/
void menu(){
	system("cls");		/*调用Dos命令清屏*/
	//textcolor(10);		/*在文本模式中选择新的字符颜色*/
	//gotoxy(10,5);		/*在文本窗口中设置光标*/
	cprintf("	The employee's Salary Management System\n");
	//gotoxy(10,8);
	cprintf("	***************************Menu*******************************	\n");
	//gotoxy(10,9);
	cprintf("	*	1.input record		2.delete record		*\n");
	//gotoxy(10,10);
	cprintf("	*	3.search record		4.modify record		*\n");
	//gotoxy(10,11);
	cprintf("	*	5.insert record		6.count record		*\n");
	//gotoxy(10,12);
	/***/
	cprintf("	**************************************************************  \n");
}
//add.c
/*增加记录*/
#pragma once
#include "preProcess.h"
void disp(ZGGZ tp[],int n);
void wrong();
void stringinput(char *t,int lens,char *notice);/*输入字符串,并进行长度验证明,长度必须小于lens,*/
float numberinput(char *notice);/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
int add(ZGGZ tp[],int n){
	char ch,num[10];
	int i,flag=0;
	system("cls");	/*清屏*/
	disp(tp,n);		/*显示已有员工工资信息*/
	while(1){		/*一次可输入多条记录,直到输入编号为0的记录才结束添加*/
		while(1){		/*输入员工编号,保证该编号没有被使用,若输入编号为0 ,则退出添加操作*/
			stringinput(num,10,"input number(press '0' return menu):");/*格式化输入编号并检验*/
			flag=0;
			if (strcmp(num,"0")==0)	/*输入为0,则退出添加操作,返回主界面*/
			{
				/* code */
				return n;
			}
			i=0;
			while(i<n){		/*查询该编号是否已经存在,若存在,则重新输入一个未被占用的编号*/
				if (strcmp(tp[i].num,num)==0)
				{
					/* code */
					flag=1;
					break;
				}
				i++;
			}
			if (flag==1)	/*提示用户是否重新输入*/
			{
				/* code */
				getchar();
				printf("======>The number %s is existing,try again?(y/n):", num);
				scanf("%c",&ch);
				if (ch=='y'||ch=='Y')
				{
					/* code */
					continue;
				}
				else
					return n;
			}
			else
				break;
		}
		strcpy(tp[n].num,num);		/*将字符串num复制到tp[n].num中*/
		stringinput(tp[n].name,15,"Name:");		
		tp[n].jbgz=numberinput("jbgz:");			/*输入并校验基本工资*/
		tp[n].jj=numberinput("jiangjin:");		/*输入并检验奖金*/
		tp[n].kk=numberinput("koukuan:");		/*输入并检验扣款*/
		tp[n].yfgz=tp[n].jbgz+tp[n].jj-tp[n].kk;	/*计算应发工资*/
		tp[n].sk=tp[n].yfgz*0.12l;		/*计算税金,假定取应发工资的12%*/
		tp[n].sfgz=tp[n].yfgz-tp[n].sk;			/*计算实发工资*/
		n++;
	}
	return n;
}

inputFunc.c
/*输入字符串,并进行长度验证明,长度必须小于lens,*/
void stringinput(char *t,int lens,char *notice){
	char n[255];
	do{
		printf(notice);			/*显示提示信息*/
		scanf("%s",n);		/*输入字符串*/
		if (strlen(n)>lens)
		{
			/* code */
			printf("\n exceed the required length!\n");/*长度校验,超过lens值重新输入*/
		}
	}while(strlen(n)>lens);
	strcpy(t,n);		/*将输入字符串复制到字符串t中*/
}

/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
float numberinput(char *notice){
	float t=0.00;
	do{
			printf(notice);/*显示提示信息*/
			scanf("%f",&t);
			if (t<0)
			{
				/* code */
				printf("\n score must>=0!\n");/*进行数值校验*/
			}
	}while(t<0);
	return t;
}
//insert.c
#pragma once
#include "preProcess.h"

void printheader();
void PRINTdata(ZGGZ pp);
void disp(ZGGZ tp[],int n);
void wrong();
void nofind();
void stringinput(char *t,int lens,char *notice);/*输入字符串,并进行长度验证明,长度必须小于lens,*/
float numberinput(char *notice);/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
extern int saveflag;				/*需要存盘的标志变量*/
/*插入记录*/
int insert(ZGGZ tp[],int n){
	char ch,num[10],s[10];	/*s数组保存插入点之前的编号,num数组保存输入的新记录编号*/
	ZGGZ newinfo;
	int flag=0,i=0,kkk=0;
	system("cls");
	disp(tp,n);
	while(1){
		stringinput(s,10,"Please input insert location after the Number:");
		flag=0;i=0;
		while(i<n){			/*查询,flag=1为表示该编号存在*/
			if (strcmp(tp[i].num,s)==0)
			{
				/* code */
				kkk=i;
				flag=1;
				break;
			}
			i++;
		}
		if (flag==1)
		{
			/* code */
			break;			/* 若编号存在,则进行插入之前的新记录输入操作*/
		}
		else{
			getchar();
			printf("\n=====>The Number %s is not existing,try again?(y/n):",s);
			scanf("%c",&ch);
			if (ch=='y'||ch=='Y')
			{
				/* code */
				continue;
			}
			else
				return n;
		}
	}
	/*以下新记录的插入操作与add()相同*/
	while(1){
		stringinput(num,10,"input new employee Number:");
		i=0;flag=0;
		while(i<n){				/*查询,flag为1时表示该编号存在*/
			if (strcmp(tp[i].num,num)==0)
			{
				/* code */
				flag=1;break;
			}
			i++;
		}
		if (flag==1)
		{
			/* code */
			getchar();
			printf("\n====>Sorry,The number %s is existing,try again(y/n)",num);
			scanf("%c",&ch);
			if (ch=='y'||ch=='Y')
			{
				/* code */
				continue;
			}else
				return n;
		}else
			break;
	}
	strcpy(newinfo.num,num);		/*将字符串num复制到newinfo.num中*/
	stringinput(newinfo.name,15,"Name:");
	newinfo.jbgz=numberinput("jbgz:");		/* 输入并校验基本工资*/
	newinfo.jj=numberinput("jiangjin");		/*输入并梭验jiangjing */
	newinfo.kk=numberinput("koukuan:");		/*输入并检验koukuan*/
	newinfo.yfgz=newinfo.jbgz+newinfo.jj-newinfo.kk;
	newinfo.sk=newinfo.yfgz*0.12;
	newinfo.sfgz=newinfo.yfgz-newinfo.sk;
	saveflag=1;			/*在main()中有对该全局变量的判断,若为1则存盘*/
	for(i=n-1;i>kkk;i--){
		strcpy(tp[i+1].num,tp[i].num);
		strcpy(tp[i+1].name,tp[i].name);
		tp[i+1].jbgz=tp[i].jbgz;
		tp[i+1].jj=tp[i].jj;
		tp[i+1].kk=tp[i].kk;
		tp[i+1].yfgz=tp[i].yfgz;
		tp[i+1].sk=tp[i].sk;
		tp[i+1].sfgz=tp[i].sfgz;
	}
	strcpy(tp[kkk+1].num,newinfo.num);/*在tp[kkk]元素位置后插入新记录*/
	strcpy(tp[kkk+1].name,newinfo.name);
	tp[kkk+1].jbgz=newinfo.jbgz;
	tp[kkk+1].jj=newinfo.jj;
	tp[kkk+1].kk=newinfo.kk;
	tp[kkk+1].yfgz=newinfo.yfgz;
	tp[kkk+1].sk=newinfo.sk;
	tp[kkk+1].sfgz=newinfo.sfgz;
	n++;
	disp(tp,n);
	printf("\n\n");
	getchar();
	return n;
}

//out.c
#pragma once
#include "preProcess.h"
/*printheader()函数用于在屏幕上以表格形式显示记录。记录的显示经常要进行,因此单独设置
printheader()函数,便于其他模块调用,减少代码的重复
*/
void printheader(){
	printf(HEADER1);
	printf(HEADER2);
	printf(HEADER3);
}

void PRINTdata(ZGGZ pp){/*格式化输出表中数据*/
	ZGGZ *p;
	p=&pp;
	printf(FORMAT,DATA);
}
void disp(ZGGZ tp[],int n){/*显示数组tp[]中存储的记录,内容为*/
	int i;
	if (n==0)
	{
		/* code */
		printf("\n========>No employees record!\n");
		getchar();
		return ;
	}
	printf("\n\n");
	printheader();		/*输出表格头部*/
	i=0;
	while(i<n){	/*逐条输出数组中存储的员工信息*/
		PRINTdata(tp[i]);
		i++;
		printf(HEADER3);
	}
	getchar();
}

void wrong(){	/*输出按键错误信息*/
	printf("\n\n\n\n*******Error:input has wrong!press any key to continue*******\n");
	getchar();
}
void nofind(){	/*输出未查找到此员工的信息*/
	printf("\n====>Not find this employee record!\n");
}
//save.c
#pragma once
#include "preProcess.h"
extern int saveflag;				/*需要存盘的标志变量*/
/*存储记录*/
void save(ZGGZ tp[],int n){
	FILE *fp;
	int i=0;
	fp=fopen("E:\zggz\gzgl.data","wb");
	if (fp==NULL)
	{
		/* code */
		printf("\n=======>open file error!\n");;
		getchar();
		return ;
	}
	for (i = 0; i < n; ++i)
	{
		/* code */
		if (fwrite(&tp[i],sizeof(ZGGZ),1,fp)==1)	/*每次写一条记录或一个结构数组元素到文件中草药*/
		{
			/* code */
			continue;
		}
		else
			break;
	}
	if (i>0)
	{
		/* code */
		getchar();
		printf("\n\n===========>save file complete,total saved's record number is :%d\n",i);
		getchar();
		saveflag=0;
	}
	else
	{
		system("cls");
		printf("the current link is empty,no employee record is saved!\n");
		getchar();
	}
	fclose(fp);
}

注意:insert功能只有在数据库(其实这里即文件)里有记录才能进行,所以,这里又还是把add功能加上,目前只是有insert和add、save的功能

            上面是用结构体数组实现,当然,也可以采用链表来实现,然而,这显然应该不是大的数据库实现的有效方式吧





你可能感兴趣的:(C语言实现的工资管理系统)