
《程序設(shè)計(jì)基礎(chǔ)》課程設(shè)計(jì)報(bào)告
設(shè)計(jì)題目 | 學(xué)生成績(jī)管理系統(tǒng) |
學(xué)生姓名 | |
學(xué)生班級(jí) | |
學(xué)生學(xué)號(hào) | |
指導(dǎo)教師 |
完成時(shí)間 :12 月 25日
目錄
1.設(shè)計(jì)目的與要求
2.系統(tǒng)需求分析
3.總體設(shè)計(jì)
4、詳細(xì)設(shè)計(jì)
5、調(diào)試與測(cè)試
6、總結(jié)與體會(huì)
設(shè)計(jì)目的:學(xué)生成績(jī)管理系統(tǒng)是為了在這個(gè)信息時(shí)代高速發(fā)展的今天,通過(guò)計(jì)算機(jī)取代傳統(tǒng)的紙張記錄人力處理的方法,提高處理學(xué)生信息的速度,提高工作效率,并且通過(guò)保證軟件的正常運(yùn)行即保證了工作的正常運(yùn)行,減少人力工作中可能出現(xiàn)的失誤,不僅保證了工作的執(zhí)行力度而且還提高了工作的準(zhǔn)確度、效率。
設(shè)計(jì)要求:熟練掌握運(yùn)用這個(gè)學(xué)期學(xué)的C語(yǔ)言知識(shí)用VISAL C++軟件編寫(xiě)程序,通過(guò)設(shè)計(jì)這個(gè)程序充分考察這個(gè)學(xué)期的知識(shí)是否已經(jīng)落到實(shí)處,進(jìn)行實(shí)踐。在學(xué)生成績(jī)管理系統(tǒng)中加入足夠數(shù)量的功能,保證這個(gè)系統(tǒng)的多功能性以保證學(xué)生成績(jī)管理系統(tǒng)的完善。通過(guò)不斷的調(diào)整測(cè)試,找出系統(tǒng)中的bug,各種語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤,確保這個(gè)系統(tǒng)在處理信息的過(guò)程中系統(tǒng)不會(huì)出現(xiàn)崩潰或信息處理錯(cuò)誤,導(dǎo)致學(xué)生成績(jī)導(dǎo)入、處理發(fā)生錯(cuò)誤,或?qū)е滦畔⑻幚砉ぷ鳠o(wú)法正常進(jìn)行。還有重要的是,選擇盡量高效,高利用率的方法來(lái)編寫(xiě)程序,避免使用低級(jí)的編程手法來(lái)編寫(xiě)系統(tǒng),導(dǎo)致不必要的信息處理的繁雜或者較長(zhǎng)的程序執(zhí)行時(shí)間。
對(duì)于學(xué)校來(lái)說(shuō),每個(gè)學(xué)期都有大量的考試,有大量的學(xué)生,有大量的成績(jī)信息進(jìn)行處理,如若使用人工處理的方法,這龐大的信息量和信息處理難度是非常可怕的。因此,我們應(yīng)該借用計(jì)算機(jī)來(lái)實(shí)現(xiàn)學(xué)生成績(jī)管理,實(shí)現(xiàn)工作準(zhǔn)確度的提高和效率的提升。在學(xué)生管理系統(tǒng)中,對(duì)學(xué)生成績(jī)的管理至少應(yīng)該包括學(xué)生數(shù)據(jù)的輸入、輸出、查找、處理、保存等功能。為了保證程序的可讀性,在Visal C++里用C語(yǔ)言應(yīng)該使用對(duì)各單獨(dú)的函數(shù)和單獨(dú)的文件將每個(gè)功能都分開(kāi),以滿足復(fù)雜的功能的實(shí)現(xiàn)。為了保證不浪費(fèi)有限的空間,應(yīng)該使用鏈表代替有可能浪費(fèi)大量空間的數(shù)組。為了實(shí)現(xiàn)數(shù)據(jù)處理的簡(jiǎn)化,應(yīng)該自定義一個(gè)結(jié)構(gòu)體以此來(lái)更高效的實(shí)現(xiàn)學(xué)生信息的輸入輸出調(diào)用。
3.總體設(shè)計(jì)
1)問(wèn)題分析
學(xué)生成績(jī)管理系統(tǒng)首先應(yīng)該實(shí)現(xiàn)的是用戶通過(guò)系統(tǒng)來(lái)輸入學(xué)生的各種數(shù)據(jù),所以需要用戶首先輸入信息,所以需要數(shù)據(jù)輸入功能。其次是對(duì)信息的處理,應(yīng)該要對(duì)信息進(jìn)行備份保存,所以需要保存至文本文件功能。再者就是對(duì)信息的處理了,對(duì)總體學(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ù)儲(chǔ)存方法,數(shù)據(jù)調(diào)用處理方法。
2)設(shè)計(jì)思路
(1)顯示主菜單界面,包括輸入學(xué)生的數(shù)據(jù)記錄、保存數(shù)據(jù)記錄、輸出最高分和最低分、求平均分、查找指定的學(xué)生信息、輸出學(xué)生的成績(jī)等級(jí)、輸出所有學(xué)生的信息還有退出功能。
(2)每項(xiàng)功能之間都是獨(dú)立的,所以應(yīng)該是用多文件多函數(shù)結(jié)構(gòu),通過(guò)在主函數(shù)中調(diào)用其他函數(shù)來(lái)實(shí)現(xiàn)功能的使用。
(3)學(xué)生的信息包括了姓名、學(xué)號(hào)、各科成績(jī),故選擇定義結(jié)構(gòu)體來(lái)簡(jiǎn)化數(shù)據(jù)的儲(chǔ)存。
(4)因?yàn)榇蟛糠止δ苄枰獙?duì)每一個(gè)同學(xué)的信息進(jìn)行查看并處理,故使用鏈表來(lái)實(shí)現(xiàn)信息的儲(chǔ)存、輸出、查看、處理。

