要求設(shè)計的管理系統(tǒng)能夠?qū)崿F(xiàn)以下功能:
1.每一條記錄包括一個學(xué)生的學(xué)號、姓名、3個成績(平時成績、作業(yè)成績、考試成績)
2.成績錄入功能:(成績信息用文件保存,可以一次完成若干條記錄)
3.成績信息顯示瀏覽功能,完成全部學(xué)生記錄的顯示。
4.查詢功能:完成按姓名查找學(xué)生記錄,并顯示
5.成績信息的刪除:按學(xué)號進(jìn)行刪除某學(xué)生的成績
6.排序功能:按學(xué)生總成績進(jìn)行排序
?
1.首先,列出所需要的頭文件以及聲明所需要的函數(shù),細(xì)心的同學(xué)會發(fā)現(xiàn),就算是數(shù)字,也用了字符串,方便輸入以及存取信息。
?
2.下面可以直接寫主函數(shù),也可以在聲明函數(shù)的時候,直接定義函數(shù),在最后寫主函數(shù)。
?
?
效果圖如下:
主函數(shù)菜單包括了題目中的所需信息,在每個選項(xiàng)的函數(shù)里都加了mei()這個函數(shù),這個函數(shù)只是為了有一個這樣的效果
這個就是為了每次進(jìn)行一次操作之后,有一個進(jìn)入成績管理系統(tǒng)的提示信息。
?
3.下面就是函數(shù)部分了,從第一個開始,添加學(xué)生,如果你在成績管理系統(tǒng)菜單選1,就會進(jìn)入添加學(xué)生的界面,按照提示輸入對應(yīng)的信息即可。在這個函數(shù)中,有學(xué)生數(shù)量的計數(shù)器,也有循環(huán),直到在相應(yīng)位置輸入n即可跳出循環(huán)。
?
4.按照學(xué)號刪除學(xué)生,這個需要寫好幾個函數(shù),首先,提示用戶輸入想要刪除學(xué)生的學(xué)號,然后,根據(jù)學(xué)號與結(jié)構(gòu)體數(shù)組想對比,找出來該學(xué)號所對應(yīng)的結(jié)構(gòu)體數(shù)組下標(biāo)。再呈現(xiàn)出該學(xué)生信息,詢問用戶是否確認(rèn)刪除,防止用戶誤刪信息。刪除信息也可以使用鏈表,對指針要求較高,后續(xù)會推出。
?
根據(jù)下面這個函數(shù)可以找到該學(xué)號對應(yīng)的數(shù)組下標(biāo),從而可以輸出該下標(biāo)對應(yīng)的學(xué)生信息(Stu_display函數(shù))
?
?
5.成績信息顯示瀏覽功能,完成全部學(xué)生記錄的顯示。在進(jìn)行學(xué)生的添加以及刪除之后,這個時候,已經(jīng)有了數(shù)據(jù)信息,就可以去顯示,顯示的方法很簡單,按照數(shù)組循環(huán)輸出各項(xiàng)信息即可。
?
6.查詢功能:完成按姓名查找學(xué)生記錄,并顯示。跟刪除學(xué)生類似,找出用戶輸入的名字信息,去對照數(shù)組中的name,如果相同就返回對應(yīng)的數(shù)組下標(biāo)。進(jìn)行學(xué)生信息的顯示。
?
7.排序功能:按學(xué)生總成績進(jìn)行排序,排序的方法很多,我在這就放一個最簡單的冒泡排序。共有九大排序方法,喜歡的話可以去研究一下,其他的方法都比冒泡要快的多。
8.下面就是文件操作了。寫兩個函數(shù),一個寫入,一個讀出。如果第一次運(yùn)行該程序,尚未創(chuàng)建你的文件,那么,在你的寫入函數(shù)中就應(yīng)該考慮到這種情況,在沒有文件的時候,直接新建。以后再運(yùn)行就可以直接讀取了。輸入學(xué)生信息,你可以按照菜單中的選項(xiàng)去執(zhí)行輸入信息,也可以你在那個自己創(chuàng)建的txt中,按照剛才存下來的那種格式,直接寫,最后程序中,也是可以讀取你的信息的。
注意排序后的數(shù)據(jù)必須放到一個新的txt文件里。防止下次讀取的是排序后的文件。但是添加,刪除,你必須還存到第一個學(xué)生信息文件中(未排序)
一次輸入就存到文件里了,下次直接讀取就行,而且讀取根寫入是對應(yīng)的,就不用考慮那么多細(xì)節(jié)了。
這樣說可能有點(diǎn)不清楚,直接上代碼吧。
?
?
?
首先,介紹幾個函數(shù)
(1)gets()
- ?
char *fgets(char *buf, int bufsize, FILE *stream);
*buf: 字符型指針,指向用來存儲所得數(shù)據(jù)的地址。
bufsize: 整型數(shù)據(jù),指明存儲數(shù)據(jù)的大小。
*stream: 文件結(jié)構(gòu)體指針,將要讀取的文件流。
返回值
成功,則返回第一個參數(shù)buf;
在讀字符時遇到end-of-file,則eof指示器被設(shè)置,如果還沒讀入任何字符就遇到這種情況,則buf保持原來的內(nèi)容,返回NULL;
如果發(fā)生讀入錯誤,error指示器被設(shè)置,返回NULL,buf的值可能被改變。
(2)fread
- ?
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
其中,ptr:指向保存結(jié)果的指針;size:每個數(shù)據(jù)類型的大??;count:數(shù)據(jù)的個數(shù);stream:文件指針
函數(shù)返回讀取數(shù)據(jù)的個數(shù)。
(3)fwrite
- ?
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
其中,ptr:指向保存數(shù)據(jù)的指針;size:每個數(shù)據(jù)類型的大小;count:數(shù)據(jù)的個數(shù);stream:文件指針
函數(shù)返回寫入數(shù)據(jù)的個數(shù)。
注意!??!
寫操作fwrite()后必須關(guān)閉流,不關(guān)閉流的情況下,每次讀或?qū)憯?shù)據(jù)后,文件指針都會指向下一個待寫或者讀數(shù)據(jù)位置的指針。
(4)fopen()
fopen函數(shù)是在當(dāng)前目錄下打開一個文件,其調(diào)用的一般形式為:
文件指針名=fopen(文件名,使用文件方式);
“文件指針名”必須是被說明為FILE 類型的指針變量;
“文件名”是被打開文件的文件名;
“使用文件方式”是指文件的類型和操作要求,可參考c prime plus 第十三章文件操作,此處不贅述。
“文件名”是字符串常量或字符數(shù)組。
另有:標(biāo)準(zhǔn)輸入文件(鍵盤),標(biāo)準(zhǔn)輸出文件(顯示器),標(biāo)準(zhǔn)出錯輸出(出錯信息)是由系統(tǒng)打開的,可直接使用。
?
讀取到文件的信息有數(shù)量和各項(xiàng)信息。這是已保存的文件,從文件中讀取出來的信息
排序后的文件依然按照上面的寫入函數(shù)一樣,只不過文件名需要改動一下(只需要改動文件名啊)
有同學(xué)會問,這樣就可以讀取了嗎?是的。注意開頭的主函數(shù)中調(diào)用寫入函數(shù)和讀出函數(shù)的地方,好好理解,并運(yùn)用一下吧。比如說寫入函數(shù),只要你在哪里調(diào)用,之前所有輸入的信息都會保存到文件里。讀取信息的時候,是按照結(jié)構(gòu)體數(shù)組一個一個讀取,采用循環(huán)即可。
審核編輯:湯梓紅
評論