
《程序設計基礎》課程設計報告
完成時間 :12 月 25日 目錄 正文 1.設計目的與要求 2.系統(tǒng)需求分析 3.總體設計 4、詳細設計 5、調(diào)試與測試 6、總結(jié)與體會 參考文獻 正文 1.設計目的與要求設計目的:學生成績管理系統(tǒng)是為了在這個信息時代高速發(fā)展的今天,通過計算機取代傳統(tǒng)的紙張記錄人力處理的方法,提高處理學生信息的速度,提高工作效率,并且通過保證軟件的正常運行即保證了工作的正常運行,減少人力工作中可能出現(xiàn)的失誤,不僅保證了工作的執(zhí)行力度而且還提高了工作的準確度、效率。 設計要求:熟練掌握運用這個學期學的C語言知識用VISAL C++軟件編寫程序,通過設計這個程序充分考察這個學期的知識是否已經(jīng)落到實處,進行實踐。在學生成績管理系統(tǒng)中加入足夠數(shù)量的功能,保證這個系統(tǒng)的多功能性以保證學生成績管理系統(tǒng)的完善。通過不斷的調(diào)整測試,找出系統(tǒng)中的bug,各種語法錯誤和邏輯錯誤,確保這個系統(tǒng)在處理信息的過程中系統(tǒng)不會出現(xiàn)崩潰或信息處理錯誤,導致學生成績導入、處理發(fā)生錯誤,或?qū)е滦畔⑻幚砉ぷ鳠o法正常進行。還有重要的是,選擇盡量高效,高利用率的方法來編寫程序,避免使用低級的編程手法來編寫系統(tǒng),導致不必要的信息處理的繁雜或者較長的程序執(zhí)行時間。
2.系統(tǒng)需求分析對于學校來說,每個學期都有大量的考試,有大量的學生,有大量的成績信息進行處理,如若使用人工處理的方法,這龐大的信息量和信息處理難度是非?膳碌。因此,我們應該借用計算機來實現(xiàn)學生成績管理,實現(xiàn)工作準確度的提高和效率的提升。在學生管理系統(tǒng)中,對學生成績的管理至少應該包括學生數(shù)據(jù)的輸入、輸出、查找、處理、保存等功能。為了保證程序的可讀性,在Visal C++里用C語言應該使用對各單獨的函數(shù)和單獨的文件將每個功能都分開,以滿足復雜的功能的實現(xiàn)。為了保證不浪費有限的空間,應該使用鏈表代替有可能浪費大量空間的數(shù)組。為了實現(xiàn)數(shù)據(jù)處理的簡化,應該自定義一個結(jié)構(gòu)體以此來更高效的實現(xiàn)學生信息的輸入輸出調(diào)用。 3.總體設計1)問題分析 學生成績管理系統(tǒng)首先應該實現(xiàn)的是用戶通過系統(tǒng)來輸入學生的各種數(shù)據(jù),所以需要用戶首先輸入信息,所以需要數(shù)據(jù)輸入功能。其次是對信息的處理,應該要對信息進行備份保存,所以需要保存至文本文件功能。再者就是對信息的處理了,對總體學生的各種數(shù)據(jù)進行比較,處理,匯總,輸出,所以需要求平均分,最高分,最低分數(shù)據(jù)搜索,學生數(shù)據(jù)輸出。用戶需要的是盡量高效的處理效率,盡量完善的功能,還有適當?shù)南到y(tǒng)占用空間大小,所以應當使用恰當?shù)臄?shù)據(jù)儲存方法,數(shù)據(jù)調(diào)用處理方法。 2)設計思路 (1)顯示主菜單界面,包括輸入學生的數(shù)據(jù)記錄、保存數(shù)據(jù)記錄、輸出最高分和最低分、求平均分、查找指定的學生信息、輸出學生的成績等級、輸出所有學生的信息還有退出功能。 (2)每項功能之間都是獨立的,所以應該是用多文件多函數(shù)結(jié)構(gòu),通過在主函數(shù)中調(diào)用其他函數(shù)來實現(xiàn)功能的使用。 (3)學生的信息包括了姓名、學號、各科成績,故選擇定義結(jié)構(gòu)體來簡化數(shù)據(jù)的儲存。 (4)因為大部分功能需要對每一個同學的信息進行查看并處理,故使用鏈表來實現(xiàn)信息的儲存、輸出、查看、處理。 
(3)程序結(jié)構(gòu) (1)頭文件 
(2)數(shù)據(jù)結(jié)構(gòu) 
(3)函數(shù)聲明  4、詳細設計班級學生成績管理系統(tǒng)的詳細設計是各個功能的實現(xiàn),即為每個函數(shù)每個功能的設計思路和編程過程。 (1)主函數(shù) 主函數(shù)是班級學生管理系統(tǒng)的入口函數(shù)程序,提供各功能模塊的操作。 首先調(diào)用菜單函數(shù)呈現(xiàn)給用戶菜單,菜單使用數(shù)字來標記各功能,要求用戶通過輸入數(shù)字來選擇要實現(xiàn)的功能,如果輸入錯誤,則提示用戶重新輸入,用default實現(xiàn)。用scanf()函數(shù)來接收用戶的輸入,用多分支條件語句switch()case…來實現(xiàn)子函數(shù)的調(diào)用,從而實現(xiàn)各個功能的使用。在實現(xiàn)其中一個函數(shù)的調(diào)用后用break;跳出分支語句后,詢問用戶是否返回主菜單,要求用戶輸入y或n,如果返回主菜單,則清空之前顯示的數(shù)據(jù),如果不返回則要求用戶輸入像要實現(xiàn)的功能所代表的數(shù)字,如果輸入錯誤,則提示用戶重新輸入,這三個分支使用if……else if……else……來實現(xiàn),語句跳轉(zhuǎn)用goto命令來實現(xiàn)。
  
(2)菜單函數(shù) 函數(shù)名:view 所在文件:view.c 在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無需返回值,定義為void類型。 菜單用在告知用戶本系統(tǒng)的功能,一一列出八種功能并用不同的數(shù)字代表。 
(3)數(shù)據(jù)輸入函數(shù) 函數(shù):input 所在文件:input.c 在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,但需要返回鏈表的表頭,定義為struct stu*類型。 此函數(shù)要求用戶用鍵盤輸入,scanf語句來接收數(shù)據(jù),用以上給出的結(jié)構(gòu)體類型struct stu來儲存。創(chuàng)建鏈表,創(chuàng)建head,p,q三個結(jié)構(gòu)體類型指針,head為表頭, 
(4)保存至文本文件函數(shù) 函數(shù):save 所在文件:save.c 在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無需返回值,定義為void類型。 以形參接收鏈表的表頭,定義一個file類型的文件指針fp,用fopen()函數(shù)以只寫方式打開文本文件,將fp指向指定的文本文件,從鏈表開始將每一個數(shù)據(jù)用fprintf()函數(shù)逐一寫入文本文件,當一個學生的所有數(shù)據(jù)全部輸入完,指針指向下一個學生的數(shù)據(jù),直到指針指向空停止,此處使用循環(huán)結(jié)構(gòu)do……while……。全部數(shù)據(jù)輸入完畢,使用fclose()函數(shù)關閉文本文件。  
(5)輸出最高分最低分函數(shù) 函數(shù):compare 所在文件:compare.c 在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無需返回值,定義為void類型。 此函數(shù)需要輸出所有科目和總分的最高分,故定義了mathmax,mathmin,englishmax,englishmin,computermax,computermin,totalmax,totalmin。運用if語句,將每一個數(shù)據(jù)與max和min比較,若該數(shù)據(jù)比max大則取代max,若比min小則取代min。  
(6)輸出平均數(shù)函數(shù) 函數(shù):average 所在文件:average.c 在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無需返回值,定義為void類型。 用do……while……語句來實現(xiàn)所有學生數(shù)學,英語,計算機成績還有總分的相加,運用+=符號。并在定義了count,放在其中一個科目的do……while……語句中,每運行一次就自加一次,最后得出學生總?cè)藬?shù)。然后將得到的所有學生的數(shù)學成績的總和、英語成績的總和、計算機成績的總和總分的總和在輸出的前均除以count,輸出各科平均分。 
(7)查找指定學生信息函數(shù) 函數(shù):search 所在文件:search.c 在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無需返回值,定義為void類型。 通過鏈表,使指針逐一指向每個學生的信息,并且取其中的學號來與用戶輸入的n作對比,用do…while…語句來控制這個比較的過程,用if語句來實現(xiàn)當學生的學號等于用戶需要查找的那個的時候先輸出那個學生的信息,再用return;結(jié)束search函數(shù)的調(diào)用返回主函數(shù)。 

(8)輸出所有學生信息函數(shù) 函數(shù):output 所在文件:output.c main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無需返回值,定義為void類型 同樣用鏈表來調(diào)用學生的數(shù)據(jù),當一個學生的數(shù)據(jù)全部輸出完之后,指針指向下一個學生,直到指針指向空的節(jié)點結(jié)束output函數(shù)的調(diào)用。
 
(9)學生等級函數(shù) 函數(shù):level 所在文件:level.c main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無需返回值,定義為void類型。 同樣使用鏈表,但不同的是每一塊求等級的語句前需要將 p指向表頭head,因為執(zhí)行完每一塊求等級的語句之后,p會停留在指向空,這樣如果直接再去當做表頭來進行下面的語句中的數(shù)據(jù)調(diào)用,明顯屬不合理的,所以每次都要將p重新指向表頭。并運用if…else if…else if…else多分支語句來篩選學生成績并按照成績高低來決定哪個等級的人數(shù)加一。 
 
(10)reinput函數(shù) 函數(shù):reinput 所在文件:reinput.c 函數(shù):level 所在文件:level.c 為了優(yōu)化系統(tǒng)原來不能重復輸入學生數(shù)據(jù),所以添加了一個重復輸入的函數(shù),在第一次輸入數(shù)據(jù),input函數(shù)執(zhí)行時,先創(chuàng)建鏈表。在重復添加數(shù)據(jù)時,則執(zhí)行reinput函數(shù),在input函數(shù)創(chuàng)建的鏈表后,在最后一個結(jié)點的后面重新接入數(shù)據(jù),輸入數(shù)據(jù),儲存數(shù)據(jù)。 
(11)自定義頭文件head.h 用于連接各文件個函數(shù),在頭文件中定義結(jié)構(gòu)體數(shù)組以便讓所有的文件、函數(shù)都能隨意調(diào)用,全局定義各種函數(shù)以便主函數(shù)調(diào)用。  5、調(diào)試與測試(1)一開始不會使用鏈表,先使用數(shù)組來進行處理,例如主函數(shù)是這樣的: 

使用數(shù)組info[]來實現(xiàn)數(shù)據(jù)處理 后來改成了鏈表的形式,如:  
從input函數(shù)那里接收了表頭,傳遞給各函數(shù),在各函數(shù)內(nèi)部調(diào)用鏈表進行數(shù)據(jù)處理。 當所用到的知識比較復雜的時候,可以先用簡單的只是去實現(xiàn)系統(tǒng)基本功能,語句的書寫,將系統(tǒng)的大體結(jié)構(gòu)完成的時候再使用復雜的手法來優(yōu)化系統(tǒng),這樣不易出錯。 (2)鏈表的創(chuàng)建 
(3)鏈表的調(diào)用 以求數(shù)學最高分為例 
從表頭開始調(diào)用表頭指向的第一個節(jié)點中的數(shù)學成績的數(shù)據(jù)進行處理,完成后將指針移向下一個節(jié)點,繼續(xù)重復,并運用do······while語句來控制循環(huán)直到指針指向空。 (4)鏈表的研究 創(chuàng)建了一個小的系統(tǒng)來研究鏈表,因為在學生成績管理系統(tǒng)中研究不方便,故做了一個小的系統(tǒng),基于老師的代碼,研究鏈表的創(chuàng)建和調(diào)用  

