C語言課程設計報告-職工工資信息管理系統(tǒng)
《C語言課程設計報告-職工工資信息管理系統(tǒng)》由會員分享,可在線閱讀,更多相關《C語言課程設計報告-職工工資信息管理系統(tǒng)(23頁珍藏版)》請在裝配圖網上搜索。
1、 目 錄 課程設計評語 2 目 錄 3 1.課程論文題目 4 2.程序設計思路 4 3. 功能模塊圖....................................................................................................................................6 4. 數據結構設計....................................................................................................
2、............................6 5. 算法設計.........................................................................................................................................7 6.程序代碼....................................................................................................................
3、..................10 7.程序運行結果..............................................................................................................................19 8.編程中遇到的困難及解決方法..................................................................................................22 9.總結心得及良好建議............
4、......................................................................................................23 10.致謝............................................................................................................................................24
5、 1. 課程論文題目 職工工資信息管理系統(tǒng) 【要求】 該系統(tǒng)能夠實現工資信息管理。系統(tǒng)包括錄入、新增、瀏覽、查詢和排序等功能。其中錄入功能要求能夠添加新的工資信息到文件;新增功能要求能夠新增職工信息到文件;瀏覽功能要求能夠按照工資卡號、姓名分類瀏覽;有排序功能,排序后按照工資卡號升序或實發(fā)工資降序輸出;查詢功能要求能夠按照工資卡號、姓名查詢。 【提示】 1、 文件中一行數據對應一個職工工資信息 2、 工資信息的數據結構采用結構體數組,一個數組元素對應一條工資單記錄。 3、 工資單信息包括工資卡號、姓名、月份、應發(fā)工資、稅費、電費、稅金、實發(fā)工資等 4、 實發(fā)工資
6、=應發(fā)工資—稅費—電費—稅金,其中稅金計算方法為: (1) 應發(fā)工資<800元,稅金=0 (2) 800<應發(fā)工資<1400元,稅金=(應發(fā)工資—800)*5% (3) 應發(fā)工資>1400元,稅金=(應發(fā)工資—1400)*10% 2.程序設計思路 1、設計思路 (1)根據題目要求,應該把職工工資信息用結構體形式輸入,在定義一個全局變量和文件指針進行整個程序的運行,然后把職工工資信息送到文件中,所以應該提供一個結構體和文件的輸入輸出等操作; (2)在程序中需實現職工工資瀏覽、查詢、統(tǒng)計等功能的操作,所以需要建立相應的功能模塊來實現; (3)另外還需要提供鍵盤式選擇菜單實現功能,在
7、運行時達到所要的目的。 2、總體設計 整個系統(tǒng)可以分為信息輸入、信息新增、信息瀏覽、信息排序和信息查詢五個主要模塊。 3、詳細設計 (1)工資信息采用結構體數組: struct list { int num; //工資卡號 char name[20]; //姓名 int month; //月份 int salary1; //應發(fā)工資 int water; //水費 int electrisity; //電費 float fax;
8、 //稅金 float salary2; //實發(fā)工資 }list[N]; //list[N]中每個數組元素對應一個職工工資信息 (2)輸入模塊 按照工資卡號、姓名、月份、應發(fā)工資、水費、電費的順序輸入信息,稅金和實發(fā)工資根據輸入的信息進行計算得到,這些信息被錄入到文件中。 文件操作函數:fopen,fwrite,fclose. 稅金的計算: if(應發(fā)工資<=800) 稅金=0; else if (應發(fā)工資>800&&應發(fā)工資<=1400) 稅金=(應發(fā)工資-800)*5%; else if (應發(fā)工資>14
9、00) 稅金=(應發(fā)工資-1400)*10%; 實發(fā)工資=應發(fā)工資-水費-電費-稅金。 (3)新增模塊 增加新的職工工資信息,從鍵盤輸入并逐條寫到原來的輸入文件中,采用追加而不是覆蓋的方式(以”ab”方式打開文件)。 (4)瀏覽模塊 調用排序模塊的排序功能,可以瀏覽排序后的所有職工信息。 (5)排序模塊 排序模塊提供菜單選擇,實現按照工資卡號升序、實發(fā)工資升序排序。排序方法可以選擇冒泡排序、插入排序、選擇排序等,本系統(tǒng)用的是冒泡排序。 (6)查詢模塊 實現按照工資卡號和姓名的查詢,采用基本的查找方法即可。 3.功能模塊圖 職工工資
10、信息管理系統(tǒng) 主菜單menu() 輸入模塊enter() 新增模塊add() 瀏覽模塊browse() 排序模塊order() 按姓名查詢search_1() 查詢模塊search() 按工資卡號查詢search_2() 退出exit(0) 按實發(fā)工資排序order_2() 按工資卡號排序order_1() 4.數據結構設計 系統(tǒng)用將職工各項信息以結構體類型struct list來定義,它包括num,name[20],month,salary1,water,electricity,fax,salaly2等不同類型的數據項,同時定義了結構體數組,包括N個數組元素
11、,對應N個職工,每一個元素用來存放一個職工的數據;每個職工的信息以結構體方式從內存和磁盤文件中進行存儲和導出。以結構體方式來整合職工的不同信息,將不同的數據組合成一個有機整體,非常方便程序的調用。 5.算法設計 1.主函數提供輸入、處理和輸出部分的函數調用,各功能模塊采用菜單方式選擇。 開 始 顯示一系列的功能選擇 輸入n,判斷n是否是0到6 N Y 根據n值調用各功能模塊 2.添加模塊 開 始 輸入職工數目 瀏覽職工信息 輸入各項信息
12、 返回? 1 儲存職工信息 2 主菜單 2.新增模塊 開 始 輸入新增職工數目 輸入新職工信息 瀏覽職工信息 1 返回? 儲存輸入信息 2 主菜單 3.瀏覽模塊 開 始 從磁盤中導出信息 輸出各職工信息 返回主菜單 4.排序模塊 開 始 輸入n 判斷n是否是0到2 N Y 1 2 瀏覽職工信息 按實
13、發(fā)工資排序
按工資卡號排序
返回?
輸出
1
2
主菜單
5.查詢模塊
開 始
輸入n
判斷n值
N
Y
瀏覽職工信息
1 2
按卡號查詢
按姓名查詢
1
返回?
輸出
主菜單
2
6.程序代碼
(每個函數都要有功能說明)
#include
14、d menu(); menu(); } void menu() //主菜單函數 { void enter(); void add(); void browse(); void search(); void order(); int n,w1; do { puts("\t\t*********************MENU*************************\n\n"); puts("\t\t\t 1.Enter ");
15、 puts("\t\t\t 2.Add"); puts("\t\t\t 3.browse all"); puts("\t\t\t 4.Search "); puts("\t\t\t 5.Order "); puts("\t\t\t 6.Exit"); puts("\n\n\t\t*************************************************\n"); printf("Choice your number(1-6):[]\b\b");
16、 scanf("%d",&n); if(n<1||n>6) /*對選擇的數字進行判斷*/ { w1=1; getchar(); } else w1=0; } while(w1==1); switch(n) { case 1:enter();break; /*輸入模塊*/ case 2:add();break; /*新增模塊*/
17、 case 3:browse();break; /*瀏覽模塊*/ case 4:search();break; /*查找模塊*/ case 5:order();break; /*排序模塊*/ case 6:exit(0); /*退出模塊*/ } } struct list //結構體定義工資信息 { int num; //工資卡號 char name[20]; //姓名 int m
18、onth; //月份 int salary1; //應發(fā)工資 int water; //水費 int electrisity; //電費 float fax; //稅金 float salary2; //實發(fā)工資 }list[N]; //list[N]中每個數組元素對應一個職工工資信息 void enter() //輸入模塊函數 { void printf_back(); void save(int n); void i
19、nput(int i);
int i,n;
printf("how many workers (1-%d)?:",N-1);
scanf("%d",&n); //輸入職工數目
printf("\n enter date now\n\n");
for(i=0;i 20、輸入函數
}
if(i!=0)save(n); //儲存職工信息
printf_back(); //執(zhí)行返回函數
}
void add() //新增模塊函數
{
void printf_back();
int i,n,m,k;
int load();
void save(int n);
void input(int i);
FILE *fp; //定義文件指針變量
21、 n=load(); //導出文件信息,得到返回值
printf("how many workers are you want to add(0-%d)?:",N-1-n);
scanf("%d",&m); //輸入新增職工數目
k=m+n; //總職工數= 新增職工數+已有職工數
for(i=n+1;i<=k;i++) //輸入新增職工信息
{
printf("\n input %dth workers record.\n" 22、,i-n+2);
input(i); //調用職工信息輸入函數
}
fp=fopen("workers.txt","ab"); //以追加形式打開文件
for(i=n+1;i<=k;i++)
fwrite(&list[i],sizeof(struct list),1,fp); //將內存中的職工信息輸出到磁盤文件中
save(n); //儲存輸入信息
fclose(fp); //關閉文件
23、 printf_back(); //執(zhí)行返回函數
}
void browse() //瀏覽模塊函數
{
void printf_one(int i);
void printf_face();
int load();
void menu();
int i,n;
n=load();
printf_face();
for(i=0;i 24、!=0)&&(i%10==0)) //以10個職工為一組輸出
{printf("\n\npass any key to continue...");
getch();
puts("\n\n");}
printf_one(i); //輸出各職工信息
printf("\n");
}
printf("\t there are %d recode.\n",n);
printf("\n pass any key t 25、o back..");
getch();
menu(); //返回主菜單
}
void search() //查詢模塊函數
{
int n,w1;
do
{
puts("\t\t\t1.search by name"); //按姓名查詢
puts("\t\t\t2.search by num"); //按工資卡號查詢
scanf("%d",&n);
26、 if(n<1||n>2)
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
switch(n)
{
void search_1();
void search_2();
case 1:search_1();break;
case 2:search_2();break;
}
}
void search_1( 27、) //按姓名查詢
{
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(); //導出文件信息,得到返回值
do
{
do
{
k 28、=-1;
printf("\n\nenter name that you want to search! name:");
scanf("%s",s.name); //輸入要查找的姓名
printf_face(); //輸出職工信息項目
for(i=0;i 29、與輸入姓名相同的職工的信息
{
k=i;
printf_one(k);break; //輸出查詢結果并中斷,說明只能輸出查到的第一個數據
}
if(k==-1) //如果沒有查出信息則執(zhí)行如下選擇菜單
{
printf("\n\n NO.exit!please");
pr 30、intf("\n\nare you again?\n\t1).again 2).NO and back []\b\b");
scanf("%d",&w1);
if(w1==2)break;
}
}
while(k==-1&&w1==1); //選擇1繼續(xù)循環(huán)執(zhí)行查詢
w4=0;w3=0;
if(k!=-1)
{
31、
printf("successful");
printf("\n\n what do you want to do?\n\t1).search another 2).back []\b\b"); //選擇查找下一個數據或返回
scanf("%d",&w2);
}
}
while(w2==1); //選擇1循環(huán)執(zhí)行查詢下一個數據
menu 32、();
}
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
{
33、 k=-1;
printf("\n\nenter num that you want to search! num:");
scanf("%d",&s.num); //輸入要查找的工資卡號
printf_face(); //輸出職工信息項目
for(i=0;i 34、 //查詢出與輸入工資卡號相同的職工的信息
{
k=i;
printf_one(k);break;
}
if(k==-1) //如果沒有查出信息則執(zhí)行如下選擇菜單
{
printf("\n\n NO.exit!please");
printf("\n\nare you a 35、gain?\n\t1).again 2).NO and back []\b\b");
scanf("%d",&w1);
if(w1==2)break;
}
}
while(k==-1&&w1==1); //選擇1繼續(xù)循環(huán)執(zhí)行查詢
w4=0;w3=0;
if(k!=-1)
{
36、 printf("successful");
printf("\n\n what do you want to do?\n\t1).search another 2).back []\b\b");
scanf("%d",&w2);
}
}
while(w2==1); //選擇1循環(huán)執(zhí)行查詢下一個數據
menu();
}
void order() //排序功能模塊 37、函數
{ int w1,n;
void order_1();
void order_2();
do
{
puts("\t\t\t1.order by num"); //按工資卡號排序
puts("\t\t\t2.order by salary 2"); //按實發(fā)工資排序
scanf("%d",&n);
if(n<1||n>2)
{
w1=1;
getchar();
38、 }
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;
39、 void browse();
struct list s;
n=load();
for(i=0;i 40、 }
}
save(n); //儲存排序后的信息
browse(); //顯示排序后的信息
puts("\n\n");
printf_back(); //執(zhí)行返回函數
}
void order_2() //按實發(fā)工資升序排序
{
int load();
void printf_back();
void save(int i);
41、 int i,j,n;
struct list s;
void browse();
n=load();
for(i=0;i 42、 }
}
save(n); //儲存排序后的信息
browse(); //顯示排序后的信息
puts("\n\n");
printf_back(); //執(zhí)行返回函數
}
void save(int n) //儲存函數
{
FILE *fp;
int i;
fp=fopen("workers.txt","wb 43、"); //以只寫方式打開文件
for(i=0;i 44、,"rb"); //以只讀方式打開文件
for(i=0;!feof(fp);i++)
fread(&list[i],sizeof(struct list),1,fp); //讀出磁盤文件中的職工信息
fclose(fp); //關閉文件
return(i-1); //返回數值i-1
}
void input(int i) //職工信息輸入函數
{
float salary2(int i);
45、 float fax(int i);
printf("No.:");
scanf("%d",&list[i].num);
printf("name:");
scanf("%s",list[i].name);
printf("month:");
scanf("%d",&list[i].month);
printf("salary1:");
scanf("%d",&list[i].salary1);
printf("water:");
46、 scanf("%d",&list[i].water);
printf("electricity:");
scanf("%d",&list[i].electrisity);
fax(i); //計算稅金
salary2(i); //計算實發(fā)工資
}
float fax(int i) //稅金計算函數
{
if 47、(list[i].salary1<800)list[i].fax=0;
else if(list[i].salary1<1400)
list[i].fax=(((list[i].salary1-800)*5/100));
else list[i].fax=(((list[i].salary1-1400)/10));
return list[i].fax;
}
float salary2(int i) //實發(fā)工資計算函數
{
list[i].salary2=(list[i].salary1-list[i].wat 48、er-list[i].electrisity-list[i].fax);
return list[i].salary2;
}
void printf_back() //返回函數
{
int w;
void menu();
void browse();
printf("\n\n\tsuccessful!");
printf("what do you want to do?\n\n\t1).bro 49、wse all now\t2).back: []\b\b"); //菜單選擇瀏覽職工信息或返回主菜單
scanf("%d",&w);
if(w==1)browse(); //輸入1選擇瀏覽職工信息
else menu(); //輸入2返回主菜單
}
void printf_one(int i) //單個職工信息輸出函數
{
printf("%9d",list[i].num);
50、printf("%9s",list[i].name);
printf("%9d",list[i].month);
printf("%9d",list[i].salary1);
printf("%9d",list[i].water);
printf("%9d",list[i].electrisity);
printf("%9.2f",list[i].fax);
printf("%9.2f",list[i].salary2);
}
void printf_face() 51、 //職工信息項目
{
printf("\n\tNo. name month salary1 water electrisity fax salary2\n");
}
7.程序運行結果
1、主函數運行,顯示主菜單函數menu()
2、輸入數字1,添入兩組數據
3、如果輸入數字2,新增一組數據并瀏覽
4、輸入數字3,瀏覽所有職工信息
5、輸入4,進行查詢程序,再輸入1 ,按姓名查詢,輸入2 ,按工資卡號查詢
6、輸入數字5,進行 52、排序程序,輸入1 ,按卡號排序,輸入2按實發(fā)工資排序。8.編程中遇到的困難及解決方法
遇到最大的問題是所有程序代碼編完放在一起后,雖然能夠成功運行,但使用時如果職工人數發(fā)生變化,會導致文件后部出現亂碼。若要使每次運行都正常,必須在人數改變后退出程序,修改宏定義的值。這樣很不方便,不能夠連續(xù)運行。為解決這一大問題,最后我想到了定義一個全局指針變量,用來追蹤最新的人數。特別是添加這個會導致人數變化的函數中,全局指針變量起了很大作用。經過一邊修改一邊調試,最終可以成功的串聯(lián)整個函數,在連續(xù)運行時,總能根據最新的人數調用各個函數。另外在串聯(lián)所有函數時,調試提示出錯:有幾個函數“redefinitio 53、n; different basic types”解決:在函數名前加void指明類型。
整個程序代碼是分塊書寫的,每個函數都可以獨立運行。只有輸入函數查詢菜單函數寫得很順利,一次性就能夠成功運行,其他函數在調試過程中或多或少都出現了問題。比如,瀏覽函數display()遇到的問題雖然不大,但解決起來很麻煩。理想的運行結果是美觀整齊。即下面的職工信息分別與第一個printf輸出的中文項目提示對齊。解決方法:不斷修改空格個數,不斷運行察看效果。又如,添加函數add()遇到的問題是用printf輸入新職工信息后,保存到文件里面,發(fā)現原有的信息不見了。解決:文件打開方式改用"a"追加寫入。
54、
9.總結心得及良好建議
經過一學期的C語言學習,我們掌握了C語言的基礎知識,能夠讀懂別人用c語言設計的程序。平時的程序設計大多是以填空的形式出現,雖然有所接觸,但都不完全。而這一周的課程設計,卻讓我們完完全全用自己學到的知識編寫一個完整的體統(tǒng)程序。這是一個新的挑戰(zhàn),也是一種新的學習。
我們組選擇的題目是第一個——職工工資信息管理系統(tǒng)。初看到這個題目覺得很簡單,但當我做到電腦前準備開始編寫代碼的時候才發(fā)現無從下手。通過去圖書館查找程序設計相關的書籍,和上網參考前人編寫的類似程序,我腦中才有了一個大概方向。
終于開始著手寫了。第一天下來,我只寫好了兩個函 55、數,但還是很開心,因為這是我編的第一個小系統(tǒng)的成功的開始!
接下來幾天都在宿舍整個下午的對著電腦不斷的編譯、調試、修改,每次編好一個能夠成功運行的程序,都會感到很欣慰,但自己編的程序自己很難發(fā)現當中的錯誤,而電腦又沒有提示的時候就很受打擊,也會著急。但可以先放一放,讓腦子休息一下,忘掉錯誤的記憶。或許等過段時間再回過頭來,就會很容易的發(fā)現之前的錯誤了。隨著編好的程序越多,累積的經驗也越多,查找錯誤就越快了。還有會發(fā)現很多程序有很多相似之處,可以通過復制修改的發(fā)式來編寫。雖然題目要求只需要一種查詢方式,但當我編出規(guī)律之后自然就想多寫兩個,寫完就會有很大的成就感了。
有一次發(fā)現 56、之前辛辛苦苦編的兩段代碼沒有保存。沒辦法,只能重新寫。
總之,經過這一次的課程設計,我體會到成功的來之不易。當最后一次成功串聯(lián)運行所有函數時,真的很開心。通過這次實踐,我們能夠更熟練掌握C語言,特別是循環(huán)和文件,當時在課堂上沒有學太清楚的,這個程序設計之后都很明白了。同時增加了我們對程序設計的興趣,暑假回家我還會嘗試著做一些其他的小系統(tǒng)。
C語言是一個有序的學習,學了最基本的替換,然后擴展到循環(huán)、嵌套,條例很清楚,不是一個零散的知識,實際愛好難過所有的客車個都如此,不過通過實習我也知道了自己的不足,存在很多的問題。
比如自己些的小程序出了問題,不會了就叫老師或同學幫忙,雖然這樣能 57、節(jié)約時間,但是會樣成一種依賴心理,碰到問題就是首先想到求助而不是自己解決,所以以后要多多鍛煉自己的信心和增加自己的能力,爭取可以做到自己可以做到一些簡單的程序編寫和錯誤排除。還有自己的基礎知識不扎實,遇到的問題,沒有很好的邏輯思維,親手編寫一個新的程序的時候會有種沒法下手的感覺,找不到突破口,通過實習逐漸理清了順序,對于簡單的程序和相對比較繁瑣的嵌套、循環(huán),不再是看著一頭霧水。其實知識理清了思路把基礎知識掌握了,然后有條不紊地分析,一步一步理解,C語言還是很有意思的課程。
“學習C語言主要是學習它的邏輯思維?!鄙险n的時候老師就說,“不管以后從事什么行業(yè),學習C語言都對自己的職業(yè)很有幫助。”初 58、步接觸C語言的時候,覺得甚是無聊,通過實習,擺脫了那種似懂非懂的狀態(tài)!希望以后還會有更多類似的實習課程,在有限的大學時間學到更多的實用技能,為以后的工作打下良好基礎。
10.致謝
通過短短幾天的C語言實習,我不僅鞏固了基礎知識,并有這樣的一個機會自己獨立編寫程序,自學能力得到了很大的培養(yǎng)。在實習過程中,首先我要感謝老師,理論課老師通俗易懂的教學方法使得我把所學知識掌握牢固,實習階段的老師耐心解答我們的問題。最后,我還要感謝給我?guī)椭耐瑢W,在一些程序問題上,我和同學交流經驗,學到了很多在書本上學不到的東西,對一些自己學習的盲區(qū)進行了攻破,充分認識到自己的不足,提高了很多。
所以,我真的感謝在這次實習中和我互相幫助的人!
23
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。