版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《C語言程序設計》課程設計報告第4頁共34頁《C語言程序設計》課程設計報告系部:三系班級:11通信(1)班學號:20110306111姓名:張夢瑤設計題目:高校人事管理程序成績:指導教師:徐化祥開課時間:2011-2012學年第2學期2012年6月
課程設計(報告)內容要求:1.課程設計的目的(1)熟練掌握C語言的基本知識和技能;(2)掌握程序設計的一些經典算法和基本方法;(3)了解數(shù)組、指針和結構體的應用;(4)利用所學的基本知識和技能,解決日常生活中經常面臨的問題;(5)培養(yǎng)分析、解決問題的能力;培養(yǎng)撰寫報告、科技論文的能力。2.課程設計的任務及要求1)課程設計題目:高校人事管理程序2)基本內容::(1)設計一個功能菜單,將程序的各個功能顯示出來,并有選擇提示;(2)應包含職工的職工號、職工姓名、性別、出生日期、部門、崗位角色、職稱、工齡、來校時間、月收入等職工基本信息;(3)要求有錯誤提示功能。例如輸入數(shù)據(jù)錯誤,提示用戶重新輸入。(4)具有新增、修改、刪除等功能;(5)具有查詢功能,且能夠按職工號或職工姓名查詢某一職工的信息。(6)使用文件功能,信息的輸入輸出用文件的存取和顯示的方式,建立文件,直接存取默認文件或指定文件。3.提交內容:(1)電子文檔:可執(zhí)行文件(.exe)和程序源文件(.c)及使用說明文件(.txt);(2)書面文檔:課程設計報告。4.評分標準:(1)完成基本功能,程序運行基本正常;(60分)(2)程序界面友好,設置錯誤提示或者按照要求改變結果;(10分)(3)完成課程設計報告和使用說明書,文字流暢,圖表清晰,格式規(guī)范;(10分)(4)出勤與回答問題情況。(20分)(5)在完成基本要求的基礎上,設計新穎、功能豐富、運行穩(wěn)定的作品,酌情加分。學生簽名:張夢瑤2012年6月日
功能描述輸入記錄模塊。輸入記錄模塊主要完成將數(shù)據(jù)存入數(shù)組中的工作。在此高校人事信息管理系統(tǒng)中,記錄可以從以二進制形式存儲的數(shù)據(jù)文件中讀入,也可以從鍵盤逐個輸入記錄。記錄由職工的基本信息字段構成。當從數(shù)據(jù)文件中讀入記錄時,它就是在以記錄為單位存儲的數(shù)據(jù)文件中,將記錄逐條復制到數(shù)組元素中。查詢記錄模塊。查詢記錄模塊主要完成在數(shù)組中查找滿足相關條件的記錄。在此人事管理系統(tǒng)中,用戶可以按照職工編號或姓名在數(shù)組中進行查找。若找到該記錄,則以表格形式打印出此記錄的信息;否則,返回一個-1的值,并打印出未找到記錄的提示信息。更新記錄模塊。更新記錄模塊主要完成對記錄的維護。在此人事管理系統(tǒng)中,實現(xiàn)對記錄的修改、刪除和排序操作。一般而言,系統(tǒng)進行了這些操作之后,需要將修改的數(shù)據(jù)存入源數(shù)據(jù)文件。統(tǒng)計記錄模塊。統(tǒng)計記錄模塊主要完成對職工總人數(shù)、性別、工齡在各等級的統(tǒng)計。輸出記錄模塊。輸出記錄模塊主要完成兩個任務。第一,它實現(xiàn)對記錄的存盤操作,即將數(shù)組中各元素中存儲的記錄信息寫入數(shù)據(jù)文件中。第二,它實現(xiàn)將數(shù)組中存儲的記錄信息以表格的形式在屏幕上打印出來。高校人事管理系統(tǒng)高校人事管理系統(tǒng)輸入記錄模塊查詢記錄模塊更新記錄模塊統(tǒng)計記錄模塊輸出記錄模塊從文件讀入從鍵盤輸入按編號查詢按姓名查詢修改記錄刪除記錄增加記錄排序記錄統(tǒng)計職工總人數(shù)輸出至文件輸出至屏幕統(tǒng)計男女職工數(shù)工齡各等級人數(shù)圖1高校人事管理系統(tǒng)功能模塊圖總體設計(一)功能模塊設計1.主控main()函數(shù)執(zhí)行流程高校人事管理系統(tǒng)執(zhí)行主流程如圖2所示。它先以可讀寫的方式打開數(shù)據(jù)文件,此文件默認為“c:\zgxx”,若該文件不存在,則新建此文件。當打開文件操作成功后,則從文件中一次讀出一條記錄,添加到新建的數(shù)組中,然后執(zhí)行顯示主菜單和進入主循環(huán)操作,進行按鍵判斷。在判斷鍵值時,有效的輸入為0—8之間的任意數(shù)值,其他輸入都被視為錯誤按鍵。若輸入為0(即變量select=0),則會繼續(xù)判斷是否在對記錄進行了更新操作之后了存盤操作,若未存盤,則全局變量saveflag=1,系統(tǒng)會提示用戶是否需要進行數(shù)據(jù)存盤操作,用戶輸入y或Y,系統(tǒng)會進行存盤操作。最后,系統(tǒng)執(zhí)行退出人事管理系統(tǒng)的操作。若選擇1,則調用Add()函數(shù),執(zhí)行增加記錄操作;若選擇2,則調用Del()函數(shù),執(zhí)行刪除記錄操作;若選擇3,則調用Qur()函數(shù),執(zhí)行查詢記錄操作;若選擇4,則調用Modify()函數(shù),執(zhí)行修改記錄操作;若選擇5,則調用Tongji()函數(shù),執(zhí)行統(tǒng)計記錄操作;若選擇6,則調用Sort()函數(shù),執(zhí)行排序記錄的操作;若選擇7,則調用Save()函數(shù),執(zhí)行將記錄存入磁盤中的數(shù)據(jù)文件的操作;若選擇8,則調用Disp()函數(shù),執(zhí)行將記錄以表格的形式打印輸出至屏幕的操作;若輸入0—8之外的值,則調用Wrong()函數(shù),給出按鍵錯誤的提示。開始以可讀寫的方式打開一個數(shù)據(jù)文件開始以可讀寫的方式打開一個數(shù)據(jù)文件將此文件的內容讀出并存入一個新的結構體類型的數(shù)組調用menu()菜單函數(shù)進入while(1)主循環(huán)輸入0-8中的數(shù)值選擇相應操作輸入是否為0判斷鍵值,調用相應函數(shù),完成相應功能結束調用Save()函數(shù),進行寫數(shù)據(jù)文件操作是否已對修改進行了存盤是否否是2.輸入記錄模塊輸入記錄模塊主要實現(xiàn)將數(shù)據(jù)存入數(shù)組中。當從數(shù)據(jù)文件中讀出記錄時,它調用fread(&zg[count],sizeof(ZGXX),1,fp)文件讀取函數(shù),執(zhí)行一次從文件中讀取一條職工信息記錄存入某個數(shù)組元素中的操作,并且這個操作在main()中調用執(zhí)行,即在人事管理系統(tǒng)進入顯示菜單界面時,該操作已經執(zhí)行了。若該文件中沒有數(shù)據(jù),系統(tǒng)會提示數(shù)組為空,沒有任何記錄可操作,此時,用戶選擇1,調用Add()函數(shù),進行記錄的輸入,既完成在數(shù)組中添加元素的操作。3.查詢記錄模塊查詢記錄模塊主要實現(xiàn)在數(shù)組中按職工編號或姓名查找滿足相關條件的記錄。在查詢函數(shù)Qur()中,為了遵循模塊化編程的原則,我們將在數(shù)組中進行的記錄定位操作設計成了一個單獨的函數(shù)intLocate(ZGXXv[],charmessage[],charway[]),參數(shù)message[]保存要查找的具體內容,way[]保存要查找的字段(值為字符串類型的num或者name),若找到該記錄,則返回指向該記錄的數(shù)組元素下標;否則,返回一個-1的值。4.更新記錄模塊更新記錄模塊主要實現(xiàn)對記錄的修改、刪除和排序操作。因為記錄是以數(shù)組的結構形式存儲的,所以這些操作都在數(shù)組中完成。下面分別介紹這3個功能模塊。修改記錄修改記錄操作需要對數(shù)組中目標元素域中的值進行修改,它分兩步完成。第一步,輸入要修改的職工編號,輸入后調用定位函數(shù)Locate()在數(shù)組中逐個對職工編號字段的值進行比較,直到找到該職工編號的記錄;第二步,若找到該記錄,則修改除職工編號之外的各字段的值,并將存盤標記變量saveflag置1,表示已經對記錄進行了修改,但還未進行存盤操作。刪除記錄刪除記錄操作完成刪除指定職工編號或姓名的記錄,它也分兩步完成。第一步,輸入要刪除的職工編號或姓名,輸入后調用定位函數(shù)Locate()在數(shù)組中逐個對職工編號或姓名字段的值進行比較,直到找到該職工的編號或姓名的記錄,并返回指向該記錄的數(shù)組元素下標;第二步,若找到該記錄,則從記錄所在元素的后續(xù)元素起,依次向前移一個元素位置,有值的數(shù)組元素個數(shù)減1。排序記錄冒泡排序法屬于內部排序法的一種,這是運用數(shù)據(jù)值比較后,依據(jù)判斷規(guī)則對數(shù)據(jù)位置進行交換,以達到排序的目的。針對數(shù)組結構的特點,這里采用這種排序法來分別`實現(xiàn)按工齡和月收入從高到低的排序。5.統(tǒng)計記錄模塊該模塊主要完成對職工總人數(shù)、男女職工人數(shù)和工齡在各個等級人數(shù)的統(tǒng)計。主要通過依次讀取數(shù)組中元素的數(shù)據(jù)域中的性別的值進行比較判斷的形式,完成對男女職工人數(shù)的統(tǒng)計,通過讀取數(shù)組中元素的數(shù)據(jù)域中的工齡的值進行比較判斷的形式,完成工齡在各個等級的人數(shù)統(tǒng)計。6.輸出記錄模塊當把記錄輸出至文件時,調用fwrite(&v[i],sizeof(ZGXX),1,fp)函數(shù),將數(shù)組元素v[i]中各字段的值,寫入文件指針fp所指的文件;當把記錄輸出至屏幕時,調用voidDisp()函數(shù),將數(shù)組中存儲的記錄信息以表格的形式在屏幕上打印出來。(二)數(shù)據(jù)結構設計本程序定義了結構體employee,用于存放職工的基本信息。typedefstructemployee{ charnum[10]; charname[15]; charsex[5]; charbirth[15]; chardepartment[15]; charpost[15]; charzc[15]; charcome_time[15]; intwork_time; intsalary;}ZGXX;其各字段含義如下:num[10]:保存職工編號。 name[15]:保存職工姓名。sex[5]:保存職工性別。birth[15]:保存職工出生日期。department[15]:保存職工部門。post[15]:保存職工職位。zc[15]:保存職工職稱。come_time[15]:保存職工來校時間work_time[15]:保存職工工齡。Salary:保存職工月收入。(三)函數(shù)功能描述1)printheader()函數(shù)原型:voidprintheader()Printheader()函數(shù)用于在以表格形式顯示記錄時,打印輸出表頭信息。2)printdata()函數(shù)原型:voidprintdata(ZGXXpp)printdata()函數(shù)用于以表格顯示的方式,打印輸出單個數(shù)組元素pp中的記錄信息。3)Disp()函數(shù)原型:voidDisp(ZGXXv[],intn)Disp()函數(shù)用于顯示數(shù)組v中存儲的n條記錄,內容為employee結構體中定義的內容。numberinput()函數(shù)原型:intnumberinput(char*notice)numberinput()函數(shù)用于輸入數(shù)值型數(shù)據(jù),notice用于保存printf()中輸出的提示信息。該函數(shù)返回用戶輸入的整型數(shù)據(jù)值。Stringinput()函數(shù)原型:voidStringinput(char*p,intlenth,char*notice)Stringinput()函數(shù)用于輸入字符串,并進行字符串長度驗證(長度<lenth),p用于保存輸入的字符串,因為是以指針形式傳遞的,所以p相當于該函數(shù)的返回值。Notice用于保存printf()中輸出的提示信息。Locate()函數(shù)原型:intLocate(ZGXXv[],intn,charmassage[],charway[])Locate()函數(shù)用于定位數(shù)組中符合要求的元素,并返回該元素的下標值。參數(shù)message[]保存要查找的具體內容,way[]保存按什么字段在數(shù)組v中查找。Add()函數(shù)原型:intAdd(ZGXXv[],intn)Add()函數(shù)用于在數(shù)組v中增加職工信息記錄元素,并返回數(shù)組中的當前記錄數(shù)。Qur()函數(shù)原型:voidQur(ZGXXv[],intn)Qur()函數(shù)用于在數(shù)組v中按職工編號或姓名查找滿足條件的記錄,并顯示出來。Del()函數(shù)原型:intDel(ZGXXv[],intn)Del()函數(shù)用于先在數(shù)組v中找到滿足條件的記錄,然后刪除該記錄。Modify()函數(shù)原型:voidModify(ZGXXv[],intn)Modify()函數(shù)用于在數(shù)組v中修改記錄元素。Tongji()函數(shù)原型:voidTongji(ZGXXv[],intn)Tongji()函數(shù)用于在數(shù)組v中完成記錄的統(tǒng)計工作,統(tǒng)計高校職工的總人數(shù)、男女分布和工齡的整體分布情況。Sort()函數(shù)原型:voidSort(ZGXXv[],intn)Sort()函數(shù)用于在數(shù)組v中完成利用冒泡排序算法實現(xiàn)數(shù)組按工號字段的升序排序和分別按工齡、月收入的降序排序。Save()函數(shù)原型:voidSave(ZGXXv[],intn)Save()函數(shù)用于將保存職工信息的數(shù)組v中的n個元素寫入磁盤的數(shù)據(jù)文件中。主函數(shù)main()main()是整個人事管理系統(tǒng)控制部分,其詳細說明可參考圖2.設計代碼#include<stdio.h>/*標準輸入輸出函數(shù)庫*/#include<stdlib.h>/*標準函數(shù)庫*/#include<string.h>/*字符串函數(shù)庫*/#include<conio.h>/*屏幕操作函數(shù)庫*/#defineHEADER1"ZGXX\n"#defineHEADER2"|num|name|sex|birth|department|post|zc|come_time|work_time|salary|\n"#defineHEADER3"|||||||||||\n"#defineFORMAT"|%3s|%4s|%3s|%5s|%10s|%4s|%4s|%9s|%9d|%6d|\n"#defineDATAp->num,p->name,p->sex,p->birth,p->department,p->post,p->zc,p->come_time,p->work_time,p->salary#defineEND"\n"#defineN5intsaveflag=0;/*是否需要存盤的標志變量*//*定義與職工信息有關的數(shù)據(jù)結構*/typedefstructemployee{ charnum[10];/*職工編號*/ charname[15];/*職工姓名*/ charsex[5];/*性別*/ charbirth[15];/*出生日期*/ chardepartment[15];/*部門*/ charpost[15];/*職位*/ charzc[15];/*職稱*/ charcome_time[15];/*來校時間*/ intwork_time;/*工齡*/ intsalary;/*月收入*/}ZGXX;voidmenu(){ system("cls"); printf("\nTheEmployee'SalaryManagementSystem\n\n"); printf("*************************Menu********************************\n"); printf("*1inputrecord2deleterecord*\n"); printf("*3searchrecord4modifyrecord*\n"); printf("*5countrecord6sortrecord*\n"); printf("*7savereord8displayrecord*\n"); printf("*0quitsystem*\n"); printf("*************************************************************\n"); }voidprintheader()/*格式化輸出表頭*/{printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidprintdata(ZGXXpp)/*格式化輸出表中數(shù)據(jù)*/{ ZGXX*p; p=&pp; printf(FORMAT,DATA);}voidwait()/*等待信息*/{ printf("\nPressanykeytocontinue\n"); getch();}voidWrong()/*輸出按鍵錯誤信息*/{ printf("\n\n\n\n\n***********Error:inputhaswrong!pressanykeytocontinue**********\n"); getch();}voidNofind()/*輸出未查找此職工的信息*/{ printf("\n=====>Notfindthisemployeerecord!\n");}voidDisp(ZGXXv[],intn)/*顯示數(shù)組v[]中存儲的記錄,內容為employee結構中定義的內容*/{ inti; if(n==0)/*表示沒有職工信息記錄*/ { printf("\n=====>Notemployeerecord!\n"); wait();/*xiugai*/ return; } printf("\n\n"); printheader();/*輸出表格頭部*/ i=0; while(i<n)/*逐條輸出數(shù)組中存儲的職工信息*/ { printdata(v[i]); i++; printf(HEADER3); } printf(END); wait();}/*用于定位數(shù)組中符合要求的記錄,并返回記錄下標。參數(shù):massage[]保存要查找的具體內容,way[]保存在數(shù)組中查找符合要求記錄的方式*/intLocate(ZGXXv[],intn,charmessage[],charway[]){ inti=0; if(strcmp(way,"num")==0)/*按職工編號查詢*/ { while(i<n) { if(strcmp(v[i].num,message)==0)/*若找到message值的職工編號*/ returni; i++; } } elseif(strcmp(way,"name")==0)/*按職工姓名查詢*/ { while(i<n) { if(strcmp(v[i].name,message)==0)/*若找到message值的姓名*/ returni; i++; } } return-1;/*若未找到,返回一個整數(shù)-1*/}/*輸入字符串,并進行長度驗證(長度<lenth)*/voidstringinput(char*p,intlenth,char*notice){charn[255];do{printf(notice);/*顯示提示信息*/scanf("%s",n);/*輸入字符串*/if(strlen(n)>lenth) printf("\nexceedtherequiredlength!\n");/*進行長度校驗,超過lenth值重新輸入*/}while(strlen(n)>lenth);strcpy(p,n);/*將輸入的字符串拷貝到字符串p中*/}/*輸入數(shù)值,0<=數(shù)值)*/intnumberinput(char*notice){intx=0;do{printf(notice);/*顯示提示信息*/scanf("%d",&x);/*輸入如工齡等數(shù)值型的值*/if(x<0)printf("\nthenumbermust>=0!\n");/*進行數(shù)值校驗*/}while(x<0);returnx;}/*增加職工信息記錄*/intAdd(ZGXXv[],intn){ charch,num[10]; inti,flag=0; system("cls"); Disp(v,n);/*先打印出已有的職工信息*/ while(1)/*一次可輸入多條記錄,直至輸入職工編號為0的記錄才結束添加操作*/ { while(1)/*輸入職工編號,保證該編號沒有被使用,若輸入編號為0,則退出添加記錄操作*/ { stringinput(num,10,"inputnumber(press'0'returnmenu):");/*格式化輸入編號并檢驗*/ flag=0; if(strcmp(num,"0")==0)/*輸入為0,則退出添加操作,返回主界面*/ {returnn;} i=0; while(i<n)/*查詢該編號是否已經存在,若存在則要求重新輸入一個未被占用的編號*/ { if(strcmp(v[i].num,num)==0) { flag=1; break; } i++; } if(flag==1)/*提示用戶是否重新輸入*/ { printf("==>Thenumber%sisexisting,tryagain?(y/n):",num); wait(); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else returnn; } else {break;} } strcpy(v[n].num,num);/*將字符串num拷貝到v[n].num中*/ stringinput(v[n].name,15,"姓名:");/*輸入并檢驗職工姓名信息*/ stringinput(v[n].sex,5,"性別:");/*輸入并檢驗職工性別信息*/ stringinput(v[n].birth,15,"出生日期:");/*輸入并檢驗職工生日信息*/ stringinput(v[n].department,15,"部門:");/*輸入并檢驗職工部門信息*/ stringinput(v[n].post,15,"職位:");/*輸入并檢驗職工職位信息*/ stringinput(v[n].zc,15,"職稱:");/*輸入并檢驗職工職稱信息*/ stringinput(v[n].come_time,15,"來校時間:");/*輸入并驗證職工來校時間信息*/ v[n].work_time=numberinput("工齡:");/*輸入并檢驗職工工齡信息*/ v[n].salary=numberinput("月收入:");/*輸入并檢驗職工月收入信息*/ saveflag=1; n++;}returnn;}/*刪除記錄:先找到保存該記錄的數(shù)組元素的下標值,然后在數(shù)組中刪除該數(shù)組元素*/intDel(ZGXXv[],intn){ intchoice; charmessage[20]; intp=0,i=0; if(n<=0) { system("cls"); printf("\n=====>Noemployeerecord!\n"); wait(); returnn; } system("cls"); Disp(v,n); printf("\n=====>1Deletebynumber=====>2Deletebyname\n"); printf("pleasechoice[1,2]:"); scanf("%d",&choice); if(choice==1) { stringinput(message,10,"inputtheexistingemployeenumber:"); p=Locate(v,n,message,"num"); if(p!=-1) { for(i=p+1;i<n;i++)/*刪除此記錄,后面記錄向前移*/ { strcpy(v[i-1].num,v[i].num); strcpy(v[i-1].name,v[i].name); strcpy(v[i-1].sex,v[i].sex); strcpy(v[i-1].birth,v[i].birth); strcpy(v[i-1].department,v[i].department); strcpy(v[i-1].post,v[i].post); strcpy(v[i-1].zc,v[i].zc); strcpy(v[i-1].come_time,v[i].come_time); v[i-1].work_time=v[i].work_time; v[i-1].salary=v[i].salary; } printf("\n==>deletesuccess!\n"); n--; wait(); saveflag=1; } else { Nofind(); wait(); } } elseif(choice==2)/*先按姓名查詢到該記錄所在的數(shù)組元素的下標值*/ { stringinput(message,15,"inputtheexistingemployeename:"); p=Locate(v,n,message,"name"); if(p!=-1) { for(i=p+1;i<n;i++)/*刪除此記錄,后面記錄向前移*/ { strcpy(v[i-1].num,v[i].num); strcpy(v[i-1].name,v[i].name); strcpy(v[i-1].sex,v[i].sex); strcpy(v[i-1].birth,v[i].birth); strcpy(v[i-1].department,v[i].department); strcpy(v[i-1].post,v[i].post); strcpy(v[i-1].zc,v[i].zc); strcpy(v[i-1].come_time,v[i].come_time); v[i-1].work_time=v[i].work_time; v[i-1].salary=v[i].salary; } printf("\n=====>deletesuccess!\n"); n--; wait(); saveflag=1; } else { Nofind(); wait(); } } returnn;}/*按職工編號或姓名,查詢記錄*/voidQur(ZGXXv[],intn){ intchoice;/*1:按編號查,2:按姓名查,其他:返回主界面(菜單)*/ charsearch[20];/*保存用戶輸入的查詢內容*/ intp=0; if(n<=0)/*若數(shù)組為空*/ { system("cls"); printf("\n=====>Noemployeerecord!\n"); wait(); return; } system("cls"); printf("\n=====>1Searchbynumber=====>2Searchbyname\n"); printf("pleasechoice[1,2]:"); scanf("%d",&choice); if(choice==1)/*按編號查詢*/ { stringinput(search,10,"inputtheexistingemployeenumber:"); p=Locate(v,n,search,"num");/*在數(shù)組v中查找編號為search值的元素,并返回該數(shù)組元素的下標值*/ if(p!=-1)/*若找到該記錄*/ { printheader(); printdata(v[p]); printf(END); wait(); } else { Nofind(); wait(); } } elseif(choice==2)/*按姓名查詢*/ { stringinput(search,15,"inputtheexistingemployeename:"); p=Locate(v,n,search,"name"); if(p!=-1) { printheader(); printdata(v[p]); printf(END); wait(); } else { Nofind(); wait(); } } else { Wrong(); wait(); }}/*修改記錄。先按輸入的職工編號查詢到該記錄,然后提示用戶修改編號之外的值,編號不能修改*/voidModify(ZGXXv[],intn){ charfindmess[20]; intp=0; if(n<=0) { system("cls"); printf("\n=====>Noemployeerecord!\n"); wait(); return; } system("cls"); printf("modifyemployeerecorder"); Disp(v,n); stringinput(findmess,10,"inputtheexistingemployeenumber:");/*輸入并檢驗該編號*/ p=Locate(v,n,findmess,"num");/*查詢到該數(shù)組元素,并返回下標值*/ if(p!=-1)/*若p!=-1,表明已經找到該數(shù)組元素*/ { printf("編號:%s,\n",v[p].num); printf("姓名:%s,",v[p].name); stringinput(v[p].name,15,"inputnewname:"); printf("性別:%s,",v[p].sex); stringinput(v[p].sex,5,"inputnewsex:"); printf("出生日期:%s,",v[p].birth); stringinput(v[p].birth,15,"inputnewbirthday:"); printf("部門:%s,",v[p].department); stringinput(v[p].department,15,"inputnewdepartment:"); printf("職位:%s,",v[p].post); stringinput(v[p].post,15,"inputnewpost:"); printf("職稱:%s,",v[p].zc); stringinput(v[p].zc,15,"inputnewzc:"); printf("來校時間:%s,",v[p].come_time); stringinput(v[p].come_time,15,"inputnewcome_time:"); printf("工齡:%d,",v[p].work_time); v[p].work_time=numberinput("inputnewwork_time:"); printf("月收入:%d,",v[p].salary); v[p].salary=numberinput("inputnewsalary:"); printf("\n=====>modifysuccess!\n"); wait(); Disp(v,n); getch(); saveflag=1; } else { Nofind(); wait(); } return;}/*統(tǒng)計職工總數(shù),分別按性別、工齡統(tǒng)計職工人數(shù)*/voidTongji(ZGXXv[],intn){ intchoice; inttotal,man=0,woman=0;/*分別保存總人數(shù)、男職工數(shù)、女職工數(shù)*/ inti=0; if(n<=0) { system("cls"); printf("\n=====>Notemployeerecord!\n"); wait(); return; } system("cls"); Disp(v,n); printf("\n1.Countthetotalworkers2.Countbysex3.Countbywork_time\n"); printf("Pleaseinputyourchoice[1,2,3]:"); scanf("%d",&choice); if(choice==1) { total=n;/*總人數(shù)*/ printf("\ntheTongJiresult\n"); printf("Thetotalworkers:%d(ren)\n",total); printf("\n"); wait(); } if(choice==2)/*按性別統(tǒng)計*/ { for(i=0;i<n;i++) { if(strcmp(v[i].sex,"m")==0) man++; else woman++; } printf("\ntheTongJiresult\n"); printf("Themaleworkers:%d(ren)\nThefemaleworkers:%d(ren)\n",man,woman); printf("\n"); wait(); } if(choice==3)/*按工齡統(tǒng)計*/ { intcount0=0,count5=0,count10=0,count15=0,count20=0; for(i=0;i<n;i++) { if(v[i].work_time>=20) { count20++; continue; } if(v[i].work_time>=15) { count15++; continue; } if(v[i].work_time>=10) { count10++; continue; } if(v[i].work_time>=5) { count5++; continue; } if(v[i].work_time<5) { count0++; continue; } } printf("\ntheTongJiresult\n"); printf("work_time>=20:%d(ren)\n",count20); printf("15<=work_time<20:%d(ren)\n",count15); printf("10<=work_time<15:%d(ren)\n",count10); printf("5<=work_time<10:%d(ren)\n",count5); printf("work_time<5:%d(ren)\n",count0); printf("\n"); wait(); } }/*利用冒泡排序法實現(xiàn)數(shù)組的按工號的升序排序,工齡、月收入字段的降序排序,從高到低*/voidSort(ZGXXv[],intn){ intchoice; inti=0,j=0,flag=0; ZGXXx; if(n<=0) { system("cls"); printf("\n=====>Notemployeerecord!\n"); wait(); return; } system("cls"); Disp(v,n);/*顯示排序前的所有記錄*/ printf("\n1.Sortbynumber2.Sortbywork_time3.Sortbysalary\n"); printf("\nPleaseinputyourchoice[1,2,3]:"); scanf("%d",&choice); if(choice==1)/*按工號升序排序*/ { for(i=0;i<n;i++) { flag=0; for(j=0;j<n-1;j++) { if(strcmp(v[j].num,v[j+1].num)>0) { flag=1; strcpy(x.num,v[j].num);/*利用結構變量x實現(xiàn)數(shù)組元素的交換*/ strcpy(,v[j].name); strcpy(x.sex,v[j].sex); strcpy(x.birth,v[j].birth); strcpy(x.department,v[j].department); strcpy(x.post,v[j].post); strcpy(x.zc,v[j].zc); strcpy(e_time,v[j].come_time); x.work_time=v[j].work_time; x.salary=v[j].salary; strcpy(v[j].num,v[j+1].num); strcpy(v[j].name,v[j+1].name); strcpy(v[j].sex,v[j+1].sex); strcpy(v[j].birth,v[j+1].birth); strcpy(v[j].department,v[j+1].department); strcpy(v[j].post,v[j+1].post); strcpy(v[j].zc,v[j+1].zc); strcpy(v[j].come_time,v[j+1].come_time); v[j].work_time=v[j+1].work_time; v[j].salary=v[j+1].salary; strcpy(v[j+1].num,x.num); strcpy(v[j+1].name,); strcpy(v[j+1].sex,x.sex); strcpy(v[j+1].birth,x.birth); strcpy(v[j+1].department,x.department); strcpy(v[j+1].post,x.post); strcpy(v[j+1].zc,x.zc); strcpy(v[j+1].come_time,e_time); v[j+1].work_time=x.work_time; v[j+1].salary=x.salary; } } if(flag==0)break;/*若標記flag=0,意味著沒有交換了,排序已經完成*/ } Disp(v,n);/*顯示排序后的所有記錄*/ saveflag=1; printf("\n=====>sortcomplete!\n"); } if(choice==2)/*按工齡降序排序*/ { for(i=0;i<n;i++) { flag=0; for(j=0;j<n-1;j++) if((v[j].work_time<v[j+1].work_time)) { flag=1; strcpy(x.num,v[j].num); strcpy(,v[j].name); strcpy(x.sex,v[j].sex); strcpy(x.birth,v[j].birth); strcpy(x.department,v[j].department); strcpy(x.post,v[j].post); strcpy(x.zc,v[j].zc); strcpy(e_time,v[j].come_time); x.work_time=v[j].work_time; x.salary=v[j].salary; strcpy(v[j].num,v[j+1].num); strcpy(v[j].name,v[j+1].name); strcpy(v[j].sex,v[j+1].sex); strcpy(v[j].birth,v[j+1].birth); strcpy(v[j].department,v[j+1].department); strcpy(v[j].post,v[j+1].post); strcpy(v[j].zc,v[j+1].zc); strcpy(v[j].come_time,v[j+1].come_time); v[j].work_time=v[j+1].work_time; v[j].salary=v[j+1].salary; strcpy(v[j+1].num,x.num); strcpy(v[j+1].name,); strcpy(v[j+1].sex,x.sex); strcpy(v[j+1].birth,x.birth); strcpy(v[j+1].department,x.department); strcpy(v[j+1].post,x.post); strcpy(v[j+1].zc,x.zc); strcpy(v[j+1].come_time,e_time); v[j+1].work_time=x.work_time; v[j+1].salary=x.salary; } if(flag==0)break; } Disp(v,n); saveflag=1; printf("\n=====>sortcomplete!\n"); } if(choice==3)/*按月收入降序排序*/ { for(i=0;i<n;i++) { flag=0; for(j=0;j<n-1;j++) if((v[j].salary<v[j+1].salary)) { flag=1; strcpy(x.num,v[j].num); strcpy(,v[j].name); strcpy(x.sex,v[j].sex); strcpy(x.birth,v[j].birth); strcpy(x.department,v[j].department); strcpy(x.post,v[j].post); strcpy(x.zc,v[j].zc); strcpy(e_time,v[j].come_time); x.work_time=v[j].work_time; x.salary=v[j].salary; strcpy(v[j].num,v[j+1].num); strcpy(v[j].name,v[j+1].name); strcpy(v[j].sex,v[j+1].sex); strcpy(v[j].birth,v[j+1].birth); strcpy(v[j].department,v[j+1].department); strcpy(v[j].post,v[j+1].post); strcpy(v[j].zc,v[j+1].zc); strcpy(v[j].come_time,v[j+1].come_time); v[j].work_time=v[j+1].work_time; v[j].salary=v[j+1].salary; strcpy(v[j+1].num,x.num); strcpy(v[j+1].name,); strcpy(v[j+1].sex,x.sex); strcpy(v[j+1].birth,x.birth); strcpy(v[j+1].department,x.department); strcpy(v[j+1].post,x.post); strcpy(v[j+1].zc,x.zc); strcpy(v[j+1].come_time,e_time); v[j+1].work_time=x.work_time; v[j+1].salary=x.salary; } if(flag==0)break; } Disp(v,n); saveflag=1; printf("\n=====>sortcomplete!\n"); }}/*數(shù)據(jù)存盤,若用戶沒有專門進行此操作且對數(shù)據(jù)有修改,在退出系統(tǒng)時,會提示用戶存盤*/voidSave(ZGXXv[],intn){ FILE*fp; inti=0; fp=fopen("c:\\zgxx","wb");/*以只寫方式打開二進制文件*/ if(fp==NULL)/*打開文件失敗*/ { printf("\n=====>openfileerror!\n"); wait(); return; } for(i=0;i<n;i++) { if(fwrite(&v[i],sizeof(ZGXX),1,fp)==1)/*每次寫一條記錄或一個結構數(shù)組元素至文件*/ { continue; } else { break; } } if(i>0) { printf("\n\n=====>savefilecomplete,totalsaved'srecordnumberis:%d\n",i); wait(); saveflag=0; } else { system("cls"); printf("thecurrentlinkisempty,noemployeerecordissaved!\n"); wait(); } fclose(fp);/*關閉此文件*/}voidmain(){ ZGXXzg[N];/*定義結構體*/ FILE*fp;/*文件指針*/ intselect;/*保存選擇結果變量*/ charch;/*保存(y,Y,n,N)*/ intcount=0;/*保存文件中的記錄條數(shù)*/ fp=fopen("c:\\zgxx","ab+"); /*以追加方式打開二進制文件,可讀可寫,若文件不存在,會創(chuàng)建此文件*/ if(fp==NULL) { printf("cannotopenfile!\n"); exit(0); } while(!feof(fp)) { if(fread(&zg[count],sizeof(ZGXX),1,fp)==1)/*一次從文件中讀取一條職工信息記錄*/ count++; } fclose(fp);/*關閉文件*/ printf("\nopenfilesuccess,thetotalrecordnumberis:%d.\n",count); wait(); menu(); while(1) { system("cls"); menu(); printf("\nPleaseenteryourchoice(0-8):");/*顯示提示信息*/ scanf("%d",&select); if(select==0) { if(saveflag==1)/*若對數(shù)組的數(shù)據(jù)有修改且未進行存盤操作,則此標志為1*/ { printf("\nWhethersavethemodifiedrecordtofile?(y/n):"); scanf("%c",&ch); if(ch=='y'||ch=='Y') Save(zg,count); } printf("\nthankyouforuseness!\n"); break; } switch(select) { case1:count=Add(zg,count);break;/*增加職工信息記錄*/ case2:count=Del(zg,count);break;/*刪除職工信息記錄*/ case3:Qur(zg,count);break;/*查詢職工信息記錄*/ case4:Modify(zg,count);break;/*修改職工信息記錄*/ case5:Tongji(zg,count);break;/*統(tǒng)計職工信息記錄*/ case6:Sort(zg,count);break;/*排序職工信息記錄*/ case7:Save(zg,count);break;/*保存職工信息記錄*/ case8:system("cls");Disp(zg,count);break;/*顯示職工信息記錄*/ def
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論