C語言課程設(shè)計(jì)報告-職工工資信息管理系統(tǒng)_第1頁
C語言課程設(shè)計(jì)報告-職工工資信息管理系統(tǒng)_第2頁
C語言課程設(shè)計(jì)報告-職工工資信息管理系統(tǒng)_第3頁
C語言課程設(shè)計(jì)報告-職工工資信息管理系統(tǒng)_第4頁
C語言課程設(shè)計(jì)報告-職工工資信息管理系統(tǒng)_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、目 錄課程設(shè)計(jì)評語2目 錄31課程論文題目42程序設(shè)計(jì)思路43. 功能模塊圖.64. 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì).65. 算法設(shè)計(jì).76程序代碼.107程序運(yùn)行結(jié)果.198編程中遇到的困難及解決方法.229總結(jié)心得及良好建議.2310致謝.241 課程論文題目職工工資信息管理系統(tǒng)【要求】該系統(tǒng)能夠?qū)崿F(xiàn)工資信息管理。系統(tǒng)包括錄入、新增、瀏覽、查詢和排序等功能。其中錄入功能要求能夠添加新的工資信息到文件;新增功能要求能夠新增職工信息到文件;瀏覽功能要求能夠按照工資卡號、姓名分類瀏覽;有排序功能,排序后按照工資卡號升序或?qū)嵃l(fā)工資降序輸出;查詢功能要求能夠按照工資卡號、姓名查詢?!咎崾尽?、 文件中一行數(shù)據(jù)對應(yīng)一個

2、職工工資信息2、 工資信息的數(shù)據(jù)結(jié)構(gòu)采用結(jié)構(gòu)體數(shù)組,一個數(shù)組元素對應(yīng)一條工資單記錄。3、 工資單信息包括工資卡號、姓名、月份、應(yīng)發(fā)工資、稅費(fèi)、電費(fèi)、稅金、實(shí)發(fā)工資等4、 實(shí)發(fā)工資=應(yīng)發(fā)工資稅費(fèi)電費(fèi)稅金,其中稅金計(jì)算方法為:(1) 應(yīng)發(fā)工資800元,稅金=0(2) 800應(yīng)發(fā)工資1400元,稅金=(應(yīng)發(fā)工資1400)*10%2程序設(shè)計(jì)思路1、設(shè)計(jì)思路(1)根據(jù)題目要求,應(yīng)該把職工工資信息用結(jié)構(gòu)體形式輸入,在定義一個全局變量和文件指針進(jìn)行整個程序的運(yùn)行,然后把職工工資信息送到文件中,所以應(yīng)該提供一個結(jié)構(gòu)體和文件的輸入輸出等操作;(2)在程序中需實(shí)現(xiàn)職工工資瀏覽、查詢、統(tǒng)計(jì)等功能的操作,所以需要建立

3、相應(yīng)的功能模塊來實(shí)現(xiàn);(3)另外還需要提供鍵盤式選擇菜單實(shí)現(xiàn)功能,在運(yùn)行時達(dá)到所要的目的。2、總體設(shè)計(jì)整個系統(tǒng)可以分為信息輸入、信息新增、信息瀏覽、信息排序和信息查詢五個主要模塊。3、詳細(xì)設(shè)計(jì)(1)工資信息采用結(jié)構(gòu)體數(shù)組:struct list int num; /工資卡號 char name20; /姓名 int month;/月份 int salary1; /應(yīng)發(fā)工資 int water;/水費(fèi) int electrisity; /電費(fèi) float fax; /稅金 float salary2; /實(shí)發(fā)工資listn; /listn中每個數(shù)組元素對應(yīng)一個職工工資信息(2)輸入模塊 按照工資

4、卡號、姓名、月份、應(yīng)發(fā)工資、水費(fèi)、電費(fèi)的順序輸入信息,稅金和實(shí)發(fā)工資根據(jù)輸入的信息進(jìn)行計(jì)算得到,這些信息被錄入到文件中。文件操作函數(shù):fopen,fwrite,fclose.稅金的計(jì)算:if(應(yīng)發(fā)工資800&應(yīng)發(fā)工資1400) 稅金=(應(yīng)發(fā)工資-1400)*10%;實(shí)發(fā)工資=應(yīng)發(fā)工資-水費(fèi)-電費(fèi)-稅金。(3)新增模塊增加新的職工工資信息,從鍵盤輸入并逐條寫到原來的輸入文件中,采用追加而不是覆蓋的方式(以”ab”方式打開文件)。(4)瀏覽模塊 調(diào)用排序模塊的排序功能,可以瀏覽排序后的所有職工信息。(5)排序模塊排序模塊提供菜單選擇,實(shí)現(xiàn)按照工資卡號升序、實(shí)發(fā)工資升序排序。排序方法可以選擇冒泡排序