(5)寫入文本文件 
第一步: 
第二步:打開文件 

第三步:數(shù)據(jù)寫入 
第四步:關閉文件 
(6)函數(shù)返回值為指針類型和指針和指向函數(shù)的指針的區(qū)別 以input函數(shù)為例: 函數(shù)返回值為指針類型:struct stu *input() 指向函數(shù)的指針:struct stu( *input)() (7)在獲得最大最小值之前要先定義并初始化變量max和min max應該初始化為0以保證數(shù)據(jù)能比max的初始值大以取代其初始值。 但min的初始值不應為0因為如此min的值永遠是最小的,數(shù)據(jù)不符合if里面的篩選條件p->(某數(shù)據(jù))<min,所以應該初始化為min=101。 (8)在把數(shù)據(jù)寫入某個指定文件時,如果指定位置為E:/system/student,它不會被放在E盤的system文件夾中的student.txt文件中,而是在E盤中創(chuàng)建了以下的文本文件。 
(9)優(yōu)化數(shù)據(jù)的類型,因為計算平均分如果將平均分定義為int,會丟失部分數(shù)據(jù),故將其保留小數(shù)點后兩位以float類型輸出。  
(10)優(yōu)化,要求用戶必須先輸入數(shù)據(jù)再執(zhí)行其他功能。 原來: 
優(yōu)化后: 
(11)驗證每個函數(shù),每個功能是否能正常運行 0:退出系統(tǒng) 
1:輸入學生的數(shù)據(jù)記錄 
2:保存數(shù)據(jù)記錄 

3:輸出最高分和最低分 
4:輸出平均分 
5:查找指定學生的信息 
6:學生等級 
7:輸出所有學生的信息 
(12) 在查找信息時,如果輸入錯誤,在重新輸入學號后,會引起系統(tǒng)崩潰,其實是在判斷輸入之前,系統(tǒng)將所有的學號先檢查了一遍,才判斷出輸入錯誤,此時p指向了null,此時繼續(xù)從p開始查找,肯定會引起崩潰。所以將表頭保留,每次查找之前,都先將p指向表頭,避免錯誤。 原來: 改正:


(13)在輸入數(shù)據(jù)之前,進行其他功能的操作是沒有任何意義的,所以在執(zhí)行其他功能之前,先判斷有無先輸入數(shù)據(jù)。 
(14)為了能夠反復輸入數(shù)據(jù),添加了一個reinput函數(shù),在input函數(shù),第一次輸入的數(shù)據(jù)后,進行數(shù)據(jù)的添加。

6、總結(jié)與體會 通過這次設計一個系統(tǒng)讓我學到了很多,程序設計的思維,學會從用戶體驗出發(fā),設想用戶的需求,從而將系統(tǒng)所應該具有的功能一一設計出。通過這種方式我能更好的實現(xiàn)課堂知識的實踐,將課堂上的知識點進行查缺補漏。這次的設計老師還要求我們運用沒有學過的鏈表、文件流等內(nèi)容,這更考驗我們的自學能力,通過老師提供的ppt和提供的系統(tǒng)作范例,研究出了如何創(chuàng)建并使用鏈表,還有如何打開、寫入、關閉文件,并且教給不會的同學,以此既幫助了對方,也幫助了我加深對知識點的理解和發(fā)現(xiàn)自己的不足。因為這個系統(tǒng)包含的內(nèi)容比較多,容易出現(xiàn)大量的錯誤,這讓我學會了認真仔細的注意查看每一行代碼,查缺補漏,不斷的調(diào)試,發(fā)現(xiàn)系統(tǒng)的錯誤并改正。
參考文獻 
0.png (40.31 KB, 下載次數(shù): 76)
下載附件
2017-8-13 03:21 上傳
全部資料下載地址:源碼+完整論文(word格式 可編輯):
http://www.torrancerestoration.com/bbs/dpj-87640-1.html
|