(3)程序結(jié)構(gòu)
(1)頭文件
![]()
(2)數(shù)據(jù)結(jié)構(gòu)

(3)函數(shù)聲明

班級(jí)學(xué)生成績(jī)管理系統(tǒng)的詳細(xì)設(shè)計(jì)是各個(gè)功能的實(shí)現(xiàn),即為每個(gè)函數(shù)每個(gè)功能的設(shè)計(jì)思路和編程過(guò)程。
(1)主函數(shù)
主函數(shù)是班級(jí)學(xué)生管理系統(tǒng)的入口函數(shù)程序,提供各功能模塊的操作。
首先調(diào)用菜單函數(shù)呈現(xiàn)給用戶菜單,菜單使用數(shù)字來(lái)標(biāo)記各功能,要求用戶通過(guò)輸入數(shù)字來(lái)選擇要實(shí)現(xiàn)的功能,如果輸入錯(cuò)誤,則提示用戶重新輸入,用default實(shí)現(xiàn)。用scanf()函數(shù)來(lái)接收用戶的輸入,用多分支條件語(yǔ)句switch()case…來(lái)實(shí)現(xiàn)子函數(shù)的調(diào)用,從而實(shí)現(xiàn)各個(gè)功能的使用。在實(shí)現(xiàn)其中一個(gè)函數(shù)的調(diào)用后用break;跳出分支語(yǔ)句后,詢問(wèn)用戶是否返回主菜單,要求用戶輸入y或n,如果返回主菜單,則清空之前顯示的數(shù)據(jù),如果不返回則要求用戶輸入像要實(shí)現(xiàn)的功能所代表的數(shù)字,如果輸入錯(cuò)誤,則提示用戶重新輸入,這三個(gè)分支使用if……else if……else……來(lái)實(shí)現(xiàn),語(yǔ)句跳轉(zhuǎn)用goto命令來(lái)實(shí)現(xiàn)。



(2)菜單函數(shù)
函數(shù)名:view 所在文件:view.c
在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無(wú)需返回值,定義為void類(lèi)型。
菜單用在告知用戶本系統(tǒng)的功能,一一列出八種功能并用不同的數(shù)字代表。

(3)數(shù)據(jù)輸入函數(shù)
函數(shù):input 所在文件:input.c
在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,但需要返回鏈表的表頭,定義為struct stu*類(lèi)型。
此函數(shù)要求用戶用鍵盤(pán)輸入,scanf語(yǔ)句來(lái)接收數(shù)據(jù),用以上給出的結(jié)構(gòu)體類(lèi)型struct stu來(lái)儲(chǔ)存。創(chuàng)建鏈表,創(chuàng)建head,p,q三個(gè)結(jié)構(gòu)體類(lèi)型指針,head為表頭,

