#include<stdio.h> #include<string.h> #include<stdlib.h> #define NUM 1000 void enter(); void search_num(); void dele_num(); void modi_num(); void browse(); void count(); void load(); void add(); void menu(); int n; //員工的總數 struct emploee //職工數據結構 { char no[5]; char name[8]; char sex[3]; int age; float wage1; //員工的基本工資 float wage2; //員工的職務工資 float funds; //員工的住房公積金 float WATERfee; //員工的水電費 float TAXfee; //員工的個人所得稅 float wage3; //員工的實發工資 }emp[NUM],newemp; void main() { menu(); } void menu()//主界面 { int n,w1; do { system("cls"); printf("************* 職工工資管理系統 **************\n"); printf("* 1-----輸入職工信息 *\n"); printf("* 2-----查詢職工信息 *\n"); printf("* 3-----根據職工ID號修改 *\n"); printf("* 4-----根據職工ID號刪除 *\n"); printf("* 5-----據工資統計並瀏覽 *\n"); printf("* 6-----從文件載入信息 *\n"); printf("* 7-----瀏覽全部職工 *\n"); printf("* 8-----追加職工信息 *\n"); printf("* 9-----退出程序 *\n"); printf("***************************************************\n"); printf(" 輸入您的選擇(1-9):[ ]\b\b"); scanf("%d",&n); if(n<1||n>9) //對選擇的數字作判斷 { w1=1; printf("your choice is not between 1 and 9,Please input again:"); getchar(); } else w1=0; } while(w1==1); switch(n) { case 1:enter(); break; case 2:search_num(); break; case 3:modi_num(); break; case 4:dele_num(); break; case 5:count (); break; case 6:load(); break; //保存模塊 case 7:browse(); break; //加載模塊 case 8:add(); break; case 9:printf("\n×××××××謝謝,歡迎下次光臨!×××××××\n\n"); default:exit(0); //退出系統,exit(0)函數功能是退出程序。 } } /*************************輸入模塊**********************/ void enter() { FILE *fp; int n,i; if ((fp=fopen("emp.txt","wb"))==NULL) { printf("不能建立emp文件\n"); exit(1); } printf("輸入職工人數:"); scanf("%d",&n); printf("輸入格式:職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅<Enter>\n"); for(i=0;i<n;i++) /* 循環獲取n個職工記錄 */ { printf("第%d個職工:",i+1); scanf("%s%s%s%d%f%f%f%f%f",emp[i].no,emp[i].name,emp[i].sex,&emp[i].age, &emp[i].wage1,&emp[i].wage2,&emp[i].funds,&emp[i].WATERfee,&emp[i].TAXfee); emp[i].wage3=emp[i].wage1+emp[i].wage2+emp[i].funds-emp[i].WATERfee-emp[i].TAXfee; } for(i=0;i<n;i++) /*將n個職工記錄寫入文件*/ fwrite(&emp[i],sizeof(struct emploee),1,fp); fclose(fp); } /*************************統計模塊**********************/ void count() { FILE *fp; int n,num; if((fp=fopen("emp.txt","rb"))==NULL) { printf("不能打開emp文件\n"); exit(1); } printf("請輸入工資數:"); scanf("%d",&num); printf("記錄號 職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 實發工資\n"); for(n=0;fread(&emp[n],sizeof(struct emploee),1,fp)!=0;n++) if(emp[n].wage3>=num) printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",n+1,emp[n].no,emp[n].name,emp[n].sex, emp[n].age,emp[n].wage1, emp[n].wage2,emp[n].funds,emp[n].WATERfee,emp[n].TAXfee,emp[n].wage3); fclose(fp); } /********************刪除模塊*******************/ void dele_num() { FILE *fp; int i,j,n; char num[5]; if((fp=fopen("emp.txt","rb"))==NULL) { printf("不能打開emp文件\n"); exit(1); } printf("刪除前:\n"); printf("記錄號 職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 實發工資\n"); for(n=0;fread(&emp[n],sizeof(struct emploee),1,fp);n++) printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",n+1,emp[n].no,emp[n].name,emp[n].sex, emp[n].age,emp[n].wage1, emp[n].wage2,emp[n].funds,emp[n].WATERfee,emp[n].TAXfee,emp[n].wage3);/*n為emp文件中記錄數*/ printf("要刪除的職工號:"); scanf("%s",num); for(i=0;(strcmp(emp[i].no,num)!=0&&i<n);i++) if(i>=n) { printf("\t沒有%s職工號的職工\n",num); exit(2); } fclose(fp); fp=fopen("emp.dat","w+"); if(n==1) /*一個記錄已經刪除了*/ { fclose(fp); exit(3); } for(j=0;j<i;j++) fwrite(&emp[j],sizeof(struct emploee),1,fp); for(j=i+1;j<n;j++) fwrite(&emp[j],sizeof(struct emploee),1,fp); printf("刪除后:\n"); fseek(fp,0,SEEK_SET); printf("記錄號 職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 實發工資\n"); for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp);i++) printf("%6d%6s%9s%4s%5d% %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1, emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3); fclose(fp); } /********************修改模塊*******************/ void modi_num() { FILE *fp; int i,j; char num[5]; if((fp=fopen("emp.txt","rb+"))==NULL) { printf("不能 打開emp文件\n"); exit(1); } printf("要修改的職工號:"); scanf("%s",num); for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp);i++) if(!strcmp(emp[i].no,num))break; if(feof(fp)) { printf("\t沒有%s職工號的職工\n",num); exit(2); } printf("記錄號 職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 實發工資\n"); printf("%6d%6s%9s%4s%5d% %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1, emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3); printf("輸入格式:職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 <Enter>\n"); printf("第%d個記錄:",i+1); scanf("%s%s%s%d%f%f%f%f%f",newemp.no,newemp.name,newemp.sex,&newemp.age, &newemp.wage1,&newemp.wage2,&newemp.funds,&newemp.WATERfee,&newemp.TAXfee);//獲取新的職工記錄 newemp.wage3=newemp.wage1+newemp.wage2+newemp.funds-newemp.WATERfee-newemp.TAXfee; fseek(fp,-(long)sizeof(struct emploee),SEEK_CUR); //文件指針指向該修改的記錄開頭 fwrite(&newemp,sizeof(struct emploee),1,fp); //用newemp覆蓋當前記錄 printf(" 修改后:\n"); fseek(fp,0,SEEK_SET); //顯示修改后的文件數據 printf("記錄號 職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 實發工資\n"); for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp)!=0;i++) printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1, emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3); fclose(fp); } /*************************查詢模塊***********************/ void search_num() { FILE *fp; int i; char num[5]; if((fp=fopen("emp.txt","rb"))==NULL) { printf("不能打開emp文件\n"); exit(1); } printf("要查詢的職工號:"); scanf("%s",num); for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp);i++) if(!strcmp(emp[i].no,num)) break; if(feof(fp)) { printf("\t查無此人\n"); exit(2); } printf("記錄號 職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 實發工資\n"); printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1, emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3); fclose(fp); } /*******************瀏覽模塊********************/ void browse() { int i; FILE *fp; if((fp=fopen("emp.txt","r"))==NULL) { printf("不能打開emp文件\n"); exit(0); } printf("記錄號 職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 實發工資\n"); for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp)!=0;i++) { printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1, emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3); } fclose(fp); } /******************追加模塊*******************/ void add() { FILE *fp; int n,i,j; if((fp=fopen("emp.txt","ab+"))==NULL) { printf("不能打開emp文件\n"); exit(0); } printf("要追加的職工人數:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("輸入格式:職工號 姓名 性別 年齡 基本工資 職務工資 公積金 水電費 稅 <Enter>\n"); printf("追加記錄:\n"); scanf("%s%s%s%d%f%f%f%f%f",newemp.no,newemp.name,newemp.sex,&newemp.age, &newemp.wage1,&newemp.wage2,&newemp.funds,&newemp.WATERfee,&newemp.TAXfee); newemp.wage3=newemp.wage1+newemp.wage2+newemp.funds-newemp.WATERfee-newemp.TAXfee;//獲取一個新的職工記錄 fwrite(&newemp,sizeof(struct emploee),1,fp); //將該職工記錄寫入文件 } fclose(fp); } /*************************載入模塊**********************/ void load() //加載記錄或可以計算記錄個數的函數 { FILE *fp; int i,w; w=1; system( "cls" ); if((fp=fopen("emp.txt","rb"))==NULL) //以輸出打開方式,在此前的記錄被覆蓋 { printf("\nCannot open file\n"); w=0; return ; } n=0; for(i=0;!feof(fp);i++) { fread(&emp[i],sizeof(struct emploee),1,fp); n++; } n=n-1; fclose(fp); if(w==1) { printf("Load file ok!"); getchar(); getchar(); menu(); } }