C語(yǔ)言課程設(shè)計(jì)學(xué)生信息管理系統(tǒng)_第1頁(yè)
C語(yǔ)言課程設(shè)計(jì)學(xué)生信息管理系統(tǒng)_第2頁(yè)
C語(yǔ)言課程設(shè)計(jì)學(xué)生信息管理系統(tǒng)_第3頁(yè)
C語(yǔ)言課程設(shè)計(jì)學(xué)生信息管理系統(tǒng)_第4頁(yè)
C語(yǔ)言課程設(shè)計(jì)學(xué)生信息管理系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩280頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、華中科技大學(xué) 細(xì)節(jié)成就未來(lái)2010/11/20c語(yǔ)言課程設(shè)計(jì)報(bào)告 課程成績(jī)信息管理系統(tǒng) 控制科學(xué)與工程系 自動(dòng)化0902鄒天明 u200914289戴潛 u200914276目錄一.引言41.任務(wù)背景42.編寫(xiě)目的43.任務(wù)概述4 (1)概述4(2)目標(biāo)4(3)軟件性能概述4二.功能及操作介紹51.系統(tǒng)用戶對(duì)象及各自功能52.系統(tǒng)界面5(1)登錄界面(login system)5(2)注冊(cè)界面6(3)學(xué)生主界面(student system)6三、程序流程71.程序扼要流程72.學(xué)生用戶類型流程83.教師用戶類型流程84.管理員類型流程9四、系統(tǒng)模塊分析91.整體模塊關(guān)系92.菜單模塊10(1

2、)本模塊功能10(2)模塊內(nèi)部設(shè)計(jì)10(3)本模塊重要結(jié)構(gòu)體設(shè)計(jì)12(4)本模塊重要函數(shù)設(shè)計(jì)152.鏈表模塊183.文件模塊18(1)文件模塊組成18(2)模塊內(nèi)部機(jī)制19五核心算法分析221.事件的觸發(fā)算法222.信息的保存及判定233.鼠標(biāo)右鍵彈出快捷菜單25六程序制作過(guò)程難點(diǎn)分析251.內(nèi)存問(wèn)題252.登分問(wèn)題25七.不足之處26八.編程分工26九程序設(shè)計(jì)心得261.戴潛262.鄒天明26十參考資料26十一程序源代碼27class.h27class.cpp28depart.h33depart.cpp34manger.h39manger.cpp40student.h42student.cp

3、p44teacher.h52teacher.cpp54page.h61page.cpp62conmicro.h67conmicro.cpp68initgra.h70initgra.cpp70message.h72message.cpp73position.h76mouse.h76mouse.cpp78menuid.h87conmenu.h90conmenu.cpp91menusys.h112menusys.cpp113stumenu.h135stumenu.cpp137teamenu.h175teamenu.cpp177mammenu.h217mammenu.cpp219window.h247

4、window.cpp251test.cpp287一.引言1.任務(wù)背景21世紀(jì)以來(lái),人類經(jīng)濟(jì)高速發(fā)展,人們發(fā)生了日新月異的變化,特別是計(jì)算機(jī)的應(yīng)用及普及到經(jīng)濟(jì)和社會(huì)生活的各個(gè)領(lǐng)域。使原本的舊的管理方法越來(lái)越不適應(yīng)現(xiàn)在社會(huì)的發(fā)展。許多人還停留在以前的手工操作。這大大地阻礙了人類經(jīng)濟(jì)的發(fā)展。為了適應(yīng)現(xiàn)代社會(huì)人們高度強(qiáng)烈的時(shí)間觀念,學(xué)校信息管理系統(tǒng)軟件為學(xué)校辦公室?guī)?lái)了極大的方便。在我國(guó),學(xué)生信息管理系統(tǒng)并非一個(gè)新的課題,雖然計(jì)算機(jī)技術(shù)在日新月異的發(fā)展,但是有的很多學(xué)校,學(xué)校的信息管理都依然由手工操作來(lái)完成,這種方法效率極低,而且容易出錯(cuò)。隨著社會(huì)的發(fā)展,信息化是社會(huì)進(jìn)程的必然趨勢(shì),學(xué)校的信息管理只有

5、自動(dòng)化,高效化才能發(fā)揮其價(jià)值。有些學(xué)校雖使用了計(jì)算機(jī)管理學(xué)生信息,但是系統(tǒng)不完善到處是漏洞,信息往往不能同步更新,有時(shí)甚至出錯(cuò),這樣極不完善的系統(tǒng)對(duì)管理來(lái)說(shuō)是沒(méi)有任何保障的。因此,提出一個(gè)新型,高效的學(xué)生成績(jī)管理系統(tǒng)是非常必要的。2.編寫(xiě)目的此次c語(yǔ)言課程設(shè)計(jì)是具有控制系特色的一次課程設(shè)計(jì),具有重要的意義:通過(guò)上個(gè)學(xué)期對(duì)c語(yǔ)言的學(xué)習(xí),對(duì)c語(yǔ)言編程有了初步的了解,獲得了一定的基礎(chǔ)但是非常缺乏實(shí)際的編程經(jīng)驗(yàn),無(wú)法從質(zhì)上對(duì)自己的編程技巧有一個(gè)很大的提高,這次的課程設(shè)計(jì)給我們提供了一個(gè)非常好的鍛煉機(jī)會(huì)。通過(guò)二個(gè)人的分工合作,在實(shí)際中運(yùn)用和訓(xùn)練程序設(shè)計(jì)的模塊化和工程化思想和技術(shù),努力掌握c語(yǔ)言精髓;同時(shí)

