




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、電子科技大學 成都學院實驗報告冊課程名稱: c語言課程設計姓名:蔣明軒學號: 1530720218 院系:微電子技術系專業(yè):嵌入式系統(tǒng)工程教師:孫軻2016 年 5 月 30日第 1 章 設計目的設計整體框架1.1 設計任務現(xiàn)對員工信息的管理,包括姓名,工號,性別,測評成績,以及等級,可以實現(xiàn)對于員工信息的輸入,插入,刪除,排序,修改,統(tǒng)計,查詢,保存。1.2 設計要求員工信息的輸入,插入,刪除,排序,修改,統(tǒng)計,查詢,保存等1.3 設計意義此程序用于新建及管理員工信息,其包括員工工號,姓名,性別,以及員工的考核成績,在程序中根據(jù)提示信息輸入相關內(nèi)容,輸入完成后,可對其輸入的內(nèi)容進行修改,刪除
2、,追加,統(tǒng)計等操作,操作完成后保存文件,文件在下一次啟動程序時將進行自動讀取信息內(nèi)容。第 2 章 設計方案2.1 軟件工作主函數(shù)中開始讀取保存的txt文件,若不存在則建立該文件,根據(jù)的選項,循環(huán)調(diào)用各個功能模塊,直到選擇退出時,將標識符改變,退出循環(huán),退出該程序。2.2 模塊流程圖第 3 章 實現(xiàn)功能3.1 實現(xiàn)功能描述主函數(shù): 檢測是否有對應的文件,若存在則打開該文件,否則則建立該文件,設置標識符循環(huán)功能模塊,根據(jù)輸入選項選擇需要使用的功能;增加員工信息 :根據(jù)工號判斷是否需要動態(tài)分配存儲空間,而后輸入員工信息;查詢員工信息 :在鏈表節(jié)點中查找對應信息的節(jié)點,并打印節(jié)點信息;刪除員工信息:
3、在鏈表中查找對應信息節(jié)點,查找到后將節(jié)點指向更改后,釋放對應節(jié)點信息;修改員工信息: 查找對應信息,然后重新輸入該節(jié)點信息;插入員工信息: 打印員工信息,并選擇需要插入的節(jié)點,鏈表中指向該節(jié)點后的指針,分配一個新的空間,輸入信息,并更改指針指向;統(tǒng)計員工信息 :統(tǒng)計員工中各個等級的員工個數(shù),并打??;排序: 根據(jù)員工分數(shù),降序排列員工信息,并打?。槐4妫?利用指針函數(shù)保存鏈表中的信息;3.2 模塊功能描述增加員工信息:根據(jù)工號判斷是否需要動態(tài)分配存儲空間,而后輸入員工信息;查詢員工信息:在鏈表節(jié)點中查找對應信息的節(jié)點,并打印節(jié)點信息;刪除員工信息:在鏈表中查找對應信息節(jié)點,查找到后將節(jié)點指向更改
4、后,釋放對應節(jié)點信息;修改員工信息:查找對應信息,然后重新輸入該節(jié)點信息;插入員工信息:打印員工信息,并選擇需要插入的節(jié)點,鏈表中指向該節(jié)點后的指針,分配一個新的空間,輸入信息,并更改指針指向;統(tǒng)計員工信息:統(tǒng)計員工中各個等級的員工個數(shù),并打印;排序:根據(jù)員工分數(shù),降序排列員工信息,并打??;保存:利用指針函數(shù)保存鏈表中的信息;第 4 章 調(diào)試與實現(xiàn)4.1 調(diào)試中遇到的重點和難點在使用鏈表時對于鏈表節(jié)點的指向不清,操作地址混淆4.2 解決辦法利用畫圖的方法,明確對指針指向的問題4.3 實現(xiàn)展示顯示員工信息主程序顯示查詢刪除統(tǒng)計第 5 章 總結(jié)通過此次實驗, 讓我認識到了自身能力的不足,也發(fā)現(xiàn)了平
5、時一些不易發(fā)現(xiàn)的小毛病,讓我意識到了程序中,任何一個小的細節(jié),將會導致的大問題,比如在此次程序的編寫中,一個微不足道的取地址符將會導致內(nèi)存的崩潰和輸出內(nèi)容的錯誤,使我養(yǎng)成了檢查代碼的習慣;此次程序中,我使用的是鏈表,在學習數(shù)據(jù)結(jié)構(gòu)理論知識時,覺得鏈表使用應該是簡單,方便,快捷的,但通過此次實踐證明,理論與實際的巨大差距,不但對指針的認識更加具體,也讓我磨煉了意志力,學會了責任與擔當,挑戰(zhàn)了個人能力,認識自身缺點。第 6 章 代碼清單#include windows.h #include stdio.h #include stdlib.h #include string.h int savefl
6、ag=0; /是否需要存盤的標志變量struct worker char name10; char num10;/ 工號char sex5; int sorce5; char dj10; ; typedef struct node struct worker data; struct node *next; node,*link; /link l (注意是:字母 l 不是數(shù)字 1) void add(link l); void disp(link l); /查看員工所有信息void del(link l); /刪除功能node* locate(link l,char findmess,char
7、 nameornum); void serch(link l); /查詢功能void tongji(link l); /統(tǒng)計void sort(link l); /排序void change(link l); /修改功能void save(link l); /將鏈表中的數(shù)據(jù)寫入文件void printe(node *p); /本函數(shù)用于打印鏈表中某個節(jié)點的數(shù)據(jù)內(nèi)容/ 以下 4 個函數(shù)用于輸出中文標題void printstart(); void wrong(); void nofind(); void printc(); void show_window() system(color f4);
8、 printf(t*n); printf(t* *n); printf(t* 1 增加員工信息 2 刪除員工信息*n); printf(t* 3 查詢員工信息 4 修改員工信息*n); printf(t* 5 插入員工記錄 6 統(tǒng)計員工記錄*n); printf(t* 7 排序 8 保存員工信息*n); printf(t* 9 顯 示數(shù) 據(jù)0 退 出 系 統(tǒng)*n); printf(t* *n); printf(t*n); /void show_window菜單結(jié)束void disp(link l) /顯示鏈表中存儲的員工記錄,內(nèi)容為worker 結(jié)構(gòu)中定義的內(nèi)容 int count=0; no
9、de *p; p=l-next; / l存儲的是單鏈表中頭結(jié)點的指針,該頭結(jié)點沒有存儲員工信息,指針域指向的后繼結(jié)點才有員工信息if(!p) /*p=null,null在 stdlib中定義為 0*/ printf(nt提示: 沒有員工記錄可以顯示 !n); return; printf(tttt顯示結(jié)果 n); printstart(); /打印橫線printc(); /打印標題printf(n); while(p) /逐條輸出鏈表中存儲的員工信息 printe(p); p=p-next; printstart(); printf(n); /void disp結(jié)束void printstar
10、t() printf(-n); void wrong() printf(n輸入錯誤 !n); void nofind() printf(n沒有找到該員工 !n); void printc() printf(t工號t姓名t 性別t 成績t 等級n); void printe(node *p)/ 用于打印鏈表中某個節(jié)點的數(shù)據(jù)內(nèi)容 printf(t%st%st%st%dt%stn, p-data.num,,p-data.sex,*p-data.sorce,p-data.dj); / 用于定位連表中符合要求的結(jié)點,并返回該指針node* locate(link l,char fi
11、ndmess,char gh) node *r; if(strcmp(gh,num)=0) / 按工號查詢 r=l-next; while(r!=null) if(strcmp(r-data.num,findmess)=0) /若找到 findmess 值的工號return r; r=r-next; return 0; /若未找到,返回一個空指針 /add()函數(shù)中 , 無節(jié)點時 ,r 指向 list頭, 有節(jié)點時 ,r 指向末尾節(jié)點void add(link l) / 增加員工 node *p,*r,*s; /實現(xiàn)添加操作的臨時的結(jié)構(gòu)體指針變量char num10; int flag=0;
12、r=l; s=l-next; /鏈表沒有節(jié)點時, s=null;/鏈表有節(jié)點時,指向第一個員工節(jié)點while(r-next!=null) /如果存在后繼結(jié)點時, r 指針后移一個r=r-next; /將指針移至于鏈表最末尾,準備添加記錄while(1) printf(請輸入工號 (以0 返回上一級菜單 ):); scanf(%s,num); if(strcmp(num,0)=0) /輸入0,跳出 while(1),即跳出 add() 函數(shù)break; s=l-next; /每次從第一個節(jié)點開始找,看num是否重復。while(s) /工號重復時,返回主菜單 if(strcmp(s-data.n
13、um,num)=0) printf(n提示: 工號為 %s 的員工已經(jīng)存在 , 若要修改請你選擇 4 修改!n,num); flag=1; / return ; s=s-next; / p=(node *)malloc(sizeof(node); /生成沒賦值的新節(jié)點 p strcpy(p-data.num,num); printf(請輸入姓名 :); scanf(%s,); getchar(); printf(請輸入性別 :); scanf(%s,p-data.sex); getchar(); printf(請輸入員工成績 :); scanf(%d,&p-dat
14、a.sorce); /getchar(); if (*p-data.sorce data.sorce = 90) strcpy(p-data.dj, 優(yōu)秀); else if (*p-data.sorcedata.sorce = 80) strcpy(p-data.dj, 良好); else if (*p-data.sorcedata.sorce = 70) strcpy(p-data.dj, 中等); else if (*p-data.sorcedata.sorce= 60) strcpy(p-data.dj, 合格); else if (*p-data.sorcedata.sorce=nu
15、ll) strcpy(p-data.dj, 不合格); / 信息輸入已經(jīng)完成p-next=null; /表明這是鏈表的尾部結(jié)點r-next=p; /將新建的結(jié)點加入鏈表尾部中r=p; saveflag=1; printc(); printe(p); sleep(100); /while(1) /void add增加結(jié)束void del(link l) / 刪除 int sel; node *p,*r; /實現(xiàn)刪除操作的臨時的結(jié)構(gòu)體指針變量char findmess20; if(!l-next) /當 list無后繼結(jié)點時,提示和結(jié)束返回del() printf(nt提示: 沒有記錄可以刪除 !
16、n); return; printf(nt1按工號刪除 nt2按姓名刪除 n); scanf(%d,&sel); if(sel=1) /按工號刪除 printf(請輸入要刪除的工號 :); scanf(%s,findmess); p=locate(l,findmess,num); if(p) r=l; while(r-next!=p) r=r-next; /從第一個結(jié)點找起,直到發(fā)現(xiàn)r-next=p, 是待刪除結(jié)點 ,跳出循環(huán)r-next=p-next; /r r-next(p) p-next free(p); printf(nt提示: 該員工已經(jīng)成功刪除 !n); saveflag=
17、1; else nofind(); /顯示一句話 /if(sel=1) else if(sel=2) /按姓名刪除 printf(請輸入要刪除的姓名 :); scanf(%s,findmess); p=locate(l,findmess,name); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; /r r-next(p) p-next free(p); printf(nt提示: 該員工已經(jīng)成功刪除 !n); saveflag=1; else nofind(); /if(sel=2) else wrong(); /顯示輸入錯誤的話 /v
18、oid del刪除結(jié)束void serch(link l) /查詢功能 int sel; char findmess20; node *p; /實現(xiàn)查詢操作的臨時的結(jié)構(gòu)體指針變量if(!l-next) printf(nt提示: 沒有數(shù)據(jù)可以查詢 !n); return; printf(請輸入要查找的工號 :); scanf(%s,findmess); p=locate(l,findmess,num); if(p) printf(tttt查找結(jié)果 n); printstart(); /打印橫線printc(); printe(p); /打印 p 結(jié)點各個數(shù)據(jù)成員的值printstart(); /
19、打印橫線 else nofind(); void change(link l) /修改功能 node *p; char findmess20; if(!l-next) printf(nt提示: 沒有資料可以修改 !n); return; printf(請輸入要修改的員工工號 :); scanf(%s,findmess); p=locate(l,findmess,num); if(p) printf(請輸入新工號 :); scanf(%s,p-data.num); printf(請輸入新姓名 :); scanf(%s,); getchar(); printf(請輸入新性別
20、:); scanf(%s,p-data.sex); getchar(); printf(請輸入新的員工分數(shù) :); scanf(%d,&p-data.sorce); if (*p-data.sorce data.sorce = 90) strcpy(p-data.dj, 優(yōu)秀); else if (*p-data.sorcedata.sorce = 80) strcpy(p-data.dj, 良好); else if (*p-data.sorcedata.sorce = 70) strcpy(p-data.dj, 中等); else if (*p-data.sorcedata.sorc
21、e= 60) strcpy(p-data.dj, 合格); else if (*p-data.sorcedata.sorce=null) strcpy(p-data.dj, 不合格); printf(nt提示: 數(shù)據(jù)修改成功 !n); /shoudsave=1; else nofind(); /if(p)結(jié)束 /void change(link l) /修改功能結(jié)束/ 插入記錄 : 按工號查詢到要插入的節(jié)點的位置,然后在該工號之后插入一個新節(jié)點。void insert(link l) node *s,*r,*p; /p指向插入位置, p 指新插入記錄節(jié)點 char ch,new_num10,o
22、ld_num10; /old_num保存插入點位置之前的工號,new_num 保存輸入的新記錄的工號 int flag=0; s=l-next; system(cls); disp(l); while(1) printf(請你輸入已存在的工號 ( 以0 返回上一級菜單 :); scanf(%s,old_num); if(strcmp(old_num,0)=0) /輸入0,跳出 while(1),即跳出 insert()函數(shù) return; s=l-next; /作用? 每次從第一個節(jié)點開始找 flag=0; while(s) /查詢該工號是否存在, flag=1 表示該工號存在 if(strc
23、mp(s-data.num,old_num)=0) flag=1; break; s=s-next; if(flag=1) break; /若工號存在,則進行插入之前的新記錄的輸入操作 else getchar(); printf(n該工號不存在,時候再次嘗試?(y/n):,old_num); scanf(%c,&ch); if(ch=y|ch=y) continue; else return; /回主菜單 /while(1) /以下新記錄的插入新節(jié)點,工號不能跟已存在的工號相同,操作與add() 相同 printf(請你輸入待插入的工號 ( 以0 返回上一級菜單 :); scanf(
24、%s,new_num); if(strcmp(new_num,0)=0) /輸入0,跳出 while(1),即跳出 add() 函數(shù) return; s=l-next; /作用? 每次從第一個節(jié)點開始找,看num是否重復。 while(s) /工號重復時,返回主菜單 if(strcmp(s-data.num,new_num)=0) printf(提示: 工號為 %s 的員工已經(jīng)存在 !n,new_num); flag=1; return ; s=s-next; /while(s) p=(node *)malloc(sizeof(node); if(!p) printf(nt錯誤! 不能申請所需
25、的內(nèi)存 !); /如沒有申請到,打印提示信息 return ; /返回主界面 strcpy(p-data.num,new_num); printf(請輸入姓名 :); scanf(%s,); getchar(); printf(請輸入性別 :); scanf(%s,p-data.sex); getchar(); printf(請輸入分數(shù) :); scanf(%d,&p-data.sorce); / 信息輸入已經(jīng)完成if (*p-data.sorce data.sorce = 90) strcpy(p-data.dj, 優(yōu)秀); else if (*p-data.s
26、orcedata.sorce = 80) strcpy(p-data.dj, 良好); else if (*p-data.sorcedata.sorce = 70) strcpy(p-data.dj, 中等); else if (*p-data.sorcedata.sorce= 60) strcpy(p-data.dj, 合格); else if (*p-data.sorcedata.sorce=null) strcpy(p-data.dj, 不合格); p-next=null; /表明這是鏈表的尾部結(jié)點 saveflag=1; /在 main() 有對該全局變量的判斷,若為1, 則進行存盤操
27、作 /將指針賦值給 r, 因為 l 中的頭節(jié)點的下一個節(jié)點才實際保存著學生的記錄 r=l-next; while(1) if(strcmp(r-data.num,old_num)=0) /在鏈表中插入一個節(jié)點 p-next=r-next; r-next=p; break; r=r-next; / while(1) , r 作為查詢指針, 依次從第一個節(jié)點找起, 找到后 跳出 while(1)循環(huán) disp(l); printf(nn); / getchar(); void tongji(link l) /統(tǒng)計 node *max,*min; node *t=l-next; if(!t) sys
28、tem(cls); printf(nt無員工記錄! n); getchar(); return; system(cls); sleep(100); disp(l); max=min=t; while(t) if(*t-data.sorce*max-data.sorce) max=t; if(*t-data.sorcedata.sorce) min=t; t=t-next; printf(最高分數(shù)為 :); printe(max); printf(最低分數(shù)為 :); printe(min); void sort(link l) /排序 link ll;/鏈 node *p,*r,*s;/節(jié)點 i
29、nt i=0; if(l-next=null) system(cls); printf(n無員工記錄! n); getchar(); return ; else ll=(node*)malloc(sizeof(node); /用于創(chuàng)建新的節(jié)點 if(!ll) printf(nt錯誤! 不能申請所需的內(nèi)存 !); /如沒有申請到,打印提示信息 return ; /返回主界面 ll-next=null; system(cls); disp(l); /顯示排序前的所有員工記錄 p=l-next; while(p) /p!=null s=(node*)malloc(sizeof(node); /新建節(jié)
30、點用于保存從原鏈表中取出的節(jié)點信息 if(!s) /=null printf(nt錯誤! 不能申請所需的內(nèi)存 !); /如沒有申請到,打印提示信息 return ; /返回主界面 s-data=p-data; /填數(shù)據(jù)域 s-next=null; /指針域為空 r=ll; /r鏈表于存儲插入單個節(jié)點后保持排序的鏈表,ll是這個鏈表的頭指針 , 每次從頭開始查找插入位置 while(r-next!=null & r-next-data.sorce=p-data.sorce) r=r-next; /指針移至分數(shù)比 p 所指的節(jié)點的分數(shù)小的節(jié)點位置 if(r-next=null)/若新鏈表
31、ll中的所有節(jié)點的分數(shù)都比p-data.sorce大時,就將 p 所指節(jié)點加入鏈表尾部 r-next=s; else /否則將該節(jié)點插入至第一個分數(shù)字段比它小的節(jié)點的前面 s-next=r-next; r-next=s; p=p-next; /原鏈表中的指針下移一個節(jié)點 l-next=ll-next; /ll中存儲是的已排序的鏈表的頭指針 disp(l); saveflag=1; printf(nt排序完成 !n); void save(link l) file* fp; node *p; /實現(xiàn)保存操作的臨時的結(jié)構(gòu)體指針變量 int flag=1,count=0; fp=fopen(work
32、er.txt,w+); if(fp=null) printf(nt提示: 重新打開文件時發(fā)生錯誤!n); return; p=l-next; /p指向第一個記錄結(jié)點 while(p) if(fwrite(p,sizeof(node),1,fp)=1) /將第一個記錄結(jié)點值寫入文件 fprintf(fp,n); p=p-next; /依次寫入第二個結(jié)點的值, count+; /文件的記錄數(shù) +1 else flag=0; break; /while(p) if(count0) printf(n提示: 文件保存成功 .( 有%d條記錄已經(jīng)保存 .)n,count); saveflag=0; els
33、e system(cls); printf(保存文件失敗, 0 條記錄被保存! n); fclose(fp); / void save結(jié)束 int main() link list; /定義鏈表 / struct node *list; file *fp; / 文件指針 int choose; /保存選擇結(jié)果變量 char ch; /保存(y,y,n,n) int count=0; /保存文件中的記錄條數(shù)(或結(jié)點個數(shù)) struct node *p,*r; /定義記錄指針變量 system(color 7d); printf(tttt員工信息管理系統(tǒng) nttttn); sleep(1000); list=(struct node*)malloc(sizeof(struct node); if(!list) printf(nt錯誤! 不能申請所需的內(nèi)存 !); /如沒有申請到,打印提示信息 return 0; /返回主界面 list-next=null; r=list; fp=fopen(w
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行業(yè)趨勢分析與未來規(guī)劃計劃
- 班級自主課題研究計劃
- 2025年比特幣投資項目發(fā)展計劃
- 2025年超凈高純試劑項目發(fā)展計劃
- 2025年燃氣摻混設備項目合作計劃書
- 少年兒童文學獎作品征文
- 2025年牙科綜合治療機項目建議書
- 格林童話之灰姑娘的童話解讀
- 辦公IT設備采購說明及預算報告
- 小王子書中的成長讀后感
- 新媒體運營合作合同范本
- 部編版《道德與法治》四年級下冊教材解讀與分析文檔
- 人教版八年級美術下冊全冊完整課件
- 學前兒童發(fā)展心理學(第3版-張永紅)教學課件1754
- 2022牛排消費趨勢報告
- TPM╲t4Step Manul(三星TPM絕密資料)
- 細菌群體感應系統(tǒng)及其應用課件
- 《農(nóng)產(chǎn)品質(zhì)量安全檢測》PPT課件
- 司法鑒定程序通則(試行)
- 橋梁墩柱模板驗收標準
- 通達信指標——江恩輪
評論
0/150
提交評論