⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 com.c

📁 应用C语言实现一个员工工作信息管理系统 主要任务是实现对一个员工的各类人员的相关信息进行输入 输出 列表等操作。主要技术是使用数组
💻 C
字号:
#include "common.h"
/*********************************************************
函数名:newMember
形参:MEMBER team[],数组首地址;count,数组中已有成员个数
返回值:无
函数功能:新建一个员工,并从键盘为新员工赋值
作者:xyh
编写日期:2006-8-8
**********************************************************/
	void newMember(MEMBER team[],int count){
	MEMBER newMember;
	float tmp;
	char tmpDate[10];
	if(count>=MAX){
		printf("存储信息的空间已经到达最大值,不能再新增员工信息了!\n");
		return;
	} 

/*以下从键盘为新节点赋值*/
	do{
		printf("\n请输入新员工编号:\n");
		gets(newMember.number);
		//scanf("%s",newMember.number);
		if(strlen(newMember.number)==0)// 输入不能为空串
			continue;
		if(unique(team,count,newMember.number)==1)//验证编号的唯一性
			break;
		else
			printf("所输入的编号已经存在,请重新输入!\n");
	}while(1);

	printf("请输入新员工姓名:\n");
	//scanf("%s",newMember.name);
	//while(strlen(newMember.name)==0)
	while(strlen(gets(newMember.name))==0)// 输入不能为空串
		continue;

	printf("请输入新员工角色(0-经理  1-秘书  2-助理  3-职员):\n");//暂时没有考虑输入0-3之外的数据的容错性
	while(1){
		while(scanf("%d",&newMember.role)!=1){// 输入不是%d格式,需要重新输入
			scanf("%*s");//跳到行输入缓冲区下一个空白字符
			printf("请重新输入角色!\n");
		}
		if(newMember.role>=0&&newMember.role<=3)//上句while执行完毕,已经输入一个整数,并且输入的是0-3之一
			break;
		else{//已经输入一个整数,但是输入的不是0-3之一
			printf("请输入0~3中的一个整数:\n");
			printf("请输入新员工角色(0-经理  1-秘书  2-助理  3-职员):\n");
		}
	}
	

	printf("请输入新员工年龄:\n");
	while(scanf("%d",&newMember.age)!=1){//输入不是%d格式,需要重新输入
		scanf("%*s");//跳到行输入缓冲区下一个空白字符
		printf("请重新输入年龄!\n");
	}

	printf("请输入新员工身高(单位:厘米):\n");//输入不是%f格式,需要重新输入
	while(scanf("%f",&tmp)!=1){
		scanf("%*s");//跳到行输入缓冲区下一个空白字符
		printf("请重新输入身高!\n");
	}
	newMember.high=tmp;

	printf("请输入新员工体重(单位:公斤):\n");
	while(scanf("%f",&tmp)!=1){//输入不是%f格式,需要重新输入
		scanf("%*s");//跳到行输入缓冲区下一个空白字符
		printf("请重新输入体重!\n");
	}	
	newMember.weight=tmp;

	printf("请输入新员工薪水(单位:人民币元/月):\n");
	while(scanf("%f",&tmp)!=1){//输入不是%f格式,需要重新输入
		scanf("%*s");//跳到行输入缓冲区下一个空白字符
		printf("请重新输入薪水!\n");
	}
	newMember.salary=tmp;

	while(getchar()!='\n')//清空行输入缓冲区
		continue;
	
	do{
		printf("请输入新员工加入日期(使用半角字符,格式:yy-mm-dd):\n");
		//scanf("%s",tmpDate);
		gets(tmpDate);
		if(checkDate(&newMember, tmpDate)==1)
			break;
	}while(1);
	team[count]=newMember;
	return ;
}



/*********************************************************
函数名:unique 
形参:存放员工信息的数组,数组中已有的员工人数,要判断的编号字符指针number
返回值:编号已经存在返回0,编号不存在返回1
函数功能:判断新输入的编号在数组中是否已经存在
作者:xyh
编写日期:2006-8-8
**********************************************************/
int unique(MEMBER team[],int count,char * number){
	int i;
	int flag=1;//标记编号是否唯一,1代表没有重复,唯一;0代表重复,不唯一
	for(i=0;i<count;i++){
		if(strcmp(team[i].number,number)==0){
			flag=0;//重复,不唯一
			break;
		}
	}
	return flag;
}


/*********************************************************
函数名:checkDate
形参:要判断的新员工member,要判断的日期字符指针number
返回值:输入正确1,输入不正确返回0
函数功能:判断新输入的日期格式是否正确,正确则赋值给newNode返回1,否则返回0
作者:xyh
编写日期:2006-6-16
**********************************************************/
int checkDate(MEMBER *pmember, char *tmpDate)
	{
		int i,d[8],flag=1;
        MEMBER member=*pmember;
		do{
			if(strlen(tmpDate)!=8){
				flag=0;
				break;
			}
			else if(tmpDate[0]<'0'||tmpDate[0]>'9'){
				flag=0;
				break;
			}
			else if(tmpDate[1]<'0'||tmpDate[1]>'9'){
				flag=0;
				break;
			}
			else if(tmpDate[2]!='-'){
				flag=0;
				break;
			}
			else if(tmpDate[3]<'0'||tmpDate[3]>'9'){
				flag=0;
				break;
			}
			else if(tmpDate[4]<'0'||tmpDate[4]>'9'){
				flag=0;
				break;
			}
			else if(tmpDate[5]!='-'){
				flag=0;
				break;
			}
			else if(tmpDate[6]<'0'||tmpDate[6]>'9'){
				flag=0;
				break;
			}
			else if(tmpDate[7]<'0'||tmpDate[7]>'9'){
				flag=0;
				break;
			}
			
			for(i=0;i<strlen(tmpDate);i++){
				d[i]=tmpDate[i]-'0';
			}

			member.joinDate.year = 10*d[0]+d[1];
			member.joinDate.month = 10*d[3]+d[4];
			member.joinDate.day= 10*d[6]+d[7];

			if(member.joinDate.month<0||member.joinDate.month>12){
				flag=0;
				break;		
			}
			else if(member.joinDate.day<0||member.joinDate.day>31){
				flag=0;
				break;	
			}
			*pmember = member;

		}while(!flag);
		if(!flag)
			printf("所输入的日期格式不对,请重新输入!\n");
		return flag;
	}