5、、插入排序、選擇排序等,本系統(tǒng)用的是冒泡排序。(6)查詢模塊實(shí)現(xiàn)按照工資卡號和姓名的查詢,采用基本的查找方法即可。3功能模塊圖職工工資信息管理系統(tǒng)主菜單menu()輸入模塊enter()新增模塊add()瀏覽模塊browse()排序模塊order()按姓名查詢search_1()查詢模塊search()按工資卡號查詢search_2()退出exit(0)按實(shí)發(fā)工資排序order_2()按工資卡號排序order_1()4數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)系統(tǒng)用將職工各項(xiàng)信息以結(jié)構(gòu)體類型struct list來定義,它包括num,name20,month,salary1,water,electricity,fax,sa

6、laly2等不同類型的數(shù)據(jù)項(xiàng),同時定義了結(jié)構(gòu)體數(shù)組,包括n個數(shù)組元素,對應(yīng)n個職工,每一個元素用來存放一個職工的數(shù)據(jù);每個職工的信息以結(jié)構(gòu)體方式從內(nèi)存和磁盤文件中進(jìn)行存儲和導(dǎo)出。以結(jié)構(gòu)體方式來整合職工的不同信息,將不同的數(shù)據(jù)組合成一個有機(jī)整體,非常方便程序的調(diào)用。5算法設(shè)計(jì)1主函數(shù)提供輸入、處理和輸出部分的函數(shù)調(diào)用,各功能模塊采用菜單方式選擇。開 始顯示一系列的功能選擇輸入n,判斷n是否是0到6ny根據(jù)n值調(diào)用各功能模塊2.添加模塊 開 始輸入職工數(shù)目瀏覽職工信息輸入各項(xiàng)信息返回?1儲存職工信息2主菜單2.新增模塊 開 始輸入新增職工數(shù)目輸入新職工信息瀏覽職工信息1返回?儲存輸入信息2主菜單3

7、.瀏覽模塊開 始從磁盤中導(dǎo)出信息輸出各職工信息返回主菜單4.排序模塊 開 始輸入n判斷n是否是0到2ny12瀏覽職工信息按實(shí)發(fā)工資排序按工資卡號排序返回?輸出12主菜單5.查詢模塊開 始輸入n判斷n值ny瀏覽職工信息12按卡號查詢按姓名查詢1返回?輸出主菜單26程序代碼(每個函數(shù)都要有功能說明)#include#include#include#include#define n 50void main() void menu(); menu();void menu() /主菜單函數(shù) void enter(); void add(); void browse(); void search(); v

8、oid order(); int n,w1; do puts(tt*menu*nn); puts(ttt 1.enter ); puts(ttt 2.add); puts(ttt 3.browse all); puts(ttt 4.search ); puts(ttt 5.order ); puts(ttt 6.exit); puts(nntt*n); printf(choice your number(1-6):bb); scanf(%d,&n); if(n6) /*對選擇的數(shù)字進(jìn)行判斷*/ w1=1; getchar(); else w1=0; while(w1=1); switch(n)

9、 case 1:enter();break; /*輸入模塊*/ case 2:add();break; /*新增模塊*/ case 3:browse();break; /*瀏覽模塊*/ case 4:search();break; /*查找模塊*/ case 5:order();break; /*排序模塊*/ case 6:exit(0); /*退出模塊*/ struct list /結(jié)構(gòu)體定義工資信息 int num; /工資卡號 char name20;/姓名 int month;/月份 int salary1; /應(yīng)發(fā)工資 int water;/水費(fèi) int electrisity; /

