文件管理系統(tǒng)開發(fā)案例_第1頁
文件管理系統(tǒng)開發(fā)案例_第2頁
文件管理系統(tǒng)開發(fā)案例_第3頁
文件管理系統(tǒng)開發(fā)案例_第4頁
文件管理系統(tǒng)開發(fā)案例_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

文件管理系統(tǒng)開發(fā)案例

----學生成績管理系統(tǒng)的設計教學目的:了解文件管理系統(tǒng)的設計步驟。將課程的主要知識內容融會貫通于該案例中。變松散的知識點的學習為知識的靈活掌握與應用。分別從結構化層面和面向對象的層面了解抽象思維的設計思想。訓練學生的綜合設計和調試程序的能力。教學講解重點:避免原有內容的重復講解,突出強調難點和易錯點的講解,包括:復雜數據結構的訪問層次和語句結構根據函數功能確定函數參數及返回值類型單鏈表的操作函數中表頭指針的變化根據文件操作數據類型和文件的有無選取正確的文件打開方式和文件讀寫函數。通過代碼的不同組織了解不同層次的抽象設計思想,包括函數庫、接口、類等概念,進一步區(qū)分結構化程序設計過程和面向對象設計中函數的不同使用方式和意義通過代碼組織理解文件包含的作用、掌握多文件操作的方法。引導學生思考如何對系統(tǒng)功能的進一步完善和對代碼的進一步優(yōu)化。學生成績管理系統(tǒng)設計要求:學生信息以數據文件的形式存放在磁盤中,包括學號、姓名、班級、語文、數學、英語三門課程的成績,系統(tǒng)對學生信息可以進行各種增、刪、改、排序及對文件進行讀寫等功能。需求分析總體設計詳細設計及編碼代碼組織---編程抽象一、需求分析能從文件中讀入學生記錄存于計算機中,同時也能將學生記錄保存到磁盤文件;能按不同方式添加新學生記錄;能對指定的學生記錄進行修改、刪除;能按照不同條件查詢學生記錄能對學生成績進行統(tǒng)計并顯示統(tǒng)計結果可對學生表按條件進行排序可用菜單形式顯示系統(tǒng)功能供用戶選擇,并能從不同功能操作中返回到菜單成績管理更新模塊輸入模塊查詢模塊統(tǒng)計模塊輸出模塊文件輸入鍵盤輸入按學號查詢按姓名查詢增加記錄刪除記錄修改記錄排序記錄輸出至文件屏幕顯示統(tǒng)計各段人數系統(tǒng)功能模塊圖二、總體設計基本流程功能模塊設計數據結構設計函數功能描述開始打開文件讀文件并存入數組或鏈表調用菜單函數選擇菜單操作退出系統(tǒng)嗎調用相應函數完成相應操作已存盤否調用存盤函數結束否是否是1、基本流程輸入模塊:實現將數據輸入數組或鏈表查詢模塊:在數組或鏈表中實現按不同字段進行查詢更新模塊:實現對記錄的增、刪、改、排序等操作統(tǒng)計模塊:實現各種統(tǒng)計功能輸出模塊:實現將處理后的數據寫入文件或在屏幕上輸出的功能。2、功能模塊設計學生成績信息結構structstudent{charnum[8];charname[20];

ints[3];//三門課成績}若通過數組實現,則定義結構數組structstudentstu[N];N為已定義過的符號常量若通過單鏈表實現,則單鏈表結點結構定義:structnode{

charnum[8];charname[20];

ints[3];

structnode*next;}3、數據結構設計voiddisplay(student

stu[],int

len)功能:顯示長度為len的學生表中存儲的學生記錄。voidsearch(student

stu[],int

len)

功能:在長度為len的學生表中按姓名或學號查找指 定的學生記錄。intappend(studentstu[],intlen)功能:在長度為len的學生表的末尾添加新的學生記錄int