/*********************************************************
函数名:sort
形参:要处理的数组team,数组中的人数count,排序方式style
返回值:无
函数功能:按指定的排序方式排序数组team
		style=1,按姓名升序排序
		style=2,按姓名降序排序
		style=3,按薪水升序排序
		style=4,按薪水升序排序
		style=其他,按编号升序排序
作者:xyh
编写日期:2006-8-8
**********************************************************/
void sort(MEMBER team[],int count,int style){
	MEMBER tmp;
	int i,j,m;

    for(i=0;i<count-1;i++){
		m=i;
		for(j=i+1;j<count;j++){//根据排序的不同类型,找最大或最小值
			switch(style){
			case 1://按姓名升序插入
				if(strcmp(team[j].name ,team[m].name) < 0){//按姓名升序插入
						m=j;
					}
				break;

			case 2://按姓名降序插入
				if(strcmp(team[j].name ,team[m].name) > 0){//按姓名升序插入
						m=j;
					}
				break;

			case 3://按薪水升序插入
				if(team[j].salary < team[m].salary){//按薪水升序插入
						m=j;
					}	
				break;

			case 4://按薪水降序插入
				if(team[j].salary > team[m].salary){//按薪水升序插入
						m=j;
					}	
				break;

			default://默认,按编号升序插入
				if(strcmp(team[j].number ,team[m].number) < 0){//按编号升序插入
						m=j;
					}			
				break;
			}//end of switch

		}//end of for

		tmp=team[i];
		team[i]=team[m];
		team[m]=tmp;
	}//end of for

	return ;
}




/*********************************************************
函数名:loadFromFile
形参:保存信息的数组team
返回值:数组中的总人数count
函数功能:从文件中把数据全部读出保存到数组中
作者:xyh
编写日期:2006-8-8
**********************************************************/
int loadFromFile(MEMBER team[]){
	MEMBER member;
	FILE *fp = fopen(FILENAME,"rb");
	int count=0;

	if(fp==NULL){//文件还不存在,无法打开
		char c;
		printf("文件打开错误或文件不存在!\n");
		printf("需要新建一个文件吗?(y/n)\n");
		//c=getche();
		c=getchar();
		if(c=='y'||c=='Y'){
			fp=fopen(FILENAME,"wb");
			fclose(fp);
			fp=fopen(FILENAME,"rb");
		}
		else
		{
			printf("\n\n程序即将结束!\n");
			exit(1);//程序终止运行
		}
	}


	if(fread(&member,sizeof(MEMBER),1,fp)==0)	{//读取第一个结点
		printf("文件中没有数据!\n");
	}
	else{
	
		team[count]=member;
		count++;
		
		while(!feof(fp) ){//没有到文件尾,继续读取
			if(fread(&member,sizeof(MEMBER),1,fp)==1){
				team[count]=member;//
				count++;			
			}
		}
	}
	fclose(fp);
	return count;
}


/*********************************************************
函数名:writeToFile
形参:要写入的数组,数组中的人数
返回值:无
函数功能:将数组全部写入到文件中
作者:xyh
编写日期:2006-8-8
**********************************************************/
void writeToFile(MEMBER team[],int count){
	MEMBER member;
	int i;
	FILE *fp;
	if(count==0) {
		printf("向文件写入数据时,数组为空!\n");
		return;
	}
	fp= fopen(FILENAME,"wb");
	for(i=0;i<count;i++){//没有到尾,继续
		fwrite(&(team[i]),sizeof(MEMBER),1,fp);//将一个结点写到文件
	}
	fclose(fp);
}

/*********************************************************
函数名:list
形参:要写入的数组,数组中的人数
返回值:无
函数功能:遍历数组输出所有数据
作者:xyh
编写日期:2006-8-8
**********************************************************/
void list(MEMBER team[],int count){
		MEMBER member;
		int i;


		printf("\n%3s%8s%15s%13s%4s%8s%8s%8s%12s\n\n","id","number","name","role","age","high","weight","salary","joinDate");
		
		for(i=0;i<count;i++){
			printf("%3d%8s%15s%13s%4d%8.2f%8.2f%8.2f%5d-%2d-%2d\n",i+1,team[i].number,team[i].name,roleSet[team[i].role],team[i].age,team[i].high,team[i].weight,team[i].salary,team[i].joinDate.year,team[i].joinDate.month,team[i].joinDate.day);
	
			if((i+1)%20==0)//分屏显示,每输出20条记录暂停
				//getche();
				getchar();
		}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -