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

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

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

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

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

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


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

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