📄 com.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 + -