?? com.c
字號:
#include "common.h"
/*********************************************************
函數(shù)名:newMember
形參:MEMBER team[],數(shù)組首地址;count,數(shù)組中已有成員個數(shù)
返回值:無
函數(shù)功能:新建一個員工,并從鍵盤為新員工賦值
作者:xyh
編寫日期:2006-8-8
**********************************************************/
void newMember(MEMBER team[],int count){
MEMBER newMember;
float tmp;
char tmpDate[10];
if(count>=MAX){
printf("存儲信息的空間已經(jīng)到達最大值,不能再新增員工信息了!\n");
return;
}
/*以下從鍵盤為新節(jié)點賦值*/
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("所輸入的編號已經(jīng)存在,請重新輸入!\n");
}while(1);
printf("請輸入新員工姓名:\n");
//scanf("%s",newMember.name);
//while(strlen(newMember.name)==0)
while(strlen(gets(newMember.name))==0)// 輸入不能為空串
continue;
printf("請輸入新員工角色(0-經(jīng)理 1-秘書 2-助理 3-職員):\n");//暫時沒有考慮輸入0-3之外的數(shù)據(jù)的容錯性
while(1){
while(scanf("%d",&newMember.role)!=1){// 輸入不是%d格式,需要重新輸入
scanf("%*s");//跳到行輸入緩沖區(qū)下一個空白字符
printf("請重新輸入角色!\n");
}
if(newMember.role>=0&&newMember.role<=3)//上句while執(zhí)行完畢,已經(jīng)輸入一個整數(shù),并且輸入的是0-3之一
break;
else{//已經(jīng)輸入一個整數(shù),但是輸入的不是0-3之一
printf("請輸入0~3中的一個整數(shù):\n");
printf("請輸入新員工角色(0-經(jīng)理 1-秘書 2-助理 3-職員):\n");
}
}
printf("請輸入新員工年齡:\n");
while(scanf("%d",&newMember.age)!=1){//輸入不是%d格式,需要重新輸入
scanf("%*s");//跳到行輸入緩沖區(qū)下一個空白字符
printf("請重新輸入年齡!\n");
}
printf("請輸入新員工身高(單位:厘米):\n");//輸入不是%f格式,需要重新輸入
while(scanf("%f",&tmp)!=1){
scanf("%*s");//跳到行輸入緩沖區(qū)下一個空白字符
printf("請重新輸入身高!\n");
}
newMember.high=tmp;
printf("請輸入新員工體重(單位:公斤):\n");
while(scanf("%f",&tmp)!=1){//輸入不是%f格式,需要重新輸入
scanf("%*s");//跳到行輸入緩沖區(qū)下一個空白字符
printf("請重新輸入體重!\n");
}
newMember.weight=tmp;
printf("請輸入新員工薪水(單位:人民幣元/月):\n");
while(scanf("%f",&tmp)!=1){//輸入不是%f格式,需要重新輸入
scanf("%*s");//跳到行輸入緩沖區(qū)下一個空白字符
printf("請重新輸入薪水!\n");
}
newMember.salary=tmp;
while(getchar()!='\n')//清空行輸入緩沖區(qū)
continue;
do{
printf("請輸入新員工加入日期(使用半角字符,格式:yy-mm-dd):\n");
//scanf("%s",tmpDate);
gets(tmpDate);
if(checkDate(&newMember, tmpDate)==1)
break;
}while(1);
team[count]=newMember;
return ;
}
/*********************************************************
函數(shù)名:unique
形參:存放員工信息的數(shù)組,數(shù)組中已有的員工人數(shù),要判斷的編號字符指針number
返回值:編號已經(jīng)存在返回0,編號不存在返回1
函數(shù)功能:判斷新輸入的編號在數(shù)組中是否已經(jīng)存在
作者:xyh
編寫日期:2006-8-8
**********************************************************/
int unique(MEMBER team[],int count,char * number){
int i;
int flag=1;//標(biāo)記編號是否唯一,1代表沒有重復(fù),唯一;0代表重復(fù),不唯一
for(i=0;i<count;i++){
if(strcmp(team[i].number,number)==0){
flag=0;//重復(fù),不唯一
break;
}
}
return flag;
}
/*********************************************************
函數(shù)名:checkDate
形參:要判斷的新員工member,要判斷的日期字符指針number
返回值:輸入正確1,輸入不正確返回0
函數(shù)功能:判斷新輸入的日期格式是否正確,正確則賦值給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;
}
/*********************************************************
函數(shù)名:sort
形參:要處理的數(shù)組team,數(shù)組中的人數(shù)count,排序方式style
返回值:無
函數(shù)功能:按指定的排序方式排序數(shù)組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++){//根據(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 ;
}
/*********************************************************
函數(shù)名:loadFromFile
形參:保存信息的數(shù)組team
返回值:數(shù)組中的總?cè)藬?shù)count
函數(shù)功能:從文件中把數(shù)據(jù)全部讀出保存到數(shù)組中
作者: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程序即將結(jié)束!\n");
exit(1);//程序終止運行
}
}
if(fread(&member,sizeof(MEMBER),1,fp)==0) {//讀取第一個結(jié)點
printf("文件中沒有數(shù)據(jù)!\n");
}
else{
team[count]=member;
count++;
while(!feof(fp) ){//沒有到文件尾,繼續(xù)讀取
if(fread(&member,sizeof(MEMBER),1,fp)==1){
team[count]=member;//
count++;
}
}
}
fclose(fp);
return count;
}
/*********************************************************
函數(shù)名:writeToFile
形參:要寫入的數(shù)組,數(shù)組中的人數(shù)
返回值:無
函數(shù)功能:將數(shù)組全部寫入到文件中
作者:xyh
編寫日期:2006-8-8
**********************************************************/
void writeToFile(MEMBER team[],int count){
MEMBER member;
int i;
FILE *fp;
if(count==0) {
printf("向文件寫入數(shù)據(jù)時,數(shù)組為空!\n");
return;
}
fp= fopen(FILENAME,"wb");
for(i=0;i<count;i++){//沒有到尾,繼續(xù)
fwrite(&(team[i]),sizeof(MEMBER),1,fp);//將一個結(jié)點寫到文件
}
fclose(fp);
}
/*********************************************************
函數(shù)名:list
形參:要寫入的數(shù)組,數(shù)組中的人數(shù)
返回值:無
函數(shù)功能:遍歷數(shù)組輸出所有數(shù)據(jù)
作者: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();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -