基于匯編語言學生成績管理系統_第1頁
基于匯編語言學生成績管理系統_第2頁
基于匯編語言學生成績管理系統_第3頁
基于匯編語言學生成績管理系統_第4頁
基于匯編語言學生成績管理系統_第5頁
已閱讀5頁,還剩13頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

學生成績管理系統目錄設計內容2設計目的2設計要求2設計分析2子程序分析7操作說明10程序代碼11總結30參考文獻30設計內容設計一個學生成績管理程序,要求能實現以下功能:各科成績的錄入,修改和刪除。按姓名查詢每個學生各門課的成績。顯示查詢結果。統計個分數段的人數。5〕打印學生成績。設計目的用匯編數據的錄入、修改和刪除操作。設計要求學習如何用匯編語言進行數據處理。設計分析1.總體結構整個程序采用主程序調用子程序的方法。主程序完成菜單的顯示,子程序完成一個獨立功能方法的實現。各子程序的實現方法簡要描述如下:1〕設計INSERT〔錄入〕子程序,先翻開文件SCORE.TXT,并置文件指針到文件尾,然后調用GET_REC子程序接受用戶的輸入,再把用戶的輸入寫入文件,最后關閉文件返回主程序。2〕設計Delete〔刪除〕子程序,先翻開文件,再調用宏GETIN得到要刪除的學生的姓名,然后讀文件中的記錄,直到其記錄的名字與所輸入的名字相同為止,把文件指針后退8個字符〔即4門課成績所占的空間〕,寫入8個“0”3〕設計List〔瀏覽〕子程序時,先翻開文件,然后讀一個記錄,并通過調用宏SHOW_ITEM將其顯示到屏幕上,入文件指針沒有到達文件尾,那么繼續讀記錄并顯示,當指針到達文件尾時,那么關閉文件返回主程序。4〕設計Modify〔修改〕子程序時,先翻開文件SCORE.TXT,通用GER_REC得到要修改的記錄,然后讀文件中的記錄,并與用戶輸入的記錄做比擬〔只比擬記錄中的名字局部〕,假設不同那么噸下一條記錄,假設相同那么將文件指針后退23個字符〔一個記錄為23個字符的長度〕,然后把用戶輸入的記錄寫入文件,最后關閉文件返回主程序。5〕設計Count〔統計〕子程序時,先翻開文件,然后讀記錄,比擬記錄的第16個字符,數學成績的高位〕,并統計,直到文件指針到達文件尾,最后關閉文件調用宏SHOW_ITEM顯示統計結果,返會主程序。6〕設計Query〔查詢〕子程序時,先翻開文件,通過調用宏GETIN得到要查找學生的姓名,然后讀文件記錄,并同要查找的學生姓名比擬,假設相同那么輸出,假設不同繼續讀文件記錄,最后顯示查詢結果,關閉文件返回程序。另外還有打印的分數段人數統計,這些結合后面的子程序功能分析做詳細介紹。圖1是本設計顯示記錄的界面圖1學生成績管理系統界面程序流程圖如圖2所示入口入口入口入口翻開文件翻開文件翻開文件翻開文件置指針到文件尾讀一個記錄置指針到文件尾讀一個記錄從終端接收用戶輸入的記錄讀錯?Y從終端接收用戶輸入的記錄讀錯?記錄寫入文件顯示錯誤信息N記錄寫入文件顯示錯誤信息文件尾?Y文件尾?關閉文件關閉文件關閉文件N關閉文件顯示記錄顯示記錄返回返回返回返回A〕List流程圖B〕Insert流程圖翻開文件返回返回文件刪除記錄姓名相同?讀一條記錄接收被刪除記錄的學生姓名入口返回關閉文件顯示統計結果指針到達文件尾對數學成績分段并統計翻開文件讀一個記錄入口入口翻開文件讀一個記錄是否為要修改的記錄返回關閉文件顯示記錄返回寫入修改記錄并關閉文件文件指針后退一個記錄是否為所尋找的記錄讀一個記錄翻開文件入口翻開文件返回返回文件刪除記錄姓名相同?讀一條記錄接收被刪除記錄的學生姓名入口返回關閉文件顯示統計結果指針到達文件尾對數學成績分段并統計翻開文件讀一個記錄入口入口翻開文件讀一個記錄是否為要修改的記錄返回關閉文件顯示記錄返回寫入修改記錄并關閉文件文件指針后退一個記錄是否為所尋找的記錄讀一個記錄翻開文件入口YYNNNYNY開始開始調用Query子程序調用Delete子程序調用Insert子程序調用Count子程序調用Modify子程序調用Iist子程序顯示菜單輸入一個字符結束是E是I是C是M是D是Q是L調用Query子程序調用Delete子程序調用Insert子程序調用Count子程序調用Modify子程序調用Iist子程序顯示菜單輸入一個字符結束是E是I是C是M是D是Q是LYNYNYNYNYNYNNY在大型的程序中,為了使程序清晰、可讀性好,一般會大量使用宏和子程序,因此,充分了解這些宏和子程序,才能掌握程序的編制方法。2.宏的分析此題中使用了以下宏,其作用如下:SHOW:用來指定地址的顯示字符串,有一個地址參數SET_P1:設定光標位置,有一個可變參數a,作用是講光標置于坐標〔a,36〕處,使用了BIOS中斷10H的2號功能。SET_P2:將光標置于〔12,2〕處。SET_P3:將光標置于〔1,30〕處。CLEAR:去除整個屏幕,用BIOS中斷10H的7號功能實現,范圍是從坐標〔0,0〕到〔24,79〕,將整個區域變為空白。CLEAR1:去除有半局部屏幕,去除范圍從坐標〔4,36〕到〔10,79〕,結果是擦出此區域的顯示內容。CLEAR2:去除下半局部屏幕,去除范圍是從坐標〔12,0〕到〔24,79〕,結果是擦除此區域的顯示內容。NNWLINE:回車換行。SHOE_ITEM:顯示記錄內容,執行后顯示名稱,然后依次顯示4項功課成績,各項成績間空3個空格,最后換行。這個宏包含的語句較多,如果每次都直接用語句實現非常冗長,使用宏后那么主程序就很簡潔,充分表達了使用宏的優點。GETIN:獲取學生的信息,這也是一個使用頻繁的宏,其中含有很多的指令,它帶有ADDRS和COUNT2兩個參數,ADDRS是存放信息的數據段位置,CIUNT2是接受的字符數。子程序分析下面詳細分析程序中用的的主要的子程序。〔1〕INSERT子程序INSERT子程序的功能是錄入一條記錄。首先保存現場入棧,然后DOS中斷3D號功能翻開FNAME指定的文件,然后宏GETIN去除屏幕右半局部的記錄輸入區域。在記錄的第一項處置光標,用GET_REC獲取記錄內容,用DOS中斷42H號功能將指針移到文件末尾。再用DOS中斷40H號功能將放在BUFFER緩沖區的23個字節的內容寫到文件中,接著關閉文件,重新設置光標位置在顯示記錄位置。最后彈?;謴同F場。〔2〕GET_REC子程序GER_REC子程序的功能是獲取新的記錄內容。首先用宏GETIN獲取學生的姓名,放入BUFF2中,最多15個字符,如果遇到回車鍵那么提前結束。再用循環方式將BUFFER2中的15個字符送到BUFFER1中。然后用宏SET_P1將光標置于數學成績輸入項后,等待鍵盤輸入。輸入的成績,先放在BUER2中,然后加到BUFFER1中的姓名后面。輸入為2個字符后遇到回車鍵提前結束。接著用同樣的方法輸入英語成績,計算機成績和中文成績。完成后,這個程序就得到了一個記錄的所有信息?!?〕OPENF子程序OPENF是個一個非常簡單的子程序。它的作用是翻開一個文件并把一個文件句柄保存在數據段的handle緩沖區中?!?〕QUERY子程序QUERY是查詢一條記錄。首先保存現場。然后分別去除界面右上方和下邊的區域。翻開FAME指定的文件并保存文件句柄。將光標至于界面的下半空白局部開始處,用宏GETIN獲取最多15個字符的輸入,然后將BUFFER1中的內容與BUFFER2中進行比擬,看是否相同。如果不同,再繼續向下從文件中讀出23個字節比擬,循環向下,直到相同或文件結束為止。如果不同,那么顯示該條記錄,然后關閉文件,恢復現場。B:MOVAH,3FH;讀文件MOVCX,23;讀23個字節〔記錄長度〕MOVDX,OFFSETBUFFER2;放在BUFFER2中INT21HLEASI,BUFFER2LEADI.BUFFER1MOVCX,15;循環次數C:MOVAL,BYTEPTR[SI]CMPAL,BYTEPTR[DI];比擬BUFFER1和BUFFER2JNZB;不同那么轉BINCSIINCDLOOPC〔5〕MODIFY子程序MODIFY子程序的功能是修改記錄。先保護現場,然后去除右上局部的記錄輸入區域,接著翻開文件。用GET_REC子程序獲取輸入的記錄信息,并存入BUFFER1中。從翻開的文件中讀取一個記錄的內容〔23個字節〕放在BUFFER2中。比擬記錄前面的15個字節〔姓名〕,如果不同,那么讀取下一個記錄;如果相同,那么回移一個記錄的指針,回到剛剛這條記錄的位置〔因為讀取一個記錄后,指針已移到下一條記錄上〕。將放在BUFFER1中的輸入的記錄寫到剛剛這條記錄在文件中的位置上,從而實現此記錄的修改。最后關閉程序,恢復現場?!?〕DELETE子程序DELETE子程序的功能是刪除一條記錄。首先保存現場,去除屏幕。然后翻開文件,保存文件句柄。用宏GETIN獲取15個字節的姓名字符,放在BUFFER1中。讀取一條記錄〔23個字節〕,放在BUFFER2中,然后和BUFFER1中內容比擬,如果不同,讀取下一條記錄。如果姓名相同,那么把指針后移8個字符〔4門功課所占空間〕,寫入8個“0〞字符。關閉文件,恢復現場并退出?!?〕LIST子程序LIST子程序的作用是顯示文件中的記錄。首先去除記錄輸入區和顯示區域。然后顯示記錄字段的標題。翻開文件,保存文件句柄。讀取一條記錄的內容放在BUFFER1中,并判斷是否到了文件末尾,如果不是,那么顯示這條記錄。循環讀取直到文件結束。最后關閉程序,恢復現場?!?〕PRINT子程序DELETE子程序的功能是打印文件中的記錄。用OPENF子程序翻開文件。讀取一條記錄,匯編語言提供了自定義數據結構的結構定義語句,可將不同的數據類型放在一個數據結構中,便于處理,在本程序中的記錄就采用了結構定義語句。這里讀取記錄也用了結構的方法。接著用DOS中斷21H的5號功能,逐字打印存放在BUFFER1中的所以字符。一條記錄打完后,打印回車符換行。然后用同樣方法繼續讀取下一條記錄并打印,直到文件結束為止。最后關閉文件退出?!?〕COT子程序COT子程序的作用是統計各分數段小說人數,并簡化程序,作為例如,本程序只統計記錄數學各分數段的人數。首先顯示統計結果的標題:maths<60<70<80<90<100。然后翻開文件。讀取記錄,將記錄的第16個字符〔數學分數的高位〕取出比擬。統計結果依次放在以BUFFER3開頭的內存單元中,如果小于60,那么將小于60的記錄單元BUFFER3加一;假設小于70,那么將小于70的記錄單元BUFFER3加一,即BUFFER3下一個地址單元內容加一,依次類推。處理完后再讀取下個記錄,作同樣處理,直到文件結束為止。接著顯示放在BUFFER3中的各分數段的人數的統計結果,最后關閉文件結束。從程序中可以看出,統計時程序有個限制,本例每個分數段最多不能超過9個人。操作說明改程序除源程序外,還需要另一個存放記錄的文件〔此程序中使用的文件名為SCORE.TXT),但本程序并沒有創立這個文件的功能。要產生這個文件,可用記事本先做以一個空的文件名為SCORE.TXT的文件。程序的運行與該文件的存放位置有關,位置是程序數據段的FNAME的值。二者要保持一致,否那么會因為找不到數據存放文件而出錯。程序運行時,在出現主菜單后,按1鍵,將顯示學生的各科成績;按i鍵,將執行錄入功能,可以錄入新的學生成績;按M鍵,了修改學生成績。由于本程序時隔簡單程序,所以在修改時,要輸入學生的所有成績,包括不要修改的成績;按D鍵后,輸入要刪除的學生名,將使其成績全為0;按Q鍵后,輸入要查詢的學生的姓名,鍵顯示其各科成績;按C鍵將顯示數學成績的分段統計結果。以上功能在運行時可以單獨實現〔即在進入主菜單后,單擊功能鍵選中該功能進行操作后程序會關閉。但要運行其他功能,那么要重新進入主菜單單擊別的功能鍵,即每次只能運行一項功能〕。要特別說明的是,本程序住一套目的是驗證匯編程序實現的數據記錄操作功能,為使程序不至于郭長,減少篇幅,因此程序處理會很簡單。程序中沒有錯誤處理程序,如果輸入錯誤,如按退格鍵將會出錯,因此輸入時要注意補要輸錯。程序代碼datasegmentmess1db'studentgrademanagementsystem',0ah,0dh,'$'mess2db'thisismainmenu',0ah,0dh,'$'mess3db'insert(i)pleaseinput:',0ah,0dh,'$'mess4db'modify(m)name:',0ah,0dh,'$'mess5db'delete(d)maths:',0ah,0dh,'$'mess6db'query(q)english:',0ah,0dh,'$'mess7db'count(c)computer:',0ah,0dh,'$'mess8db'print(p)chinese:',0ah,0dh,'$'mess9db'exit(e)',0ah,0dh,'$'mess10db'**********************************************************$'mess11db'nameMaEnCoCh',0ah,0dh,'$'mess13db'list(l)',0ah,0dh,'$'mess12db'maths<60<70<80<90<100',0ah,0dh,'$'err1db'thereisnotthisstudent$'err2db'fileclosewrong$'fnamedb"d:\masm\score.txt";記錄分數文件的路徑和文件名。buffer1db23dup(?)buffeerdb0ah,0dh,'$'buffer2db30dup(?)buffer3db8dup('0')countdb5handledw?deldb8dup('0')xdb?dataendsscorestruc;定義記錄結構namesdb15dup('')mathsdb0,0englishdb0,0computerdb0,0chinesedb0,0scoreendsshowmacroaddrs;顯示字符串leadx,addrsmovah,9int21hendmset_p1macroa;設光標于〔a,36〕movah,2movdh,amovdl,36movbh,0int10hendmset_p2macro;設光標于〔12,2〕movah,2movdh,12movdl,2movbh,0int10hendmset_p3macro;設光標于〔1,30〕movah,2movdh,1movdl,30movbh,0int10hendmclearmacro;清整個屏幕moval,0movcl,0movch,0movdh,24movdl,79movbh,7movah,6int21hendmclear1macro;清右上記錄輸入區moval,0movbh,7movch,4movcl,36movdh,10movdl,79movah,6int10hendmclear2macro;清下半局部記錄顯示區moval,0movbh,7movch,12movcl,0movdh,24movdl,79int10hendmnewlinemacro;回車換行pushaxpushdxmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hpopdxpopaxendmshow_itemmacroaddrs;在指定位置顯示記錄localiloop,w10pushbxpushcxmovbx,0iloop:movdl,addrs[bx];顯字符串movah,2int21hincbxcmpbx,15jliloopmovcx,4w10:movdl,''movah,2int21hmovdl,''movah,2int21hmovdl,''movah,2int21hmovdl,addrs[bx]movah,2int21hincbxmovdl,addrs[bx]movah,2int21hincbxloopw10newlinepopcxpopbxendmgetinmacroaddrs,count2;從鍵盤獲取信息localzeroit,lp,input_end,exitpushbxpushaxmovbx,0zeroit:movaddrs[bx],''incbxcmpbx,15jlzeroitmovbx,0lp:movah,1int21hcmpal,0ahjzinput_endcmpal,0dhjzinput_endmovaddrs[bx],alincbxcmpbx,count2jllpinput_end:cmpal,0dhjzexitcmpal,0ahjzexitmovah,7int21hjmpinput_endexit:popaxpopbxendmcodesegmentmainprocfarassumecs:code,ds:data,es:datastart:movax,datamovds,axmovah,0;設顯示模式80*25moval,3int10hclearshowmess1showmess2showmess13showmess3showmess4showmess5showmess6showmess7showmess8showmess9newlineshowmess10set_p3w:movah,7int21hcmpal,'i'jnzn1callinsertjmpwn1:cmpal,'m'jnzn2callmodifyjmpwn2:cmpal,'d'jnzn3calldeletejmpwn3:cmpal,'q'jnzn4callqueryjmpwn4:cmpal,'c'jnzn5callcotjmpwn5:cmpal,'p'jnzn6callprintjmpwn6:cmpal,'l'jnzn7calllistjmpwn7:cmpal,'e'jzexitfjmpwexitf:movah,4chint21hretmainendpinsertprocnearpushaxpushbxpushcxpushdxmovdx,offsetfnamemoval,2movah,3dh;翻開文件int21hmovbx,axclear1set_p14callget_recmovcx,0;指針移到文件尾movdx,0moval,2movah,42hint21hmovcx,23;寫文件movdx,offsetbuffer1movah,40hint21hmovah,3eh;關閉文件int21hset_p3popdxpopcxpopbxpopaxretinsertendpget_recprocnearpushaxpushbxgetinbuffer2,15;輸入姓名movbx,0movcx,15continue:moval,buffer2[bx]movbuffer1[bx],alincbxloopcontinueset_p15getinbuffer2,2;輸入數學成績moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxset_p16getinbuffer2,2;輸入英語成績moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxset_p17getinbuffer2,2;輸入計算機成績moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxset_p18getinbuffer2,2;輸入語文成績moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxpopbxpopaxretget_recendpopenfprocnear;翻開文件movdx,offsetfnamemoval,02movah,3dhint21hmovhandle,axretopenfendpqueryprocnear;查詢記錄pushaxpushbxpushcxpushdxclear1clear2movdx,offsetfnamemoval,2movah,3dh;翻開文件int21hmovbx,axset_p2getinbuffer1,15;取姓名到buffr1中leadx,mess11movah,9int21hb:movah,3fh;讀文件movcx,23;讀23個字節〔記錄長度movdx,offsetbuffer2;放在buffer2中int21hleasi,buffer2leadi,buffer1movcx,15;循環次數c:moval,byteptr[si]cmpal,byteptr[di];比擬buffer1和buffer2jnzb;不同那么轉bincsiincdiloopcmov[buffer2+23],'$'show_itembuffer2movah,3ehint21hpopdxpopcxpopbxpopaxretqueryendpmodifyprocnear;修改記錄pushaxpushbxpushcxpushdxclear1set_p14movdx,offsetfnamemoval,2movah,3dhint21hmovbx,axmovhandle,axcallget_rec;讀取輸入內容放在buffer1read:movdx,offsetbuffer2movcx,23movah,3fh;讀文件,記錄內容放在buffer2int21hleasi,buffer2;比擬姓名是否相同leadi,buffer1movcx,15c5:movdl,byteptr[si]cmpdl,byteptr[di]jnzreadincsiincdiloopc5movbx,handlemovah,42h;回移文件指針moval,1movcx,0ffffhmovdx,-23int21hmovcx,23movdx,offsetbuffer1movah,40h;寫入修改記錄int21hmovah,3ehint21hjmpexit2exit1:set_p2showerr1exit2:set_p3popdxpopcxpopbxpopaxretmodifyendpdeleteprocnearpushaxpushbxpushcxpushdxclear1set_p14movdx,offsetfnamemoval,2movah,3dh;翻開文件int21hmovbx,axmovhandle,axgetinbuffer1,15;讀取鍵盤輸入放在buffer1read5:movdx,offsetbuffer2movcx,23movah,3fh;從文件讀記錄放在buffer2中int21hleasi,buffer2leadi,buffer1movcx,15c6:movdl,byteptr[si]cmpdl,byteptr[di]jnzread5incsiincdiloopc6movbx,handlemovah,42h;移文件指針moval,1movcx,0ffffhmovdx,-8int21hmovcx,8movdx,offsetdelmovah,40h;寫文件int21hmovah,3eh;關閉文件int21hjmpexit6exit5:set_p2showerr1exit6:set_p3popdxpopcxpopbxpopaxretdeleteendplistprocnear;列文件中記錄pushaxpushbxpushcxpushdxclear1clear2set_p2showmess11movdx,offsetfnamemoval,2movah,3dh;翻開文件int21hmovbx,axagain:movdx,offsetbuffer1;讀取記錄movcx,23movah,3fhint21hcmpax,0jzpshow_itembuffer1jmpagainp:movah,3eh;關閉文件int21hset_p3popdxpopcxpopbxpopaxretlistendpprintprocnearpushaxcallopenf;翻開文件movcl,countmovch,0read2:movdx,offsetbuffer1movcx,typescoremovah,3fh;讀文件int21hmovcx,23hmovbx,0next:movah,5movdl,byteptrbuffer1[bx]int21hincbxloopnextmovah,5movdl,0dhint21hdecxcmpx,0jnzread2movbx

溫馨提示

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

最新文檔

評論

0/150

提交評論