员工信息管理系统--C语言
員工信息管理系統
?一. 目的
C語言的課設選擇了員工管理系統,處理的對象為員工的信息,分為3個端(管理員,普通員工,部門經理)登錄。進入主函數首先讀取文件內容,其次用戶選擇登錄身份,驗證登錄密碼,其次選擇每個登錄身份的各項功能。存在文件及文件之間的交互,*輸入密碼等。二. 功能模塊圖
三.各功能簡單描述
1.管理員模塊:
密碼驗證成功后,進入管理員菜單選項,管理員可以進行:
??????1)采集信息(添加員工信息,添加部門經理信息):添加信息后選擇是否保存,若保存將員工(部門經理)信息保存到存放員工(部門經理)信息的文件(staff.txt/manager.txt),其中添加員工信息時每種輸入都有限制,如名字只能輸入中文、工號只能輸入小于等于8位的數字、電話只能輸入11位的數字等,輸入工號、電話的時候會有查重提示,輸入部門和職位時只能輸入公司機構文件存在的本公司現有的部門和職位,在公司機構文件里面查找,保證員工基本資金與職位對應。
??????2)管理員工信息(查找、修改、刪除、排序):其中修改、刪除后需要選擇是否將改動信息保存到文件。
??????3)瀏覽員工信息,按照報表的格式輸入公司所有員工的信息。
??????4)管理登錄密碼(管理員密碼、員工密碼、經理密碼):若是管理管理員密碼,因為管理員只有一個,所以直接將存放管理員密碼文件的數據修改,若是管理員工和經理密碼找到對應員工或經理修改其密碼
??????5)管理公司機構:管理員為公司添加新的部門、職位、和職位對應的工資,添加時存在查重。
??????6)查看公司現有機構:輸出該公司現存在部門、職位。
?
2.普通員工模塊:
密碼驗證成功后,進入菜單選項,管理員可以進行:
??????1)查詢員工信息:該公司是公開,所以員工可以查詢公司每個員工的信息。
??????2)修改自己的信息:員工只能修改自己的基礎信息(姓名,工號,電話),不能修改請假、遲到、加班信息。
??????3)查看加班信息:可以查看自己的部門經理給其分配的加班天數
??????4)發送請假請求:向經理發送請假請求,將發送請求的員工保存到另外一個文件,等待經理審核。
3.部門經理模塊:
??????1)采集員工信息:經理有權利添加員工。
??????2)瀏覽所有員工信息:經理可以查看該公司所有員工的信息
??????3)查看本部門員工信息:將經理所在部門的員工信息以報表的形式輸出
??????4)通知本部門員工加班信息:經理只能通知自己部門的員工加班,無權給其他部門員工給予加班信息,通知加班信息時加班時間不能(壓榨員工)太長。
??????5)審核請假信息:經理讀取需要請假的員工文件,進行審核,若批準將員工信息的請假次數修改,若不批準則不改動。
四.程序部分運行
大一結束了,C語言也學完了,為了課設第一次寫這么長的代碼,下面是我的課設代碼,在vc++6.0運行的,如果要復制查看的換運行程序后會出現多個.txt ( 其中manage.txt存放管理員密碼,剛開始要手動打開.txt給里面添加密碼,不然無法進行之后的程序 ), 剛開始程序有有點low....之后改了好多,輸入也加了好多限制,不過應該有沒發現的bug,希望大佬們別吐槽。
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <windows.h> #include <malloc.h> //員工:姓名 工號 電話 部門 職位 密碼 工資(實際工資,基本工資,扣款(遲到/請假) ,獎金(加班天數)) struct wage { int real;//實際工資int base;//基本工資int cut;//扣款( 遲到-10,請假-5 )int bonus;//獎金( 加班60 ) }; typedef struct staff {char name[20];char number[20];char phone[20];char depart[20];//部門 char post[20];//職位char password[20];int late;//遲到次數int leave;//請假次數int over;//加班天數struct wage z;struct staff *next; }sta; sta *head,*u,*p,*q,*wj,*t;//頭指針 //部門經理: 姓名 工號 所管部門 密碼 typedef struct manager {char mname[20];char mnumber[20];char mdepart[20];//所管部門char mpassword[20];struct manager *next; }mana; mana *mhead,*mu,*mp,*mq,*mwj,*mt; //************************************************************************************************************* typedef struct begin//管理員輸入的初始部門 {char bdepart[20];char bpost[20];int bbase;struct begin *next; }beg; beg *bhead,*bu,*bp,*bq,*bwj,*bt; typedef struct gobye {char gnumber[20];int gleave;//請假次數struct gobye *next; }gob; //員工個數 int n; char nei; //員工登錄工號 員工查找自己信息 char sdl[100]; char ddepart[100];//登錄經理所管的部門 char look[100];//查找重復的時候使用 //*********************************************函數聲明***************************************** sta* new_node(sta* uu); mana* mnew_node(mana* uu); void add();void s_add();void m_add(); void modify(); void modi_all();void modi_num();void modi_name(); void modi_phone(); void del(); void del_name(); void del_num(); void del_phone(); void sort();void sort_name();void sort_num();void sort_real();void sort_late();void sort_leave();void sort_over(); void find();void find_sta();void find_depart();void find_name();void find_num();void find_phone();void find_namenum(); void lookover();void callover();void overday();int overname();//關于加班 void askleave();void giveleave();//關于請假 void display();void adminxx(); void save();void read();void msave();void mread();gob* learead();void leasave(); void exi();void admin();void staff();void manager();void mjinru(); void mmgl();void stam();void manam();void adminm(); void welcome();void gotoxy(int x, int y);//光標移動 void begin();void begread();void begsave();void beg_show();void beg_add();//公司機構 //********************************************************************************************** //構造員工結點函數 沒有頭結點 sta* new_node(sta* uu) { uu = (sta*)malloc(sizeof(sta)); uu->next = NULL; return uu; } //構造部門經理結點函數 沒有頭結點mana* mnew_node(mana* uu) { uu = (mana*)malloc(sizeof(mana)); uu->next = NULL; return uu; } //構造公司機構結點函數 沒有頭結點 beg* bnew_node(beg* uu) { uu = (beg*)malloc(sizeof(beg)); uu->next = NULL; return uu; } //構造請假結點函數 沒有頭結點 gob* gnew_node(gob* uu) { uu = (gob*)malloc(sizeof(gob)); uu->next = NULL; return uu; }void askleave() {char c[20];FILE *fp;for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,sdl) == 0) { printf("\t\t\t☆ 你可以向你所在部門的經理申請一次請假\n");printf("\t\t\t☆ 友情提示: 請假太多一定不會被批準的\n");printf("\t\t\t☆ 你在這個月已經請了%d次假(被批準的)\n",u->leave);printf("\t\t\t☆ 你是否還要請假(y/n):"); while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t☆請輸入合法字符!\n");printf("\t\t\t☆請重新輸入: ");fflush(stdin); //清除緩沖區 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t☆你這次選擇了不請假,此次操作不會告訴上級 ^.^\n");return ;}if((strcmp(c,"y")==0)){printf("\t\t\t☆你這次選擇了請假,此次操作將反饋給上級,請等待批準\n");//fp=fopen("leave.txt","a+"); //進入程序時打開/建立該文件//fclose(fp); fp=fopen("leave.txt","a+");printf("\t\t\t☆你此次的請假信息將被記錄\n");fprintf(fp,"%s ",u->number); fprintf(fp,"%d\n",u->leave); fclose(fp); }} } } //讀取請假文件 gob * learead() { FILE *fp;gob *ghead,*gu,*gr;ghead = gr= (gob*)malloc(sizeof(gob));ghead ->next=NULL;//fp=fopen("leave.txt","a"); //進入程序時打開/建立該文件//fclose(fp);if((fp=fopen("leave.txt","r"))==NULL) { return NULL; }nei=fgetc(fp);if(nei==EOF)//文件內沒東西時{ return NULL;} else{rewind(fp);}while(!feof(fp)) { gu= (gob*)malloc(sizeof(gob));fscanf(fp,"%s ",gu->gnumber); fscanf(fp,"%d\n",&gu->gleave);gr->next=gu;gu->next=NULL;gr=gu;}fclose(fp);return ghead; } void giveleave() { FILE *fp;char c[20];int m=0;gob *ghead,*gu;ghead=learead();//讀入if(nei==EOF)//文件內沒東西時{ printf("\n\n\t\t\t☆ 暫時還沒有員工需要請假\n");return;} for(gu = ghead->next; gu!= NULL;gu = gu->next) { m++; printf("\t\t\t☆ 第%d個代批準員工的請假記錄\n",m);printf("\t\t\t☆ 工號\t請假次數\n");printf("\t\t\t☆ %s\t%d\n",gu->gnumber,gu->gleave);printf("\t\t\t☆ 你是否批準?(y/n)");while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t☆請輸入合法字符!\n");printf("\t\t\t☆請重新輸入: ");fflush(stdin); //清除緩沖區 }if( (strcmp(c,"n")==0)|| (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t☆ 你狠心的拒絕了該員工此次的請假申請\n");continue;}if((strcmp(c,"y")==0)){printf("\t\t\t☆ 你通過了該員工的請假申請\n");//請假次數加1for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,gu->gnumber) == 0) { printf("\t\t\t☆ 你將給員工記錄這請假\n");u->leave=gu->gleave+1;u->z.cut=u->late*10+u->leave*5; //扣款:遲到-10 請假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;save();break; } } }} fp=fopen("leave.txt","w"); //進入程序時打開直接關閉相當于清空文件fclose(fp);return; }void lookover()//員工查看加班時間 員工登錄工號全局變量char sdl[20]; {for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,sdl) == 0) { printf("\t\t\t☆ 你所在部門給你分配下來的本月加班%d天☆\n",u->over);printf("\t\t\t☆ 小提示: 若時間不充足,你也可以返回上一步申請請假,等待批準\n");break; } } } void overday() {int j;printf("\t\t\t☆ 輸入你準備給分配本月的加班天數:");//匹配時輸入加班時間while(1){j=scanf("%d",&u->over);if(j!=1){printf("\t\t\t☆ 加班天數是數字哦 ^.^ 請重新輸入:");fflush(stdin); //清除緩沖區 u->over=1; //防止跳出循環 }else{if(u->over>32){printf("\t\t\t☆ 哇,加班天數有點都多哦,經理也不能這么壓榨勞苦人民吧\n");printf("\t\t\tSo...^.^ 請你重新輸入:");}if(j==1 && u->over<32){u->z.bonus=u->over*60; //獎金:加班60 u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}}} } int overname()//經理通知加班時間********************************* { int k,m,j,l;//控制char overname[20];k=m=l=0;printf("\t\t\t☆ 經理特權: 你可以讓自己部門的員工進行加班哦\n ");printf("\t\t\t☆ 小提示: 你可以先退回上一步查看自己部門的員工哦\n");printf("\t\t\t☆ 輸入你準備給分配加班員工的姓名:");while(1){scanf("%s",overname);for(j=0;(size_t)j<strlen(overname);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(overname[j]>=0 && overname[j]<=255){printf("\t\t\t☆ 不是中文 ^.^ 請重新輸入:");break;}if(strlen(overname)>15){printf("\t\t\t☆ 姓名過長了 ^.^ 請重新輸入:");break;}else k=1;}if(k==1){for(u = head->next; u != NULL;u = u->next) { if( strcmp(u->depart,ddepart)==0 && strcmp(u->name,overname)==0)//不是該部門的員工則跳過;{l=1;return 1; }}if(l==0){printf("\t\t\t☆ 哇,你不能讓其他部門的員工加班 ");return 0;}if(u==NULL && l==0) { printf("\t\t\t☆ 哇,你的部門還木有員工,怎么讓別人加班呢(T▽T)!\n");printf("\t\t\t☆ 小提示: 你可以退回上一步雇傭員工給你的部門增加人氣哦");return 0; }}}return 0; } void callover() {if(overname()){overday();}elsereturn; } //打印該公司機構 void beg_show() { if(bhead->next == NULL) { printf("\t\t\t--->該公司的公司機構還沒有錄入!\n"); return; }printf("☆友情提示:該公司現有部門和職位\n");puts("部門 職位 \n"); for(bu = bhead->next; bu!= NULL;bu = bu->next) { printf("%-15s %-15s ",bu->bdepart,bu->bpost);printf("\n");} } //添加公司機構********************************************************8888 void beg_add() { int j,m;//控制char c[20];bu = bnew_node(bu); //新建一個節點printf("\t\t\t****************采集公司機構信息***************\n");while(1){printf("\t\t\t*部門:__\b\b");//查重*********************************************************scanf("%s",bu->bdepart);for(j=0;(size_t)j<strlen(bu->bdepart);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(bu->bdepart[j]>=0 && bu->bdepart[j]<=255){printf("\t\t\t不是中文呢 ^.^\t請重新輸入\n");break;}if(strlen(bu->bdepart)>15){printf("\t\t\t部門輸入過長 ^.^\t請重新輸入\n");break;}}strcpy(look,bu->bdepart);//查重for(bt = bwj->next; bt != NULL;bt = bt->next) { if(strcmp(bt->bdepart,look) == 0) {m=0;printf("\t\t\t該公司已經存在該部門了呦 ^.^\n ");printf("\t\t\t您是否要新建部門? (y/n)");while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t請輸入合法字符!\n");printf("\t\t\t請重新輸入: ");fflush(stdin); //清除緩沖區 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不新建部門 ^.^\n");m=1 ;break;}printf("\t\t\t新建部門請重新命名 ^.^\n");break;} if(strcmp(bt->bdepart,look) != 0) { continue;}}if(bt==NULL)//新的工號時{m=1;}if(strlen(bu->bdepart)<=15 && (size_t)j==strlen(bu->bdepart)&&m==1){break;}}while(1){printf("\t\t\t*職位:__\b\b");//查重***********************************************************scanf("%s",bu->bpost);for(j=0;(size_t)j<strlen(bu->bpost);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(bu->bpost[j]>=0 && bu->bpost[j]<=255){printf("\t\t\t不是中文呢 ^.^ 請重新輸入\n");break;}if(strlen(bu->bpost)>15){printf("\t\t\t職位輸入過長 ^.^ 請重新輸入\n");}}strcpy(look,bu->bpost);//查重for(bt = bwj->next; bt != NULL;bt = bt->next) { if(strcmp(bt->bpost,look) == 0) {m=0;printf("\t\t\t該公司已經存在該職位了呦 ^.^ 新建職位請重新命名\n ");break;} if(strcmp(bt->bpost,look) != 0) { continue;}}if(bt==NULL)//新的工號時{m=1;}if(strlen(bu->bpost)<=15 && (size_t)j==strlen(bu->bpost) && m==1){break;}}while(1){printf("\t\t\t*基本工資:");j=scanf("%d",&bu->bbase);if(j!=1){printf("\t\t\t工資是數字哦 ^.^\t請重新輸入\n");fflush(stdin); //清除緩沖區 bu->bbase=1; //防止跳出循環 }if(j==1){if(bu->bbase>20000){printf("\t\t\t親,這個工資有點高哦,請檢查是不是手誤啦\n");printf("\t\t\t ^.^請重新輸入\n");}if(j==1 && bu->bbase<=20000){break;}}}bu->next = bhead->next; //采用頭插法將新節點的尾指針指向第二個節點bhead->next = bu; //將新節點放在頭節點后面printf("\n\t\t\t--->采集成功!\n"); begsave();printf("\n\t\t\t");system("pause");system("cls"); }//讀取公司機構文件 void begread() { char a[100];//存放讀取的漢字FILE *fp;char ch;fp=fopen("begin.txt","a+"); //進入程序時打開/建立該文件fclose(fp);if((fp=fopen("begin.txt","r"))==NULL) { printf("\n\t\t\t--->沒有找到文件!\n"); return ; }ch=fgetc(fp);if(ch==EOF){return;}elserewind(fp);fgets(a,20,fp);//讀取第一行漢字信息while(!feof(fp)) { bu = bnew_node(bu);fscanf(fp,"%s %s ",bu->bdepart,bu->bpost); fscanf(fp," %d\n",&bu->bbase);bu->next = bhead->next; //頭插法建立鏈表 bhead->next = bu; }fclose(fp); } //保存公司機構信息 void begsave() {char c[20];FILE *fp;printf("\n\t\t\t確認保存?(y/n): "); while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t請輸入合法字符!\n");printf("\t\t\t請重新輸入: ");fflush(stdin); //清除緩沖區 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;}if((fp=fopen("begin.txt","w+"))==NULL) { printf("\n\t\t\t--->begin.txt文件打開失敗!\n");return ; }fputs("部門 職位 基本工資\n",fp); //從頭節點開始依次寫入文件;for(bu = bhead->next; bu != NULL;bu = bu->next) { fprintf(fp,"%s %s ",bu->bdepart,bu->bpost); fprintf(fp,"%d\n",bu->bbase);} fclose(fp); printf("\n\t\t\t--->信息成功存入\n"); } //添加員工信息 void s_add() { int j;int m,k,l=0;//控制u = new_node(u); //新建一個節點printf("\t\t\t┏━━━━━━━━━━━━━━采集員工信息━━━━━━━━━━━━━━━┓\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃姓名: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃工號: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃電話: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃部門: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃職位: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃密碼: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃遲到次數: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");while(1){gotoxy(32,2);scanf("%s",u->name);for(j=0;(size_t)j<strlen(u->name);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->name[j]>=0 && u->name[j]<=255){gotoxy(32,2);printf("不是中文 ^.^ 請重新輸入");Sleep(400);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->name)>15){gotoxy(32,2);printf("姓名過長了 ^.^ 請重新輸入");Sleep(400);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}}if(strlen(u->name)<=15&&(size_t)j==strlen(u->name)){break;}}while(1){gotoxy(32,4);scanf("%s",u->number);for(j=0;(size_t)j<strlen(u->number);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->number[j]<'0' || u->number[j]>'9') {gotoxy(32,4);printf("工號是數字哦 ^.^ 請重新輸入");Sleep(400);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->number)>8){gotoxy(32,4);printf("工號控制在8位以內哦 ^.^ 請重新輸入");Sleep(400);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}}strcpy(look,u->number);//查重for(t = wj->next; t != NULL;t = t->next) { if(strcmp(t->number,look) == 0) {m=0;gotoxy(32,4);printf("該工號已經存在了哦 ^.^ 請重新給予一個工號 ");Sleep(400);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;} if(strcmp(t->number,look) != 0) { continue;}}if(t==NULL)//新的工號時{m=1;}if(strlen(u->number)<=8&& (size_t)j==strlen(u->number) && m==1){break;}}while(1){gotoxy(32,6);scanf("%s",u->phone);for(j=0;(size_t)j<strlen(u->phone);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->phone[j]<'0' || u->phone[j]>'9'){gotoxy(32,6);printf("電話是數字 ^.^ 請重新輸入");Sleep(400);gotoxy(32,6);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->phone)!=11){gotoxy(32,6);printf("電話是11位 ^.^ 請重新輸入");Sleep(400);gotoxy(32,6);for(k=0;k<55;k++)printf(" ");break;}}strcpy(look,u->phone);//查重for(t = wj->next; t != NULL;t = t->next) { if(strcmp(t->phone,look) == 0) {m=0;gotoxy(32,6);printf("已經存在員工為電話了哦,不可能重復呀 ^.^ 請重新輸入");Sleep(400);gotoxy(32,6);for(k=0;k<55;k++)printf(" ");break;} if(strcmp(t->phone,look) != 0) { continue;}}if(t==NULL)//新的電話時{m=1;}if(strlen(u->phone)==11&& (size_t)j==strlen(u->phone) && m==1){break;}}while(1)//應該輸入公司之前存在的部門{gotoxy(32,8);scanf("%s",u->depart);for(j=0;(size_t)j<strlen(u->depart);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->depart[j]>=0 && u->depart[j]<=255){gotoxy(32,8);printf("不是中文 ^.^ 請重新輸入");Sleep(400);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->depart)>15){gotoxy(32,8);printf("部門輸入過長 ^.^ 請重新輸入");Sleep(400);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");break;}l=1;//輸入符合 接下來判斷是否存在}if(l==1){strcpy(look,u->depart);//檢查輸入的部門是否為公司機構文件之前存在的for(bt = bwj->next; bt != NULL;bt = bt->next) { if(strcmp(bt->bdepart,look) == 0) //存在時滿足{m=1;break;} if(strcmp(bt->bdepart,look) != 0) { m=0;continue;}}if(m==0)// 請重新輸入或者回到機構管理添加{gotoxy(32,8);printf("該公司還沒有此部門,^.^ 請重新輸入");Sleep(400);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");}if(strlen(u->depart)<=15 && (size_t)j==strlen(u->depart)&& m==1){break;}}}while(1){gotoxy(32,10);scanf("%s",u->post);for(j=0;(size_t)j<strlen(u->post);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->post[j]>=0 && u->post[j]<=255){gotoxy(32,10);printf("不是中文呢 ^.^ 請重新輸入");Sleep(400);gotoxy(32,10);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->post)>15){gotoxy(32,10);printf("職位輸入過長 ^.^ 請重新輸入");Sleep(400);gotoxy(32,10);for(k=0;k<55;k++)printf(" ");break;}l=1;}if(l==1){strcpy(look,u->post);//檢查輸入的職位是否為公司機構文件之前存在的for(bt = bwj->next; bt != NULL;bt = bt->next) { if(strcmp(bt->bpost,look) == 0) //存在時滿足{m=1;break;} if(strcmp(bt->bpost,look) != 0) { m=0;continue;}}if(m==0)// 請重新輸入或者回到機構管理添加{gotoxy(32,10);printf("該公司還沒有此職位,^.^ 請重新輸入");Sleep(400);gotoxy(32,10);for(k=0;k<55;k++)printf(" ");}}if(strlen(u->post)<=15 && (size_t)j==strlen(u->post) && m==1){break;}}while(1){gotoxy(32,12);scanf("%s",u->password);if(strlen(u->password)>15){gotoxy(32,12);printf("密碼輸入過長 ^.^ 請重新輸入");Sleep(400);gotoxy(32,12);for(k=0;k<55;k++)printf(" ");}if(strlen(u->password)<=15){break;}}while(1)//遲到次數是輸入的{gotoxy(35,14);j=scanf("%d",&u->late);if(j!=1){gotoxy(35,14);printf("遲到次數是數字哦 ^.^ 請重新輸入");Sleep(400);gotoxy(35,14);for(k=0;k<55;k++)printf(" ");fflush(stdin); //清除緩沖區 u->late=1; //防止跳出循環 }else{if(u->late>100){gotoxy(35,14);printf("親,遲到次數有點多哦,手誤了吧 ^.^請重新輸入");Sleep(300);gotoxy(35,14);for(k=0;k<55;k++)printf(" ");}if(j==1 && u->late<=100){break;}}}u->leave=u->over=0;u->z.base=bt->bbase;u->z.bonus=u->z.real=u->z.cut=0;u->z.bonus=u->over*60; //獎金:加班60u->z.cut=u->late*10+u->leave*5; //扣款:遲到-10 請假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;u->next = head->next; //采用頭插法將新節點的尾指針指向第二個節點head->next = u; //將新節點放在頭節點后面printf("\n\t\t\t--->采集成功!\n"); save();printf("\n\t\t\t");system("pause");system("cls"); }//添加部門經理信息 void m_add() {int j;int m,k,l=0;//控制mu = mnew_node(mu); //新建一個節點printf("\t\t\t┏━━━━━━━━━━━━━━采集經理信息━━━━━━━━━━━━━━━┓\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃姓名: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃工號: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃所管部門: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃密碼: ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");while(1){gotoxy(32,2);scanf("%s",mu->mname);for(j=0;(size_t)j<strlen(mu->mname);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(mu->mname[j]>=0 && mu->mname[j]<=255){gotoxy(32,2);printf("不是中文 ^.^ 請重新輸入");Sleep(300);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}if(strlen(mu->mname)>15){gotoxy(32,2);printf("姓名過長了 ^.^ 請重新輸入");Sleep(300);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}}if(strlen(mu->mname)<=15 && (size_t)j==strlen(mu->mname)){break;}}while(1){gotoxy(32,4);scanf("%s",mu->mnumber);for(j=0;(size_t)j<strlen(mu->mnumber);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(mu->mnumber[j]<'0' || mu->mnumber[j]>'9'){gotoxy(32,4);printf("工號是數字哦 ^.^ 請重新輸入");Sleep(300);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}if(strlen(mu->mnumber)>8){gotoxy(32,4);printf("工號控制在8位以內哦 ^.^ 請重新輸入");Sleep(300);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}}strcpy(look,mu->mnumber);//查重for(mt = mwj->next; mt != NULL;mt = mt->next) { if(strcmp(mt->mnumber,look) == 0) {m=0;gotoxy(32,4);printf("該工號已經存在了哦 ^.^ 請重新給予一個工號 ");Sleep(300);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;} if(strcmp(mt->mnumber,look) != 0) { continue;}}if(mt==NULL)//新的工號時{m=1;}if(strlen(mu->mnumber)<=8 && (size_t)j==strlen(mu->mnumber) && m==1){break;}}while(1){gotoxy(35,6);scanf("%s",mu->mdepart);for(j=0;(size_t)j<strlen(mu->mdepart);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(mu->mdepart[j]>=0 && mu->mdepart[j]<=255){gotoxy(35,6);printf("不是中文 ^.^ 請重新輸入");Sleep(300);gotoxy(35,6);for(k=0;k<55;k++)printf(" ");break;}if(strlen(mu->mdepart)>20){gotoxy(35,6);printf("部門輸入過長 ^.^ 請重新輸入");Sleep(300);gotoxy(35,6);for(k=0;k<55;k++)printf(" ");break;}l=1;}if(l==1){strcpy(look,mu->mdepart);//檢查輸入的部門是否為公司機構文件之前存在的for(bt = bwj->next; bt != NULL;bt = bt->next) { if(strcmp(bt->bdepart,look) == 0) //存在時滿足{m=1;break;} if(strcmp(bt->bdepart,look) != 0) { m=0;continue;}}if(m==0)// 請重新輸入或者回到機構管理添加{gotoxy(35,6);printf("該公司還沒有此部門,^.^ 請重新輸入");Sleep(300);gotoxy(35,6);for(k=0;k<55;k++)printf(" ");}if(strlen(mu->mdepart)<=20 && (size_t)j==strlen(mu->mdepart) && m==1){break;}}}while(1){gotoxy(32,8);scanf("%s",mu->mpassword);if(strlen(mu->mpassword)>15){gotoxy(32,8);printf("密碼輸入過長 ^.^ 請重新輸入");Sleep(300);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");}if(strlen(mu->mpassword)<=20){break;}}mu->next = mhead->next; //采用頭插法將新節點的尾指針指向第二個節點(掰開)mhead->next = mu; //將新節點放在頭節點后面printf("\n\t\t\t--->添加成功!\n"); msave(); } void add() {int chioce;do{printf("\n");printf("\t\t\t***********************************\n");printf("\t\t\t* 1.采集員工信息 *\n"); printf("\t\t\t* 2.采集部門經理信息 *\n");printf("\t\t\t* 3.返回上一步 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t***********************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){system("cls");switch(chioce){ case 1:s_add();break;case 2:m_add();break;case 3:return;case 0:exi(); break;default:printf("\n\t\t\t--->沒有該選項!\n"); }}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; } //修改函數 也可再里面弄一個整體修改小函數 void modify() {int chioce;if(head->next == NULL) { printf("\t\t\t--->沒有員工信息!"); return ; }do{printf("\n");printf("\t\t\t********************************\n");printf("\t\t\t* 1.按姓名修改 *\n");printf("\t\t\t* 2.按工號修改 *\n");printf("\t\t\t* 3.按電話修改 *\n");printf("\t\t\t* 4.返回上一步 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t********************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){system("cls");switch(chioce){ case 1:modi_name();break;case 2:modi_num();break;case 3:modi_phone();break;case 4:return;default:printf("\n--->無效的指令!\n");}}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; }void modi_all() { int chioce; int j;do{printf("\n");printf("\t\t\t*********************修改信息*********************\n");printf("\t\t\t* 1.修改姓名 2.修改工號 *\n");printf("\t\t\t* 3.修改電話 4.調動部門 *\n");printf("\t\t\t* 5.調動職位 6.修改基本工資 *\n");printf("\t\t\t* 7.修改加班天數 8.修改遲到次數 *\n");printf("\t\t\t* 9.修改請假次數 10.返回上一步 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t**************************************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){system("cls");switch(chioce){ case 1:{ while(1){printf("\t\t\t*請輸入新的姓名: "); scanf("%s",u->name);for(j=0;(size_t)j<strlen(u->name);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->name[j]>=0 && u->name[j]<=255){printf("\t\t\t不是中文呢 ^.^\t請重新輸入\n");break;}if(strlen(u->name)>15){printf("\t\t\t姓名過長 ^.^\t請重新輸入\n");break;}}if(strlen(u->name)<=15&&(size_t)j==strlen(u->name)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 2:{while(1){printf("\t\t\t*請輸入新的工號(8位以內):__\b\b");scanf("%s",u->number);for(j=0;(size_t)j<strlen(u->number);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->number[j]<'1' || u->number[j]>'9'){printf("\t\t\t工號是數字 ^.^\t請重新輸入\n");break;}if(strlen(u->number)>=8){printf("\t\t\t工號控制在8位以內 ^.^\t請重新輸入\n");break;}}if(strlen(u->number)<8 && (size_t)j==strlen(u->number)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 3:{while(1){printf("\t\t\t*請輸入新的電話(11位):__\b\b");scanf("%s",u->phone);for(j=0;(size_t)j<strlen(u->phone);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->phone[j]<'1' || u->phone[j]>'9'){printf("\t\t\t電話是數字 ^.^\t請重新輸入\n");break;}if(strlen(u->phone)!=11){printf("\t\t\t電話是11位 ^.^\t請重新輸入\n");break;}}if(strlen(u->phone)==11&& (size_t)j==strlen(u->phone)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 4:{while(1){printf("\t\t\t*請輸入新的部門:__\b\b");scanf("%s",u->depart);for(j=0;(size_t)j<strlen(u->depart);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->depart[j]>=0 && u->depart[j]<=255){printf("\t\t\t不是中文呢 ^.^\t請重新輸入\n");break;}if(strlen(u->depart)>20){printf("\t\t\t部門輸入過長 ^.^\t請重新輸入\n");break;}}if(strlen(u->depart)<=20 && (size_t)j==strlen(u->depart)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 5:{while(1){printf("\t\t\t*請輸入新的職位:__\b\b");scanf("%s",u->post);for(j=0;(size_t)j<strlen(u->post);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->post[j]>=0 && u->post[j]<=255){printf("\t\t\t不是中文呢 ^.^\t請重新輸入\n");break;}if(strlen(u->post)>20){printf("\t\t\t職位輸入過長 ^.^\t請重新輸入\n");}}if(strlen(u->post)<=20 && (size_t)j==strlen(u->post)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 6:{while(1){printf("\t\t\t*請輸入新的基本工資:");j=scanf("%d",&u->z.base);if(j!=1){printf("\t\t\t工資是數字哦 ^.^\t請重新輸入\n");fflush(stdin); //清除緩沖區 u->z.base=1; //防止跳出循環 }if(j==1){if(u->z.base>20000){printf("\t\t\t親,這個工資有點高哦,請檢查是不是手誤啦\n");printf("\t\t\t ^.^請重新輸入\n");}if(j==1 && u->z.base<=20000){break;}}}u->z.bonus=u->over*60; //獎金:加班60 補貼20%u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}case 7:{while(1){printf("\t\t\t*請輸入新的加班天數:");j=scanf("%d",&u->over);if(j!=1){printf("\t\t\t加班天數是數字哦 ^.^\t請重新輸入\n");fflush(stdin); //清除緩沖區 u->over=1; //防止跳出循環 }else{if(u->over>32){printf("\t\t\t親,加班天數比每月天數都多哦,請檢查是不是手誤啦\n");printf("\t\t\t^.^請重新輸入\n");}if(j==1 && u->over<32){break;}}}u->z.bonus=u->over*60; //獎金:加班60 u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}case 8:{while(1){printf("\t\t\t*請輸入新的遲到次數: ");j=scanf("%d",&u->late);if(j!=1){printf("\t\t\t遲到次數是數字哦 ^.^\t請重新輸入\n");fflush(stdin); //清除緩沖區 u->late=1; //防止跳出循環 }else{if(u->late>100){printf("\t\t\t親,這個遲到次數有點多哦,請檢查是不是手誤啦\n");printf("\t\t\t^.^請重新輸入\n");}if(j==1 && u->late<=100){break;}}}u->z.cut=u->late*10+u->leave*5; //扣款:遲到-10 請假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}case 9:{while(1){printf("\t\t\t*請輸入新的請假次數::");j=scanf("%d",&u->leave);if(j!=1){printf("\t\t\t請假次數是數字哦 ^.^\t請重新輸入\n");fflush(stdin); //清除緩沖區 u->leave=1; //防止跳出循環 }else{if(u->leave>100){printf("\t\t\t親,這個請假次數有點多哦,請檢查是不是手誤啦\n");printf("\t\t\t^.^請重新輸入\n");}if(j==1 && u->leave<=100){break;}}}u->z.cut=u->late*10+u->leave*5; //扣款:遲到-10 請假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;save();printf("\n\t\t\t--->修改成功!\n");break;}case 10:return;default:printf("\n\t\t\t--->無效的指令!\n");}}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; } //根據員工姓名修改信息 void modi_name() { char xname[100];n = 0;printf("\n\t\t\t請輸入您要修改的員工姓名: "); scanf("%s",xname); for(u = head; u != NULL;u = u->next) { if(strcmp(u->name,xname) == 0) { n = 1;printf("\t\t\t\t*員工初始信息*\n");puts(" 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_all();break; } } if(!n) printf("\n\t\t\t--->沒有這個學生的信息!\n"); } //根據員工工號修改信息 void modi_num() { char xnum[20];n = 0;printf("\n\t\t\t請輸入您要修改員工的工號: "); scanf("%s",xnum); for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,xnum) == 0) { n = 1;printf("\t\t\t\t*員工初始信息*\n");puts(" 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_all();save();break; } } if(!n) printf("\n\t\t\t--->沒有這個學生的信息!\n"); } //根據員工電話修改信息 void modi_phone() { char xphone[20];n = 0;printf("\n\t\t\t請輸入您要修改員工的電話: "); scanf("%s",xphone); for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,xphone) == 0) { n = 1;printf("\t\t\t\t*員工初始信息*\n");puts(" 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_all();save();break; } } if(!n) printf("\n\t\t\t--->沒有這個學生的信息!\n"); } void del() {int chioce;if(head->next == NULL) { printf("--->\t\t\t沒有員工信息!"); return ; }do{printf("\n");printf("\t\t\t********************************\n");printf("\t\t\t* 1.按姓名刪除 *\n");printf("\t\t\t* 2.按工號刪除 *\n");printf("\t\t\t* 3.按電話刪除 *\n");printf("\t\t\t* 4.返回上一步 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t********************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){switch(chioce){ case 1:del_name();break;case 2:del_num();break;case 3:del_phone();break;case 4:return;default:printf("\n\t\t\t--->無效的指令!\n");}}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; } //根據姓名刪除信息 void del_name() { char dname[100];n = 0;printf("\n\t\t\t請輸入您要刪除員工的姓名: "); scanf("%s",dname); for(u = head; u != NULL;u = u->next) { if(strcmp(u->name,dname) == 0) { n = 1;printf("\t\t\t\t*員工信息*\n");puts(" 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);p->next = u->next; free(u); printf("\n\t\t\t--->刪除成功!\n");save();break; } p = u; } if(!n) printf("\n\t\t\t--->沒有這個員工的信息!\n"); } //根據工號刪除信息 void del_num() { char dnum[20];n = 0;printf("\n\t\t\t請輸入您要刪除員工的工號: "); scanf("%s",dnum); for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,dnum) == 0) { n = 1; printf("\t\t\t\t*員工信息*\n");puts(" 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);p->next = u->next; free(u); printf("\t\t\t\n--->刪除成功!\n");save();break; } p = u; } if(!n) printf("\n\t\t\t--->沒有這個員工的信息!\n"); } //根據電話刪除信息 void del_phone() { char dphone[20];n = 0;printf("\n\t\t\t請輸入您要刪除員工的電話: "); scanf("%s",dphone); for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,dphone) == 0) { n = 1; printf("\t\t\t\t*員工信息*\n");puts(" 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);p->next = u->next; free(u); printf("\n\t\t\t--->刪除成功!\n");save();break; } p = u; } if(!n) printf("\n\t\t\t--->沒有這個員工的信息!\n"); } void sort() {int chioce;if(head->next == NULL) { printf("\t\t\t--->沒有員工信息!"); return ; }do{printf("\n");printf("\t\t\t************************************\n");printf("\t\t\t* 1.按工號排序 *\n");printf("\t\t\t* 2.按實際工資排序 *\n");printf("\t\t\t* 3.按遲到次數排序 *\n");printf("\t\t\t* 4.按請假次數排序 *\n");printf("\t\t\t* 5.按加班天數排序 *\n");printf("\t\t\t* 6.返回上一步 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t************************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){system("cls");switch(chioce){ case 1:sort_num();break; case 2:sort_real();break;case 3:sort_late();break;case 4:sort_leave();break;case 5:sort_over();break;case 6:return;default:printf("\n\t\t\t--->無效的指令!\n");}}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; } //按工號排序 void sort_num() { int i,j; n = 0; //記錄員工總數;for(u = head->next; u != NULL;u = u->next) n++; //采用冒泡法對各個節點按工號升序for(i=1;i<=n;i++) { u = head; for(j=0;j<n-i;j++) { p = u->next; q = p->next; if(strcmp(p->number,q->number) > 0 || strcmp(p->number,q->number) == 0) { u->next = q; p->next = q->next; q->next = p; } u = u->next;} } printf("\t\t\t\t工號排序后員工信息\n");display();return; } //按實際工資排序 void sort_real() { int i,j; n = 0; for(u = head->next; u != NULL;u = u->next) n++; //采用冒泡法對各個節點按工資升序for(i=1;i<=n;i++) { u = head; for(j=0;j<n-i;j++) { p = u->next; q = p->next; if(p->z.real >= q->z.real) { u->next = q; p->next = q->next; q->next = p; } u = u->next; } } printf("\t\t\t\t實際工資升序后員工信息\n");display();return; } //按請假次數排序 void sort_leave() { int i,j; //記錄學生總數;n = 0; for(u = head->next; u != NULL;u = u->next) n++; //采用冒泡法對各個節點按請假次數降序排列for(i=1;i<=n;i++) { u = head; for(j=0;j<n-i;j++) { p = u->next; q = p->next; if(p->leave < q->leave) { u->next = q; p->next = q->next; q->next = p; } u = u->next; } } printf("\t\t\t\t請假次數降序后員工信息\n");display();return; } //按遲到次數排序 void sort_late() { int i,j; //記錄學生總數;n = 0; for(u = head->next; u != NULL;u = u->next) n++; //采用冒泡法對各個節點按遲到次數降序排列for(i=1;i<=n;i++) { u = head; for(j=0;j<n-i;j++) { p = u->next; q = p->next; if(p->late< q->late) { u->next = q; p->next = q->next; q->next = p; } u = u->next; } } printf("\t\t\t\t遲到次數降序后員工信息\n");display();return; } //按加班天數排序 void sort_over() { int i,j; //記錄學生總數;n = 0; for(u = head->next; u != NULL;u = u->next) n++; //采用冒泡法對各個節點按加班天數降序排列for(i=1;i<=n;i++) { u = head; for(j=0;j<n-i;j++) { p = u->next; q = p->next; if(p->over < q->over) { u->next = q; p->next = q->next; q->next = p; } u = u->next; } } printf("\t\t\t\t加班天數降序后員工信息\n");display();return; } void find() {int chioce;do{printf("\t\t\t********************************\n");printf("\t\t\t* 1.按姓名查找 *\n");printf("\t\t\t* 2.按工號查找 *\n");printf("\t\t\t* 3.按電話查找 *\n");printf("\t\t\t* 4.按姓名和工號查找 *\n");printf("\t\t\t* 5.返回上一步 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t********************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){system("cls");switch(chioce) { case 1:find_name();break;case 2:find_num();break;case 3:find_phone();break;case 4:find_namenum();break;case 5:return;default:printf("\n\t\t\t--->無效的指令!\n");}}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; } //按姓名查找某一員工 void find_name() { char cname[20];//標志變量,記錄是否查找成功;n = 0;printf("\t\t\t\t\t根據姓名查詢信息\n");printf("\t\t\t請輸入您要查詢員工的姓名: "); scanf("%s",cname); for(u = head->next; u != NULL;u = u->next) { if(strcmp(u->name,cname) == 0) { n = 1; puts("☆\t 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf("\t ┊%-10s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break; } } if(!n) printf("\t\t\t--->該員工不存在哦(⊙o⊙)!\n"); } //按工號查找某一學生成績 void find_num() { //標志變量,記錄是否查找成功;char cnum[20];n = 0;printf("\t\t\t\t\t根據工號查詢信息\n");printf("\t\t\t請輸入您要查詢員工的工號: "); scanf("%s",cnum); for(u = head->next; u != NULL;u = u->next) { if(strcmp(u->number,cnum) == 0) { n = 1; puts("☆\t 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf("\t ┊%-10s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break; } } if(!n) printf("\t\t\t--->該員工不存在哦(⊙o⊙)!\n"); }//按電話查找某一員工 void find_phone() { //標志變量,記錄是否查找成功;char cphone[20];n = 0;printf("\t\t\t\t\t根據電話查詢信息\n");printf("\t\t\t請輸入您要查詢員工的電話: "); scanf("%s",cphone); for(u = head->next; u != NULL;u = u->next) { if(strcmp(u->phone,cphone) == 0) { n = 1; printf("\n"); puts("☆\t 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf("\t ┊%-10s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break; } } if(!n) printf("\t\t\t--->該員工不存在哦(⊙o⊙)!\n"); } //按姓名和工號查找某一員工 void find_namenum() { //標志變量,記錄是否查找成功;char ch[20];n = 0;printf("\t\t\t\t\t根據姓名和工號查詢信息\n");printf("\t\t\t請輸入您要查詢員工的姓名: "); scanf("%s",ch); for(u = head->next; u != NULL;u = u->next) { if(strcmp(u->name,ch) == 0) { printf("\t\t\t請輸入工號:");while(1){scanf("%s",ch);if(strcmp(u->number,ch) == 0){n = 1; printf("\n"); puts("☆\t 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf("\t ┊%-10s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break;}else{printf("\t\t\t工號與姓名不匹配!請重新輸入工號:");fflush(stdin);}}} } if(!n) printf("\t\t\t--->該員工不存在哦(⊙o⊙)!\n"); } //打印該公司所以員工的信息 void display() { n=0; if(head->next == NULL) { printf("--->沒有員工信息!\n"); return ; } puts("☆\t 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");for(u = head->next; u!= NULL;u = u->next) { n++; printf("\t ┊%-10s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");} printf("\n該公司共有 %d個員工.\n\n",n); } //保存員工文件; void save() { char c[20];FILE *fp;printf("\n\t\t\t確認保存?(y/n): "); while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t請輸入合法字符!\n");printf("\t\t\t請重新輸入: ");fflush(stdin); //清除緩沖區 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;}if((fp=fopen("staff.txt","w+"))==NULL) { printf("\n\t\t\t--->staff.txt文件打開失敗!\n");return ; }fputs("姓名 工號 電話 部門 職位 密碼 實際工資 基本工資 遲到 請假 加班 扣款 獎金\n",fp); //從頭節點開始依次寫入文件;for(u = head->next; u != NULL;u = u->next) { fprintf(fp,"%s %s %s %s %s %s ",u->name,u->number,u->phone,u->depart,u->post,u->password); fprintf(fp,"%d %d %d %d %d %d %d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);} fclose(fp); printf("\n\t\t\t--->信息成功存入\n"); } //讀取員工文件 void read() { char a[100];//存放讀取的漢字FILE *fp;char ch;fp=fopen("staff.txt","a+"); //進入程序時打開/建立該文件fclose(fp);if((fp=fopen("staff.txt","r"))==NULL) { printf("\n\t\t\t--->沒有找到文件!\n"); return ; }ch=fgetc(fp);if(ch==EOF){return;}elserewind(fp);fgets(a,74,fp);//讀取第一行漢字信息while(!feof(fp)) { u = new_node(u);fscanf(fp,"%s %s %s %s %s %s ",u->name,u->number,u->phone,u->depart,u->post,u->password); fscanf(fp,"%d %d %d %d %d %d %d\n",&u->z.real,&u->z.base,&u->late,&u->leave,&u->over,&u->z.cut,&u->z.bonus);u->next = head->next; //頭插法建立鏈表 head->next = u; }fclose(fp);} //保存經理文件; void msave() { char c[20];FILE *fp;printf("\n\t\t\t確認保存?(y/n): "); while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t請輸入合法字符!\n");printf("\t\t\t請重新輸入: ");fflush(stdin); //清除緩沖區 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;} if((fp=fopen("manage.txt","w+"))==NULL) { printf("\n--->無法打開文件\n"); return ; } fputs("姓名 工號 所管部門 密碼\n",fp); //從頭節點開始依次寫入文件; //部門經理: 姓名 工號 所管部門 密碼for(mu = mhead->next; mu != NULL;mu = mu->next) { fprintf(fp,"%s %s %s %s\n",mu->mname,mu->mnumber,mu->mdepart,mu->mpassword); } fclose(fp); printf("\n\t\t\t--->經理信息成功存入\n"); } //讀取經理文件 void mread() { FILE *fp;char ch,a[100];fp=fopen("manage.txt","a");fclose(fp);if((fp=fopen("manage.txt","r"))==NULL) { printf("\n--->沒有找到文件!\n"); return ; }ch=fgetc(fp);if(ch==EOF){return;}elserewind(fp);fgets(a,25,fp);//讀取第一行漢字信息while(!feof(fp)) { mu = mnew_node(mu); fscanf(fp,"%s %s %s %s\n",mu->mname,mu->mnumber,mu->mdepart,mu->mpassword); mu->next = mhead->next; //頭插法建立鏈表 mhead->next = mu; }fclose(fp); } //退出程序 void exi() { char c[100];printf("\n\t\t\t確定退出?(y/n): ");while(1){scanf("%s",c); if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t請輸入合法字符!\n");printf("\t\t\t請重新輸入: ");fflush(stdin); //清除緩沖區 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;} system("cls"); printf("\n\n"); printf("\t\t\t ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷\n"); printf("\t\t\t ∷ 謝謝使用 ∷\n"); printf("\t\t\t ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷\n"); printf("\t\t\t Thank you! ( ̄▽ ̄) \n"); exit(0); } void gotoxy(int x, int y)//位置函數 {COORD coord = {x, y}; /*COORD是Windows API中定義的一種結構,表示一個字符在控制臺屏幕上的坐標。其定義為:typedef struct _COORD {SHORT X; // horizontal coordinateSHORT Y; // vertical coordinate} COORD;*/SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } void welcome() {int i;system("color 0B");printf("\n\n\n\t\t\t(* ̄︶ ̄)~* 歡 迎 進 入 FengRong's 員 工 管 理 系 統");printf("\n\n\n\n\n\n\n\n\n\n");printf("\t\t\t\t┌───────────┐\n\n\n");printf("\n\t\t\t\t└───────────┘\n");gotoxy(33,15);for(i=0;i<5;i++){printf("██");Sleep(400);}system("cls"); } int main() { int chioce;head = wj = new_node(head);//wj,mwj用于初始文件的讀取mhead = mwj = mnew_node(mhead);bhead = bwj = bnew_node(bhead);//welcome();system("color 3f");read();mread();begread();do{ printf("\t\t\t┏━━━━━員工管理系統━━━━━┓\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 1. 管理員 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 2.普通員工 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 3.部門經理 ┃\n"); printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 0.退出管理系統 ┃\n"); printf("\t\t\t┃ ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━━┛\n"); printf("\t\t\t請選擇登陸身份:");if(scanf("%d",&chioce)){switch(chioce){ case 0:exi(); case 1:admin();break;case 2:staff();break;case 3:manager();default:printf("\n\t\t\t請重新選擇登錄身份:\n");break;}}else{printf("\n\t\t\t不能輸入非整型,請重新選擇登錄身份:\n");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 } }while(chioce!=0);system("pause"); } void mmgl() {int chioce;do{printf("\n");printf("\t\t\t************************************\n");printf("\t\t\t* 1.修改員工密碼 *\n");printf("\t\t\t* 2.修改經理密碼 *\n");printf("\t\t\t* 3.修改管理員密碼 *\n");printf("\t\t\t* 4.退回系統 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t************************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){system("cls");switch(chioce){ case 1:stam();break;case 2:manam();break;case 3:adminm();break;case 4:return;default:printf("\n--->無效的指令!\n");}}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; } void stam() // 管理員修改密碼--找到要修改員工的工號 { char mm[100]; //變量:修改密碼的工號,輸入舊密碼,修改的新密碼n = 0;printf("\n\t\t\t請輸入要您要修改密碼的工號"); scanf("%s",mm); for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,mm) == 0){ n = 1; printf("\n\t\t\t請輸入舊的密碼: ");scanf("%s",mm);if(strcmp(u->password,mm) != 0){printf("\t\t\t舊密碼輸入錯誤哦\n");printf("\t\t\t請謹慎輸入 ^.^ 重新輸入舊密碼\n");scanf("%s",mm);if(strcmp(u->password,mm) != 0){printf("\t\t\t兩次輸入錯誤了!\n");printf("\t\t\t您已經沒有權利修改密碼了 =_= 將返回上一步\n");}else{printf("\t\t\t舊密碼驗證成功!\n");printf("\t\t\t請輸入新的密碼: "); while(1){scanf("%s",u->password);if(strlen(u->password)>15){printf("\t\t\t密碼輸入過長 ^.^\t請重新輸入\n");}if(strlen(u->password)<=15){break;}}printf("\n\t\t\t--->修改成功!\n");save();break; } }else{printf("\t\t\t舊密碼驗證成功!\n");printf("\t\t\t請輸入新的密碼: "); while(1){scanf("%s",u->password);if(strlen(u->password)>15){printf("\t\t\t密碼輸入過長 ^.^\t請重新輸入\n");}if(strlen(u->password)<=15){break;}} printf("\n\t\t\t--->修改成功!\n");save();break; } } } if(!n) printf("\n\t\t\t--->沒有這個員工!\n"); } void manam() { char mm[100];n = 0;printf("\n\t\t\t請輸入要修改經理密碼的工號 "); scanf("%s",mm); for(mu = mhead; mu != NULL;mu = mu->next) { if(strcmp(mu->mnumber,mm) == 0) { n = 1;printf("\n\t\t\t請輸入舊的密碼: ");scanf("%s",mm);if(strcmp(mu->mpassword,mm) != 0){printf("\t\t\t舊密碼輸入錯誤哦\n");printf("\t\t\t請謹慎輸入 ^.^ 重新輸入舊密碼\n");scanf("%s",mm);if(strcmp(mu->mpassword,mm) != 0){printf("\t\t\t兩次輸入錯誤了!\n");printf("\t\t\t您已經沒有權利修改密碼了 =_= 將返回上一步\n");}else{printf("\t\t\t舊密碼驗證成功!");printf("\n\t\t\t請輸入新的密碼: "); scanf("%s",mu->mpassword); printf("\n\t\t\t--->修改成功!\n");msave();break; } }else{printf("\t\t\t舊密碼驗證成功!");printf("\n\t\t\t請輸入新的密碼: "); scanf("%s",mu->mpassword); printf("\n\t\t\t--->修改成功!\n");msave();break; } }} if(!n) printf("\n\t\t\t--->沒有這個經理!\n"); }void adminm() {FILE *fp;unsigned i;char ch[100];char ps[100];fp=fopen("admin.txt","rt"); fscanf(fp,"%s",ps);//讀取管理員密碼fclose(fp);if((fp=fopen("admin.txt","w+"))==NULL) { printf("\n\t\t\t--->無法打開文件\n"); return; }printf("\n\t\t\t請輸入舊密碼:");scanf("%s",ch);if(strcmp(ps,ch)!=0){printf("\t\t\t舊密碼輸入錯誤哦\n");printf("\t\t\t請謹慎輸入 ^.^ 重新輸入舊密碼\n");scanf("%s",ch);if(strcmp(mu->mpassword,ch) != 0){printf("\t\t\t兩次輸入錯誤了!\n");printf("\t\t\t您已經沒有權利修改密碼了 =_= 將返回上一步\n");}else{printf("\n\t\t\t請輸入新的管理員密碼:\n");scanf("%s",ch);for(i=0;i<(strlen(ch));i++){fputc(ch[i],fp);}fclose(fp);return;}}else{printf("\n\t\t\t請輸入新的管理員密碼:\n");scanf("%s",ch);for(i=0;i<(strlen(ch));i++){fputc(ch[i],fp);}fclose(fp);return;} } int getadmin() {int i=0;FILE *fp;char password[100],password1[100];char c;fp=fopen("admin.txt","a");fclose(fp);fp=fopen("admin.txt","rt"); fscanf(fp,"%s",password);//讀取管理員密碼fclose(fp);printf("\n\n\n\n\t\t\t請輸入管理員密碼:");//scanf("%s",password1);while((c=getch())!=13){if(c==8){printf("\b \b");i--;continue;}password1[i++]=c;putchar('*');}password1[i]='\0';if(strcmp(password1,password)==0){printf("\n\t\t\t登錄中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t密碼輸入錯誤!密碼在admin.txt中\n\t\t\t請重新輸入密碼:");fflush(stdin);scanf("%s",password1);if(strcmp(password1,password)==0){printf("\n\t\t\t登錄中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t你已經兩次密碼輸入錯誤!\n\t\t\t將返回上一步,請重新選擇登錄身份!\n");system("pause");system("cls");return 0;}} } void adminxx() {int chioce;do{printf("\t\t\t┏━━━━━━━━━━━━━━━━┓\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 1. 查詢員工信息 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 2. 修改員工信息 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 3. 刪除員工信息 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 4. 排序員工信息 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 5. 返回上一步 ┃\n"); printf("\t\t\t┃ ┃\n"); printf("\t\t\t┃ 0.退出管理系統 ┃\n"); printf("\t\t\t┃ ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━━┛\n"); printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){system("cls");switch(chioce) { case 1:find();break;case 2:modify();break;case 3:del();break; case 4:sort();break;case 5:return;case 0:exi(); break;default:printf("\n--->無效的指令!\n"); }}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; } void admin() {int choice; system("color 0a");system("cls");if(getadmin()){system("cls");//*****while(1) { printf("\t\t\t\t\t\t\t\t管理員模式\n\n\n\n");printf("\t\t\t┏━━━━━員工管理系統━━━━━┓\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 1. 采集信息 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 2. 管理員工信息 ┃\n");//查詢find() 修改modify() 刪除del() 排序sort();printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 3. 瀏覽員工信息 ┃\n");//display()printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 4. 管理密碼 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 5. 管理公司機構 ┃\n"); //beg_add()printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 6. 查看公司機構 ┃\n"); //beg_show()printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 7. 返回上一步 ┃\n"); printf("\t\t\t┃ ┃\n"); printf("\t\t\t┃ 0.退出管理系統 ┃\n"); printf("\t\t\t┃ ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━━┛\n"); printf("\t\t\t 請選擇功能:");if(scanf("%d",&choice)) {system("cls");switch(choice) { case 1:add();break;case 2:adminxx();break;case 3:display();break; case 4:mmgl();break;case 5:beg_add();break;case 6:beg_show();break;case 7:return;case 0:exi(); break;default:printf("\n--->無效的指令!\n"); }}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 choice=1; //防止跳出循環 }printf("\n"); } }else return ; } int sgetmima() {int m,i=0;//控制char smima[20];char c;m=0;printf("\t\t\t請輸入工號:");scanf("%s",sdl);if(head->next==NULL){printf("\t\t\t沒有員工信息\n");return 0;}for(u=head->next;u!=NULL;u=u->next){if(strcmp(u->number,sdl)==0){printf("\t\t\t請輸入密碼:");//scanf("%s",smima);while((c=getch())!=13){if(c==8){printf("\b \b");i--;continue;}smima[i++]=c;putchar('*');}smima[i]='\0';if(strcmp(u->password,smima)==0){m=1;printf("\n\t\t\t登錄中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t請再次輸入密碼:");scanf("%s",smima);if(strcmp(u->password,smima)==0){m=1;printf("\n\t\t\t登錄中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\t\t\t密碼輸入錯誤!\n");return 0;}}}}if(!m){printf("\n\t\t\t沒有此工號的員工!\n");return 0;}return 0; }void modi_self()//員工修改自己基本信息 {int chioce; int j;do{printf("\n");printf("\t\t\t*********************修改信息*********************\n");printf("\t\t\t* 1.修改姓名 2.修改電話 *\n");printf("\t\t\t* 3.修改密碼 4.返回上一步 *\n");printf("\t\t\t* 0.退出 *\n");printf("\t\t\t**************************************************\n");printf("\t\t\t請選擇:");if(scanf("%d",&chioce)){switch(chioce){ case 1:{ while(1){printf("\t\t\t*請輸入新的姓名: "); scanf("%s",u->name);for(j=0;(size_t)j<strlen(u->name);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->name[j]<'a' || u->name[j]>'z'){printf("\t\t\t姓名不符合常規 ^.^\t請重新輸入\n");break;}if(strlen(u->name)>15){printf("\t\t\t姓名過長 ^.^\t請重新輸入\n");break;}}if(strlen(u->name)<=15&&(size_t)j==strlen(u->name)){break;}}printf("\n--->修改成功!\n");save();break;}case 2:{while(1){printf("\t\t\t*請輸入新的電話(11位):__\b\b");scanf("%s",u->phone);for(j=0;(size_t)j<strlen(u->phone);j++) //strlen函數返回的類型是size_t 實質是無符號整型{if(u->phone[j]<'1' || u->phone[j]>'9'){printf("\t\t\t電話是數字 ^.^\t請重新輸入\n");break;}if(strlen(u->phone)!=11){printf("\t\t\t電話是11位 ^.^\t請重新輸入\n");break;}}if(strlen(u->phone)==11&& (size_t)j==strlen(u->phone)){break;}}printf("\n--->修改成功!\n");save();break;}case 3:{printf("\t\t\t請輸入新的密碼: "); while(1){scanf("%s",u->password);if(strlen(u->password)>15){printf("\t\t\t密碼輸入過長 ^.^\t請重新輸入\n");}if(strlen(u->password)<=15){break;}}printf("\n\t\t\t--->修改成功!\n");save();break; }case 4:return;default:printf("\n\t\t\t--->無效的指令!\n");}}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 chioce=1; //防止跳出循環 }}while(chioce!=0);return; }//員工修改自己的基本信息 員工登錄工號全局變量char sdl[20]; void mself() { for(u = head; u != NULL;u = u->next) { if(strcmp(u->number,sdl) == 0) { printf("\t\t\t\t\t*員工初始信息*\n");puts(" 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_self();break; } } } void sjinru() {int choice;system("color 3f");system("cls");while(1) { printf("\t\t\t\t\t\t\t\t\t\t\t員工模式\n\n\n\n");printf("\t\t\t┏━━━━━━━━━━━━━━━┓\n"); printf("\t\t\t┃ 1.查詢信息 ┃ \n"); //員工可以查詢自己和別人的信息 printf("\t\t\t┃ ┃\n"); printf("\t\t\t┃ 2.修改信息 ┃\n"); //該工號員工只能修改自己的基本信息(姓名 電話 密碼)printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 3.查看加班信息 ┃\n"); //員工查看經理發布的加班時間printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 4.發送請假信息 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 5.返回上一步 ┃\n"); printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 0.退出管理系統 ┃\n"); printf("\t\t\t┃ ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n"); printf("\t\t\t請選擇功能: ");if(scanf("%d",&choice)){system("cls");switch(choice) { case 1:find();break; case 2:mself();break; case 3:lookover();break;case 4:askleave();break;case 5:return;case 0:exi();break; default:printf("\n\t\t\t--->無效的指令!\n"); }}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 choice=1; //防止跳出循環 }printf("\n"); system("pause"); system("cls"); } } void staff() {system("color 0b");//while(1)// {if(sgetmima()) //工號和密碼{system("cls");sjinru();}elsereturn;//}} int mgetmima() {int m,i=0;//控制char mmima[20];char mnumber[20];char c;m=0;printf("\t\t\t請輸入部門經理工號:");scanf("%s",mnumber);if(mhead->next==NULL){printf("\t\t\t沒有經理\n");return 0;}for(mu=mhead->next;mu!=NULL;mu=mu->next){if(strcmp(mu->mnumber,mnumber)==0){printf("\n\t\t\t請輸入密碼:");//scanf("%s",mmima);while((c=getch())!=13){if(c==8){printf("\b \b");i--;continue;}mmima[i++]=c;putchar('*');}mmima[i]='\0';if(strcmp(mu->mpassword,mmima)==0){m=1;strcpy(ddepart,mu->mdepart);//查看自己部門員工的信息printf("\n\t\t\t登錄中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t請再次輸入密碼:");scanf("%s",mmima);if(strcmp(mu->mpassword,mmima)==0){m=1;strcpy(ddepart,mu->mdepart);printf("\n\t\t\t登錄中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\t\t\t密碼輸入錯誤!\n");return 0;}}}}if(!m){printf("\n\t\t\t沒有此工號的經理!\n");return 0;}return 0; }//查找自己部門所有員工的信息; void find_depart() { n=0; for(u = head->next; u != NULL;u = u->next) { //不是該部門的員工則跳過;if(strcmp(u->depart,ddepart)) continue; //如果是第一個員工則打印頭信息if(!n) puts("☆\t 姓名 工號 電話 部門 職位 實際工資 基本工資 遲到 請假 加班 罰款 獎金\n"); printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); n++;printf("\t ┊%-10s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); } if(!n) { printf("沒有這個部門員工的信息!\n"); return ; } printf("\n該部門共有 %d個員工.\n\n",n); } void mjinru() {int choice;system("color 2f");system("cls");while(1) { printf("\t\t\t\t\t\t\t\t\t\t\t>經理模式\n\n\n\n");printf("\t\t\t┏━━━━━━━━━━━━━━━┓\n"); printf("\t\t\t┃ 1.采集員工信息 ┃\n");printf("\t\t\t┃ ┃\n"); printf("\t\t\t┃ 2.瀏覽信息 ┃\n");printf("\t\t\t┃ ┃\n"); printf("\t\t\t┃ 3.查看本部門信息 ┃\n"); printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 4.通知加班信息 ┃\n"); printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 5.審核請假信息 ┃\n"); printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 6.返回上一步 ┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 0.退出管理系統 ┃\n");printf("\t\t\t┃ ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n"); printf("\t\t 請選擇功能:"); if(scanf("%d",&choice)){system("cls");switch(choice) { case 1:s_add();break; case 2:display();break;case 3:find_depart();break;case 4:callover();break;case 5:giveleave();break;case 6:return;case 0:exi(); break;default :system("cls");printf("\n--->請重新輸入!\n"); }}else{printf("\n\t\t\t不能輸入非整型,請重新輸入:");fflush(stdin); //清除緩沖區 choice=1; //防止跳出循環 }printf("\n"); system("pause"); system("cls"); } } void manager() {system("color 0b");//while(1)// {if(mgetmima()){system("cls");mjinru();}elsereturn;// } }
總結
以上是生活随笔為你收集整理的员工信息管理系统--C语言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#开发终端式短信的原理和方法
- 下一篇: java信息管理系统总结_java实现科