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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

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

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

ints[3];//三門課成績}若通過數(shù)組實現(xiàn),則定義結(jié)構(gòu)數(shù)組structstudentstu[N];N為已定義過的符號常量若通過單鏈表實現(xiàn),則單鏈表結(jié)點結(jié)構(gòu)定義:structnode{

charnum[8];charname[20];

ints[3];

structnode*next;}3、數(shù)據(jù)結(jié)構(gòu)設(shè)計voiddisplay(student

stu[],int

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

stu[],int

len)

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

del(student

stu[],int

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

stu[],int

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

stu[],int

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

stu[],int

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

stu[],int

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

readfile(student

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

int

len;

intchoice; charch;

len=readfile(stu);//調(diào)用讀文件函數(shù)

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

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

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

cin>>name;

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

if(strcmp(stu[i].name,name)==0){cout<<"學號\t姓名\t語文\t數(shù)學\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();}}?思考:比較按姓名和學號兩種方式查詢的代碼,函數(shù)如何優(yōu)化更簡潔5、append函數(shù)的設(shè)計設(shè)計思路:在學生表中添加新的學生記錄。首先輸入要添加的學生學號,在原表中查找該學號的記錄是否已存在。若已存在,則選擇是否重新輸入新學生記錄,如選擇“是”,則返回①;否則結(jié)束函數(shù)返回主菜單。若原表中不存在該學號的學生,則繼續(xù)輸入要添加的學生的姓名和三門課的成績。添加成功后,學生表的實際長度增加1.根據(jù)上述設(shè)計思路,請自行完成如下形式的函數(shù)設(shè)計int

append(student

stu[],int

len)?思考:該函數(shù)的類型為何要定義為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<<"輸入數(shù)學成績【0~100】:"<<endl;

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

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

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

del(student

stu[],int

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

----結(jié)構(gòu)化C層面上的編程抽象函數(shù)與接口:定義函數(shù)的目的之一是將整個程序分成多個可操作的部分以降低復雜性;接口則是在更高層次上降低復雜性。函數(shù)使其調(diào)用者將訪問需要的一系列步驟組合為一個操作;接口則是使其客戶將訪問需要的一系列函數(shù)實現(xiàn)成一個編程抽象。接口是庫和其客戶間的邊界,提供庫和客戶間的交流渠道,也是分離二者的屏障;在不顯示庫的實現(xiàn)細節(jié)的情況下,為客戶提供有關(guān)使用庫的信息。使用由庫導出定義的任何源文件只包括其客戶需要了解的有關(guān)庫的信息(只包括函數(shù)原型)庫代碼client.cppmylib.hmylib.c客戶文件接口文件庫文件managelib.h內(nèi)容(接口文件)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;}……(略)此處略去前面定義的除主函數(shù)外的所有函數(shù)運行時將接口文件插入至此,進一步理解文件包含的作用scoremanage.cpp文件內(nèi)容(客戶文件)#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"string.h"#include"managelib.h"#defineN20voidmain(){……//主函數(shù)的具體實現(xiàn)

……}代碼的組織(2)

----面向?qū)ο蟮木幊坛橄蠖x一個學生成績管理類scoremanage,將對學生信息管理的操作都作為類的成員函數(shù)定義在類體內(nèi),組織在文件funlib.h。將類成員函數(shù)在類體外實現(xiàn),組織在funlib.cpp中。structstudent{charnum[8];charname[20];

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

int

len;public:

scoremanage(studentstu1[],intlen1)//構(gòu)造函數(shù) { len=len1;

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

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

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

i,j;

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

getchar();return;}

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

int

len,i=0;……//通過讀文件獲取stu內(nèi)容和記錄個數(shù)len

scoremanage

sm(stu,len);

……} 客戶文件manmain.cpp創(chuàng)建scoremanage類對象,自動調(diào)用構(gòu)造函數(shù)注意對類對象成員函數(shù)調(diào)用的方法有別于結(jié)構(gòu)化,如:sm.display();面向?qū)ο蠓椒ǖ拇a實現(xiàn)請自行完成五、

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論