10、電費(fèi)float fax; /稅金 float salary2; /實(shí)發(fā)工資listn; /listn中每個數(shù)組元素對應(yīng)一個職工工資信息void enter() /輸入模塊函數(shù) void printf_back(); void save(int n); void input(int i); int i,n; printf(how many workers (1-%d)?:,n-1); scanf(%d,&n); /輸入職工數(shù)目 printf(n enter date nownn); for(i=0;in;i+) /輸入職工各項(xiàng)信息 printf(n input %dth student reco

11、rd.n,i+1); input(i); /調(diào)用職工信息輸入函數(shù) if(i!=0)save(n); /儲存職工信息 printf_back(); /執(zhí)行返回函數(shù)void add() /新增模塊函數(shù) void printf_back(); int i,n,m,k; int load();void save(int n); void input(int i); file *fp; /定義文件指針變量 n=load(); /導(dǎo)出文件信息,得到返回值 printf(how many workers are you want to add(0-%d)?:,n-1-n); scanf(%d,&m); /輸

12、入新增職工數(shù)目 k=m+n; /總職工數(shù)= 新增職工數(shù)+已有職工數(shù) for(i=n+1;i=k;i+) /輸入新增職工信息 printf(n input %dth workers record.n,i-n+2); input(i); /調(diào)用職工信息輸入函數(shù) fp=fopen(workers.txt,ab); /以追加形式打開文件 for(i=n+1;i=k;i+) fwrite(&listi,sizeof(struct list),1,fp); /將內(nèi)存中的職工信息輸出到磁盤文件中save(n); /儲存輸入信息 fclose(fp); /關(guān)閉文件 printf_back(); /執(zhí)行返回函數(shù)

13、 void browse() /瀏覽模塊函數(shù) void printf_one(int i); void printf_face(); int load(); void menu(); int i,n; n=load(); printf_face(); for(i=0;in;i+) if(i!=0)&(i%10=0) /以10個職工為一組輸出 printf(nnpass any key to continue.); getch(); puts(nn); printf_one(i); /輸出各職工信息printf(n); printf(t there are %d recode.n,n); pri

14、ntf(n pass any key to back.); getch(); menu(); /返回主菜單 void search() /查詢模塊函數(shù) int n,w1; do puts(ttt1.search by name); /按姓名查詢 puts(ttt2.search by num); /按工資卡號查詢 scanf(%d,&n); if(n2) w1=1; getchar(); else w1=0; while(w1=1); switch(n) void search_1(); void search_2(); case 1:search_1();break; case 2:sear

15、ch_2();break; void search_1() /按姓名查詢 int load(); void printf_face(); void menu(); void printf_one(int i); int i,n,k,w1=1,w2,w3,w4; struct list s; n=load(); /導(dǎo)出文件信息,得到返回值 do do k=-1; printf(nnenter name that you want to search! name:); scanf(%s,); /輸入要查找的姓名 printf_face(); /輸出職工信息項(xiàng)目 for(i=0;in;i

16、+) if(strcmp(,)=0) /查詢出與輸入姓名相同的職工的信息 k=i; printf_one(k);break; /輸出查詢結(jié)果并中斷,說明只能輸出查到的第一個數(shù)據(jù) if(k=-1) /如果沒有查出信息則執(zhí)行如下選擇菜單 printf(nn no.exit!please); printf(nnare you again?nt1).again 2).no and back bb); scanf(%d,&w1); if(w1=2)break; while(k=-1&w1=1); /選擇1繼續(xù)循環(huán)執(zhí)行查詢 w4=0;w3=0; if(k!=-1) prin

17、tf(successful); printf(nn what do you want to do?nt1).search another 2).back bb); /選擇查找下一個數(shù)據(jù)或返回 scanf(%d,&w2); while(w2=1); /選擇1循環(huán)執(zhí)行查詢下一個數(shù)據(jù) menu(); void search_2() /按工資卡號查詢 int load(); void printf_face(); void menu(); void printf_one(int i); struct list s; int i,n,k,w1=1,w2,w3,w4; n=load(); do do k=

18、-1; printf(nnenter num that you want to search! num:); scanf(%d,&s.num); /輸入要查找的工資卡號 printf_face(); /輸出職工信息項(xiàng)目 for(i=0;in;i+) if(s.num=listi.num) /查詢出與輸入工資卡號相同的職工的信息 k=i; printf_one(k);break; if(k=-1) /如果沒有查出信息則執(zhí)行如下選擇菜單 printf(nn no.exit!please); printf(nnare you again?nt1).again 2).no and back bb);