del(student

stu[],int

len)功能:從長度為len的學生表中刪除指定學號的學生voidmodify(student

stu[],int

len)功能:修改長度為len的學生表中指定學號的學生記錄4、函數功能描述(數據結構以結構數組為例)voidcount(student

stu[],int

len)功能:對長度為len的學生表按要求進行統(tǒng)計voidsort(student

stu[],int

len)功能:將長度為len的學生表中記錄按要求排序voidsave(student

stu[],int

len)功能:將長度為len的學生表中記錄保存到文件int

readfile(student

stu[])功能:將文件中的學生數據讀入到學生記錄表中,并返回表中的記錄數。voidmenu()功能:顯示系統(tǒng)提供的可選菜單項voidmain()整個系統(tǒng)的控制部分。三、詳細設計及編碼1、主函數的設計:啟動程序后,首先從文件中將學生信息讀入到結構數組或鏈表中,然后進入菜單界面供用戶選擇,根據選擇項執(zhí)行相應的操作,直到退出該管理系統(tǒng)。菜單界面如下:根據前面的基本流程設計出如下的主函數:清屏,原型包含在stdlib.h中voidmain(){ structstudentstu[N];

int

len;

intchoice; charch;

len=readfile(stu);//調用讀文件函數

cout<<"按任意鍵繼續(xù)"<<endl;

getchar(); while(1)//注意該循環(huán)退出的條件 {system("cls");//清屏函數 menu();//調用菜單顯示函數

cout<<"選擇菜單項(0~8):";

cin>>choice;

if(choice==0)//選擇退出 { cout<<"\n保存到文件嗎?"<<endl;

cin>>ch;

if(ch=='y'||ch=='Y')

save(stu,len);

cout<<"\n歡迎再次使用,按任意鍵退出"<<endl;

getchar();break; }增強交互

switch(choice) { case1:display(stu,len);break; case2:search(stu,len);break; case3:len=append(stu,len);break; case4:len=del(stu,len);break; case5:modify(stu,len);break; case6:count(stu,len);break; case7:sort(stu,len);break; case8:save(stu,len);break; default:

cout<<"\n輸入錯誤,按任意鍵繼續(xù)"<<endl;

getchar(); }}}2、menu函數的設計該函數功能很簡單,只需在屏幕上按要求顯示菜單項,請自行完成設計。3、display函數的設計分析:遍歷長度為len的結構數組stu,輸出每個學生的所有信息。注意對結構數組成員的訪問層次,尤其是成員本身又為數組的學生成績,需逐一訪問。如第i個學生的第j門課的成績需表示為:stu[i].s[j]故遍歷需雙重循環(huán)。請自行完成代碼設計。4、search函數的設計設計思路:在長度為len的學生表中按姓名或學號查找指定的學生記錄,因有不同的查詢條件,所以需設計二級菜單,分別按學號和姓名查詢學生記錄,根據查詢情況分別輸出查詢到的學生信息或是未找到的提示,然后返回到上級菜單。該函數的流程如下:開始選擇查找方式按學號?選擇錯誤否按姓名?否輸入待查學號最后一個學生?是取第一個學生比較找到否?否否取下一個學生比較找到否?是輸出未找到提示否輸出找到的記錄是結束同按學號查找過程,略voidsearch(student

stu[],int

len){int

choice,i,j;charnum[8],name[20];

system("cls");

cout<<"1.按學號查詢2.按姓名查詢\n";

cout<<"輸入查找方式[1,2]:";

cin>>choice;

if(choice==1){cout<<"輸入學號:"<<endl;

cin>>num;

for(i=0;i<len;i++)

if(strcmp(stu[i].num,num)==0){cout<<"學號\t姓名\t語文\t數學\t英語\t總分"<<endl;

cout<<stu[i].num<<'\t'<<stu[i].name<<'\t';

for(j=0;j<3;j++)

cout<<stu[i].s[j]<<"\t";

cout<<stu[i].s[0]+stu[i].s[1]+stu[i].s[2]<<endl;

cout<<"按任意鍵繼續(xù)"<<endl;

getchar();return; }

cout<<"\n未找到該生記錄,按任意鍵繼續(xù)\n";

getchar();return;} 字符串比較必須通過此函數elseif(choice==2){cout<<"輸入姓名:"<<endl;

cin>>name;

for(i=0;i<len;i++)

if(strcmp(stu[i].name,name)==0){cout<<"學號\t姓名\t語文\t數學\t英語\t總分"<<endl;

cout<<stu[i].num<<'\t'<<stu[i].name<<'\t';

for(j=0;j<3;j++)

cout<<stu[i].s[j]<<"\t";

cout<<stu[i].s[0]+stu[i].s[1]+stu[i].s[2]<<endl;

cout<<"按任意鍵繼續(xù)"<<endl;

getchar();return; }

cout<<"\n未找到該生記錄,按任意鍵繼續(xù)\n";

getchar();return;}else{cout<<"\n選擇錯誤,按任意鍵返回"<<endl;

getchar();}}?思考:比較按姓名和學號兩種方式查詢的代碼,函數如何優(yōu)化更簡潔5、append函數的設計設計思路:在學生表中添加新的學生記錄。首先輸入要添加的學生學號,在原表中查找該學號的記錄是否已存在。若已存在,則選擇是否重新輸入新學生記錄,如選擇“是”,則返回①;否則結束函數返回主菜單。若原表中不存在該學號的學生,則繼續(xù)輸入要添加的學生的姓名和三門課的成績。添加成功后,學生表的實際長度增加1.根據上述設計思路,請自行完成如下形式的函數設計int

