




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
數據結構課程設計宿舍管理查詢軟件班級學號班學生姓名提交日期2015年7月24日成績計算機與通信工程學院一、需求分析程序設計任務為宿舍管理人員編寫一個宿舍管理查詢軟件。①程序設計要求:A.采用交互工作方式B.建立數據文件,數據文件按關鍵字(姓名、學號、房號)進行排序(冒泡、選擇、插入排序等任選一種)②查詢菜單:(用二分查找實現以下操作)A.按姓名查詢B.按學號查詢C.按房號查詢③打印任一查詢結果(可以連續操作)2、功能①要實現交互工作方式,各項操作結束后均應返回主菜單;②系統本無任何信息數據,要建立數據文件,需開發一個信息錄入功能,即首先創建一個學員線性表,同時我們可以將數據暫時保存在內存中,所以我們未開發信息存盤功能;③信息錄入后都保存在內存中,用戶看不到,需要設計一個信息顯示功能,信息的顯示應該便于查閱,所以需具備按各種關鍵字顯示的功能;④本系統按關鍵字(姓名、學號、房號)進行冒泡排序,采用二分查找方式分別實現按關鍵字(姓名、學號、房號)查詢功能;⑤由于有些同學因為不同原因而離校,所以設計了刪除功能;⑥由于有新同學入校,所以設計了插入功能;⑦當用戶操作完畢需要退出時,我們提供了退出選項,便于使用者退出交互式工作系統。功能模塊圖流程圖輸入和輸出①輸入的形式1)開始創建線性表:按先后順序輸入姓名(20個字以內),學號(整型),房號(整型)。2)根據用戶所選擇的操作鍵,然后再根據程序的相應提示進行輸入。選擇操作鍵1(按姓名排序):無輸入;選擇操作鍵2(按學號排序):無輸入;選擇操作鍵3(按房號排序):無輸入;選擇操作鍵4(按姓名查找):輸入要查找的姓名;選擇操作鍵5(按學號查找):輸入要查找的學號;選擇操作鍵6(按房號查找):輸入要查找的房號;選擇操作鍵7(按學號插入):按照提示順序輸入要插入的學生姓名,學號,房號;選擇操作鍵8(按學號刪除):輸入要刪除學生的學號。②輸出的形式及范圍根據用戶選擇的不同,會有不同的輸出。選擇操作鍵1(按姓名排序):輸出以姓名首字母排序的所有學生信息;選擇操作鍵2(按學號排序):輸出按學號從小到大排列的所有學生信息;選擇操作鍵3(按房號排序):輸出按房號從小到大排列的所有學生信息;選擇操作鍵4(按姓名查找):若查找成功,則輸出相應學生信息,若不成功,則輸出該學生不存在;選擇操作鍵5(按學號查找):若查找成功,則輸出相應學生信息,若不成功,則輸出該學生不存在;選擇操作鍵6(按房號查找):若查找成功,則輸出相應學生信息,若不成功,則輸出該學生不存在。選擇操作鍵7(按學號插入):輸出插入后的所有學生信息;選擇操作鍵8(按學號刪除):輸出所需刪除的學生信息,確認刪除后,輸出刪除后的所有學生信息。測試數據開始錄入的數據:姓名學號房號劉備1102孫權6231周瑜3124正確輸入:查找的數據:6(按學號)正確輸出:孫權6231詳細設計1、數據結構typedefstruct//定義結構體成員{ charname[20]; intnum;//學號和房號都為整型 introom;}stu;stustud;typedefstruct{ intlength;//當前長度 stu*elem;//存儲空間基址 intlistsize;//當前分配的存儲容量}linklist;2、數據intf;f為全局變量,指選擇的操作鍵數charname[20];name為姓名intnum;num為學號introom;room為房號intlength;length為線性表的當前長度stu*elem;elem指示線性表的基地址intlistsize;listsize為當前分配的存儲容量charc;c為進入主界面的任意鍵charch;ch為判斷字符y或ninti,j;在冒泡排序中,i為外層循環次數,j為內層循環次數inti;在打印學生信息時,i作為循環變量intm;intn;inta;m,n,a在二分查找中分別代表房號,學號,姓名inti,j,k;i,j,k在按學號插入中作為循環變量inti,j,k=-1;i,j,k在按學號刪除中作為循環變量3、函數調用具體函數如下:voidinit(linklist&l):用于線性表初始化,通過調用C語言文件操作函數來實現。voidcreate(linklist&l):用于創建學生信息表,通過線性表來實現。voidsort3(linklist&l):用于按房號排序,通過采用冒泡排序的算法來實現。voidsort2(linklist&l):用于按學號排序,通過采用冒泡排序的算法來實現。voidsort1(linklist&l):用于按姓名排序,通過采用冒泡排序的算法來實現。voidchazhao3(linklist&l):用于按房號從小到大查找,通過采用二分查找的算法來實現。voidchazhao2(linklist&l):用于按學號從小到大查找,通過采用二分查找的算法來實現。voidchazhao1(linklist&l):用于按姓名從小到大查找,通過采用二分查找的算法來實現。voidprint1(linklist&l):用于打印學生信息,通過調用文件操作函數實現。voidprint2(linklist&l,intmid):用于打印查找到的學生信息,通過調用文件查找函數實現。intpanduan2(charch):用于如果學生不存在,判斷是否繼續查找,通過if語句,文件操作函數實現voidpanduan3():用于如果已無學生記錄則返回主界面,通過調用其他函數和文件操作函數實現。voiddisp():用于返回主界面,通過調用menu()函數實現。voidmenu():用于列出操作菜單,通過輸入輸出語句實現。voidmain():程序操作的入口,是程序的主函數,可以按照已定義的函數調用子函數。4、主程序:intmain()//主函數{ linklistl;//定義線性表l init(l);//調用初始化函數 charch; system("colora"); printf("\n"); printf("*************************歡迎進入宿舍管理查詢系統*************************\n"); printf("\n"); printf("請按任意鍵開始操作:"); scanf("%c",&ch); system("cls");//將屏幕先前顯示的內容清理掉 create(l);//調用線性表創建函數 system("cls"); t=1; menu(); //調用主菜單函數while(f!=0) { system("cls"); switch(f) { case1:sort1(l);//調用按姓名排序函數 printf("\n"); if(l.length==0) { printf("已無學生記錄\n"); printf("\n"); disp(); menu(); } else { printf("按姓名排序:\n"); print1(l); disp();//調用返回主界面 menu(); } break; case2:sort2(l);//調用按學號排序函數 printf("\n"); if(l.length==0) { printf("已無學生記錄\n"); printf("\n"); disp(); menu(); } else { printf("按學號排序:\n"); print1(l); disp(); menu(); }break; case3:sort3(l);//調用按房號排序函數 printf("\n"); if(l.length==0) { printf("已無學生記錄\n"); printf("\n"); disp(); menu(); } else { printf("按房號排序:\n"); print1(l); disp(); menu(); }break; case4:sort1(l);//先調用按姓名排序函數進行排序 chazhao1(l);//再調用按姓名查找函數進行(二分)查找 break; case5:sort2(l);//先調用按學號排序函數進行排序 chazhao2(l);//再調用按學號查找函數進行(二分)查找 break; case6:sort3(l);//先調用按房號排序函數進行排序 chazhao3(l);//再調用按房號查找函數進行(二分)查找 break; case7:sort2(l);//調用插入函數 insert(l); system("cls"); printf("顯示插入后的學生信息:\n");print1(l); disp(); menu(); break; case8:Delete(l);//調用刪除函數 if(l.length==0) { printf("\n"); printf("學生記錄已被刪除完\n"); printf("\n"); disp(); menu(); } else { printf("顯示刪除后的學生信息:\n"); print1(l); disp(); menu(); } break; } }}調試分析①為了避免繁瑣、改進算法,在一些函數中調用了其它的函數。如:在按(姓名、學號、房號)查找中都調用了panduan1(ch)和panduan2(ch)函數。②在插入和刪除模塊中,顯示學生的信息的下面總是有主界面,經過調試,運用system("cls")函數清屏后,顯示的只有學生的信息了,再按鍵即可返回主界面。③本程序多次運用了disp()、menu()、system("cls")、fflush(stdin)等函數,經過多次調試,已經很好的控制了顯示的學生信息與主界面的轉換。④通過本次課程設計,對線性表、冒泡排序、二分查找的應用有了更深入的了解。用戶手冊首先,運行程序進入“歡迎進入宿舍管理查詢系統”界面,然后進入線性表創建界面中,輸入學生的信息,創建好學生信息以后單擊任意鍵則進入操作界面(主界面),然后可按鍵進行操作。單擊數字鍵“1”,則為按姓名排序單擊數字鍵“2”,則為按學號排序單擊數字鍵“3”,則為按房號排序單擊數字鍵“4”,則為按姓名查找單擊數字鍵“5”,則為按學號查找單擊數字鍵“6”,則為按學號查找單擊數字鍵“7”,則為按學號插入單擊數字鍵“8”,則為按學號刪除系統中有如下關鍵詞:提示:當輸入的數字鍵為0時,退出操作;請輸入數字鍵(1~8為操作鍵);請按任意鍵進入主界面。測試結果歡迎界面按任意鍵進入線性表的創建界面,并輸入數據,開始創建按操作鍵選擇操作按姓名排序按學號排序按房號排序按姓名查找按學號查找按房號查找按學號插入按學號刪除附錄源程序://采用順序線性表解決宿舍管理問題(C語言)#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN40//線性表存儲空間的初始分配量#defineincrease10//線性表存儲空間的分配量增量intf,t=0;//定義全局變量typedefstruct{ charname[20]; intnum;//學號和房號都為整型 introom;}stu;stustud;typedefstruct{ intlength;//當前長度 stu*elem;//存儲空間基址 intlistsize;//當前分配的存儲容量}linklist;voidinit(linklist&l)//線性表初始化{ l.length=0; l.elem=(stu*)malloc(N*sizeof(stu)); l.listsize=N;}voidmenu()//操作菜單{ printf("\n"); printf("***************請按鍵選擇操作****************\n"); printf("\n");printf("\n"); printf("1按姓名排序2按學號排序\n"); printf("\n"); printf("3按房號排序4按姓名查找\n"); printf("\n"); printf("5按學號查找6按房號查找\n"); printf("\n"); printf("7按學號插入8按學號刪除\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("提示:當輸入的數字鍵為0時,退出操作\n"); if(t==1) { printf("請輸入數字鍵(1~8為操作鍵):");//1~8為有效數字操作鍵 scanf("%d",&f); if(f<0||f>9) { system("cls"); printf("\n"); printf("輸入數字不對,請在原處重輸!\n");printf("\n"); menu(); } } }voiddisp()//返回主界面{ charc; fflush(stdin); printf("\n"); printf("請按任意鍵進入主界面:"); scanf("%c",&c); system("cls");}voidpanduan3()//如果已無學生記錄則返回主界面{ printf("\n"); printf("已無學生記錄\n"); printf("\n"); disp(); menu();}voidshuru(linklistl)//輸入學生的信息{ printf("請輸入姓名:"); fflush(stdin);//清空輸入緩沖區,得到正確的輸入數據 gets();//輸入一行字符串(姓名) printf("請輸入學號:"); scanf("%d",&stud.num); printf("請輸入房號:"); scanf("%d",&stud.room);}voidcreate(linklist&l)//創建學生信息表{ if(l.length>=l.listsize)//判斷學生的人數是否超過初值,如果超過,則重新分配 { stu*newbase; newbase=(stu*)realloc(l.elem,(N+increase)*sizeof(stu)); l.elem=newbase; l.listsize+=increase; } inti=2; charch; printf("\n"); printf("**************************開始創建線性表***************************\n");printf("\n"); printf("請輸入第1個學生的信息\n"); shuru(l);//調用輸入函數 ch=getchar(); strcpy(l.elem[l.length].name,); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; l.length++; printf("\n"); printf("是否繼續輸入?<y/n>:"); scanf("%c",&ch); printf("\n");printf("\n"); while(ch=='y') { printf("請輸入第%d個學生的信息\n",i); shuru(l); strcpy(l.elem[l.length].name,); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; l.length++; i++; ch=getchar();printf("\n"); printf("是否繼續輸入?<y/n>:"); scanf("%c",&ch); printf("\n");printf("\n"); }if(ch=='n')system("cls"); }voidsort3(linklist&l)//按房號排序(采用冒泡排序){ inti,j; stutemp; for(i=0;i<l.length-1;i++) for(j=i+1;j<l.length;j++) if(l.elem[i].room>l.elem[j].room) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; }}voidsort2(linklist&l)//按學號排序(采用冒泡排序){ inti,j; stutemp; for(i=0;i<l.length-1;i++) for(j=i+1;j<l.length;j++) if(l.elem[i].num>l.elem[j].num) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; }}voidsort1(linklist&l)//按姓名排序(采用冒泡排序){ inti,j; stutemp; for(i=0;i<l.length-1;i++) for(j=i+1;j<l.length;j++) if(strcmp(l.elem[i].name,l.elem[j].name)>0) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; } }voidprint1(linklist&l)//打印學生信息{ inti; printf("\n"); printf("姓名學號房號\n");printf("\n"); for(i=0;i<l.length;i++) printf("%-15s%-3d%5d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room);}voidprint2(linklist&l,intmid)//打印查找到的學生信息{ printf("查找成功----->該學生信息為:\n"); printf("姓名學號房號\n");printf("\n"); printf("%-15s%-5d%-5d\n",l.elem[mid].name,l.elem[mid].num,l.elem[mid].room);}intpanduan1(charch)//判斷是否繼續查找{ scanf("%c",&ch); printf("是否繼續查找?<y/n>:"); fflush(stdin); scanf("%c",&ch); if(ch=='y') { system("cls"); return(1); } else return0;}intpanduan2(charch)//如果學生不存在,判斷是否繼續查找{ scanf("%c",&ch); printf("該學生不存在,是否繼續查找?<y/n>:"); fflush(stdin); scanf("%c",&ch); if(ch=='y') { system("cls"); return(1); } else return0;}voidchazhao3(linklist&l)//按房號從小到大查找(采用二分查找){ if(l.length==0)panduan3();//此函數功能為:返回主界面 else { intlow=0,high=l.length,mid,flag=0;//flag作為標志符,為1則表示查找成功,否則沒有所要查找的學生 intm; charch; printf("\n");printf("\n"); printf("按房號查找----->請輸入要查找的房號:"); scanf("%d",&m); printf("\n"); while(low<=high) { mid=(low+high)/2; if(m==l.elem[mid].room) { flag=1; break; } elseif(m>l.elem[mid].room) low=mid+1; else high=mid-1; } if(flag==1) { print2(l,mid); if(panduan1(ch))//調用判斷函數1 chazhao3(l); else { system("cls"); menu(); } } else { if(panduan2(ch))//調用判斷函數2 chazhao3(l); else { system("cls"); menu(); } } }}voidchazhao2(linklist&l)//按學號從小到大查找(采用二分查找){if(l.length==0)panduan3(); else { intlow=0,high=l.length,mid,flag=0; intn; charch; printf("\n");printf("\n"); printf("按學號查找----->請輸入要查找的學號:"); scanf("%d",&n); printf("\n"); while(low<=high) { mid=(low+high)/2; if(n==l.elem[mid].num) { flag=1; break; } elseif(n>l.elem[mid].num) low=mid+1; else high=mid-1; } if(flag==1) { print2(l,mid); if(panduan1(ch)) chazhao2(l); else { system("cls"); menu(); } } else { if(panduan2(ch)) chazhao2(l); else { system("cls"); menu(); } } }}voidchazhao1(linklist&l)//按姓名從小到大查找(采用二分查找){ if(l.length==0)panduan3(); else { intlow=0,high=l.length,mid,flag=0; printf("\n");printf("\n"); printf("按姓名查找----->請輸入要查找的姓名:"); chara[15],ch; scanf("%s",a); printf("\n"); while(low<=high) { mid=(low+high)/2; if(strcmp(a,l.elem[mid].name)==0) { flag=1; break; } elseif(strcmp(a,l.elem[mid].name)>0) low=mid+1; else high=mid-1; } if(flag==1) { print2(l,mid);//打印查找到的學生的信息 if(panduan1(ch))chazhao1(l); else { system("cls"); menu(); } } else { if(panduan2(ch)) chazhao1(l); else { system("cls"); menu(); } } }}voidinsert(linklist&l)//按學號從小到大插入該學生{ inti,j,k; charch; printf("\n"); printf("插入的學生信息為:\n"); printf("姓名:"); fflush(stdin);//清空輸入緩沖區,得到正確的輸入數據 gets(); printf("學號:"); scanf("%d",&stud.num); printf("房號:"); scanf("%d",&stud.room); if(l.length==0) { strcpy(l.elem[l.length].name,); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; } for(i=0;i<l.length;i++) { if(stud.num<l.elem[i].num) { k=i; for(j=l.length;j>k;j--) l.elem[j]=l.elem[j-1]; strcpy(l.elem[k].name,); l.elem[k].num=stud.num; l.elem[k].room=stud.room; break; } else { strcpy(l.elem[l.length].name,); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; } } l.length++; fflush(stdin); printf("\n"); printf("是否繼續插入?<y/n>:"); scanf("%c",&ch); if(ch=='y')insert(l); elsesystem("cls");}voidDelete(linklist&l)//按學號刪除該學生{ inti,j,k=-1; charch; printf("\n");printf("\n"); printf("請輸入要刪除學生的學號:"); scanf("%d",&stud.num); for(i=0;i<l.length;i++) { if(stud.num==l.elem[i].num) { printf("該學生的信息為:\n");printf("\n"); printf("%-15s%-3d%7d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room); k=i; for(j=k;j<l.length-1;j++) l.elem[j]=l.elem[j+1]; printf("\n"); break; } } if(i>=l.length)printf("該學生不存在\n"); if(k>=0)l.length--; fflush(stdin); printf("\n"); printf("是否繼續刪除?<y/n>:"); scanf("%c",&ch); system("cls"); if(ch=='y')Delete(l); elsesystem("cls"); }intmain()//主函數{ linklistl;//定義線性表l init(l);//調用初始化函數 charch; system("colora"); printf("\n"); printf("*************************歡迎進入宿舍管理查詢系統*************************\n"); printf("\n"); printf("請按任意鍵開始操作:"); scanf("%c",&ch); system("cls");//將屏幕先前顯示的內容清理掉 create(l);//調用線性表創建函數 system("cls"); t=1; menu(); //調用主菜單函數 while(f!=0) { system("cls"); switch(f) { case1:sort1(l);//調用按姓名排序函數 printf("\n"); if(l.length=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025下半年電新行業供給回歸有序需求韌性較好靜待周期復蘇
- 直播電商主播在2025年的粉絲互動與營銷策略研究報告
- 老年教育課程設置改革與2025年體驗式教學方法應用分析報告
- 2025年農村一二三產業融合發展的農村電商與農業品牌建設報告
- 2025年文化旅游演藝項目季節性運營與市場策略報告
- 2025年成人教育終身學習平臺運營中的品牌建設與市場推廣報告
- 汽車輕量化材料在汽車底盤減重中的技術創新報告
- 汽車行業2025年供應鏈風險管理與企業風險管理策略優化方案報告
- 汽車共享平臺2025年運營模式轉型與用戶行為重構報告
- 2025年遠程醫療服務在分級診療中的遠程醫療技術與設備研發與創新報告
- 2025年高考英語課后續寫高頻考點話題分類第07講 讀后續寫之成長類主題(講義)
- 2025年廣東中考百校聯考語文試卷 2025年廣東中考百校聯考語文試卷
- 2025年公路市場調研報告
- 五年級(下)語文選擇題專項165道
- 生物+2025云南新高考自主命題沖刺金卷及答案
- 糖尿病眼病試題及答案
- 期末模擬卷(南京專用)(含解析)2024-2025學年譯林版英語七年級下冊
- 石油化工工程防滲技術規范
- 25年企業員工崗前安全培訓考試試題【模擬題】
- 高中語文跨學科閱讀教學研究-以《紅樓夢》為例
- 腕管綜合征診治循證臨床實踐指南(2024)解讀
評論
0/150
提交評論