19、scanf(%d,&w1); if(w1=2)break; while(k=-1&w1=1); /選擇1繼續(xù)循環(huán)執(zhí)行查詢 w4=0;w3=0; if(k!=-1) printf(successful); printf(nn what do you want to do?nt1).search another 2).back bb); scanf(%d,&w2); while(w2=1); /選擇1循環(huán)執(zhí)行查詢下一個數(shù)據(jù) menu(); void order() /排序功能模塊函數(shù) int w1,n; void order_1(); void order_2(); do puts(ttt1.or

20、der by num); /按工資卡號排序 puts(ttt2.order by salary 2); /按實(shí)發(fā)工資排序 scanf(%d,&n); if(n2) w1=1; getchar(); else w1=0; while(w1=1); switch(n) case 1:order_1();break; case 2:order_2();break; void order_1() /按工資卡號升序排序 int load(); void printf_back(); void save(int i); int i,j,n;void browse();struct list s; n=lo

21、ad(); for(i=0;in-1;i+) /冒泡排序法,按職工工資卡號升序排列出職工信息 for(j=i+1;jn-1;j+) if(listj.numlisti.num) s=listj; listj=listi; listi=s; save(n); /儲存排序后的信息browse(); /顯示排序后的信息 puts(nn); printf_back(); /執(zhí)行返回函數(shù) void order_2() /按實(shí)發(fā)工資升序排序 int load(); void printf_back(); void save(int i); int i,j,n; struct list s; void br

22、owse(); n=load(); for(i=0;in-1;i+) /冒泡排序法,按實(shí)發(fā)工資升序排列出職工信息 for(j=i+1;jn-1;j+) if(listi.salary2listj.salary2) s=listj;listj=listi;listi=s; save(n); /儲存排序后的信息browse(); /顯示排序后的信息 puts(nn); printf_back(); /執(zhí)行返回函數(shù) void save(int n) /儲存函數(shù) file *fp; int i; fp=fopen(workers.txt,wb); /以只寫方式打開文件 for(i=0;in;i+) f

23、write(&listi,sizeof(struct list),1,fp); /將內(nèi)存中的職工信息輸出到磁盤文件中 fclose(fp); /關(guān)閉文件 int load() /導(dǎo)出文件信息 file *fp; int i; fp=fopen(workers.txt,rb); /以只讀方式打開文件 for(i=0;!feof(fp);i+) fread(&listi,sizeof(struct list),1,fp); /讀出磁盤文件中的職工信息 fclose(fp); /關(guān)閉文件 return(i-1); /返回數(shù)值i-1 void input(int i) /職工信息輸入函數(shù) float

24、salary2(int i); float fax(int i); printf(no.:); scanf(%d,&listi.num); printf(name:); scanf(%s,); printf(month:); scanf(%d,&listi.month); printf(salary1:); scanf(%d,&listi.salary1); printf(water:); scanf(%d,&listi.water); printf(electricity:); scanf(%d,&listi.electrisity); fax(i); /計(jì)算稅金 sal

25、ary2(i); /計(jì)算實(shí)發(fā)工資 float fax(int i) /稅金計(jì)算函數(shù) if(listi.salary1800)listi.fax=0; else if(listi.salary11400) listi.fax=(listi.salary1-800)*5/100); else listi.fax=(listi.salary1-1400)/10);return listi.fax; float salary2(int i) /實(shí)發(fā)工資計(jì)算函數(shù) listi.salary2=(listi.salary1-listi.water-listi.electrisity-listi.fax);

26、return listi.salary2; void printf_back() /返回函數(shù) int w; void menu(); void browse(); printf(nntsuccessful!); printf(what do you want to do?nnt1).browse all nowt2).back: bb); /菜單選擇瀏覽職工信息或返回主菜單 scanf(%d,&w); if(w=1)browse(); /輸入1選擇瀏覽職工信息 else menu(); /輸入2返回主菜單 void printf_one(int i) /單個職工信息輸出函數(shù) printf(%9

27、d,listi.num); printf(%9s,); printf(%9d,listi.month); printf(%9d,listi.salary1); printf(%9d,listi.water); printf(%9d,listi.electrisity); printf(%9.2f,listi.fax); printf(%9.2f,listi.salary2); void printf_face() /職工信息項(xiàng)目 printf(ntno. name month salary1 water electrisity fax salary2n); 7程序運(yùn)行結(jié)果1