append(student

stu[],int

len)?思考:該函數的類型為何要定義為int類型int

append(student

stu[],int

len){inti;charnum[8],ch;

system("cls");while(1){cout<<"輸入學號(輸入'0'返回菜單):"<<endl;

cin>>num;if(strcmp(num,"0")==0) returnlen;

for(i=0;i<len;i++){if() {cout<<"學號"<<num<<"已存在,重試(y/n):";

cin>>ch;

if(ch=='y'||ch=='Y') ; else {cout<<"按任意鍵返回"<<endl;

getchar();returnlen; } } }strcmp(stu[i].num,num)==0break

if(i==len)//要添加的學生記錄不在原表中 break;}

strcpy(stu[len].num,num);

cout<<"輸入姓名:"<<endl;

cin>>stu[len].name;

cout<<"輸入語文成績【0~100】:"<<endl;

cin>>stu[len].s[0];

cout<<"輸入數學成績【0~100】:"<<endl;

cin>>stu[len].s[1];

cout<<"輸入英語成績【0~100】:"<<endl;

cin>>stu[len].s[2];;returnlen;}len++6、del函數的設計設計思路:為簡單起見,本例中該函數只考慮按學號刪除的情況,實際應用中還可按姓名刪除學生記錄。本例中該函數的設計思路:①若學生表為空表,則做相應的提示,然后退出該函數;若非空,則轉②②在表中查找待刪除學生的學號。③若找到,該學生后的所有記錄前移一位刪除該記錄,然后退出該函數;若未找到,則提示該學生不存在,重新輸入新學號后,轉②繼續(xù)查找。根據上述設計思路,請自行完成如下形式的函數設計int

del(student

stu[],int

len)7、modify函數的設計設計思路:①若學生表為空表,則做相應的提示,然后退出該函數;若非空,則轉②②在表中查找待修改學生的學號。③若找到,輸入該學生的新信息,然后退出該函數;若未找到,則提示該學生不存在,重新輸入新學號后,轉②繼續(xù)查找。請自行完成代碼設計8、count函數的設計分析:該函數的功能是對學生成績表的統(tǒng)計,統(tǒng)計的內容可以很多,包括每門課程和總分的最高最低分、包括各分數段的人數等,也適宜設計成二級菜單的形式供用戶選擇,請大家自行完善。9、sort函數的設計設計思路:該函數的功能是對學生成績表按條件排序,排序的條件可以是學號、成績等,也適宜設計成二級菜單的形式供用戶選擇。設計程序時注意如下內容:若按學號等字符串類型的成員排序的話,注意比較的方法要通過strcmp函數實現,而不能直接用關系比較運算比較此類成員交換元素時結構變量允許整體賦值,無需逐個成員交換10、save函數的設計分析:該函數實現的是將存儲于結構數組中的學生記錄寫入磁盤文件的功能。對結構數組適宜選擇塊讀寫。函數中注意對文件正確打開與否的判別、對讀寫成功與否的不同提示等等。代碼請自行設計。11、readfile函數的設計分析:函數實現從磁盤文件讀學生數據到結構數組的功能。對結構數組選擇塊讀寫。設計中兩個關鍵點:因學生表的初始長度取決于文件中的記錄數,所以讀文件的過程中要記錄下學生記錄的總數,作為函數的返回值提供給其它操作使用。因數據可從文件讀也可從鍵盤輸入,所以以讀的方式打開一個可能存在也可能不存在的文件應選用“ab+”方式。int

readfile(student

stu[]){FILE*fp;

inti=0,len;

fp=fopen("c:\\student","ab+");

if(fp==NULL){ cout<<"無法打開文件student\n"; exit(0);}

while(!feof(fp)){if(fread(&stu[i],sizeof(student),1,fp)==1) i++;}

len=i;

fclose(fp);

cout<<"文件中學生記錄數為:"<<len<<endl;returnlen;}四、代碼的組織(1)

----結構化C層面上的編程抽象函數與接口:定義函數的目的之一是將整個程序分成多個可操作的部分以降低復雜性;接口則是在更高層次上降低復雜性。函數使其調用者將訪問需要的一系列步驟組合為一個操作;接口則是使其客戶將訪問需要的一系列函數實現成一個編程抽象。接口是庫和其客戶間的邊界,提供庫和客戶間的交流渠道,也是分離二者的屏障;在不顯示庫的實現細節(jié)的情況下,為客戶提供有關使用庫的信息。使用由庫導出定義的任何源文件只包括其客戶需要了解的有關庫的信息(只包括函數原型)庫代碼client.cppmylib.hmylib.c客戶文件接口文件庫文件managelib.h內容(接口文件)structstudent{ charnum[8]; charname[20];

ints[3];};voiddisplay(student

stu[],int

len);voidsearch(student

stu[],int

len);int

append(student

stu[],int

len);……學生成績管理系統(tǒng)案例的代碼組織managelib.cpp文件(庫文件,包括必要的頭文件)#include"managelib.h"#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"string.h"voiddisplay(student

stu[],int

len){int

i,j;

if(len==0){cout<<"無記錄,按任意鍵返回"<<endl;

getchar();return;}……(略)此處略去前面定義的除主函數外的所有函數運行時將接口文件插入至此,進一步理解文件包含的作用scoremanage.cpp文件內容(客戶文件)#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"string.h"#include"managelib.h"#defineN20voidmain(){……//主函數的具體實現

……}代碼的組織(2)