6、提高自己的交流與團(tuán)隊(duì)合作的能力。為以后的更專業(yè)更復(fù)雜的課程設(shè)計(jì)和實(shí)踐活動(dòng)打好基礎(chǔ)。3.任務(wù)概述(1)概述本軟件是將現(xiàn)代化的計(jì)算機(jī)技術(shù)和傳統(tǒng)的教學(xué)、教務(wù)工作相結(jié)合,按照學(xué)院的工作流程設(shè)計(jì)完成的.完全實(shí)現(xiàn)了工作過(guò)程的計(jì)算機(jī)化,提高了工作效率和工作質(zhì)量,為管理員更好地決策有一定幫助.(2)目標(biāo) 本軟件旨在幫助教務(wù)人員更好地對(duì)學(xué)生進(jìn)行管理, 教務(wù)人員首先編排班級(jí),對(duì)學(xué)生進(jìn)行基本的信息錄入,再由任課老師對(duì)成績(jī)進(jìn)行錄入。教務(wù)處、任課老師跟據(jù)實(shí)際情況對(duì)錄入的成績(jī)進(jìn)行維護(hù),各位同學(xué)對(duì)以上錄入的信息可以跟據(jù)自己的需要進(jìn)行適當(dāng)?shù)牟樵儭Mㄟ^(guò)軟件的開(kāi)發(fā)過(guò)程,了解掌握軟件開(kāi)發(fā)的基本流程,培養(yǎng)團(tuán)隊(duì)合作的能力。(3)軟件性

7、能概述1)靈活性該系統(tǒng)給予tc2.0和bc31開(kāi)發(fā),適用于dos3.0以上的所有dos版本和windows操作系;本軟件設(shè)計(jì)中加入了鼠標(biāo)和鍵盤(pán)操作,因此操作過(guò)程必須依賴鼠標(biāo)和鍵盤(pán)才能實(shí)現(xiàn)所有功能;本軟件對(duì)于顯卡無(wú)特殊要求。2)輸入輸出由于本軟件由用戶輸入各種數(shù)據(jù)較多,因此采用全英文模式輸入和輸出。3)錯(cuò)誤檢測(cè)整個(gè)系統(tǒng)對(duì)用戶的各種可能的輸入做了各種檢測(cè)和限制,能夠及時(shí)以警示的方式提醒其錯(cuò)誤操作,大大提高了系統(tǒng)運(yùn)行的穩(wěn)定性。二.功能及操作介紹1.系統(tǒng)用戶對(duì)象及各自功能 本系統(tǒng)面向三種用戶,分別有不同的權(quán)限,具體如下: 普通學(xué)生:可以通過(guò)注冊(cè)本系統(tǒng),實(shí)現(xiàn)查詢自己信息,修改自己信息,查詢課表,查詢分?jǐn)?shù)

8、,選課、查詢自己教師信息的功能。普通教師:可以通過(guò)注冊(cè)本系統(tǒng),實(shí)現(xiàn)查詢自己信息,修改自己信息,查詢自己課程安排,查詢自己學(xué)生信息,登記分?jǐn)?shù)功能。系統(tǒng)管理員:最主要功能是發(fā)布課表,和院系,包括正常課表和選修課表。2.系統(tǒng)界面(1)登錄界面(login system)說(shuō)明:在當(dāng)前界面,用戶可以選擇登錄方式(即學(xué)生還是老師)進(jìn)入自己的主界面,管理員無(wú)需選擇自己的登錄方式而按默認(rèn)的用戶名admin即可登錄(其它類型用戶無(wú)法注冊(cè)該用戶名),用戶也可以通過(guò)register按鈕進(jìn)入注冊(cè)界面。同時(shí),點(diǎn)擊quit鍵即可退出當(dāng)前程序。若用戶輸入錯(cuò)誤則會(huì)彈出警告框,點(diǎn)擊ok重新輸入。(2)注冊(cè)界面說(shuō)明:在當(dāng)前界面,

9、用戶可以注冊(cè)自己的信息,若輸入信息不完整則會(huì)彈出警告框,此時(shí)點(diǎn)擊ok鍵即可重新輸入信息。若用戶名或者用戶id已經(jīng)注冊(cè),也會(huì)彈出警告框,此時(shí)應(yīng)修改自己的用戶名方能成功注冊(cè)。點(diǎn)擊back鍵可以返回至登錄界面,點(diǎn)擊quit鍵可以退出當(dāng)前程序。(3)學(xué)生主界面(student system)說(shuō)明:在當(dāng)前界面,用戶在主菜單欄有5個(gè)選項(xiàng),依次是information,class,score,help,about選項(xiàng)。下面來(lái)詳細(xì)介紹個(gè)選項(xiàng)的功能。1)information該項(xiàng)菜單有3項(xiàng)子菜單,分別是my information,edit information,login again,exit。第一項(xiàng)可以查

