




免費(fèi)預(yù)覽已結(jié)束,剩余20頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
華中科技大學(xué)電子科學(xué)與技術(shù)系課程設(shè)計(jì)報(bào)告名 稱: 軟件課程設(shè)計(jì) 題 目: 學(xué)生成績(jī)管理系統(tǒng) 院 系: 電子科學(xué)與技術(shù)系 班 級(jí): 電子科學(xué)與技術(shù)0606 日期: 2008 年 6月 30日目 錄一、 程序功能說明頁碼1. 主功能說明2. 輔助功能說明3. 程序模塊說明4. 界面說明二、 總體算法設(shè)計(jì)頁碼1. 數(shù)據(jù)存儲(chǔ)文件結(jié)構(gòu)2. 源代碼文件結(jié)構(gòu)三、 詳細(xì)設(shè)計(jì)頁碼函數(shù)說明及程序流程四、 源程序清單.頁碼(由于源代碼有1700多行,不便在報(bào)告中全部列出,因此只列出了核心功能函數(shù)的源代碼)五、測(cè)試結(jié)果 .頁碼六、實(shí)踐體會(huì) .頁碼一程序功能說明本程序可以實(shí)現(xiàn)以下功能1.主功能:1.登錄認(rèn)證和密碼修改2. 自動(dòng)讀取和存儲(chǔ)數(shù)據(jù)3. 添加,刪除,修改學(xué)生信息4. 添加,刪除,修改科目信息5. 添加,刪除,修改分?jǐn)?shù)信息6. 多重搜索(學(xué)生姓名,學(xué)號(hào))7. 按升序或降序顯示所有學(xué)生任一科目的成績(jī)(包括加權(quán)成績(jī))注:程序中可以存儲(chǔ)同名的學(xué)生,但是不允許學(xué)號(hào)相同,因此做了部分處理應(yīng)對(duì)這種情況。當(dāng)搜索某個(gè)同名學(xué)生時(shí),倘若通過姓名搜索,則會(huì)顯示所有該姓名的學(xué)生,然后再通過學(xué)號(hào)確定。2.輔助功能1. 全自動(dòng)生成數(shù)據(jù)。為便于程序測(cè)試,由系統(tǒng)自動(dòng)隨機(jī)生成所有數(shù)據(jù)(包括學(xué)生姓名,學(xué)科的相關(guān)信息,學(xué)生的各科成績(jī)等).(本來想寫一個(gè)程序自動(dòng)測(cè)試腳本的,算法已經(jīng)成熟了,然而精力有限未能完成)3.模塊說明本程序分四個(gè)模塊: 數(shù)據(jù)庫核心功能模塊,數(shù)據(jù)庫輔助功能模塊, 數(shù)據(jù)庫界面功能模塊,自動(dòng)數(shù)據(jù)庫生成模塊。我認(rèn)為數(shù)據(jù)庫核心功能模塊應(yīng)負(fù)責(zé)最底層的文件操作,其他的模塊都是基于核心模塊的應(yīng)用型模塊。模塊間相對(duì)獨(dú)立,以核心功能模塊為主,自動(dòng)數(shù)據(jù)庫生成模塊和數(shù)據(jù)庫界面模塊都需要頻繁調(diào)用核心功能模塊,如此便實(shí)現(xiàn)了功能間的剝離,便于日后的功能擴(kuò)展和程序升級(jí).保證核心功能的健壯性和容錯(cuò)能力相當(dāng)重要。對(duì)此,我采取了一系列措施:對(duì)于每個(gè)傳入的參數(shù)進(jìn)行嚴(yán)格的檢查,包括變量的范圍,指針是否為空,變量是否合法等。如果發(fā)現(xiàn)異常,就設(shè)置錯(cuò)誤myerr并終止程序。我的想法是核心功能模塊不應(yīng)該出現(xiàn)參數(shù)異常的問題,所有的不合法參數(shù)應(yīng)該在上層模塊如界面模塊中就進(jìn)行過濾了,在與用戶交互的過程中,所有輸入的非法參數(shù)都應(yīng)該被過濾,以防非法參數(shù)傳入底層模塊,甚至寫入數(shù)據(jù)庫,造成數(shù)據(jù)庫異常。因此倘若如果經(jīng)過種種措施后,仍然有非法參數(shù)傳入核心模塊,我就認(rèn)為程序異常并發(fā)出終止程序的命令。而倘若是上層模塊出現(xiàn)異常的話,可以返回false標(biāo)志,而不致于立即終止程序。另外為了更方便地分析程序中的功能異常情況,我又采取了一些措施,包括將二進(jìn)制數(shù)據(jù)庫文件重寫入文本文件,從而可以隨時(shí)查看數(shù)據(jù)庫中各變量值,從而迅速地對(duì)錯(cuò)誤進(jìn)行定位。另外我還寫了個(gè)別測(cè)試程序,如showsubinfo(),showlink()等,這些函數(shù)都是在程序莫名其妙地出現(xiàn)異常的情況下為調(diào)試而寫出來的,目的是查看某類型結(jié)構(gòu)體中的各變量的值。程序出現(xiàn)功能異常,大多數(shù)都是變量異常。而結(jié)構(gòu)體中的變量值異常相對(duì)來說比較難查出來,因此我寫了一系列小測(cè)試函數(shù),根據(jù)需要插入代碼中,每當(dāng)執(zhí)行到該處時(shí),就會(huì)將該結(jié)構(gòu)體中各變量顯示出來,錯(cuò)誤一目了然。4.界面說明進(jìn)入程序后首先是登錄界面,初次使用本程序時(shí),會(huì)提示初始密碼,用戶可以在登錄后修改密碼。初次使用時(shí),由于數(shù)據(jù)庫為空,因此系統(tǒng)會(huì)提示添加學(xué)生,其中有一個(gè)選項(xiàng)是系統(tǒng)自動(dòng)生成學(xué)生,該功能是為測(cè)試程序之用。若系統(tǒng)檢測(cè)到數(shù)據(jù)庫中沒有學(xué)科就會(huì)提示用戶添加學(xué)科。之后用戶就可以進(jìn)入完整的功能界面了。在界面方面做了小設(shè)計(jì)。比如當(dāng)數(shù)據(jù)庫中無學(xué)生信息時(shí),界面就只有選項(xiàng)提示用戶添加學(xué)生,之后若系統(tǒng)檢測(cè)到數(shù)據(jù)庫中無科目信息時(shí)再提示用戶添加科目,如果數(shù)據(jù)庫中的科目數(shù)已經(jīng)達(dá)到最大允許值(本程序設(shè)置的最大科目數(shù)為200,可在宏中設(shè)置),則界面中就會(huì)屏蔽掉添加科目這一選項(xiàng),即界面會(huì)隨著數(shù)據(jù)庫中數(shù)據(jù)的情況進(jìn)行適當(dāng)?shù)恼{(diào)整。我認(rèn)為在界面方面尚未將核心功能開發(fā)完全,通過界面的擴(kuò)展,可以實(shí)現(xiàn)更多的功能,從而充分利用核心函數(shù)的功能。為了增加功能的通用性,我盡量將核心功能函數(shù)進(jìn)行部分抽象化,對(duì)不同功能以宏進(jìn)行區(qū)分,這樣可以精簡(jiǎn)代碼,避免代碼重復(fù)和冗余。二.總體算法設(shè)計(jì)1.數(shù)據(jù)存儲(chǔ)文件結(jié)構(gòu)a)本程序的二進(jìn)制存儲(chǔ)文件為stuinfo.dat,文件包含兩個(gè)部分,文件頭和數(shù)據(jù)區(qū),類似于bmp文件結(jié)構(gòu).文件頭中存儲(chǔ)了文件信息,包括學(xué)生數(shù),科目數(shù),冗余塊數(shù),冗余塊的位移地址數(shù)組,以及學(xué)科信息數(shù)組及用戶的登錄密碼.當(dāng)文件進(jìn)行數(shù)據(jù)的操作時(shí)首先要讀入文件頭,當(dāng)數(shù)據(jù)操作完后會(huì)自動(dòng)修改頭文件,頭文件的存在使文件能高效的操作.當(dāng)數(shù)據(jù)塊刪除時(shí),不采取文件大塊數(shù)據(jù)整體移動(dòng)的物理刪除方法,而是采用將數(shù)據(jù)塊的flag標(biāo)志位置零的邏輯刪除方法,同時(shí)將該數(shù)據(jù)塊的起始偏移地址寫入冗余塊數(shù)組中,當(dāng)有新數(shù)據(jù)寫入文件時(shí),則由文件頭中的冗余塊數(shù)組得到某個(gè)冗余塊的偏移地址,然后新數(shù)據(jù)即可寫入該處,而不是簡(jiǎn)單地追加到文件末,此法可以有效地利用文件空間,減少冗余度.b)由于數(shù)據(jù)存儲(chǔ)文件為二進(jìn)制形式,因此當(dāng)對(duì)該文件進(jìn)行數(shù)據(jù)寫入或刪除等操作后,無法掌握是否正確地完成了相關(guān)功能,文件結(jié)構(gòu)是否保持正常.當(dāng)程序出現(xiàn)異常時(shí),無法及時(shí)定位導(dǎo)致異常的數(shù)據(jù)塊,因此另外生成了一個(gè)輔助文件test.txt,將stuinfo.dat文件中的所有變量以文本形式一一寫入test.txt,此法便于調(diào)試程序及對(duì)異常數(shù)據(jù)的準(zhǔn)確定位c)為便于測(cè)試程序,需要首先建立一個(gè)數(shù)據(jù)文件,同時(shí)輸入大量數(shù)據(jù),人工輸入未免過于麻煩,因此我專門寫了個(gè)模塊用于隨機(jī)產(chǎn)生數(shù)據(jù)文件,隨機(jī)產(chǎn)生學(xué)生的姓名,學(xué)號(hào),性別,所有科目的成績(jī),所有學(xué)科的學(xué)分,開課時(shí)間等.隨機(jī)產(chǎn)生字符串時(shí),需要抽取字符進(jìn)行組合,對(duì)于隨機(jī)產(chǎn)生姓名,其長度及字符都是隨機(jī)的,而學(xué)號(hào)由十二位數(shù)字組成,學(xué)生的分?jǐn)?shù),學(xué)科的學(xué)分都為double型,因此產(chǎn)生隨機(jī)整數(shù)乘以0.5,隨機(jī)數(shù)產(chǎn)生時(shí)要嚴(yán)格控制其范圍,如分?jǐn)?shù)不能超過100,學(xué)分不超過6等.(本想使隨機(jī)產(chǎn)生的成績(jī)成正態(tài)分布,且學(xué)生間分?jǐn)?shù)拉開,由于時(shí)間有限,算法研究未成熟,因此只能采用簡(jiǎn)單的隨機(jī)數(shù)生成獲得成績(jī)).2.源代碼結(jié)構(gòu)本程序包含4個(gè)頭文件和五個(gè)C文件,每個(gè)文件功能明確Mydb.h總頭文件,包含程序所涉及的所有頭文件及全局變量Macro.h宏頭文件,包含程序所涉及的所有宏,如文件路徑等Struct.h包含所有結(jié)構(gòu)體的定義Func.h包含所有函數(shù)的聲明Main.c程序主函數(shù)Filefunc.c關(guān)于文件數(shù)據(jù)操作(添加,刪除)的核心函數(shù)(12個(gè)函數(shù))Extrafunc.c關(guān)于附加功能操作的函數(shù),如搜索,排序等(9個(gè)函數(shù))System_gui.c關(guān)于與用戶交互的文本界面函數(shù)(13個(gè)函數(shù))Randrecord.c關(guān)于隨機(jī)產(chǎn)生數(shù)據(jù)的函數(shù)(7個(gè)函數(shù))三. 詳細(xì)算法設(shè)計(jì)及函數(shù)說明a)void seterr(char*);該函數(shù)用于設(shè)置程序中的異常,在代碼關(guān)鍵處出錯(cuò)時(shí),該函數(shù)會(huì)返回錯(cuò)誤原因,便于調(diào)試. void freeparam();該函數(shù)用于文件結(jié)束時(shí)釋放所有全局變量及關(guān)閉所有文件void initfile();該函數(shù)用于初始化數(shù)據(jù)文件,即初始化數(shù)據(jù)文件頭void fcntl(long,int,void*,int);用于對(duì)文件進(jìn)行讀寫操作,將fseek,fread,fwrite集為一體bool addstu(pmystu);用于添加學(xué)生信息(姓名,專業(yè)班級(jí),性別,學(xué)號(hào))bool delstu(long);用于刪除學(xué)生,參數(shù)long為該學(xué)生在文件中的偏移地址bool editstu(long,pmystu);用于編輯已有學(xué)生的信息bool addsub(psubinfo);用于添加學(xué)科信息(學(xué)分,名稱,開課時(shí)間)bool delsub(int);用于刪除學(xué)科信息,參數(shù)為學(xué)科的ID號(hào)bool editsub(psubinfo);用于編輯已有學(xué)科信息bool editmark(psubmark,long);用于編輯學(xué)生某科目的成績(jī),包括(添加,刪除,修改)bool makeavemark(pstuinfo);用于計(jì)算學(xué)生的加權(quán)成績(jī)b) long search(char*,int);用于搜索記錄(通過姓名或?qū)W號(hào)搜索學(xué)生,通過學(xué)科名稱搜索學(xué)科),集數(shù)項(xiàng)搜索功能于一身void showfile();用于將stuinfo.dat二進(jìn)制信息以文本方式寫入test.txt,plink sortlink(plink,int);用于對(duì)單鏈表進(jìn)行排序,int參數(shù)用于表示排序方式plink makelink(plink,double,long);用于將新數(shù)據(jù)接入鏈表,double為學(xué)生的成績(jī),long為學(xué)生的偏移地址plink marklink(int);用于產(chǎn)生鏈表,int用于表示將ID為該參數(shù)的科目成績(jī)產(chǎn)生鏈表void freelink(plink);用于釋放鏈表所有節(jié)點(diǎn)的空間c)void login_gui();用戶登錄界面void changekey_gui();用戶修改密碼界面bool system_gui();總界面,用于調(diào)度所有分界面bool addstu_gui();用于交互添加學(xué)生信息bool editstu_gui();用于交互編輯學(xué)生(包括刪除學(xué)生)bool inputsub_gui();用于交互編輯輸入學(xué)科信息bool editsub_gui();用于編輯學(xué)科信息(包括刪除)bool editmark_gui();用于編輯成績(jī)信息(包括添加,刪除,修改)bool showstu(long,int,int*,int);用于顯示學(xué)生信息(分三種顯示模式,SHOW_PRIV:單人信息顯示模式,只顯示個(gè)人信息,不含成績(jī)信息SHOW_PERMARK:單人成績(jī)顯示模式SHOW_ALLMARK:多人成績(jī)顯示模式 bool search_gui();用于交互搜索記錄bool isschid(char*);用于判斷學(xué)號(hào)是否合法 bool showmark_gui();用于交互顯示成績(jī)plink findstu_gui(char*);用于處理重名的學(xué)生d)void makestu();用于隨機(jī)產(chǎn)生所有學(xué)生信息void makesub();用于隨機(jī)產(chǎn)生學(xué)科信息void makemark();用于隨機(jī)產(chǎn)生成績(jī)信息long myrand(long,long);用于產(chǎn)生所設(shè)范圍的任意大隨機(jī)數(shù)void makeword(char*,char);用于產(chǎn)生隨機(jī)字符串void MakeDataBase();用于產(chǎn)生隨機(jī)數(shù)據(jù)文件bool makemajor(char*);用于隨機(jī)產(chǎn)生專業(yè)四.源程序清單(僅給出核心代碼部分,源代碼在一起提交的文件夾中)typedef char bool;#define FILEPATHc:stuinfo.dat#define INFOPATHc:test.txt#define MAXSPACECOUNT10/系統(tǒng)所記錄的最大冗余塊數(shù)#define MAXSUBCOUNT 20/系統(tǒng)所允許存儲(chǔ)的最多科目數(shù)#define RANDSTUCOUNT100/系統(tǒng)將自動(dòng)產(chǎn)生的學(xué)生個(gè)數(shù)#define RANDSUBCOUNT20/系統(tǒng)將自動(dòng)產(chǎn)生的科目個(gè)數(shù)#define BUFSIZE20/字符緩沖區(qū)大小#define SHOWMAX6/屏幕最大顯示的科目數(shù)#define TRUE1#define FALSE0#define READ0x81#define WRITE0x82#define SEARCH_SCHID0x83/通過學(xué)生的學(xué)號(hào)進(jìn)行搜索#define SEARCH_NAME0x85/通過學(xué)生的姓名進(jìn)行搜索#define SEARCH_SUB0x86/通過學(xué)科的名稱進(jìn)行搜索#define SHOW_PRIV0x87/顯示單個(gè)學(xué)生的個(gè)人信息#define SHOW_PERMARK0x89/顯示單個(gè)學(xué)生的個(gè)人成績(jī)#define SHOW_ALLMARK0x90/顯示所有學(xué)生的某科成績(jī)#define SORT_DECLINE0x92/以降序排列#define SORT_INCLINE0x93/以升序排列#define ALPHAWORD0x94/以字母構(gòu)成的字符串(用于隨機(jī)產(chǎn)生學(xué)生的姓名#define NUMBERWORD0x95/以數(shù)字構(gòu)成的字符串(用于隨機(jī)產(chǎn)生學(xué)號(hào)#define ADDSUB0x96/科目編輯模式為添加#define EDITSUB0x97/科目編輯模式為修改#define BIGNUMBER0x0ffffff/系統(tǒng)延遲采用的循環(huán)中的大數(shù)#define LONGSIZEsizeof(long)#define INTSIZEsizeof(int)#define LINKSIZEsizeof(link)#define STUINFOSIZE sizeof(stuinfo)#define SUBINFOSIZE sizeof(subinfo)#define TCHINFOSIZEsizeof(tchinfo)#define SUBMARKSIZE sizeof(submark)#define FILEINFOSIZE sizeof(fileinfo)#define MYSTUSIZEsizeof(mystu)#define DATASEEK(FILEINFOSIZE+LONGSIZE)#define DATATRANS(STUINFOSIZE+LONGSIZE)#define SETERR(S)printf(S);return FALSE;/顯示出錯(cuò)信息并返回#define NEW(I)(I*)malloc(sizeof(I)/開辟新的內(nèi)存空間typedef struct _submarkinfoboolflag;/flag=0表該塊無效int sub_id;/科目的id號(hào)double sub_mark;/該科目的成績(jī)submark,*psubmark;/科目成績(jī)信息typedef struct _stuchar stu_name20;/學(xué)生姓名char stu_schid20;/學(xué)生學(xué)號(hào)int stu_sex;/學(xué)生性別 0=man 1=womanchar stu_major20;/學(xué)生專業(yè)和班級(jí)(電子0606)mystu,*pmystu;/學(xué)生個(gè)人信息typedef struct _stuinfoboolflag;/flag=0表該生作廢int stu_sysid;/學(xué)生id號(hào)/系統(tǒng)將為每個(gè)學(xué)生產(chǎn)生唯一的ID號(hào)mystustu_privacy;/學(xué)生個(gè)人信息long stu_seek;/在文件中的地址int stu_markcount;/已有的成績(jī)數(shù)doublestu_avemark;/學(xué)生加權(quán)平均分submark stu_markMAXSUBCOUNT;/學(xué)生成績(jī)數(shù)組stuinfo,*pstuinfo;/學(xué)生信息(包括個(gè)人信息和系統(tǒng)信息)typedef struct _subinfobool flag;/flag=0表該塊無效int sub_id;/科目的id號(hào)int sub_term;/科目開課的學(xué)期double sub_rate;/科目所占的學(xué)分char sub_name20;/科目名稱subinfo,*psubinfo;/科目信息typedef struct _fileinfoint stucount;/已注冊(cè)的學(xué)生人數(shù)int countmax;/最大學(xué)生數(shù),用于產(chǎn)生idint spacecount;/文件冗余塊數(shù)long seekMAXSPACECOUNT;/文件冗余塊在文件中的地址int subcount;/已注冊(cè)的科目的個(gè)數(shù)subinfo subMAXSUBCOUNT;/科目信息數(shù)組fileinfo,*pfileinfo;/學(xué)生信息文件頭typedef struct _linkdouble mark;long stuseek;struct _link* next;link,*plink;/該結(jié)構(gòu)體用于產(chǎn)生鏈表/鏈表用于對(duì)成績(jī)排序之用核心功能函數(shù)/本函數(shù)設(shè)置系統(tǒng)錯(cuò)誤,并終止程序void seterr(char*err)memset(void*)myerr,0,errnosize);int n=strlen(err);if(nerrnosize-1)n=errnosize;memcpy(myerr,err,n);printf(nn%snn,err);exit(0);/*本函數(shù)用于清理所有全局變量包括文件指針和全局結(jié)構(gòu)體指針*/void freeparam()if(fp)fclose(fp);fp=NULL;if(myfileinfo)free(myfileinfo);myfileinfo=NULL;if(mystuinfo)free(mystuinfo);mystuinfo=NULL;/本函數(shù)用于對(duì)文件進(jìn)行操作,將常用的文件操作集于一身void fcntl(long seek,int cntlmode,void *pdata,int size)if(!fp)fp=fopen(FILEPATH,rb+);if(!fp)initfile();rewind(fp);fseek(fp,seek,SEEK_SET);if(!pdata)return;if(!size)seterr(fcntl:parameter not matched);switch(cntlmode)case READ:fread(pdata,size,1,fp);break;case WRITE:fwrite(pdata,size,1,fp);break;default:seterr(fcntl:cntlmode invalid);/初始化數(shù)據(jù)庫void initfile()if(!fp)fp=fopen(FILEPATH,wb+);if(!myfileinfo)myfileinfo=NEW(fileinfo);memset(myfileinfo,0,FILEINFOSIZE);myfileinfo-seek0=DATASEEK;int i=0;for(;isubi.sub_id=i+1;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);/添加學(xué)生的核心函數(shù)void addstu(pmystu newstuinfo)if(!newstuinfo)seterr(addstu:newstuinfo null);if(search(newstuinfo-stu_schid,SEARCH_SCHID)seterr(addstu:database schid collision);if(!myfileinfo)myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);int spacecount=myfileinfo-spacecount;if(spacecount=MAXSPACECOUNT)seterr(addstu:parameter invalid);long seek=myfileinfo-seekspacecount;if(spacecount)myfileinfo-seekspacecount=0;myfileinfo-spacecount-;else myfileinfo-seekspacecount+=DATATRANS;if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);memcpy(&(mystuinfo-stu_privacy),newstuinfo,MYSTUSIZE);mystuinfo-stu_seek=seek;mystuinfo-flag=1;int i;mystuinfo-stu_sysid=myfileinfo-countmax+1;for(i=0;istu_marki.sub_id=i+1;fcntl(seek,WRITE,mystuinfo,STUINFOSIZE);myfileinfo-stucount+;myfileinfo-countmax+;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);/刪除學(xué)生的核心函數(shù)void delstu(long delstuseek)if(!delstuseek)seterr(delstu:parameter zero);if(!myfileinfo)myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(delstuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo-flag)seterr(delstu:parameter invalid);mystuinfo-flag=0;fcntl(delstuseek,WRITE,mystuinfo,STUINFOSIZE);myfileinfo-stucount-;myfileinfo-spacecount+;int count=myfileinfo-spacecount;if(countseekcount=delstuseek;else myfileinfo-spacecount-;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);/編輯一個(gè)已存在學(xué)生的核心函數(shù)void editstu(long editstuseek,pmystu tempstu)if(!tempstu)seterr(editstu:parameter null);if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(editstuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo-flag)seterr(editstu:editstu invalid);plink linkhead=search(tempstu-stu_schid,SEARCH_SCHID);if(linkhead&linkhead-data-editstuseek)seterr(editstu:database schid collision);memcpy(&mystuinfo-stu_privacy,tempstu,MYSTUSIZE);fcntl(editstuseek,WRITE,mystuinfo,STUINFOSIZE);/添加新的學(xué)科的核心函數(shù)void addsub(psubinfo newsub)if(!newsub)seterr(addsub:parameter null);if(newsub-sub_termsub_term8)seterr(addsub:parameter invalid);if(newsub-sub_ratesub_rate6)seterr(addsub:parameter invalid);if(search(newsub-sub_name,SEARCH_SUB)seterr(addsub:database sub collision);if(!myfileinfo)myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);int subcount=myfileinfo-subcount;if(subcount=MAXSUBCOUNT)seterr(addsub:subject full);psubinfo psubtemp=myfileinfo-sub;newsub-flag=1;int i;for(i=0;iflag)newsub-sub_id=psubtemp-sub_id;memcpy(psubtemp,newsub,SUBINFOSIZE);break;if(i=MAXSUBCOUNT)seterr(addsub:subject all in use);myfileinfo-subcount+;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);/刪除一個(gè)已經(jīng)存在學(xué)科的核心函數(shù)void delsub(int subid)if(subidMAXSUBCOUNT)seterr(delsub:subid invalid);if(!myfileinfo)myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);if(myfileinfo-subcountsub+subid-1;if(!subtemp-flag)seterr(delsub:flag invalid);subtemp-flag=0;myfileinfo-subcount-;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);if(!mystuinfo)mystuinfo=NEW(stuinfo);long seek=DATASEEK;int i;psubmark marktemp=NULL;for(i=0;istucount;i+,seek+=DATATRANS)fcntl(seek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo-flag)i-;continue;marktemp=mystuinfo-stu_mark+subid-1;if(marktemp-flag)memset(marktemp,0,SUBMARKSIZE);mystuinfo-stu_markcount-;else continue;fcntl(seek,WRITE,mystuinfo,STUINFOSIZE);makeavemark(seek);/編輯一個(gè)已經(jīng)存在的學(xué)科的核心函數(shù)void editsub(psubinfo newsub)if(!newsub)seterr(editsub:newsub null);if(!newsub-flag)seterr(editsub:newsub invalid);int subid=newsub-sub_id;if(subidMAXSUBCOUNT)seterr(editsub:subid invalid);int term=newsub-sub_term;if(term8)seterr(editsub:subterm invalid);double rate=newsub-sub_rate;if(rate6)seterr(editsub:subrate invalid);int size=strlen(newsub-sub_name);if(size=20)newsub-sub_name19=0;if(!myfileinfo)myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);plink linkhead=search(newsub-sub_name,SEARCH_SUB);if(linkhead&linkhead-next)seterr(editsub:search invalid);if(linkhead&linkhead-data-subid)seterr(editsub:database sub collision);newsub-flag=1;psubinfo subtemp=myfileinfo-sub+subid-1;memcpy(subtemp,newsub,SUBINFOSIZE);fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);if(!mystuinfo)mystuinfo=NEW(stuinfo);int count=myfileinfo-stucount;int i;long seek=DATASEEK;for(i=0;iflag)i-;continue;makeavemark(seek);/編輯某學(xué)生某科目的核心函數(shù)void editmark(psubmark newmark,long stuseek)if(!newmark|!stuseek)seterr(addmark:parameter null);int subid=newmark-sub_id;if(subidMAXSUBCOUNT|!subid)seterr(editmark:subid invalid);double mark=newmark-sub_mark;if(mark100)seterr(editmark:submark invalid);if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(stuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo-flag)seterr(editmark:student invalid);psubmark marktemp=mystuinfo-stu_mark+subid-1;int flag1=marktemp-flag,flag2=newmark-flag;if(!flag1&!flag2)seterr(editmark:markflag invalid);memcpy(marktemp,newmark,SUBMARKSIZE);if(!flag1&flag2)mystuinfo-stu_markcount+;if(flag1&!flag2)mystuinfo-stu_markcount-;fcntl(stuseek,WRITE,mystuinfo,STUINFOSIZE);makeavemark(stuseek);/計(jì)算某學(xué)生的加權(quán)分?jǐn)?shù)的核心函數(shù)void makeavemark(long stuseek)if(!stuseek)seterr(makeavemark:parameter null);if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(stuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo-flag)seterr(makeavemark:parameter invalid);if(!myfileinfo)myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);int subcount=myfileinfo-subcount;if(!subcount|!mystuinfo-stu_markcount)mystuinfo-stu_avemark=0;fcntl(mystuinfo-stu_seek,WRITE,mystuinfo,STUINFOSIZE);return;psubinfo subtemp=myfileinfo-sub;psubmark marktemp=mystuinfo-stu_mark;int i;double marksum=0.0,rate,ratesum=0.0;for(i=0;iflag)i-;continue;if(!marktemp-flag)continue;rate=subtemp-sub_rate;ratesum+=rate;marksum+=marktemp-sub_mark*rate;if(ratesum0.1|marksumstu_avemark=0;else mystuinfo-stu_avemark=marksum/ratesum;fcntl(mystuinfo-stu_seek,WRITE,mystuinfo,STUINFOSIZE);/*本函數(shù)承擔(dān)著數(shù)據(jù)庫的所有搜索任務(wù) 包括由組名搜索組的ID,由學(xué)生的姓名和學(xué)號(hào)搜索學(xué)生,并返回該生在文件中的偏移地址*/plink search(char *pdata,int searchtype)if(!myfileinfo)myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);plink linkhead=NULL,linktemp=NULL;if(searchtype=SEARCH_SUB)psubinfo subtemp=myfileinfo-sub;int i;for(i=0;iflag&!strcmp(subtemp-sub_name,pdata)linkhead=NEW(link);memset(linkhead,0,LINKSIZE);linkhead-data=subtemp-sub_id;linkhead-next=NULL;return linkhead;if(strlen(pdata)=19)pdata19=0;if(!mystuinfo)mystuinfo=NEW(stuinfo);long seek=DATASEEK;int count=myfileinfo-stucount,i;for(i=0;iflag)i-;continue;pmystu stutemp=&mystuinfo-stu_privacy;switch(searchtype)case SEARCH_SCHID:if(!strcmp(stutemp-stu_schid,pdata)linkhead=NEW(link);linkhead-data=mystuinfo-stu_seek;linkhead-next=NULL;return linkhead;break;case SEARCH_NAME:if(!strcmp(stutemp-stu_name,pdata)linktemp=NEW(link);linktemp-data=mystuinfo-stu_seek;linktemp-next=linkhead;linkhead=linktemp;break;default:retur
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 法律科技(LawTech)專員考試試卷及答案
- 2025年金溪縣遴選教師考試筆試試題【答案】
- 2025年海水淡化及水處理設(shè)備項(xiàng)目建議書
- 2025年山西省住房和城鄉(xiāng)建設(shè)廳下屬事業(yè)單位招聘考試筆試試題【答案】
- 2025年寧波市奉化區(qū)交通控股集團(tuán)有限公司招聘考試筆試試題【答案】
- 2025年吉林省長白山公安局招聘警務(wù)輔助人員考試試題【答案】
- 2025年南寧市第十三中學(xué)招聘初中頂崗教師考試筆試試題【答案】
- 2025年樂山市沙灣區(qū)婦幼保健院招聘專技人員考試試題【答案】
- 2025年乙酸甲酯項(xiàng)目合作計(jì)劃書
- 大學(xué)生家具廠實(shí)習(xí)報(bào)告范文
- 2025年北京市中考數(shù)學(xué)真題試卷及答案解析
- AI+Agent與Agentic+AI的原理和應(yīng)用洞察與未來展望
- 事故隱患內(nèi)部報(bào)告獎(jiǎng)勵(lì)制度
- 【艾青詩選】批注
- 最新-傷口愈合新進(jìn)展和美容縫合課件
- 調(diào)度系統(tǒng)介紹課件
- tpo41閱讀聽力部分參考答案
- 黑布林The Clever Woman 聰明的婦人公開課課件
- 采購年中工作總結(jié)匯報(bào)PPT(24P)
- 施耐德ATV31變頻器說明書
- 房屋建筑構(gòu)造(地基與基礎(chǔ))課件
評(píng)論
0/150
提交評(píng)論