----面向對象的編程抽象定義一個學生成績管理類scoremanage,將對學生信息管理的操作都作為類的成員函數定義在類體內,組織在文件funlib.h。將類成員函數在類體外實現,組織在funlib.cpp中。structstudent{charnum[8];charname[20];

ints[3];};接口文件funlib.h包括一個student結構類型和一個成績管理類scoremanage的定義classscoremanage{private: studentstu[N];

int

len;public:

scoremanage(studentstu1[],intlen1)//構造函數 { len=len1;

for(inti=0;i<len;i++)

stu[i]=stu1[i]; } voiddisplay(); voidsearch(); voidappend();

……};注意:類的成員函數可直接操作類的成員stu,無需通過參數使用。思考:append函數和del函數的返回值為何為void類型,與前面結構化程序不同?funlib.cpp文件(類的成員函數實現)#include"funlib.h"voidscoremanage::display(){int

i,j;

if(len==0){cout<<"無記錄,按任意鍵返回"<<endl;

getchar();return;}

……//輸出信息的語句略去}其它成員函數實現略成員函數類體外實現類成員,無需也不能重定義#include"funlib.h"voidmain(){ structstudentstu[N];

int

len,i=0;……//通過讀文件獲取stu內容和記錄個數len

scoremanage

sm(stu,len);

……} 客戶文件manmain.cpp創(chuàng)建scoremanage類對象,自動調用構造函數注意對類對象成員函數調用的方法有別于結構化,如:sm.display();面向對象方法的代碼實現請自行完成五、

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論