10、看自己的所有當(dāng)前信息,第三項(xiàng)可以重新進(jìn)入登錄界面,第二項(xiàng)可以編輯自己的信息,最后一項(xiàng)可退出系統(tǒng)。點(diǎn)擊edit information后將出現(xiàn)如下界面:從左邊起第1項(xiàng)為編輯個(gè)人基本信息(base information),第2項(xiàng)為編輯個(gè)人學(xué)校信息(school information),第3項(xiàng)為編輯個(gè)人登錄密碼(password),各項(xiàng)信息編輯完畢后務(wù)必點(diǎn)擊save鍵保存。2)class該項(xiàng)菜單有3項(xiàng)子菜單,分別是class table,my teacher,choose class。第一項(xiàng)可以查看自己的所有當(dāng)前課程信息,第二項(xiàng)可以查看自己的老師,第三項(xiàng)可以選修課程。3)score該項(xiàng)有一項(xiàng)子菜

11、單,學(xué)生點(diǎn)擊后可查看自己所有科目的分?jǐn)?shù)。4)help點(diǎn)擊該項(xiàng)會(huì)出現(xiàn)一個(gè)矩形框,幫助信息將會(huì)從矩形框底部緩慢向上浮現(xiàn),此時(shí)鼠標(biāo)將暫時(shí)停止響應(yīng),直到幫助信息輸出完畢。5)about點(diǎn)擊該項(xiàng)會(huì)出現(xiàn)一個(gè)矩形框,字符信息將會(huì)從矩形框底部緩慢向上浮現(xiàn),此時(shí)鼠標(biāo)將暫時(shí)停止響應(yīng),直到字符信息輸出完畢。注:當(dāng)前界面支持鼠標(biāo)右鍵,點(diǎn)擊后彈出快捷菜單,功能上面已提到。管理員界面及教師界面和學(xué)生界面類似,管理員擁有發(fā)布課表,新建院系的權(quán)限,且其發(fā)布的課程和院系會(huì)同步更新至文件中。教師擁有登分權(quán)限,他可以找到自己學(xué)生的所有課程,并選擇自己所教授的課程登記分?jǐn)?shù)。保存在學(xué)生相應(yīng)學(xué)生文件中內(nèi)。三、程序流程 1.程序扼要流程

12、程序扼要流程圖2.學(xué)生用戶類型流程 學(xué)生用戶流程圖3.教師用戶類型流程 教師用戶流程圖4.管理員類型流程 . 管理員類型流程圖四、系統(tǒng)模塊分析 1.整體模塊關(guān)系 整個(gè)程序由菜單、文件和鏈表模塊組成模塊關(guān)系圖 2.菜單模塊 (1)本模塊功能對(duì)用戶操作作出響應(yīng),返回用戶輸入信息,打印邏輯層結(jié)果至屏幕。如下圖: 菜單作用示意圖(2)模塊內(nèi)部設(shè)計(jì) 程序運(yùn)行時(shí),將建立一個(gè)界面對(duì)象鏈表,將所有當(dāng)前界面上處于激活狀態(tài)的窗口對(duì)象加入該連表。同時(shí)由一事件檢測(cè)函數(shù)不斷檢測(cè)用戶的鼠標(biāo)和鍵盤(pán)事件,一旦發(fā)生,則將該事件的信息讀入一msg結(jié)構(gòu)體并傳入事件處理函數(shù)。事件處理函數(shù)將對(duì)當(dāng)前鏈表逐一檢測(cè)直到有節(jié)點(diǎn)能對(duì)該事件作出響

13、應(yīng),或者所有節(jié)點(diǎn)對(duì)此都無(wú)響應(yīng),則進(jìn)入下一事件循環(huán)。窗口對(duì)象響應(yīng)事件時(shí)除了自身響應(yīng)外,還將判斷是否擊發(fā)與自身關(guān)聯(lián)的窗口處理函數(shù),若擊發(fā),則返回自己的窗口id至一窗口處理函數(shù)分發(fā)函數(shù)(eventpro)中,該函數(shù)將根據(jù)獲得的窗口id調(diào)用對(duì)應(yīng)的窗口函數(shù)以完成響應(yīng)。 由此可見(jiàn),事實(shí)上window process distribution function就是界面模塊與邏輯層的接口,通過(guò)它實(shí)現(xiàn)與下層的交流。 界面模塊內(nèi)部關(guān)系圖窗口鏈表運(yùn)行示意圖(3)本模塊重要結(jié)構(gòu)體設(shè)計(jì)1)window 結(jié)構(gòu)體負(fù)責(zé)所有界面對(duì)象的繪制,包括下拉菜單,按鈕和文本輸入框。擁有共同的的窗口響應(yīng)函數(shù)和獨(dú)立的窗口處理函數(shù),后者通過(guò)窗

14、口id相互關(guān)聯(lián)。#define title_length 50#define textdialog 0#define button 1#define down_menu_header 2#define down_menu_body 3#define down_text_dialog 4#define warning_window 5#define right_button_menu 6 #define choose_circle 7#define password_dialog 8 #define no_window_pro_stop_check -1#define no_window_pro

15、_continue_check -2#define no_window_action_continue_check -3#define menu_restore_background -4#define dialog_move_cursor -5#define max_dialog_show_length 50#define max_input_length 31#define backspace 8#define enter 13#define bk_color blue#define button_color 24#define button_color_light 7#define bu

16、tton_color_dark 8#define button_length 50#define button_height 25#define down_menu_body_length 200#define down_menu_body_height 25#define text_dialog_length 250typedef struct tagwindowstposition top;/菜單定點(diǎn)坐標(biāo)/窗口拖動(dòng)時(shí),記錄與鼠標(biāo)當(dāng)前位置的相對(duì)坐標(biāo)stposition mousepositionwhenleftkit;/窗口長(zhǎng)度int nlength;/窗口高度int nheight; /記

17、錄該窗口是否有父窗口int nhavefather ; /若該窗口擁有父窗口,該項(xiàng)記錄父窗口idint nfatherid; /光標(biāo)閃爍中,記錄累計(jì)次數(shù),以獲得延時(shí)功能unsigned long int nlaytime;/*identify this windows id in this system*/unsigned int nmenuid;/*identify the kind of the window object*/int nkind; /是否繪出窗口int ndraw; /窗口是否在鼠標(biāo)的點(diǎn)擊下開(kāi)始移動(dòng)int nstartmove; /窗口標(biāo)題char actitletitle

18、_length;/*when window object is a text dialog, keep the string inputed in this character array*/char acinputtextdialogmax_input_length;/*when window object is a text dialog,keep the string length inputed in this character array*/int ntextlength;/*identify the window is or not active*/int nactive; /按

19、紐是否被按下int npress; /是否獲得用戶輸入文本int ngetinputtext; /下拉框是否處于下拉狀態(tài)int nmenudown; /該窗口是否需要加入當(dāng)前事件檢測(cè)int ncheckevent; /保存需要保存背景的窗口的背景void far *pimage; /指向下一窗口節(jié)點(diǎn)指針struct tagwindow*pnextwindow; /指向上一窗口借點(diǎn)指針struct tagwindow*plastwindow;/*draw the window object*/void (*pfdrawwindow)(struct tagwindow*); /函數(shù)指針, 內(nèi)部事件

20、響應(yīng)函數(shù)int(*pfeventselfaction)(structtagwindow*,struct tagmessage*,struct tagmouse*); /函數(shù)指針,判斷鼠標(biāo)是否在當(dāng)前窗口上int ( *pfismouseinside)(struct tagwindow*,struct tagmessage*); /函數(shù)指針,恢復(fù)當(dāng)前窗口背景void (*pfputimage)(struct tagwindow* ); stwindow;2)坐標(biāo)結(jié)構(gòu)體記錄屏幕坐標(biāo) /*坐標(biāo)結(jié)構(gòu)體*/ typedef struct tagpositionint nx;int ny;stpositio

21、n;3)message 結(jié)構(gòu)體事件檢測(cè)函數(shù)檢測(cè)到事件發(fā)生后就將事件填充入該結(jié)構(gòu)體并向下傳遞。typedef struct tagmessage /當(dāng)前鼠標(biāo)的坐標(biāo)stposition mouse_position; /判斷鼠標(biāo)鍵擊int nbutton; /判斷鍵盤(pán)鍵擊int nkbhit; /若有鍵盤(pán)事件,該值保存輸入的字符ascii碼int nkeyinput;/*store the key value*/ /判斷鼠標(biāo)是否移動(dòng)int nmousemove; /是否重新檢測(cè)當(dāng)前事件int nbacktoheader ; / 指向當(dāng)前學(xué)生用戶 struct tagstudent * pstcur

22、rstudent ; /指向當(dāng)前教師用戶 struct tagteacher* pstcurrteacher ; /指向當(dāng)前管理員 struct tagmanger* pstcurrmanger ; /指向某個(gè)系別 struct tagdepartment * pstdepartment ;stmessage;(4)本模塊重要函數(shù)設(shè)計(jì) #define no_window_pro_stop_check -1#define no_window_pro_continue_check -2#define no_window_action_continue_check -3#define menu_re

23、store_background -4#define dialog_move_cursor -51)窗口事件內(nèi)部響應(yīng)函數(shù)隸屬于窗口對(duì)象,對(duì)能夠作出響應(yīng)的事件作出窗口響應(yīng)int eventselfaction(struct tagwindow*pstcurrwindow,struct tagmessage*pstmsg,struct tagmouse*pstmouse) switch (pstcurrwindow-nkind) /判斷窗口類型,轉(zhuǎn)入相應(yīng)的處理函數(shù)case textdialog : /文本輸入框和密碼輸入框case password_dialog : textdialogevent

24、selfaction(pstcurrwindow,pstmsg,pstmouse);break;case button: /普通按鈕if(tru= buttoneventselfaction(pstcurrwindow,pstmsg,pstmouse)return pstcurrwindow-nmenuid;break; /下拉框頭部case down_menu_header:if(true=downmenuheaderselfaction(pstcurrwindow,pstmsg,pstmouse)return pstcurrwindow-nmenuid;break; /下拉框體case d

25、own_menu_body:if(true=downmenubodyselfaction(pstcurrwindow,pstmsg,pstmouse)return pstcurrwindow-nmenuid;break; /下拉文本框case down_text_dialog:if(true=downtextdialogselfaction(pstcurrwindow,pstmsg,pstmouse)return pstcurrwindow-nmenuid;break; /警告框case warning_window:if(true=warningwindowselfaction(pstcur

26、rwindow,pstmsg,pstmouse)return pstcurrwindow-nmenuid;break; /右鍵快捷菜單case right_button_menu:if(true=rightbuttonmenuselfaction(pstcurrwindow,pstmsg,pstmouse)return pstcurrwindow-nmenuid;break; /雙選框case choose_circle:if(true=choosecircleselfaction(pstcurrwindow,pstmsg,pstmouse)return pstcurrwindow-nmenu

27、id;break;return false;2)外部事件處理函數(shù)獲得msg并逐一檢測(cè),檢測(cè)到對(duì)應(yīng)節(jié)點(diǎn)后將調(diào)用該節(jié)點(diǎn)的selfeventaction函數(shù),根據(jù)返回結(jié)果判斷是否需要調(diào)用windowpro 函數(shù)。int eventpro(struct tagwindow*pstmenuheader, struct tagmessage*pstmsg,struct tagmouse*pstmouse)stwindow* pstwindownode=pstmenuheader-pnextwindow;while (null != pstwindownode ) /*if this node should

28、 be checked , call its self function first*/if(true = pstwindownode-ncheckevent)if (pstwindownode-pfeventselfaction(pstwindownode,pstmsg,pstmouse) 0) /*if the return value of the self action function is bigger than zero ,implying that this windows process function should be called*/windowstupro( pst

29、windownode,pstmsg,pstmouse);windowmanpro( pstwindownode,pstmsg,pstmouse);windowteapro( pstwindownode,pstmsg,pstmouse);/*if this value is true ,back the check pointer tolist header to recheck the event */if (true = pstmsg-nbacktoheader)pstwindownode=pstmenuheader-pnextwindow;pstmsg-nbacktoheader = fa

30、lse ;windowloginpro( pstwindownode,pstmsg,pstmouse); /*check next node*/if (null != pstwindownode) pstwindownode = pstwindownode-pnextwindow ;return true;2.鏈表模塊 在最初階段,我們程序的整個(gè)包括菜單、學(xué)生、教師等信息都是在程序開(kāi)始運(yùn)行時(shí)讀入鏈表再對(duì)其進(jìn)行各種操作的,雖然方便,但是這樣很塊就出現(xiàn)了問(wèn)題:內(nèi)存不夠。而且這種方案也不符合現(xiàn)實(shí)情況,對(duì)于一個(gè)信息管理系統(tǒng)系統(tǒng),其管理的是大量的信息,不可能依賴將各種文件讀入內(nèi)存的方法來(lái)進(jìn)行管理,所以我

31、們轉(zhuǎn)為直接對(duì)文件進(jìn)行操作,雖然復(fù)雜性增加,但是更加符合實(shí)際情況,改革時(shí),我們保留原來(lái)的借口不變,只是在下層改變信息獲取和修改方法,從而做到了對(duì)上層的細(xì)節(jié)隱藏,這樣也很方便程序的改進(jìn),是模塊化的典型優(yōu)勢(shì)。最終整個(gè)鏈表模塊只在菜單系統(tǒng)中應(yīng)用,通過(guò)一雙向鏈表來(lái)對(duì)各菜單節(jié)點(diǎn)進(jìn)行操作,其原理在菜單模塊中已有詳細(xì)圖解,此不贅述。3.文件模塊 為了實(shí)現(xiàn)大規(guī)模的信息管理,整個(gè)系統(tǒng)幾乎都是直接對(duì)文件進(jìn)行查找,修改,刪除等操作。(1)文件模塊組成1) student.dat 教師信息存儲(chǔ)文件 2) teacher.dat 課表存儲(chǔ)文件 3) class.dat 系別存儲(chǔ)文件 4)department.dat 系統(tǒng)

32、管理員信息存儲(chǔ)文件 5) manger.dat(2)模塊內(nèi)部機(jī)制1)savexxtofile 事實(shí)上該函數(shù)已經(jīng)暗含了修改功能,當(dāng)將某結(jié)構(gòu)體寫(xiě)入文件時(shí),其將先查找文件中是否已有結(jié)構(gòu)體,若有則將文件指針定位到該處將該結(jié)構(gòu)體重寫(xiě)一遍,否則將新結(jié)構(gòu)體添加到文件末尾。保存文件原理圖2)getxxfromyyfile讀取文件原理圖3)文件內(nèi)部組成 文件內(nèi)部組成圖每個(gè)文件開(kāi)始初記錄該文件保存的項(xiàng)目數(shù),文件指針通過(guò)讀取該數(shù)據(jù),可以很方便的將其自身定位到所需要之處。五核心算法分析1.事件的觸發(fā)算法因?yàn)槲覀兊某绦蚴腔诖翱谑录z測(cè)而產(chǎn)生相應(yīng)反饋的,因此若想添加某項(xiàng)功能,只需把與這項(xiàng)功能對(duì)應(yīng)的窗結(jié)構(gòu)體加入當(dāng)前事件檢

33、測(cè)鏈表,再加上對(duì)應(yīng)的自反應(yīng)函數(shù)和窗口處理函數(shù)即可,若該功能無(wú)需激發(fā)窗口處理函數(shù),則無(wú)需添加。這樣看來(lái),各個(gè)在同一層次的功能之間實(shí)現(xiàn)方法則完全相同。例如登錄系統(tǒng)中的輸入框,我們先把它加入當(dāng)前事件監(jiān)測(cè)鏈表,用如下函數(shù):struct tagwindow* getnewwindow(int nx,int ny,int nlength,int nheight, int nkind,unsigned long int nmenuid,char* pactitle) /*allocate memory to this window*/ struct tagwindow* pstcurrwindow;if(p

34、stcurrwindow=(struct tagwindow*)malloc(1*sizeof(struct tagwindow)=null)printf(no enough memory);exit(1);/*init the varible in the window*/pstcurrwindow-top.nx = nx;pstcurrwindow-top.ny= ny;pstcurrwindow-mousepositionwhenleftkit.nx=0; pstcurrwindow-mousepositionwhenleftkit.ny=0;pstcurrwindow-nactive

35、= false;pstcurrwindow-nfatherid = 0;pstcurrwindow-nhavefather = false;pstcurrwindow-nheight=nheight;pstcurrwindow-nlength=nlength;pstcurrwindow-nmenuid=nmenuid;pstcurrwindow-npress = false ; pstcurrwindow-nkind=nkind;pstcurrwindow-ngetinputtext = false;pstcurrwindow-ntextlength = 0 ;pstcurrwindow-nl

36、aytime = 0;pstcurrwindow-nmenudown = false;pstcurrwindow-nstartmove = false;pstcurrwindow-ndraw = false;pstcurrwindow-pimage = null;pstcurrwindow-ncheckevent = true;strcpy(pstcurrwindow-actitle,pactitle);pstcurrwindow-pfdrawwindow=drawwindow; pstcurrwindow-pfismouseinside=ismouseinside;pstcurrwindow

37、-pfeventselfaction=eventselfaction; pstcurrwindow-pfputimage = putimage; return pstcurrwindow;函數(shù)在初始化窗口時(shí)pstcurrwindow-pfeventselfaction=eventselfaction;這樣事件檢測(cè)函數(shù)就會(huì)知道當(dāng)前鼠標(biāo)位置在窗體內(nèi)時(shí)激發(fā)該窗體自反應(yīng)函數(shù)。而具體調(diào)用何種函數(shù)則是根據(jù)窗體的nkind來(lái)判斷的。若調(diào)用自反應(yīng)函數(shù)后返回值為false,則不激發(fā)窗口處理函數(shù),若為true則激發(fā)。具體激發(fā)那個(gè)函數(shù)則有siwtch語(yǔ)句來(lái)判定(若該窗體有父窗口則調(diào)用其父窗口處理函數(shù))。下圖表示注冊(cè)

38、界面中department下拉文本框的處理過(guò)程。下拉文本框的處理過(guò)程2.信息的保存及判定當(dāng)對(duì)話框?yàn)槲谋究蚧蛳吕驎r(shí),用戶輸入的信息只保存在屬于自己的窗口結(jié)構(gòu)體中,而要想集中保存或判定則要借助另外一個(gè)窗體,我們把他們叫做okbotton,其窗口處理函數(shù)將通過(guò)如下函數(shù)找到要保存的信息所屬于的窗口節(jié)點(diǎn),并對(duì)節(jié)點(diǎn)中的信息進(jìn)行判定或保存。stwindow*findnodebyid(stwindow*pstcurrwindow,unsigned long int unmeneid )stwindow*pstmenuheader = getmenuheader(pstcurrwindow);while (n

39、ull != pstmenuheader )if ( unmeneid = pstmenuheader-nmenuid)return pstmenuheader;pstmenuheader = pstmenuheader-pnextwindow;return null;下圖表示在登陸界面中信息的判定過(guò)程:登陸界面中信息的判定過(guò)程3.鼠標(biāo)右鍵彈出快捷菜單關(guān)于鼠標(biāo)右鍵的問(wèn)題我們提出了幾種方案,最終敲定了以下方案,其實(shí)是對(duì)第一點(diǎn)深度理解后的運(yùn)用。我們把鼠標(biāo)右鍵也對(duì)應(yīng)一個(gè)窗體,不過(guò)這個(gè)窗體是虛擬的,并不把它畫(huà)出來(lái),而且其大小跟電腦全屏幕接近,且把它的等級(jí)定位主菜單等級(jí),自反應(yīng)函數(shù)只是返回一個(gè)true,

40、從而可以直接激發(fā)窗口處理函數(shù)。 以下為學(xué)生界面中該窗體節(jié)點(diǎn)的定義,自反應(yīng)函數(shù)以及窗口處理函數(shù):stwindow*pstrightmenu116=getnewwindow(483,22,116,25,right_button_menu,student_rightbutton_menu,about); /內(nèi)部反應(yīng)函數(shù),由于該窗口本身是虛擬的,故僅返回tre 以激發(fā)對(duì)應(yīng)外部/事件處理函數(shù)int rightbuttonmenuselfaction(struct tagwindow*pstcurrwindow, struct tagmessage*pstmsg,struct tagmouse*pstmo

41、use) return true ; /外部事件處理函數(shù)int winprofunc116(struct tagwindow*pstcurrwindow,struct tagmessage*pstmsg,struct tagmouse*pstmouse)六程序制作過(guò)程難點(diǎn)分析 1.內(nèi)存問(wèn)題內(nèi)存不夠的問(wèn)題可以說(shuō)是貫穿的整個(gè)課程設(shè)計(jì),其中最大的一次滑鐵盧是我們?cè)朐谟脩舻卿浿螅雅c他相同類型的用戶信息全部存入一個(gè)鏈表,在用戶退出程序時(shí)在釋放該鏈表。當(dāng)我們用這種思想編寫(xiě),只有管理員能成功登錄,老師和學(xué)生登陸后程序會(huì)立刻跳出。最后我們意識(shí)到是內(nèi)存不夠的問(wèn)題,便馬上調(diào)整了思路,改成從與當(dāng)前用戶同類型的

42、文件里直接讀取和寫(xiě)入信息,這就涉及到了對(duì)文件的精確操作,我們最終克服了困難。還有一個(gè)有趣的事情是對(duì)malloc函數(shù)的理解問(wèn)題,就是我們發(fā)現(xiàn)malloc能成功分配的內(nèi)存與其理論值有很大的出入,最后我們了解到那些庫(kù)函數(shù)只不過(guò)是一些你我一樣的程序員編寫(xiě)的,所以說(shuō)不可能你要多大的內(nèi)存他就會(huì)提供,例外由于我們用的編譯器的局限性,進(jìn)一步限制了我們可分配的內(nèi)存。 2.登分問(wèn)題表面看只是登分的問(wèn)題,隱藏在其背后的卻是信息查找的紊亂問(wèn)題。之前,如果我們想通過(guò)老師來(lái)查找自己的學(xué)生,就必須先找到當(dāng)前學(xué)生文件中所有學(xué)生的department,然后一個(gè)個(gè)與自己的department比較,進(jìn)而找到自己的學(xué)生,這就必須繞兩

43、個(gè)圈子。當(dāng)老師想登分是,就必訓(xùn)繞三個(gè)圈子,這樣既麻煩有容易出錯(cuò)。這就造成了我們的程序好久都沒(méi)有進(jìn)展,最后我們想到可以把教師和學(xué)生的課程保存至其結(jié)構(gòu)體中,這樣,一個(gè)學(xué)生的結(jié)構(gòu)體就比原來(lái)增加了7倍,但我們做多至保留一個(gè)學(xué)生或老師的結(jié)構(gòu)體在message結(jié)構(gòu)體中,內(nèi)存事實(shí)足夠的。所以現(xiàn)在查找信息就變得清洗和簡(jiǎn)單了。七.不足之處八.編程分工 鄒天明 整體設(shè)計(jì) 、代碼編寫(xiě) 戴潛 頁(yè)面設(shè)計(jì)、 功能點(diǎn)實(shí)現(xiàn) 、代碼編寫(xiě)九程序設(shè)計(jì)心得1.戴潛 通過(guò)這13周的c語(yǔ)言課程設(shè)計(jì),我們學(xué)到了很多東西,對(duì)c語(yǔ)言也有了更深入的了解。在對(duì)整個(gè)程序架構(gòu)之前,為了使整個(gè)程序有更好的擴(kuò)展性,我們拋棄了傳統(tǒng)的方法,而創(chuàng)造性地采用了類

44、似于windows的事件響應(yīng)機(jī)制,這對(duì)我們來(lái)說(shuō)是一次嘗試,也是一個(gè)挑戰(zhàn),所幸的是最后我們成功了。 我們的課題是學(xué)生信息管理系統(tǒng),它涉及到圖形繪制,文件,鏈表方面的知識(shí),但在上學(xué)期c語(yǔ)言的學(xué)習(xí)中,我們對(duì)這些東西還不熟悉,所以只能邊學(xué)習(xí)邊編程。這正好增強(qiáng)了我們獨(dú)立學(xué)習(xí),解決問(wèn)題的能力。由于我們是團(tuán)隊(duì)合作,任務(wù)也輕松了很多,也經(jīng)常相互交流,這樣也增強(qiáng)了我們的團(tuán)隊(duì)精神。 在實(shí)際編程的過(guò)程中,我們也深深體會(huì)到什么叫做眼高手低,體會(huì)到了為了一個(gè)小小的bug而徹夜不眠的情形,體會(huì)到了解決問(wèn)題后油然而生的自豪感和自信心,也體會(huì)到了在dos環(huán)境下繪圖的不易。種種體會(huì),只有在我們?nèi)硇耐度氲匠绦蛟O(shè)計(jì)中來(lái)才能體會(huì)到