(4)保存至文本文件函數(shù)
函數(shù):save 所在文件:save.c
在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無(wú)需返回值,定義為void類(lèi)型。
以形參接收鏈表的表頭,定義一個(gè)file類(lèi)型的文件指針fp,用fopen()函數(shù)以只寫(xiě)方式打開(kāi)文本文件,將fp指向指定的文本文件,從鏈表開(kāi)始將每一個(gè)數(shù)據(jù)用fprintf()函數(shù)逐一寫(xiě)入文本文件,當(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)部完成,無(wú)需返回值,定義為void類(lèi)型。
此函數(shù)需要輸出所有科目和總分的最高分,故定義了mathmax,mathmin,englishmax,englishmin,computermax,computermin,totalmax,totalmin。運(yùn)用if語(yǔ)句,將每一個(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)部完成,無(wú)需返回值,定義為void類(lèi)型。
用do……while……語(yǔ)句來(lái)實(shí)現(xiàn)所有學(xué)生數(shù)學(xué),英語(yǔ),計(jì)算機(jī)成績(jī)還有總分的相加,運(yùn)用+=符號(hào)。并在定義了count,放在其中一個(gè)科目的do……while……語(yǔ)句中,每運(yùn)行一次就自加一次,最后得出學(xué)生總?cè)藬?shù)。然后將得到的所有學(xué)生的數(shù)學(xué)成績(jī)的總和、英語(yǔ)成績(jī)的總和、計(jì)算機(jī)成績(jī)的總和總分的總和在輸出的前均除以count,輸出各科平均分。

(7)查找指定學(xué)生信息函數(shù)
函數(shù):search 所在文件:search.c
在main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無(wú)需返回值,定義為void類(lèi)型。
通過(guò)鏈表,使指針逐一指向每個(gè)學(xué)生的信息,并且取其中的學(xué)號(hào)來(lái)與用戶輸入的n作對(duì)比,用do…while…語(yǔ)句來(lái)控制這個(gè)比較的過(guò)程,用if語(yǔ)句來(lái)實(shí)現(xiàn)當(dāng)學(xué)生的學(xué)號(hào)等于用戶需要查找的那個(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)部完成,無(wú)需返回值,定義為void類(lèi)型
同樣用鏈表來(lái)調(diào)用學(xué)生的數(shù)據(jù),當(dāng)一個(gè)學(xué)生的數(shù)據(jù)全部輸出完之后,指針指向下一個(gè)學(xué)生,直到指針指向空的節(jié)點(diǎn)結(jié)束output函數(shù)的調(diào)用。


(9)學(xué)生等級(jí)函數(shù)
函數(shù):level 所在文件:level.c
main函數(shù)中調(diào)用,所有功能在函數(shù)內(nèi)部完成,無(wú)需返回值,定義為void類(lèi)型。
同樣使用鏈表,但不同的是每一塊求等級(jí)的語(yǔ)句前需要將 p指向表頭head,因?yàn)閳?zhí)行完每一塊求等級(jí)的語(yǔ)句之后,p會(huì)停留在指向空,這樣如果直接再去當(dāng)做表頭來(lái)進(jìn)行下面的語(yǔ)句中的數(shù)據(jù)調(diào)用,明顯屬不合理的,所以每次都要將p重新指向表頭。并運(yùn)用if…else if…else if…else多分支語(yǔ)句來(lái)篩選學(xué)生成績(jī)并按照成績(jī)高低來(lái)決定哪個(gè)等級(jí)的人數(shù)加一。



(10)reinput函數(shù)
函數(shù):reinput 所在文件:reinput.c
函數(shù):level 所在文件:level.c
為了優(yōu)化系統(tǒng)原來(lái)不能重復(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ù),儲(chǔ)存數(shù)據(jù)。

(11)自定義頭文件head.h
用于連接各文件個(gè)函數(shù),在頭文件中定義結(jié)構(gòu)體數(shù)組以便讓所有的文件、函數(shù)都能隨意調(diào)用,全局定義各種函數(shù)以便主函數(shù)調(diào)用。

(1)一開(kāi)始不會(huì)使用鏈表,先使用數(shù)組來(lái)進(jìn)行處理,例如主函數(shù)是這樣的:


使用數(shù)組info[]來(lái)實(shí)現(xiàn)數(shù)據(jù)處理
后來(lái)改成了鏈表的形式,如:


從input函數(shù)那里接收了表頭,傳遞給各函數(shù),在各函數(shù)內(nèi)部調(diào)用鏈表進(jìn)行數(shù)據(jù)處理。
當(dāng)所用到的知識(shí)比較復(fù)雜的時(shí)候,可以先用簡(jiǎn)單的只是去實(shí)現(xiàn)系統(tǒng)基本功能,語(yǔ)句的書(shū)寫(xiě),將系統(tǒng)的大體結(jié)構(gòu)完成的時(shí)候再使用復(fù)雜的手法來(lái)優(yōu)化系統(tǒng),這樣不易出錯(cuò)。
(2)鏈表的創(chuàng)建

(3)鏈表的調(diào)用
以求數(shù)學(xué)最高分為例

從表頭開(kāi)始調(diào)用表頭指向的第一個(gè)節(jié)點(diǎn)中的數(shù)學(xué)成績(jī)的數(shù)據(jù)進(jìn)行處理,完成后將指針移向下一個(gè)節(jié)點(diǎn),繼續(xù)重復(fù),并運(yùn)用do······while語(yǔ)句來(lái)控制循環(huán)直到指針指向空。
(4)鏈表的研究
創(chuàng)建了一個(gè)小的系統(tǒng)來(lái)研究鏈表,因?yàn)樵趯W(xué)生成績(jī)管理系統(tǒng)中研究不方便,故做了一個(gè)小的系統(tǒng),基于老師的代碼,研究鏈表的創(chuàng)建和調(diào)用



(5)寫(xiě)入文本文件

第一步:
![]()
第二步:打開(kāi)文件
![]()

第三步:數(shù)據(jù)寫(xiě)入

第四步:關(guān)閉文件

(6)函數(shù)返回值為指針類(lèi)型和指針和指向函數(shù)的指針的區(qū)別
以input函數(shù)為例:
函數(shù)返回值為指針類(lèi)型: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ù)寫(xiě)入某個(gè)指定文件時(shí),如果指定位置為E:/system/student,它不會(huì)被放在E盤(pán)的system文件夾中的student.txt文件中,而是在E盤(pán)中創(chuàng)建了以下的文本文件。
![]()
(9)優(yōu)化數(shù)據(jù)的類(lèi)型,因?yàn)橛?jì)算平均分如果將平均分定義為int,會(huì)丟失部分?jǐn)?shù)據(jù),故將其保留小數(shù)點(diǎn)后兩位以float類(lèi)型輸出。
![]()

(10)優(yōu)化,要求用戶必須先輸入數(shù)據(jù)再執(zhí)行其他功能。
原來(lái):

優(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é)生等級(jí)

7:輸出所有學(xué)生的信息

(12) 在查找信息時(shí),如果輸入錯(cuò)誤,在重新輸入學(xué)號(hào)后,會(huì)引起系統(tǒng)崩潰,其實(shí)是在判斷輸入之前,系統(tǒng)將所有的學(xué)號(hào)先檢查了一遍,才判斷出輸入錯(cuò)誤,此時(shí)p指向了null,此時(shí)繼續(xù)從p開(kāi)始查找,肯定會(huì)引起崩潰。所以將表頭保留,每次查找之前,都先將p指向表頭,避免錯(cuò)誤。
原來(lái):
改正:
![]()
![]()
(13)在輸入數(shù)據(jù)之前,進(jìn)行其他功能的操作是沒(méi)有任何意義的,所以在執(zhí)行其他功能之前,先判斷有無(wú)先輸入數(shù)據(jù)。

(14)為了能夠反復(fù)輸入數(shù)據(jù),添加了一個(gè)reinput函數(shù),在input函數(shù),第一次輸入的數(shù)據(jù)后,進(jìn)行數(shù)據(jù)的添加。
![]()

通過(guò)這次設(shè)計(jì)一個(gè)系統(tǒng)讓我學(xué)到了很多,程序設(shè)計(jì)的思維,學(xué)會(huì)從用戶體驗(yàn)出發(fā),設(shè)想用戶的需求,從而將系統(tǒng)所應(yīng)該具有的功能一一設(shè)計(jì)出。通過(guò)這種方式我能更好的實(shí)現(xiàn)課堂知識(shí)的實(shí)踐,將課堂上的知識(shí)點(diǎn)進(jìn)行查缺補(bǔ)漏。這次的設(shè)計(jì)老師還要求我們運(yùn)用沒(méi)有學(xué)過(guò)的鏈表、文件流等內(nèi)容,這更考驗(yàn)我們的自學(xué)能力,通過(guò)老師提供的ppt和提供的系統(tǒng)作范例,研究出了如何創(chuàng)建并使用鏈表,還有如何打開(kāi)、寫(xiě)入、關(guān)閉文件,并且教給不會(huì)的同學(xué),以此既幫助了對(duì)方,也幫助了我加深對(duì)知識(shí)點(diǎn)的理解和發(fā)現(xiàn)自己的不足。因?yàn)檫@個(gè)系統(tǒng)包含的內(nèi)容比較多,容易出現(xiàn)大量的錯(cuò)誤,這讓我學(xué)會(huì)了認(rèn)真仔細(xì)的注意查看每一行代碼,查缺補(bǔ)漏,不斷的調(diào)試,發(fā)現(xiàn)系統(tǒng)的錯(cuò)誤并改正。

| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |