《C語言職工檔案管理系統(tǒng)-500多行代碼.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語言職工檔案管理系統(tǒng)-500多行代碼.doc(17頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1.程序的總體設(shè)計(jì)
職工檔案管理系統(tǒng)設(shè)計(jì),每個(gè)職工是一條記錄,包括編號(hào),姓名,性別,出生年月,所在
部門,職稱,工資級(jí)別、電話等。系統(tǒng)可實(shí)現(xiàn)以下功能:
1、輸入功能:輸入每一位職工記錄,將其信息存入文件中。
2、顯示功能:完成全部職工記錄的顯示。
3、查找功能:完成按編號(hào)或姓名查找職工的相關(guān)記錄,并顯示。
2. 數(shù)據(jù)結(jié)構(gòu)
對(duì)于這個(gè)職工檔案系統(tǒng)的設(shè)計(jì),我主要采用結(jié)構(gòu)體存放不同類型的數(shù)據(jù),運(yùn)用數(shù)組對(duì)各數(shù)據(jù)進(jìn)行控制,而所有數(shù)據(jù)(除ID外)都以字符型的形式存放,這樣方便存入中文數(shù)據(jù)。本程序用指針相對(duì)較少,事實(shí)上,我只在文件的保存函數(shù)上用了指針。只要是因?yàn)槲覀儗?duì)指針了解相對(duì)較少,而且指針相對(duì)容易出錯(cuò)誤,而這個(gè)程序用結(jié)構(gòu)體和數(shù)組就可以很好地完成。
3. 函數(shù)原型聲明的說明(功能,參數(shù),返回值)
1.主函數(shù) void main()
主函數(shù)的主意作用是調(diào)用函數(shù)以實(shí)現(xiàn)程序的預(yù)期功能,主函數(shù)有各函數(shù)的聲明調(diào)用。主函數(shù)用switch語句對(duì)各函數(shù)進(jìn)行調(diào)用。
2添加函數(shù):void append()
該函數(shù)是無參函數(shù),主要功能是添加職工,由于界面為DOS的命令界面,為了使添加更加人性化,我采用先確認(rèn)添加人數(shù),再對(duì)每個(gè)員工的每條信息,逐個(gè)添加,這樣可以減少錯(cuò)誤的發(fā)生和加快輸入速度。員工添加后可用保存函數(shù),將其數(shù)據(jù)保存到指定文件中。
3查找函數(shù): void search()
該函數(shù)是無參函數(shù),主要功能是查找員工,可按編號(hào)或姓名查找職工的相關(guān)記錄,按姓名查找時(shí)采用字符串處理函數(shù)strcmp()進(jìn)行比較,這樣可以用兩種方法查找職工信息。
4輸出函數(shù):void output()
該函數(shù)是無參函數(shù),主要功能是輸出全部員工的信息,用for語句進(jìn)行輸出。
5刪除函數(shù):void delete()
該函數(shù)是無參函數(shù),主要功能是刪除指定員工的全部信息,該函數(shù)相對(duì)較復(fù)雜,用for語句對(duì)刪除后該員工后的員工的序號(hào)進(jìn)行排列。
6修改函數(shù):void modify()
該函數(shù)是無參函數(shù),主要功能是修改指定員工的信息,該函數(shù)有密碼操作,要輸入密碼后才能進(jìn)入修改界面,密碼操作采用while語句,用getch()輸入密碼,可以將密碼隱藏。這里getch()函數(shù)要調(diào)用conio.h文件。
7保存函數(shù):void save()
該函數(shù)是無參函數(shù),主要功能是保存添加的員工信息到指定文件,該函數(shù)用到了指針和文件的內(nèi)容。
8主菜單函數(shù):void showmenu()
該函數(shù)是無參函數(shù),主要功能是提供美觀的菜單界面。
9文檔導(dǎo)入函數(shù):void read()
該函數(shù)是無參函數(shù),主要功能是導(dǎo)入文件中的職工檔案信息。
9數(shù)據(jù)排序函數(shù):void sort()
該函數(shù)是無參函數(shù),主要將職工數(shù)據(jù)排序,分按編號(hào)排序和工資排序,工資排序又分從高到低和從低到高兩種。
二、詳細(xì)設(shè)計(jì)
1.main()流程圖
修改數(shù)據(jù)
輸入密碼
由低到高
由高到低
按工資排序
按編號(hào)排序
導(dǎo)入數(shù)據(jù)
Switch語句
查找函數(shù)
輸出數(shù)據(jù)
修改函數(shù)
開始主函數(shù)
刪除數(shù)據(jù)
保存數(shù)據(jù)
數(shù)據(jù)排序
添加數(shù)據(jù)
主菜單函數(shù)
按姓名查找
按編號(hào)查找
三、測試及調(diào)試(測試方案、存在的問題及解決方法)
測試方案、存在的問題及解決方法
我用的是visual C++ 6.0進(jìn)行編譯和測試的,主要觀察程序運(yùn)行的錯(cuò)誤及找出錯(cuò)誤發(fā)生的原因,還有各函數(shù)的功能的實(shí)現(xiàn)以及部分變量在程序運(yùn)行時(shí)的變化。采取逐個(gè)函數(shù)測驗(yàn)的方法 ,雖然比較耗時(shí)間,但是我實(shí)在沒有找到可以檢查我的海量錯(cuò)誤的方法。下面是某此調(diào)試的截圖。
可以看到,這時(shí)候幾乎什么錯(cuò)誤都有,低級(jí)的錯(cuò)誤數(shù)不清,高級(jí)的錯(cuò)誤無法數(shù),在這樣的局勢下,我仍然心靜如水地檢查錯(cuò)誤,下面介紹我遇到的問題及其解決方案。
我主要遇到了三個(gè)函數(shù)問題,第一,我原本想用數(shù)組代替指針,這樣可以更好的檢查錯(cuò)誤,但是后來的的數(shù)據(jù)保存就遇到了問題,老是無法正確的保存數(shù)據(jù),所以還是用了個(gè)FILE *fp,當(dāng)然也為此狂看了文件一章,最后在數(shù)據(jù)導(dǎo)入也用到了指針和文件。第二,題目本沒有要求寫刪除函數(shù)也沒有要求寫排序函數(shù),也許修改函數(shù)能夠代替刪除函數(shù)的一部分功能,但是無法減少職工的數(shù)目,這個(gè)對(duì)于想裁員的公司不利,所以,我又想了一個(gè)刪除函數(shù)。寫刪除函數(shù)遇到的問題是,我刪除了編號(hào)為2的函數(shù),如何把2后面的同志移到前面來,而1不動(dòng),后來還是用最笨的for語句搞定了,據(jù)說這里可以用鏈表很美妙地完成,但是也可以不用鏈表。排序函數(shù)是最后加上去的,一個(gè)原因是我的程序不夠500行,就完成了功能,后來要求盡情發(fā)揮,我就用了排序函數(shù),這個(gè)函數(shù)相對(duì)簡單,用的是我們學(xué)過的起泡法排序,有按照編號(hào)和工資排序兩種方式,也用到了switch語句,這樣是程序的功能更加完善了。第三,密碼的問題,密碼函數(shù)是個(gè)比較嚴(yán)肅的函數(shù),為此不能敷衍了事用個(gè)while語句和字符串處理函數(shù)搞定,這樣密碼是明文的,很別扭。所以,我又加了一個(gè)不熟悉的頭文件#include
,調(diào)用了這個(gè)文件里的getch()函數(shù),這個(gè)函數(shù)能夠不顯示你輸入的字符,很有保密特性。
程序設(shè)計(jì)其實(shí)是最大的問題,起初的兩三天我根本就不知道從哪里入手,后來參考到可以用switch語句對(duì)各功能函數(shù)很好的利用,這里還用到了break語句,感覺,課堂上沒講的東西就是這么有用啊!
關(guān)于如何輸入數(shù)據(jù)信息的問題,我起初準(zhǔn)備用一個(gè)scanf語句,輸入全部的職工信息,都是后來發(fā)現(xiàn)這樣極易出現(xiàn)輸入格式不正確的問題,后來就考慮用一個(gè)一個(gè)數(shù)據(jù)輸入的方法,雖然這樣做使代碼長度加長了一些,但是這樣輸入簡單明了更加人性化,所以我最終采用了逐個(gè)數(shù)據(jù)輸入的方法。
我還用宏定義定義了一個(gè)最大員工數(shù)MAX_NUM,這樣能夠使程序更高效率更準(zhǔn)確地運(yùn)行,而且改變最大員工數(shù)業(yè)很方便。
最后談?wù)務(wù){(diào)試錯(cuò)誤的問題,上面已經(jīng)曬了我的錯(cuò)誤截圖,感覺這些錯(cuò)誤確實(shí)很震撼人,有時(shí)候就一個(gè)字符串函數(shù)應(yīng)用錯(cuò)誤,找了半天,居然發(fā)現(xiàn)strcmp前面忘記加“!”了,還有諸如忘記寫“;”“}”,最頭痛的還是把%s寫成%d,這樣程序能夠運(yùn)行,就是系統(tǒng)告訴你內(nèi)存錯(cuò)誤,搞得我以為電腦壞了,調(diào)了半天電腦,這就足夠悲劇的。最后還是一點(diǎn)一點(diǎn)地去檢查,不怕花費(fèi)時(shí)間,就怕那些小東西太不入眼了。越是小的問題,可能浪費(fèi)的時(shí)間就越讓人感到悲憤,所以,細(xì)心檢查永遠(yuǎn)是解決此類問題的良方。
四、小結(jié)(收獲和建議)
通過本次課程設(shè)計(jì)我不僅溫習(xí)了C程序設(shè)計(jì)課程的主體知識(shí),還鍛煉了對(duì)錯(cuò)誤的承受能力,而且這個(gè)題目是我這輩子做過的最大的題目,搞了一個(gè)多星期才有一點(diǎn)點(diǎn)眉目,讓人感到前途特別渺茫,也催迫著我不斷前進(jìn)。
開始時(shí),對(duì)這個(gè)題目完全無從下手,后來列出了主函數(shù)和結(jié)構(gòu)體,就慢慢算入門了,成天趴在電腦里,電腦前放著那本綠色的程序設(shè)計(jì)的書,外面冷風(fēng)嗖嗖,鞭炮響起。明天就是除夕了,我要趕在春節(jié)前把這個(gè)題目做完。而現(xiàn)在函數(shù)全部寫出來了,且運(yùn)行的相當(dāng)成功,幾個(gè)特殊的功能函數(shù)也奇跡般的起作用了,小小的成功給了我大大的喜悅。這個(gè)時(shí)候,電腦不是機(jī)器,數(shù)據(jù)不是抽象,一切都像春風(fēng)一樣。
調(diào)試程序的時(shí)候情緒一直十分難控,一聲聲嘆息加上使勁敲打鍵盤的聲音還有怒目對(duì)視屏幕,這樣感覺在無盡的黑暗中尋找黎明?,F(xiàn)在黎明的曙光已經(jīng)出現(xiàn),感覺一切的努力都是那么值得,心胸豁然開朗。
當(dāng)然也有沒有解決的問題,就是我的密碼不能夠在程序運(yùn)行的時(shí)候修改只能夠在源程序上修改,后來想了很久也沒有找到好的辦法。
建議,由于在學(xué)校時(shí)沒有上過幾次實(shí)驗(yàn)課,理論的東西已經(jīng)慢慢淡忘。所以建議以后此類的課盡量在實(shí)驗(yàn)室上好些,還有感覺只有一個(gè)題目沒有啥挑戰(zhàn)性,應(yīng)該多布置幾個(gè)……
附件:主要源程序代碼(需打印)
/*C語言課程設(shè)計(jì)任務(wù)書:職工檔案管理系統(tǒng)設(shè)計(jì)*/
#include
#include
#include
#include
#include
#define MAX_NUM 900
struct worker
{
int ID;
char Birth[20];
char Sex[20];
char Name[30];
char Telenum[20];
int Wage;
char Department[30];
char Job[30];
}
work[MAX_NUM];
void main()
{
void showmenu(); /* 聲明主菜單函數(shù) */
void append(); /* 聲明添加函數(shù) */
void search(); /* 聲明查找函數(shù) */
void output(); /* 聲明輸出函數(shù) */
void modify(); /* 聲明修改函數(shù) */
void deletes(); /* 聲明刪除函數(shù) */
void save(); /* 聲明保存函數(shù) */
void read(); /* 聲明錄入函數(shù) */
void sort(); /* 聲明排序存函數(shù) */
int m;
showmenu();
scanf("%d",&m);
for(;m>=0&&m<=8;)
{
switch(m)
{
case 1: append(); /* 用戶選擇 1 號(hào)菜單,程序執(zhí)行 添加的數(shù)據(jù)文件的函數(shù) */
break;
case 2: search();/* 用戶選擇 2號(hào)菜單,程序執(zhí)行 查找數(shù)據(jù)的函數(shù) */
break;
case 3: modify();/* 用戶選擇 3 號(hào)菜單,程序執(zhí)行 修改數(shù)據(jù)的函數(shù) */
break;
case 4: deletes();/* 用戶選擇 4號(hào)菜單,程序執(zhí)行 刪除數(shù)據(jù)的函數(shù) */
break;
case 5: output();/* 用戶選擇 5號(hào)菜單,程序執(zhí)行輸出數(shù)據(jù)錄的函數(shù) */
break;
case 6: save();/* 用戶選擇 6 號(hào)菜單,程序執(zhí)行保存數(shù)據(jù)的函數(shù) */
break;
case 7: read();/* 用戶選擇7 號(hào)菜單,程序執(zhí)行 讀取文件的函數(shù) */
break;
case 8: sort();/* 用戶選擇8 號(hào)菜單,程序執(zhí)行 排序數(shù)據(jù)的函數(shù) */
break;
case 0: exit(0);/* 用戶選擇 3 號(hào)菜單,程序執(zhí)行退書的函數(shù) */
printf("\n\n操作完畢,請(qǐng)?jiān)俅芜x擇!");
default:printf("錯(cuò)誤,重新輸入\n");}
showmenu();
scanf("%d",&m);
}
}
/* 主菜單函數(shù) */
void showmenu()/* 顯示 主菜單,并返回用戶所選擇的 菜單項(xiàng) 的 編號(hào) */
{
printf(" ********************************************************************\n");
printf(" ^^^^^^^^^^^^^^^^^^^^^^^職工檔案管理系統(tǒng)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf(" ----------------------------------設(shè)計(jì)者:陳文凱---------------------\n");
printf(" *******************************************************************\n");
printf(" \n");
printf(" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& \n");
printf(" & 1,添加職工 5,輸出職工 & \n");
printf(" & 2,查找職工 6,保存職工 & \n");
printf(" & 3,修改職工 7,讀取檔案 & \n");
printf(" & 4,刪除職工 8,職工排序 & \n");
printf(" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& \n");
printf("--------------------------------------------退出,請(qǐng)按0----------------\n");
printf("請(qǐng)選擇(0--8):");
}
/* 添加函數(shù) */
void append()
{int number,i;
FILE *fp;
char filepn[MAX_NUM];
system("cls");
printf("\n您選擇的是添加職工!\n");
printf("\n請(qǐng)輸入本次添加的職工人數(shù): ");
scanf("%d",&number);
if(number>MAX_NUM)
{
printf("您輸入的人數(shù)太多,大于 %d 人!\n",MAX_NUM);
}
for(i=0;iwork[j].Wage)
{
strcpy(temp,work[i].Birth);
strcpy(work[i].Birth,work[j].Birth);
strcpy(work[j].Birth,temp);
strcpy(temp,work[i].Name);
strcpy(work[i].Name,work[j].Name);
strcpy(work[j].Name,temp);
strcpy(temp,work[i].Sex);
strcpy(work[i].Sex,work[j].Sex);
strcpy(work[j].Sex,temp);
s=work[i].Wage;
work[i].Wage=work[j].Wage;
work[j].Wage=s;
strcpy(temp,work[i].Telenum);
strcpy(work[i].Telenum,work[j].Telenum);
strcpy(work[j].Telenum,temp);
strcpy(temp,work[i].Department);
strcpy(work[i].Department,work[j].Department);
strcpy(work[j].Department,temp);
strcpy(temp,work[i].Job);
strcpy(work[i].Job,work[j].Job);
strcpy(work[j].Job,temp);
s=work[i].ID;
work[i].ID=work[j].ID;
work[j].ID=s;
}
}
printf(" 新的排序如下:\n");
printf("\t編號(hào)\t姓名 \t出生年月\t電話\t 性別\t工資\t部門\t職稱\n");
for(i=0;i
下載提示(請(qǐng)認(rèn)真閱讀)
- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
文檔包含非法信息?點(diǎn)此舉報(bào)后獲取現(xiàn)金獎(jiǎng)勵(lì)!
下載文檔到電腦,查找使用更方便
9.9
積分
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
-
語言
職工
檔案管理系統(tǒng)
500
代碼
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,未經(jīng)上傳用戶書面授權(quán),請(qǐng)勿作他用。
鏈接地址:http://www.820124.com/p-6649164.html