45、。 當(dāng)然,在這里要感謝不辭辛苦地為我們答疑解難的所有老師和助教們,你們總會(huì)用豐富的經(jīng)驗(yàn)和精煉的語(yǔ)言讓我們醍醐灌頂,幫助我們更徹底地了解c語(yǔ)言的重點(diǎn)難點(diǎn),沒(méi)有你們的幫助,我們c語(yǔ)言程序設(shè)計(jì)的道路也會(huì)走的更加艱難。 程序?qū)懲曛?,發(fā)現(xiàn)代碼已經(jīng)有7000來(lái)行了,這在程序設(shè)計(jì)之初,我們簡(jiǎn)直不能想象,而仔細(xì)想想,這一過(guò)程卻進(jìn)行的那么自然,程序的整體架構(gòu)很好,擴(kuò)展性也很強(qiáng),在為程序添加功能時(shí),我們不必縫縫補(bǔ)補(bǔ),直接在相應(yīng)接口中添加即可,所以程序設(shè)計(jì)后期,我們的工作也相對(duì)較為輕松。結(jié)束了近2個(gè)月來(lái)的課程設(shè)計(jì),我們感到松了口氣,當(dāng)我們回想著這一路走來(lái)經(jīng)歷的挫折和快樂(lè)時(shí),感到自己的大學(xué)生活更充實(shí)了,現(xiàn)在我們所得

46、的,也必會(huì)對(duì)我們的整個(gè)人生產(chǎn)生積極影響。2.鄒天明 九月份看到這個(gè)題目的時(shí)候,也正是生活一片混亂的時(shí)候,各種糾結(jié),而無(wú)暇顧及課程設(shè)計(jì)的問(wèn)題。于是一直遲遲沒(méi)有開(kāi)始寫(xiě),直到10月中旬才決定要?jiǎng)邮至?。不過(guò)在此前,其實(shí)已經(jīng)想了很多關(guān)于程序的實(shí)現(xiàn)機(jī)制,一開(kāi)始就覺(jué)得要是用這種類似與消息機(jī)制的原理,不過(guò)當(dāng)時(shí)并沒(méi)想太多,直覺(jué)一片迷茫,困難重重。 從最開(kāi)始的菜單鏈表建立,到鼠標(biāo)實(shí)現(xiàn),到調(diào)用事件函數(shù),到各種信息結(jié)構(gòu)體鏈表的操作以及后來(lái)為了解決內(nèi)存瓶頸不得不又重寫(xiě)了所有的信息操作,由鏈表改為直接對(duì)文件操作。一路好像走過(guò)了好多折騰,糾結(jié),直到前幾天終于一切ok的那一刻,都有點(diǎn)不相信,真的所有想要實(shí)現(xiàn)的都已運(yùn)行在眼前。

47、 有時(shí)候總是為一個(gè)小小的功能而費(fèi)盡心思,為了實(shí)現(xiàn)窗口的拖動(dòng),明明覺(jué)得邏輯上沒(méi)有錯(cuò)誤,但是每次動(dòng)幾下后,程序就會(huì)卡死。記得那天趕早就爬起來(lái)和同學(xué)調(diào)試了一早,才發(fā)現(xiàn)是指針的多次釋放問(wèn)題。為了實(shí)現(xiàn)下拉文本框,開(kāi)始有許多想法,但是每次都不成功,直到后來(lái)想到可以設(shè)計(jì)父窗口id來(lái)實(shí)現(xiàn),當(dāng)窗口最終下來(lái)的那一刻,那快樂(lè)無(wú)所可比。 近兩個(gè)月的時(shí)間,開(kāi)心的不開(kāi)心的好像多多少少都刻上了課設(shè)的影子,第一次寫(xiě)了個(gè)這么長(zhǎng)的程序,有時(shí)覺(jué)得自己神經(jīng),可是好像某種蘊(yùn)含的快樂(lè)讓自己欲罷不能。也許是某種癡迷,又或是某種逃避。 無(wú)論怎樣,就這樣和老三一起一行一行的寫(xiě)完了這樣最終的288頁(yè),每一行每一句代碼都還留有手指的余溫,每一條指

48、令都在鍵擊的愉悅或者煩躁中堅(jiān)決的執(zhí)行。 有時(shí)覺(jué)得代碼就像一個(gè)世界,一個(gè)受你控制卻又不受約束的世界。總是在深夜的時(shí)候,靜靜的陶醉在其中,用自己的思想,用一個(gè)一個(gè)函數(shù),就像惟命是從的仆人,就像聽(tīng)從詔令的士兵,為你沖鋒沙場(chǎng),為你一點(diǎn)一點(diǎn)化開(kāi)那些久遠(yuǎn)的記憶。 程序總有終結(jié)點(diǎn),即使死循環(huán)也會(huì)在某年某月斷死在某點(diǎn),而時(shí)間永恒。十參考資料王士元. c高級(jí)實(shí)用程序設(shè)計(jì). 北京: 清華大學(xué)出版社. 1996周純杰,劉正林等. 標(biāo)準(zhǔn)c語(yǔ)言程序及應(yīng)用. 武漢: 華中科技大學(xué)出版社. 2005c游戲編程從入門到精通 北京:希望電子出版社十一程序源代碼class.h /*copyright (c) 2010, zoutianming&daiqian. all rights reserved.-class.hmodule name: file & list_classdate created: 2010-10-22author: zoutianming&daiqiandescription: class file and list opeartion . -modification histo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論