28、、主函數(shù)運(yùn)行,顯示主菜單函數(shù)menu()2、輸入數(shù)字1,添入兩組數(shù)據(jù)3、如果輸入數(shù)字2,新增一組數(shù)據(jù)并瀏覽4、輸入數(shù)字3,瀏覽所有職工信息5、輸入4,進(jìn)行查詢程序,再輸入1 ,按姓名查詢,輸入2 ,按工資卡號查詢6、輸入數(shù)字5,進(jìn)行排序程序,輸入1 ,按卡號排序,輸入2按實(shí)發(fā)工資排序。8.編程中遇到的困難及解決方法遇到最大的問題是所有程序代碼編完放在一起后,雖然能夠成功運(yùn)行,但使用時如果職工人數(shù)發(fā)生變化,會導(dǎo)致文件后部出現(xiàn)亂碼。若要使每次運(yùn)行都正常,必須在人數(shù)改變后退出程序,修改宏定義的值。這樣很不方便,不能夠連續(xù)運(yùn)行。為解決這一大問題,最后我想到了定義一個全局指針變量,用來追蹤最新的人數(shù)。特

29、別是添加這個會導(dǎo)致人數(shù)變化的函數(shù)中,全局指針變量起了很大作用。經(jīng)過一邊修改一邊調(diào)試,最終可以成功的串聯(lián)整個函數(shù),在連續(xù)運(yùn)行時,總能根據(jù)最新的人數(shù)調(diào)用各個函數(shù)。另外在串聯(lián)所有函數(shù)時,調(diào)試提示出錯:有幾個函數(shù)“redefinition; different basic types”解決:在函數(shù)名前加void指明類型。 整個程序代碼是分塊書寫的,每個函數(shù)都可以獨(dú)立運(yùn)行。只有輸入函數(shù)查詢菜單函數(shù)寫得很順利,一次性就能夠成功運(yùn)行,其他函數(shù)在調(diào)試過程中或多或少都出現(xiàn)了問題。比如,瀏覽函數(shù)display()遇到的問題雖然不大,但解決起來很麻煩。理想的運(yùn)行結(jié)果是美觀整齊。即下面的職工信息分別與第一個print

30、f輸出的中文項(xiàng)目提示對齊。解決方法:不斷修改空格個數(shù),不斷運(yùn)行察看效果。又如,添加函數(shù)add()遇到的問題是用printf輸入新職工信息后,保存到文件里面,發(fā)現(xiàn)原有的信息不見了。解決:文件打開方式改用a追加寫入。9總結(jié)心得及良好建議 經(jīng)過一學(xué)期的c語言學(xué)習(xí),我們掌握了c語言的基礎(chǔ)知識,能夠讀懂別人用c語言設(shè)計(jì)的程序。平時的程序設(shè)計(jì)大多是以填空的形式出現(xiàn),雖然有所接觸,但都不完全。而這一周的課程設(shè)計(jì),卻讓我們完完全全用自己學(xué)到的知識編寫一個完整的體統(tǒng)程序。這是一個新的挑戰(zhàn),也是一種新的學(xué)習(xí)。 我們組選擇的題目是第一個職工工資信息管理系統(tǒng)。初看到這個題目覺得很簡單,但當(dāng)我做到電腦前準(zhǔn)備開始編寫代碼的時候才發(fā)現(xiàn)無從下手。通過去圖書館查找程序設(shè)計(jì)相關(guān)的書籍,和上網(wǎng)參考前人編寫的類似程序,我腦中才有了一個大概方向。 終于開始著手寫了。第一天下來,我只寫好了兩個函數(shù),但還是很開心,因?yàn)檫@是我編的第一個小系統(tǒng)的成功的開始! 接下來幾天都在宿舍整個下午的對著電腦不斷的編譯、調(diào)試、修改,每次編好一個能夠成功運(yùn)行的程序,都會感到很欣慰,但自己編的程序自己很難發(fā)現(xiàn)當(dāng)中的錯誤,而電腦又沒有提示的時候就很受打擊,也會著急。但可以先放一放,讓腦子休息一下,忘掉錯誤的記憶?;蛟S等過段時間再回過頭來,

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論