版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《C語言程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告第4頁共34頁《C語言程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告系部:三系班級:11通信(1)班學(xué)號:20110306111姓名:張夢瑤設(shè)計(jì)題目:高校人事管理程序成績:指導(dǎo)教師:徐化祥開課時間:2011-2012學(xué)年第2學(xué)期2012年6月
課程設(shè)計(jì)(報(bào)告)內(nèi)容要求:1.課程設(shè)計(jì)的目的(1)熟練掌握C語言的基本知識和技能;(2)掌握程序設(shè)計(jì)的一些經(jīng)典算法和基本方法;(3)了解數(shù)組、指針和結(jié)構(gòu)體的應(yīng)用;(4)利用所學(xué)的基本知識和技能,解決日常生活中經(jīng)常面臨的問題;(5)培養(yǎng)分析、解決問題的能力;培養(yǎng)撰寫報(bào)告、科技論文的能力。2.課程設(shè)計(jì)的任務(wù)及要求1)課程設(shè)計(jì)題目:高校人事管理程序2)基本內(nèi)容::(1)設(shè)計(jì)一個功能菜單,將程序的各個功能顯示出來,并有選擇提示;(2)應(yīng)包含職工的職工號、職工姓名、性別、出生日期、部門、崗位角色、職稱、工齡、來校時間、月收入等職工基本信息;(3)要求有錯誤提示功能。例如輸入數(shù)據(jù)錯誤,提示用戶重新輸入。(4)具有新增、修改、刪除等功能;(5)具有查詢功能,且能夠按職工號或職工姓名查詢某一職工的信息。(6)使用文件功能,信息的輸入輸出用文件的存取和顯示的方式,建立文件,直接存取默認(rèn)文件或指定文件。3.提交內(nèi)容:(1)電子文檔:可執(zhí)行文件(.exe)和程序源文件(.c)及使用說明文件(.txt);(2)書面文檔:課程設(shè)計(jì)報(bào)告。4.評分標(biāo)準(zhǔn):(1)完成基本功能,程序運(yùn)行基本正常;(60分)(2)程序界面友好,設(shè)置錯誤提示或者按照要求改變結(jié)果;(10分)(3)完成課程設(shè)計(jì)報(bào)告和使用說明書,文字流暢,圖表清晰,格式規(guī)范;(10分)(4)出勤與回答問題情況。(20分)(5)在完成基本要求的基礎(chǔ)上,設(shè)計(jì)新穎、功能豐富、運(yùn)行穩(wěn)定的作品,酌情加分。學(xué)生簽名:張夢瑤2012年6月日
功能描述輸入記錄模塊。輸入記錄模塊主要完成將數(shù)據(jù)存入數(shù)組中的工作。在此高校人事信息管理系統(tǒng)中,記錄可以從以二進(jìn)制形式存儲的數(shù)據(jù)文件中讀入,也可以從鍵盤逐個輸入記錄。記錄由職工的基本信息字段構(gòu)成。當(dāng)從數(shù)據(jù)文件中讀入記錄時,它就是在以記錄為單位存儲的數(shù)據(jù)文件中,將記錄逐條復(fù)制到數(shù)組元素中。查詢記錄模塊。查詢記錄模塊主要完成在數(shù)組中查找滿足相關(guān)條件的記錄。在此人事管理系統(tǒng)中,用戶可以按照職工編號或姓名在數(shù)組中進(jìn)行查找。若找到該記錄,則以表格形式打印出此記錄的信息;否則,返回一個-1的值,并打印出未找到記錄的提示信息。更新記錄模塊。更新記錄模塊主要完成對記錄的維護(hù)。在此人事管理系統(tǒng)中,實(shí)現(xiàn)對記錄的修改、刪除和排序操作。一般而言,系統(tǒng)進(jìn)行了這些操作之后,需要將修改的數(shù)據(jù)存入源數(shù)據(jù)文件。統(tǒng)計(jì)記錄模塊。統(tǒng)計(jì)記錄模塊主要完成對職工總?cè)藬?shù)、性別、工齡在各等級的統(tǒng)計(jì)。輸出記錄模塊。輸出記錄模塊主要完成兩個任務(wù)。第一,它實(shí)現(xiàn)對記錄的存盤操作,即將數(shù)組中各元素中存儲的記錄信息寫入數(shù)據(jù)文件中。第二,它實(shí)現(xiàn)將數(shù)組中存儲的記錄信息以表格的形式在屏幕上打印出來。高校人事管理系統(tǒng)高校人事管理系統(tǒng)輸入記錄模塊查詢記錄模塊更新記錄模塊統(tǒng)計(jì)記錄模塊輸出記錄模塊從文件讀入從鍵盤輸入按編號查詢按姓名查詢修改記錄刪除記錄增加記錄排序記錄統(tǒng)計(jì)職工總?cè)藬?shù)輸出至文件輸出至屏幕統(tǒng)計(jì)男女職工數(shù)工齡各等級人數(shù)圖1高校人事管理系統(tǒng)功能模塊圖總體設(shè)計(jì)(一)功能模塊設(shè)計(jì)1.主控main()函數(shù)執(zhí)行流程高校人事管理系統(tǒng)執(zhí)行主流程如圖2所示。它先以可讀寫的方式打開數(shù)據(jù)文件,此文件默認(rèn)為“c:\zgxx”,若該文件不存在,則新建此文件。當(dāng)打開文件操作成功后,則從文件中一次讀出一條記錄,添加到新建的數(shù)組中,然后執(zhí)行顯示主菜單和進(jìn)入主循環(huán)操作,進(jìn)行按鍵判斷。在判斷鍵值時,有效的輸入為0—8之間的任意數(shù)值,其他輸入都被視為錯誤按鍵。若輸入為0(即變量select=0),則會繼續(xù)判斷是否在對記錄進(jìn)行了更新操作之后了存盤操作,若未存盤,則全局變量saveflag=1,系統(tǒng)會提示用戶是否需要進(jìn)行數(shù)據(jù)存盤操作,用戶輸入y或Y,系統(tǒng)會進(jìn)行存盤操作。最后,系統(tǒng)執(zhí)行退出人事管理系統(tǒng)的操作。若選擇1,則調(diào)用Add()函數(shù),執(zhí)行增加記錄操作;若選擇2,則調(diào)用Del()函數(shù),執(zhí)行刪除記錄操作;若選擇3,則調(diào)用Qur()函數(shù),執(zhí)行查詢記錄操作;若選擇4,則調(diào)用Modify()函數(shù),執(zhí)行修改記錄操作;若選擇5,則調(diào)用Tongji()函數(shù),執(zhí)行統(tǒng)計(jì)記錄操作;若選擇6,則調(diào)用Sort()函數(shù),執(zhí)行排序記錄的操作;若選擇7,則調(diào)用Save()函數(shù),執(zhí)行將記錄存入磁盤中的數(shù)據(jù)文件的操作;若選擇8,則調(diào)用Disp()函數(shù),執(zhí)行將記錄以表格的形式打印輸出至屏幕的操作;若輸入0—8之外的值,則調(diào)用Wrong()函數(shù),給出按鍵錯誤的提示。開始以可讀寫的方式打開一個數(shù)據(jù)文件開始以可讀寫的方式打開一個數(shù)據(jù)文件將此文件的內(nèi)容讀出并存入一個新的結(jié)構(gòu)體類型的數(shù)組調(diào)用menu()菜單函數(shù)進(jìn)入while(1)主循環(huán)輸入0-8中的數(shù)值選擇相應(yīng)操作輸入是否為0判斷鍵值,調(diào)用相應(yīng)函數(shù),完成相應(yīng)功能結(jié)束調(diào)用Save()函數(shù),進(jìn)行寫數(shù)據(jù)文件操作是否已對修改進(jìn)行了存盤是否否是2.輸入記錄模塊輸入記錄模塊主要實(shí)現(xiàn)將數(shù)據(jù)存入數(shù)組中。當(dāng)從數(shù)據(jù)文件中讀出記錄時,它調(diào)用fread(&zg[count],sizeof(ZGXX),1,fp)文件讀取函數(shù),執(zhí)行一次從文件中讀取一條職工信息記錄存入某個數(shù)組元素中的操作,并且這個操作在main()中調(diào)用執(zhí)行,即在人事管理系統(tǒng)進(jìn)入顯示菜單界面時,該操作已經(jīng)執(zhí)行了。若該文件中沒有數(shù)據(jù),系統(tǒng)會提示數(shù)組為空,沒有任何記錄可操作,此時,用戶選擇1,調(diào)用Add()函數(shù),進(jìn)行記錄的輸入,既完成在數(shù)組中添加元素的操作。3.查詢記錄模塊查詢記錄模塊主要實(shí)現(xiàn)在數(shù)組中按職工編號或姓名查找滿足相關(guān)條件的記錄。在查詢函數(shù)Qur()中,為了遵循模塊化編程的原則,我們將在數(shù)組中進(jìn)行的記錄定位操作設(shè)計(jì)成了一個單獨(dú)的函數(shù)intLocate(ZGXXv[],charmessage[],charway[]),參數(shù)message[]保存要查找的具體內(nèi)容,way[]保存要查找的字段(值為字符串類型的num或者name),若找到該記錄,則返回指向該記錄的數(shù)組元素下標(biāo);否則,返回一個-1的值。4.更新記錄模塊更新記錄模塊主要實(shí)現(xiàn)對記錄的修改、刪除和排序操作。因?yàn)橛涗浭且詳?shù)組的結(jié)構(gòu)形式存儲的,所以這些操作都在數(shù)組中完成。下面分別介紹這3個功能模塊。修改記錄修改記錄操作需要對數(shù)組中目標(biāo)元素域中的值進(jìn)行修改,它分兩步完成。第一步,輸入要修改的職工編號,輸入后調(diào)用定位函數(shù)Locate()在數(shù)組中逐個對職工編號字段的值進(jìn)行比較,直到找到該職工編號的記錄;第二步,若找到該記錄,則修改除職工編號之外的各字段的值,并將存盤標(biāo)記變量saveflag置1,表示已經(jīng)對記錄進(jìn)行了修改,但還未進(jìn)行存盤操作。刪除記錄刪除記錄操作完成刪除指定職工編號或姓名的記錄,它也分兩步完成。第一步,輸入要刪除的職工編號或姓名,輸入后調(diào)用定位函數(shù)Locate()在數(shù)組中逐個對職工編號或姓名字段的值進(jìn)行比較,直到找到該職工的編號或姓名的記錄,并返回指向該記錄的數(shù)組元素下標(biāo);第二步,若找到該記錄,則從記錄所在元素的后續(xù)元素起,依次向前移一個元素位置,有值的數(shù)組元素個數(shù)減1。排序記錄冒泡排序法屬于內(nèi)部排序法的一種,這是運(yùn)用數(shù)據(jù)值比較后,依據(jù)判斷規(guī)則對數(shù)據(jù)位置進(jìn)行交換,以達(dá)到排序的目的。針對數(shù)組結(jié)構(gòu)的特點(diǎn),這里采用這種排序法來分別`實(shí)現(xiàn)按工齡和月收入從高到低的排序。5.統(tǒng)計(jì)記錄模塊該模塊主要完成對職工總?cè)藬?shù)、男女職工人數(shù)和工齡在各個等級人數(shù)的統(tǒng)計(jì)。主要通過依次讀取數(shù)組中元素的數(shù)據(jù)域中的性別的值進(jìn)行比較判斷的形式,完成對男女職工人數(shù)的統(tǒng)計(jì),通過讀取數(shù)組中元素的數(shù)據(jù)域中的工齡的值進(jìn)行比較判斷的形式,完成工齡在各個等級的人數(shù)統(tǒng)計(jì)。6.輸出記錄模塊當(dāng)把記錄輸出至文件時,調(diào)用fwrite(&v[i],sizeof(ZGXX),1,fp)函數(shù),將數(shù)組元素v[i]中各字段的值,寫入文件指針fp所指的文件;當(dāng)把記錄輸出至屏幕時,調(diào)用voidDisp()函數(shù),將數(shù)組中存儲的記錄信息以表格的形式在屏幕上打印出來。(二)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)本程序定義了結(jié)構(gòu)體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條記錄,內(nèi)容為employee結(jié)構(gòu)體中定義的內(nèi)容。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ù)用于輸入字符串,并進(jìn)行字符串長度驗(yàn)證(長度<lenth),p用于保存輸入的字符串,因?yàn)槭且灾羔樞问絺鬟f的,所以p相當(dāng)于該函數(shù)的返回值。Notice用于保存printf()中輸出的提示信息。Locate()函數(shù)原型:intLocate(ZGXXv[],intn,charmassage[],charway[])Locate()函數(shù)用于定位數(shù)組中符合要求的元素,并返回該元素的下標(biāo)值。參數(shù)message[]保存要查找的具體內(nèi)容,way[]保存按什么字段在數(shù)組v中查找。Add()函數(shù)原型:intAdd(ZGXXv[],intn)Add()函數(shù)用于在數(shù)組v中增加職工信息記錄元素,并返回?cái)?shù)組中的當(dāng)前記錄數(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)計(jì)工作,統(tǒng)計(jì)高校職工的總?cè)藬?shù)、男女分布和工齡的整體分布情況。Sort()函數(shù)原型:voidSort(ZGXXv[],intn)Sort()函數(shù)用于在數(shù)組v中完成利用冒泡排序算法實(shí)現(xiàn)數(shù)組按工號字段的升序排序和分別按工齡、月收入的降序排序。Save()函數(shù)原型:voidSave(ZGXXv[],intn)Save()函數(shù)用于將保存職工信息的數(shù)組v中的n個元素寫入磁盤的數(shù)據(jù)文件中。主函數(shù)main()main()是整個人事管理系統(tǒng)控制部分,其詳細(xì)說明可參考圖2.設(shè)計(jì)代碼#include<stdio.h>/*標(biāo)準(zhǔn)輸入輸出函數(shù)庫*/#include<stdlib.h>/*標(biāo)準(zhǔn)函數(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;/*是否需要存盤的標(biāo)志變量*//*定義與職工信息有關(guān)的數(shù)據(jù)結(jié)構(gòu)*/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[]中存儲的記錄,內(nèi)容為employee結(jié)構(gòu)中定義的內(nèi)容*/{ 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ù)組中符合要求的記錄,并返回記錄下標(biāo)。參數(shù):massage[]保存要查找的具體內(nèi)容,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*/}/*輸入字符串,并進(jìn)行長度驗(yàn)證(長度<lenth)*/voidstringinput(char*p,intlenth,char*notice){charn[255];do{printf(notice);/*顯示提示信息*/scanf("%s",n);/*輸入字符串*/if(strlen(n)>lenth) printf("\nexceedtherequiredlength!\n");/*進(jìn)行長度校驗(yà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");/*進(jìn)行數(shù)值校驗(yàn)*/}while(x<0);returnx;}/*增加職工信息記錄*/intAdd(ZGXXv[],intn){ charch,num[10]; inti,flag=0; system("cls"); Disp(v,n);/*先打印出已有的職工信息*/ while(1)/*一次可輸入多條記錄,直至輸入職工編號為0的記錄才結(jié)束添加操作*/ { while(1)/*輸入職工編號,保證該編號沒有被使用,若輸入編號為0,則退出添加記錄操作*/ { stringinput(num,10,"inputnumber(press'0'returnmenu):");/*格式化輸入編號并檢驗(yàn)*/ flag=0; if(strcmp(num,"0")==0)/*輸入為0,則退出添加操作,返回主界面*/ {returnn;} i=0; while(i<n)/*查詢該編號是否已經(jīng)存在,若存在則要求重新輸入一個未被占用的編號*/ { 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,"姓名:");/*輸入并檢驗(yàn)職工姓名信息*/ stringinput(v[n].sex,5,"性別:");/*輸入并檢驗(yàn)職工性別信息*/ stringinput(v[n].birth,15,"出生日期:");/*輸入并檢驗(yàn)職工生日信息*/ stringinput(v[n].department,15,"部門:");/*輸入并檢驗(yàn)職工部門信息*/ stringinput(v[n].post,15,"職位:");/*輸入并檢驗(yàn)職工職位信息*/ stringinput(v[n].zc,15,"職稱:");/*輸入并檢驗(yàn)職工職稱信息*/ stringinput(v[n].come_time,15,"來校時間:");/*輸入并驗(yàn)證職工來校時間信息*/ v[n].work_time=numberinput("工齡:");/*輸入并檢驗(yàn)職工工齡信息*/ v[n].salary=numberinput("月收入:");/*輸入并檢驗(yàn)職工月收入信息*/ saveflag=1; n++;}returnn;}/*刪除記錄:先找到保存該記錄的數(shù)組元素的下標(biāo)值,然后在數(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ù)組元素的下標(biāo)值*/ { 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];/*保存用戶輸入的查詢內(nèi)容*/ 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ù)組元素的下標(biāo)值*/ 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:");/*輸入并檢驗(yàn)該編號*/ p=Locate(v,n,findmess,"num");/*查詢到該數(shù)組元素,并返回下標(biāo)值*/ if(p!=-1)/*若p!=-1,表明已經(jīng)找到該數(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)計(jì)職工總數(shù),分別按性別、工齡統(tǒng)計(jì)職工人數(shù)*/voidTongji(ZGXXv[],intn){ intchoice; inttotal,man=0,woman=0;/*分別保存總?cè)藬?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;/*總?cè)藬?shù)*/ printf("\ntheTongJiresult\n"); printf("Thetotalworkers:%d(ren)\n",total); printf("\n"); wait(); } if(choice==2)/*按性別統(tǒng)計(jì)*/ { 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)計(jì)*/ { 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(); } }/*利用冒泡排序法實(shí)現(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);/*利用結(jié)構(gòu)變量x實(shí)現(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;/*若標(biāo)記flag=0,意味著沒有交換了,排序已經(jīng)完成*/ } 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ù)存盤,若用戶沒有專門進(jìn)行此操作且對數(shù)據(jù)有修改,在退出系統(tǒng)時,會提示用戶存盤*/voidSave(ZGXXv[],intn){ FILE*fp; inti=0; fp=fopen("c:\\zgxx","wb");/*以只寫方式打開二進(jìn)制文件*/ if(fp==NULL)/*打開文件失敗*/ { printf("\n=====>openfileerror!\n"); wait(); return; } for(i=0;i<n;i++) { if(fwrite(&v[i],sizeof(ZGXX),1,fp)==1)/*每次寫一條記錄或一個結(jié)構(gòu)數(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);/*關(guān)閉此文件*/}voidmain(){ ZGXXzg[N];/*定義結(jié)構(gòu)體*/ FILE*fp;/*文件指針*/ intselect;/*保存選擇結(jié)果變量*/ charch;/*保存(y,Y,n,N)*/ intcount=0;/*保存文件中的記錄條數(shù)*/ fp=fopen("c:\\zgxx","ab+"); /*以追加方式打開二進(jìn)制文件,可讀可寫,若文件不存在,會創(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);/*關(guān)閉文件*/ 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ù)有修改且未進(jìn)行存盤操作,則此標(biāo)志為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)計(jì)職工信息記錄*/ 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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上??苿?chuàng)職業(yè)技術(shù)學(xué)院《職業(yè)生涯教育與就業(yè)指導(dǎo)(含創(chuàng)新創(chuàng)業(yè)教育)(二)》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海交通職業(yè)技術(shù)學(xué)院《酒店實(shí)務(wù)案例及情景模擬》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海建橋?qū)W院《精細(xì)與功能高分子》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海濟(jì)光職業(yè)技術(shù)學(xué)院《機(jī)械工程控制基礎(chǔ)A》2023-2024學(xué)年第一學(xué)期期末試卷
- 護(hù)理精益改善項(xiàng)目匯報(bào)
- 上海海洋大學(xué)《小動物疾病》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海海洋大學(xué)《國際工程項(xiàng)目投資與融資》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海海關(guān)學(xué)院《專題設(shè)計(jì)(商業(yè)空間設(shè)計(jì))》2023-2024學(xué)年第一學(xué)期期末試卷
- 教科研中期報(bào)告范文
- 2024年中國水基淬火液市場調(diào)查研究報(bào)告
- 南京市玄武區(qū)2023-2024學(xué)年八年級上學(xué)期期末歷史試卷(含答案解析)
- 露天礦設(shè)備運(yùn)行分析報(bào)告
- 防高空墜物安全教育課件
- 鄉(xiāng)村的風(fēng)許俊文賞析-鄉(xiāng)村的風(fēng)許俊文閱讀答案-記敘文閱讀及答案
- 樓宇消防安全培訓(xùn)課件
- 電腦繪圖在考古器物繪圖工作中的應(yīng)用研究
- MOOC 3D工程圖學(xué)-華中科技大學(xué) 中國大學(xué)慕課答案
- 舞蹈教師之舞-年終教學(xué)經(jīng)驗(yàn)分享
- 醫(yī)院感染科護(hù)士的終末清潔和消毒流程
- 分析高中生心理健康問題的家庭功能差異
- 酒吧接待服務(wù)流程
評論
0/150
提交評論