




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)說(shuō)明書(shū)題目:學(xué)生成績(jī)管理系統(tǒng)學(xué)院:計(jì)算機(jī)科學(xué)與工程學(xué)院專(zhuān)業(yè):計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名:學(xué)號(hào):指導(dǎo)教師: 2012年 09 月 21 日摘要隨著科學(xué)的發(fā)展和社會(huì)的進(jìn)步,許多過(guò)去由人工處理的繁雜事務(wù)開(kāi)始交付計(jì)算機(jī)來(lái)完成。明顯地加快了經(jīng)濟(jì)信息化和社會(huì)信息化的進(jìn)程。因此,計(jì)算機(jī)教育在各國(guó)備受重視,計(jì)算機(jī)知識(shí)與能力已成為21世紀(jì)人才素質(zhì)的基本要素之一。本說(shuō)明書(shū)簡(jiǎn)單敘述了學(xué)生管理系統(tǒng)的現(xiàn)狀,重點(diǎn)介紹了學(xué)生成績(jī)管理系統(tǒng)的實(shí)現(xiàn)過(guò)程:包括系統(tǒng)分析、數(shù)據(jù)流程分析、功能設(shè)計(jì)、系統(tǒng)實(shí)現(xiàn)、系統(tǒng)測(cè)試和調(diào)試。 C語(yǔ)言是一種通用的程序設(shè)計(jì)語(yǔ)言,C語(yǔ)言在很多方面繼承和發(fā)展了以往許多高級(jí)程序設(shè)計(jì)語(yǔ)言的成果經(jīng)
2、驗(yàn)與特色,具有適應(yīng)性強(qiáng)、應(yīng)用范圍廣、書(shū)寫(xiě)格式自由、數(shù)據(jù)類(lèi)型豐富、數(shù)據(jù)結(jié)構(gòu)系統(tǒng)化、運(yùn)行程序質(zhì)量高、可移植性好和運(yùn)行效率高等優(yōu)點(diǎn)。而數(shù)據(jù)結(jié)構(gòu)與算法則是對(duì)數(shù)據(jù)進(jìn)行一定的結(jié)構(gòu)化,通過(guò)運(yùn)用各種算法使系統(tǒng)的實(shí)現(xiàn)更簡(jiǎn)便易行。關(guān)鍵詞:C語(yǔ)言;數(shù)據(jù)結(jié)構(gòu);學(xué)生成績(jī)管理系統(tǒng);目錄1系統(tǒng)概述12需求分析2數(shù)據(jù)需求分析2功能需求分析2界面需求3輸入輸出形式3開(kāi)發(fā)環(huán)境33詳細(xì)設(shè)計(jì)4系統(tǒng)結(jié)構(gòu)4各個(gè)模塊的功能5模塊功能的設(shè)計(jì)5數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)20學(xué)生成績(jī)信息結(jié)構(gòu)體20單鏈表node結(jié)構(gòu)體204測(cè)試結(jié)果215結(jié)論24參考文獻(xiàn)25引言背景:21世紀(jì),科學(xué)技術(shù)突飛猛進(jìn),特別是信息技術(shù)和網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,各個(gè)學(xué)校的規(guī)模也隨之不斷增大,
3、有關(guān)學(xué)生成績(jī)管理工作所涉及的數(shù)據(jù)量越來(lái)越大,如若進(jìn)行的仍是手工的學(xué)生成績(jī)管理,學(xué)校就不得不靠增加人力、物力來(lái)進(jìn)行學(xué)生成績(jī)管理。即使如此,手工管理仍具有效率低、管理復(fù)雜和易出錯(cuò)等諸多問(wèn)題。所以在學(xué)校這樣一個(gè)具有超大數(shù)據(jù)量的機(jī)構(gòu)中,通過(guò)應(yīng)用信息技術(shù)和網(wǎng)絡(luò)技術(shù)對(duì)學(xué)生成績(jī)信息進(jìn)行系統(tǒng)化的管理是必須的。將計(jì)算機(jī)這一信息處理器應(yīng)用于學(xué)生的個(gè)人信息管理已是勢(shì)必所然,而且這也將為學(xué)生信息管理帶來(lái)前所未有的改變。采用計(jì)算機(jī)對(duì)學(xué)生的信息管理是信息科學(xué)化和現(xiàn)代的重要標(biāo)志,它也給各大高校帶來(lái)了明顯的社會(huì)效益。主要體現(xiàn)在:極大地提高了管理工作人員的工作效率,大大地減少了以往的資料室所存在的各種弊端,同時(shí)也加強(qiáng)和規(guī)范學(xué)校
4、對(duì)于學(xué)生信息的管理。目的:本系統(tǒng)運(yùn)用C語(yǔ)言進(jìn)行開(kāi)發(fā),C語(yǔ)言能夠簡(jiǎn)單地進(jìn)行編譯一些程序,來(lái)實(shí)現(xiàn)對(duì)問(wèn)題的解決。它能夠呈現(xiàn)出清晰的界面,使人們能夠很好地理解,并能在一些方面給人們更好的服務(wù),所以,它能夠被大多數(shù)用戶(hù)所接受。經(jīng)過(guò)一個(gè)學(xué)期對(duì)數(shù)據(jù)結(jié)構(gòu)與算法的學(xué)習(xí),我們都學(xué)到了不少東西,可能學(xué)得還不夠透徹,但無(wú)論如何這都為我們以后的學(xué)習(xí)打下一定堅(jiān)實(shí)的基礎(chǔ)。在通過(guò)運(yùn)用結(jié)構(gòu)體和調(diào)用各種數(shù)據(jù)結(jié)構(gòu)算法與C語(yǔ)言相結(jié)合來(lái)完成下面的學(xué)生成績(jī)管理系統(tǒng),一方面是為了檢查我們一個(gè)學(xué)期以來(lái)的學(xué)習(xí)成果,另一方面是為了更進(jìn)一步對(duì)數(shù)據(jù)結(jié)構(gòu)與算法的掌握和運(yùn)用,同時(shí)也讓我們清楚的知道自己的掌握水平和不足之處。1 系統(tǒng)概述學(xué)生成績(jī)管理系統(tǒng)的
5、主要功能是實(shí)現(xiàn)學(xué)生成績(jī)信息的管理。如若還沒(méi)有建立文件可以在指定路徑新建文件,學(xué)生成績(jī)信息有學(xué)號(hào)、姓名、C+、高數(shù)、英語(yǔ)、總分、平均分和名次的顯示。學(xué)生成績(jī)管理包括對(duì)學(xué)生各科成績(jī)的錄入、查詢(xún)、刪除、修改、插入、統(tǒng)計(jì)、排序和保存等功能。查詢(xún)分為按學(xué)號(hào)和按姓名進(jìn)行查找,然后輸出查找學(xué)生的全部信息;刪除可以通過(guò)按姓名或者學(xué)號(hào)先進(jìn)行學(xué)生信息記錄定位,然后進(jìn)行刪除,最后對(duì)學(xué)生信息記錄進(jìn)行調(diào)整并保存;在進(jìn)行修改處理時(shí),系統(tǒng)會(huì)首先根據(jù)用戶(hù)的要求先查找到此學(xué)生的記錄,然后提示修改學(xué)號(hào)之外的值;插入學(xué)生記錄,系統(tǒng)首先進(jìn)行對(duì)插入結(jié)點(diǎn)位置的定位,然后在該結(jié)點(diǎn)后插入新的結(jié)點(diǎn);統(tǒng)計(jì)可以對(duì)學(xué)生信息記錄統(tǒng)計(jì)出各科不及格人數(shù),
6、單科及總分最高分的學(xué)生信息記錄,并輸出相關(guān)信息;學(xué)生信息記錄排序處理,系統(tǒng)按照插入排序算法實(shí)現(xiàn)單鏈表的按總分字段的降序排序,并顯示結(jié)果。以上就是對(duì)本系統(tǒng)的整個(gè)流程和功能的大概描述,管理系統(tǒng)界面簡(jiǎn)潔、清楚、功能齊全,使用方便,讓使用的人一看就知道如何操作。2 需求分析隨著社會(huì)的發(fā)展,管理信息系統(tǒng)在各行各業(yè)都越來(lái)越重要,特別是教育事業(yè)。在經(jīng)濟(jì)發(fā)達(dá)的國(guó)家,許多教育機(jī)構(gòu)都投入了大量的資金來(lái)開(kāi)發(fā)信息管理系統(tǒng),就是為了在以后激烈的競(jìng)爭(zhēng)中立于不敗之地。在我國(guó),民辦教育是一個(gè)新興的行業(yè),它是隨著改革開(kāi)放和中國(guó)特有的國(guó)情發(fā)展起來(lái)的。中國(guó)民辦教育促進(jìn)法的出臺(tái),從一定程度上促進(jìn)和規(guī)范了民辦教育事業(yè)的發(fā)展,這是一個(gè)很
7、有前途的新興產(chǎn)業(yè)。與發(fā)達(dá)國(guó)家相比,我國(guó)的民辦教育機(jī)構(gòu)信息技術(shù)的應(yīng)用程度還比較低,信息管理系統(tǒng)能從各方面提高工作效率,為教育機(jī)構(gòu)取得良好的經(jīng)濟(jì)效益和社會(huì)效益。近年來(lái),雖然計(jì)算機(jī)技術(shù)發(fā)展迅速,網(wǎng)絡(luò)已經(jīng)普及到尋常百姓家庭,但是還有些學(xué)校還沒(méi)有學(xué)生的成績(jī)管理系統(tǒng),所有的信息操縱基本都是手工完成,甚至有的還停留在紙介質(zhì)基礎(chǔ)上,這種種的管理手段會(huì)浪費(fèi)許多的人力和物力,并且效率低下?,F(xiàn)在已經(jīng)進(jìn)入21世紀(jì),以后的社會(huì)是信息的社會(huì),信息只有快、準(zhǔn)、精才能實(shí)現(xiàn)其價(jià)值。傳統(tǒng)的管理方法必然被計(jì)算機(jī)信息管理系統(tǒng)所替代,因?yàn)闄C(jī)器代替人力是必然的歷史發(fā)展趨勢(shì)。設(shè)計(jì)該學(xué)生成績(jī)管理系統(tǒng)具有重要的意義:學(xué)生成績(jī)管理是學(xué)校管理中最
8、重要的一個(gè)環(huán)節(jié),作為學(xué)校,除了育人,就是育知,學(xué)生成績(jī)管理的計(jì)算機(jī)化是整個(gè)教務(wù)管理的重要部分。能否實(shí)現(xiàn)這一步關(guān)系到學(xué)校整體辦學(xué)效率的高低,應(yīng)用該系統(tǒng)可以減少學(xué)校工作人員的工作量,縮小開(kāi)支,提高學(xué)校的整體工作效率。2.1 數(shù)據(jù)需求分析本系統(tǒng)的主要數(shù)據(jù)是學(xué)生的成績(jī)信息,學(xué)生成績(jī)信息包括:數(shù)據(jù)類(lèi)型為字符型的學(xué)生學(xué)號(hào),姓名;數(shù)據(jù)類(lèi)型為整型的C+成績(jī),高數(shù)成績(jī),英語(yǔ)成績(jī),總分和名次;還有數(shù)據(jù)類(lèi)型為浮點(diǎn)數(shù)類(lèi)型的平均分等。2.2 功能需求分析1. 使用中文菜單,界面設(shè)計(jì)和用戶(hù)輸入輸出要人性化些。2. 將學(xué)生信息保存在文本文檔中,具體對(duì)學(xué)生信息進(jìn)行插入刪除查詢(xún)操作時(shí),將保存在文本文檔中的學(xué)生信息提取出來(lái),保存
9、在自己定義的數(shù)據(jù)結(jié)構(gòu)中,然后再對(duì)該數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,所有操作完成,或者在相應(yīng)的命令后,再將學(xué)生信息保存到文本文檔中。3. 具有數(shù)據(jù)輸入功能,輸入的數(shù)據(jù)能最終保存在文件中。4. 具有數(shù)據(jù)刪除功能,能最終從文件中刪除。5. 排序功能,根據(jù)自己設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)。6. 具有多種查詢(xún)(如按學(xué)號(hào)查詢(xún)、按姓名查詢(xún)等)及相關(guān)信息的輸出功能;7. 其它功能(如各種統(tǒng)計(jì),統(tǒng)計(jì)每個(gè)學(xué)生所有課程的平均分,統(tǒng)計(jì)某門(mén)課程所有學(xué)生的平均分等)。8. 學(xué)生信息的修改(比如修改學(xué)生姓名,修改學(xué)生某門(mén)課程的成績(jī)等,并將修改的結(jié)果存儲(chǔ)在文件中)2.3 界面需求系統(tǒng)界面要具有廣泛的實(shí)用性,便于移植。界面友好,操作簡(jiǎn)便。根據(jù)軟件的使用環(huán)
10、境、用戶(hù)的要求,系統(tǒng)界面應(yīng)該簡(jiǎn)單、友好、易于使用、方便查看、簡(jiǎn)潔明快。而且系統(tǒng)是在Windows環(huán)境下的應(yīng)用軟件,軟件產(chǎn)品的界面應(yīng)該與操作系統(tǒng)的界面相切合,產(chǎn)品的主界面應(yīng)該功能齊全,分類(lèi)明確,讓用戶(hù)一眼看去就能明白大致的功能。2.4 輸入輸出形式本系統(tǒng)是一個(gè)學(xué)生成績(jī)管理系統(tǒng),采用VC編譯器作為開(kāi)發(fā)環(huán)境,這個(gè)環(huán)境是我們?cè)趯W(xué)習(xí)C+的平臺(tái)。輸入數(shù)據(jù)類(lèi)型主要是char、int、float等數(shù)據(jù)類(lèi)型,輸入內(nèi)容包括:學(xué)號(hào)、姓名、C+成績(jī)、高數(shù)成績(jī)、英語(yǔ)成績(jī)等數(shù)據(jù)。用戶(hù)在輸入學(xué)生數(shù)據(jù)時(shí)不需要保證輸入數(shù)據(jù)格式的正確性,系統(tǒng)會(huì)自動(dòng)檢測(cè)輸入的數(shù)據(jù)是否正確,輸出形式與輸入形式類(lèi)似,根據(jù)需要可以選擇顯示輸入的各項(xiàng)內(nèi)容
11、,還可以選擇顯示計(jì)算好平均分后并排序后的記錄,顯示內(nèi)容包括:學(xué)號(hào)、姓名、C+成績(jī)、高數(shù)成績(jī)、英語(yǔ)成績(jī)、總分、平均分等數(shù)據(jù)。2.5 開(kāi)發(fā)環(huán)境Visual C+不僅僅是是一個(gè)C+編譯器,而是一個(gè)基于Windows操作系統(tǒng)的可視化集成開(kāi)發(fā)環(huán)境,這種環(huán)境開(kāi)發(fā)出來(lái)的軟件穩(wěn)定性好、可移植性強(qiáng),可以編制各種各樣的Windows應(yīng)用程序。3 詳細(xì)設(shè)計(jì)3.1 系統(tǒng)結(jié)構(gòu)此學(xué)生成績(jī)管理系統(tǒng)主要利用單鏈表實(shí)現(xiàn),從整體結(jié)構(gòu)看,分為五大功能模塊:輸入記錄模塊、查詢(xún)記錄模塊、更新記錄模塊、統(tǒng)計(jì)記錄模塊和輸出記錄模塊。其系統(tǒng)模塊構(gòu)成如圖3-1所示。圖3-1 學(xué)生成績(jī)管理系統(tǒng)功能模塊圖3.2 各個(gè)模塊的功能為了滿(mǎn)足系統(tǒng)需求要求
12、,系統(tǒng)所需的主要模塊與功能如下:(1) 輸入記錄模塊。輸入記錄模塊主要完成將數(shù)據(jù)存入單鏈表中的工作。在此成績(jī)管理系統(tǒng)中,記錄可以從以二進(jìn)制形式存儲(chǔ)的數(shù)據(jù)文件中讀入,也可以從鍵盤(pán)逐個(gè)輸入學(xué)生記錄。學(xué)生記錄由學(xué)生的基本信息和成績(jī)信息字段構(gòu)成。當(dāng)從數(shù)據(jù)文件中讀入記錄時(shí),它就是以記錄為單位存儲(chǔ)的數(shù)據(jù)文件中,將記錄逐條復(fù)制到鏈表中。(2) 查詢(xún)記錄模塊。查詢(xún)記錄模塊主要完成在單鏈表中查找滿(mǎn)足相關(guān)條件的學(xué)生記錄。在此成績(jī)管理系統(tǒng)中,用戶(hù)可以按照學(xué)生的學(xué)號(hào)或姓名在單鏈表中進(jìn)行查找。若找到該學(xué)生的記錄,則返回指向該學(xué)生記錄的指針;否則,返回一個(gè)值為NULL的空指針,并輸出沒(méi)有找到該學(xué)生的信息。(3) 更新記錄
13、模塊。該模塊主要完成對(duì)學(xué)生記錄的維護(hù)。在此系統(tǒng)中它實(shí)現(xiàn)了對(duì)學(xué)生記錄的修改、刪除、排序和插入等操作。而進(jìn)行了這些操作之后,需要將更新后的數(shù)據(jù)保存到數(shù)據(jù)文件中。(4) 統(tǒng)計(jì)記錄模塊。完成了對(duì)學(xué)生總?cè)藬?shù)、各科不及格人數(shù)的統(tǒng)計(jì),單科成績(jī)最高分以及總分最高分的統(tǒng)計(jì)(5) 輸出記錄模塊。該模塊主要完成兩個(gè)任務(wù):一是實(shí)現(xiàn)對(duì)學(xué)生記錄的存盤(pán)操作,即將單鏈表中的各節(jié)點(diǎn)中存儲(chǔ)的學(xué)生記錄信息寫(xiě)入數(shù)據(jù)文件中;二是實(shí)現(xiàn)將單鏈表中存儲(chǔ)的學(xué)生成績(jī)和基本信息在屏幕界面上輸出來(lái)。3.2.1 模塊功能的設(shè)計(jì)u 主函數(shù)模塊用函數(shù)void main()來(lái)實(shí)現(xiàn)。主要是來(lái)顯示主菜單,讓用戶(hù)選擇操作。首先進(jìn)行的是打開(kāi)文件的操作,只有打開(kāi)文件
14、或創(chuàng)建文件成功,才能進(jìn)入主菜單。之后應(yīng)用了while(1)永真循環(huán)和switch-case語(yǔ)句來(lái)進(jìn)行選擇,是個(gè)比較簡(jiǎn)單實(shí)現(xiàn)的模塊。最后若選擇“0”則是退出永真循環(huán)。退出此系統(tǒng)之前如若未進(jìn)行更新數(shù)據(jù)之后的保存操作,則會(huì)提示用戶(hù)是否進(jìn)行更新數(shù)據(jù)后的保存,然后才退出系統(tǒng)。u 錄入學(xué)生記錄模塊用函數(shù)void Type_in(Link l);來(lái)實(shí)現(xiàn)。主要功能用來(lái)對(duì)學(xué)生的成績(jī)進(jìn)行收集和輸入。函數(shù)首先進(jìn)行的是對(duì)讀取的數(shù)據(jù)文件的數(shù)據(jù)收集工作,如若在指定路徑找不到數(shù)據(jù)文件,系統(tǒng)則會(huì)創(chuàng)建新的數(shù)據(jù)文件;如果找到數(shù)據(jù)文件,系統(tǒng)則根據(jù)指定的文件讀取方式度數(shù)據(jù)文件中的數(shù)據(jù)進(jìn)行讀取,并打印顯示在界面上。之后會(huì)有個(gè)提示“輸入
15、新的學(xué)號(hào)(按數(shù)字0返回主菜單)”,這樣就可以按照系統(tǒng)的提示輸入學(xué)生的成績(jī)信息了。錄入學(xué)生記錄模塊可以錄入學(xué)生的成績(jī)信息,比如學(xué)號(hào),姓名,成績(jī)等。系統(tǒng)首先會(huì)根據(jù)用戶(hù)輸入的學(xué)號(hào)來(lái)用函數(shù)void stringinput(char *t,size_tlens,char *notice);對(duì)鏈表結(jié)點(diǎn)進(jìn)行一一比對(duì),以此來(lái)判定錄入學(xué)生信息期間是否有重復(fù)學(xué)號(hào)輸入,系統(tǒng)還會(huì)根據(jù)intnumberinput(char *notice);來(lái)判定學(xué)生的各科成績(jī)錄入是否在0到100之間。之后系統(tǒng)對(duì)學(xué)生的成績(jī)進(jìn)行總分匯總,并計(jì)算錄入的每位學(xué)生的平均分。在本操作中,允許有重復(fù)的學(xué)生姓名出現(xiàn)。在此模塊中,用到了一個(gè)控制變量f
16、lag,它是用來(lái)判定的條件變量,flag=1表示找到了與之重復(fù)的學(xué)號(hào),系統(tǒng)會(huì)提示改學(xué)號(hào)已經(jīng)被占用,是否重新輸入?(y/n)flag=0表示未出現(xiàn)重復(fù)學(xué)號(hào)。系統(tǒng)默認(rèn)按學(xué)號(hào)排序保存到文件中去(名次初始化為0)。錄入數(shù)據(jù)完畢后按數(shù)字0即可返回主菜單。主要代碼如下:voidType_in(Link l)Node *p,*r,*s;/*實(shí)現(xiàn)添加操作的臨時(shí)的結(jié)構(gòu)體指針變量*/charch,flag=0,num10;r=l;s=l->next;system("cls");printf("n 歡迎進(jìn)入增加學(xué)生記錄界面");show(l);/*先打印出已有的學(xué)生信息
17、*/while(r->next!=NULL)r=r->next;/*將指針移至于鏈表最末尾,準(zhǔn)備添加記錄*/while(1)/*一次可輸入多條記錄,直至輸入學(xué)號(hào)為0的記錄結(jié)點(diǎn)添加操作結(jié)束*/while(1)/*若輸入學(xué)號(hào)為0,則退出添加記錄操作*/stringinput(num,10,"輸入新的學(xué)號(hào)(按數(shù)字0返回主菜單):"); /*格式化輸入學(xué)號(hào)并檢驗(yàn)*/flag=0;/*該標(biāo)志用于對(duì)輸入字符串的合法性進(jìn)行校驗(yàn)*/if(strcmp(num,"0")=0) /*輸入為0,返回主界面*/return;s=l->next;/*s指針指向頭
18、結(jié)點(diǎn)的后繼結(jié)點(diǎn),用于校驗(yàn)學(xué)號(hào)是否重復(fù)*/while(s)/*查詢(xún)?cè)搶W(xué)號(hào)是否已經(jīng)存在,若存在則要求重新輸入學(xué)號(hào)*/if(strcmp(s->data.num,num)=0)flag=1;break;s=s->next;if(flag=1)/*提示用戶(hù)是否重新輸入*/ getchar();printf("=>該學(xué)號(hào) %s 已經(jīng)被占用,是否重新輸入?(y/n):",num);scanf("%c",&ch);if(ch='y'|ch='Y')continue;elsereturn;elsebreak;p=
19、(Node *)malloc(sizeof(Node);/*申請(qǐng)內(nèi)存空間*/if(!p)printf("n申請(qǐng)空間失敗! ");/*如沒(méi)有申請(qǐng)到,打印提示信息*/return ;/*返回主界面*/strcpy(p->data.num,num);/*將字符串num拷貝到p->中*/stringinput(p->,15,"姓名:");p->=numberinput("C語(yǔ)言成績(jī)0-100:");/*輸入并檢驗(yàn)分?jǐn)?shù),分?jǐn)?shù)必須在0100之間*/p->=numberinput("高數(shù)成績(jī)
20、0-100:");/*輸入并檢驗(yàn)分?jǐn)?shù),分?jǐn)?shù)必須在0100之間*/p->=numberinput("英語(yǔ)成績(jī)0-100:");/*輸入并檢驗(yàn)分?jǐn)?shù),分?jǐn)?shù)必須在0100之間*/p->=p->+p->data.cgrade+p->/*計(jì)算總分p->=(float)(p->/3);/*計(jì)算平均分,強(qiáng)制類(lèi)型轉(zhuǎn)換*/p->=0;/*增加的學(xué)生信息記錄,名次初始化為零。*/p->next=NULL;/*表明這是鏈表的尾部結(jié)點(diǎn)*/r->next=p;/*將新建的結(jié)點(diǎn)加入鏈表尾部中*/r=p;saveflag=1;retur
21、n ;u 按學(xué)號(hào)或姓名刪除學(xué)生記錄用函數(shù)void Delete(Link l)來(lái)實(shí)現(xiàn)。主要功能是用來(lái)刪除學(xué)生記錄。首先有個(gè)鏈表判空的操作,如果鏈表不為空則顯示刪除前的信息記錄。之后會(huì)有格式化輸入字符串的判斷,按照數(shù)字選擇利用Node* Locate(Link l,charfindmess,char nameornum);匹配學(xué)號(hào)或是姓名,之后利用if(p)/*p!=NULL*/語(yǔ)句,對(duì)鏈表中字段相匹配的結(jié)點(diǎn)進(jìn)行刪除操作,并釋放其空間。刪除成功后打印刪除后的全體學(xué)生信息記錄。具體代碼如下:void Delete(Link l)int select;Node *p,*r;charfindmess2
22、0;if(!l->next) system("cls");printf("n=>鏈表為空,沒(méi)有信息記錄!無(wú)法刪除!按回車(chē)鍵返回.n");getchar();getchar();return;system("cls");printf("n 歡迎進(jìn)入刪除學(xué)生記錄界面");show(l);printf("n =>選擇1 按學(xué)號(hào)刪除 =>選擇2 按姓名刪除n");printf("n 請(qǐng)選擇1或2:");scanf("%d",&sel
23、ect);if(select=1)stringinput(findmess,10,"n請(qǐng)輸入您要?jiǎng)h除的學(xué)生記錄的學(xué)號(hào):");p=Locate(l,findmess,"num");if(p)/*p!=NULL*/r=l;while(r->next!=p)r=r->next;r->next=p->next;/*將p所指節(jié)點(diǎn)從鏈表中去除*/free(p);/*釋放內(nèi)存空間*/printf("n=>刪除成功!n");show(l);saveflag=1;elseNofind();getchar();else if
24、(select=2)/*先按姓名查詢(xún)到該記錄所在的結(jié)點(diǎn)*/stringinput(findmess,15,"請(qǐng)輸入您要?jiǎng)h除的記錄的學(xué)生姓名:");p=Locate(l,findmess,"name");if(p)r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("n=>刪除成功!n");show(l);saveflag=1;elseNofind();getchar();elseWrong();getchar();u 按學(xué)號(hào)或姓名來(lái)查
25、詢(xún)學(xué)生記錄模塊用函數(shù)void Query(Link l);來(lái)實(shí)現(xiàn)。主要功能時(shí)用來(lái)查詢(xún)學(xué)生記錄。首先會(huì)有提示是按學(xué)號(hào)查詢(xún)還是按姓名查詢(xún),再用if判斷語(yǔ)句if(select=?)來(lái)進(jìn)行查找,若找到則顯示該學(xué)生的成績(jī)信息記錄并按回車(chē)鍵返回主菜單;如果沒(méi)有找到與輸入信息匹配的記錄則顯示“沒(méi)有找到該學(xué)生的信息記錄”。代碼如下:void Query(Link l)/*按學(xué)號(hào)或姓名,查詢(xún)學(xué)生記錄*/int select;/*1:按學(xué)號(hào)查詢(xún),2:按姓名查詢(xún),其他:返回主界面(菜單)*/char searchinput20;/*保存用戶(hù)輸入的查詢(xún)內(nèi)容*/Node *p;if(!l->next)/*若鏈表為
26、空*/system("cls");printf("n=>鏈表為空,沒(méi)有學(xué)生的信息記錄!無(wú)法查詢(xún)!按回車(chē)鍵返回.n");getchar();getchar();return;system("cls");printf("n 歡迎進(jìn)入查詢(xún)學(xué)生記錄界面n");printf("nn =>1 按學(xué)號(hào)查詢(xún) =>2 按姓名查詢(xún)n");printf("n 請(qǐng)選擇1或2:");scanf("%d",&select);if(select=1)/*按學(xué)號(hào)
27、查詢(xún)*/stringinput(searchinput,10,"請(qǐng)輸入您所要查詢(xún)的學(xué)號(hào):");p=Locate(l,searchinput,"num");/*在鏈表中查找學(xué)號(hào)為searchinput值的結(jié)點(diǎn),并返回結(jié)點(diǎn)的指針*/if(p)/*若p!=NULL*/printheader();printdata(p);printf(END);printf("按回車(chē)鍵返回.");getchar();elseNofind();getchar();else if(select=2)/*按姓名查詢(xún)*/stringinput(searchinput
28、,15,"請(qǐng)輸入您所要查詢(xún)的學(xué)生姓名:");p=Locate(l,searchinput,"name");if(p)printheader();printdata(p);printf(END);printf("按回車(chē)鍵返回.");getchar();elseNofind();getchar();elseWrong();getchar();u 修改學(xué)生記錄模塊用函數(shù)void Modify(Link l);來(lái)實(shí)現(xiàn)。主要功能是用來(lái)修改學(xué)生記錄。首先是提示用戶(hù)看看要修改的學(xué)生學(xué)號(hào)是否存在,這個(gè)是通過(guò)Node* Locate(Link l,ch
29、arfindmess,char nameornum);來(lái)判斷的(學(xué)號(hào)是不會(huì)有重復(fù)的),如果學(xué)號(hào)存在,則系統(tǒng)會(huì)提示修改學(xué)號(hào)之外的值。最后將修改過(guò)后的記錄打印出來(lái),并提示修改成功!具體代碼如下:void Modify(Link l)Node *p;charfindmess20;if(!l->next) system("cls");printf("n=>鏈表為空,沒(méi)有信息記錄!無(wú)法修改!按回車(chē)鍵返回.n");getchar();getchar();return;system("cls");printf("n 歡迎進(jìn)入修
30、改學(xué)生記錄界面");show(l);stringinput(findmess,10,"請(qǐng)輸入您要修改的學(xué)生學(xué)號(hào):");/*輸入并檢驗(yàn)該學(xué)號(hào)*/p=Locate(l,findmess,"num");/*查詢(xún)到該節(jié)點(diǎn)*/if(p)/*若p!=NULL,表明已經(jīng)找到該節(jié)點(diǎn)*/printf("學(xué)號(hào):%s,n",p->);printf("姓名:%s,",p->);stringinput(p->,15,"請(qǐng)輸入新的名字:");printf(&q
31、uot;C+成績(jī):%d,",p->);p->=numberinput("請(qǐng)輸入新的C+成績(jī)0-100:");printf("高數(shù)成績(jī):%d,",p->);p->=numberinput("請(qǐng)輸入新的高數(shù)成績(jī)0-100:");printf("英語(yǔ)成績(jī):%d,",p->);p->=numberinput("請(qǐng)輸入新的英語(yǔ)成績(jī)0-100:");p->=p->data.egrade+p->data.cgrade+p->p->=(
32、float)(p->/3);p->=0;printf("n=>修改成功!n");show(l);saveflag=1;elseNofind();getchar();u 插入學(xué)生記錄模塊用函數(shù)void Insert(Link l);來(lái)實(shí)現(xiàn)。主要功能是用來(lái)增加學(xué)生信息記錄,若顯示時(shí)沒(méi)有此學(xué)生的信息,則不能進(jìn)行該功能的操作。因?yàn)榇四K算法采用的是后插法,首先是進(jìn)行對(duì)插入結(jié)點(diǎn)位置的定位,然后在該結(jié)點(diǎn)后插入新的結(jié)點(diǎn)。如果可以進(jìn)行插入操作,系統(tǒng)會(huì)先檢查定位的結(jié)點(diǎn)是否存在(比對(duì)學(xué)號(hào)),然后再檢查需要插入的新信息中學(xué)號(hào)是否重復(fù),如果重復(fù),系統(tǒng)會(huì)打印該學(xué)號(hào)的學(xué)生成績(jī)信息,然
33、后退出返回主菜單,本模塊功能到此結(jié)束。主要代碼如下:void Insert(Link l)Link p,v,newinfo;/*p指向插入位置,newinfo指新插入記錄*/char ch,num10,s10;/*s保存插入點(diǎn)位置之前的學(xué)號(hào),num保存輸入的新記錄的學(xué)號(hào)*/int flag=0;v=l->next;system("cls");printf("n 歡迎進(jìn)入插入學(xué)生記錄界面");show(l);if(l->next=NULL)printf("n=>鏈表為空,沒(méi)有學(xué)生的信息記錄!無(wú)法進(jìn)行后插操作!按回車(chē)鍵返回.n&q
34、uot;);getchar();return ;while(1) stringinput(s,10,"請(qǐng)您輸入學(xué)號(hào),則插入的學(xué)生信息在該學(xué)號(hào)的后面:");flag=0;v=l->next;while(v)/*查詢(xún)?cè)搶W(xué)號(hào)是否存在,flag=1表示該學(xué)號(hào)存在*/if(strcmp(v->data.num,s)=0) flag=1;break;v=v->next;if(flag=1)break;/*若學(xué)號(hào)存在,則進(jìn)行插入之前的新記錄的輸入操作*/elsegetchar();printf("n=>學(xué)號(hào)%s不存在!是否重新輸入?(y/n):"
35、;,s);scanf("%c",&ch);if(ch='y'|ch='Y')continue;elsereturn;/*以下新記錄的輸入操作與Type_in()相同*/stringinput(num,10,"輸入學(xué)號(hào):");v=l->next;while(v)if(strcmp(v->data.num,num)=0)printf("=>對(duì)不起,學(xué)號(hào)'%s'已經(jīng)存在!n",num);printheader();printdata(v);printf(END);pr
36、intf("n");getchar();getchar();return;v=v->next;newinfo=(Node *)malloc(sizeof(Node);if(!newinfo)printf("n申請(qǐng)失敗!");/*如沒(méi)有申請(qǐng)到,打印提示信息*/return ;/*返回主界面*/strcpy(newinfo->data.num,num);stringinput(newinfo->,15,"輸入姓名:");newinfo->=numberinput("C+成績(jī)0-100:&
37、quot;);newinfo->=numberinput("高數(shù)成績(jī)0-100:");newinfo->=numberinput("英語(yǔ)成績(jī)0-100:");newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade;newinfo->=(float)(newinfo->/3);newinfo->=0;newinfo->next=NULL;saveflag=1; /*在main()有對(duì)該全局
38、變量的判斷,若為1,進(jìn)行存盤(pán)*/*將指針賦值給p,因?yàn)閘中的頭節(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)才實(shí)際保存著學(xué)生的記錄。*/p=l->next;while(1)if(strcmp(p->data.num,s)=0) /*在鏈表中插入一個(gè)結(jié)點(diǎn)*/newinfo->next=p->next;p->next=newinfo;break;p=p->next; show(l);printf("nn");getchar();u 統(tǒng)計(jì)學(xué)生總?cè)藬?shù)及各科目不及格人數(shù)模塊用函數(shù)void Statistics(Link l);來(lái)實(shí)現(xiàn)。主要功能是統(tǒng)計(jì)學(xué)生總?cè)藬?shù)和各科目不及格人數(shù),
39、以及指出各科的最高分學(xué)生的姓名。代碼比較容易實(shí)現(xiàn)。void Statistics(Link l)Node *pm,*pe,*pc,*pt;/*用于指向分?jǐn)?shù)最高的節(jié)點(diǎn)*/Node *r=l->next;intcountc=0,countm=0,counte=0; /*保存三門(mén)成績(jī)中不及格的人數(shù)*/if(!r) system("cls");printf("n=>鏈表為空,沒(méi)有信息記錄!無(wú)法統(tǒng)計(jì)!按回車(chē)鍵返回.n");getchar();getchar();return ;system("cls");printf("n
40、 歡迎進(jìn)入統(tǒng)計(jì)學(xué)生記錄界面");show(l);pm=pe=pc=pt=r;while(r)if(r-><60)countc+;if(r-><60) countm+;if(r-><60)counte+;if(r->d>=pc->)pc=r;if(r->d>=pm->)pm=r;if(r->>=pe->)pe=r;if(r->>=pt->)pt=r;r=r->next;printf("n-統(tǒng)計(jì)結(jié)果如下-n");printf("C+ <60
41、分: %d 人n",countc);printf("高數(shù) <60分: %d 人n",countm);printf("英語(yǔ) <60分: %d 人n",counte);printf("學(xué) 生 信 息 表 中 總 分 最 高 的人是: %s 最高總分是: %dn",pt->,pt->);printf("學(xué) 生 信 息 表 中 英語(yǔ)成績(jī)最高的人是: %s 最高英語(yǔ)成績(jī)是: %dn",pe->,pe->);printf("學(xué) 生 信
42、息 表 中 高數(shù)成績(jī)最高的人是: %s 最高高數(shù)成績(jī)是: %dn",pm->,pm->);printf("學(xué) 生 信 息 表 中 C+ 成績(jī)最高的人是: %s 最高C+成績(jī)是: %dn",pc->,pc->);printf("nn按回車(chē)鍵返回.");getchar();u 按總分成績(jī)(插入排序法)降序排序模塊用函數(shù)void Sort(Link l);來(lái)實(shí)現(xiàn)。主要功能是用來(lái)對(duì)學(xué)生的記錄按總分成績(jī)進(jìn)行降序排序。這樣方便對(duì)學(xué)生總體成績(jī)有個(gè)大致的了解。首先定義三個(gè)臨時(shí)指針,為排序做基礎(chǔ)。其中r
43、r鏈表則是用于存儲(chǔ)插入單個(gè)結(jié)點(diǎn)后保持排序的鏈表,ll始終為這個(gè)鏈表的頭指針,每次都經(jīng)過(guò)頭指針尋找插入位置,此時(shí)rr作為移動(dòng)指針按條件遍歷鏈表;s為新建結(jié)點(diǎn),用于保存從原鏈表中取出的結(jié)點(diǎn)信息,其指針域始終為空。找到正確位置后就是結(jié)點(diǎn)的插入操作而已了。void Sort(Link l)Link ll;Node *p,*rr,*s;inti=0;if(l->next=NULL)system("cls");printf("n=>鏈表為空,沒(méi)有信息記錄!無(wú)法排序!按回車(chē)鍵返回.n");getchar();getchar();return ;ll=(No
44、de*)malloc(sizeof(Node);/*用于創(chuàng)建新的節(jié)點(diǎn)*/if(!ll)printf("n申請(qǐng)空間失敗!");/*如沒(méi)有申請(qǐng)到,打印提示信息*/return ;/*返回主界面*/ll->next=NULL;system("cls");printf("n 歡迎進(jìn)入學(xué)生總分排名界面n");printf("n名次排序前的學(xué)生信息表:");show(l);/*顯示排序前的所有學(xué)生記錄*/p=l->next;while(p) /*p!=NULL*/s=(Node*)malloc(sizeof(Nod
45、e);/*新建結(jié)點(diǎn)用于保存從原鏈表中取出的結(jié)點(diǎn)信息*/if(!s)printf("n申請(qǐng)空間失敗!");/*如沒(méi)有申請(qǐng)到,打印提示信息*/return ;/*返回菜單界面*/s->data=p->data;/*填數(shù)據(jù)域*/s->next=NULL;/*指針域?yàn)榭?/rr=ll;/*指針移至總分比p所指的結(jié)點(diǎn)的總分小的節(jié)點(diǎn)位置*/while(rr->next!=NULL && rr->next->>=p->)rr=rr->next;if(rr->next=NULL)/*若新鏈表ll中的所有結(jié)點(diǎn)的總分值
46、都比p->大時(shí),就將p所指結(jié)點(diǎn)加入鏈表尾部*/rr->next=s;else /*否則將該結(jié)點(diǎn)插入至第一個(gè)總分字段比它小的結(jié)點(diǎn)的前面*/s->next=rr->next;rr->next=s;p=p->next; /*原鏈表中的指針下移一個(gè)結(jié)點(diǎn)*/l->next=ll->next;/*ll中存儲(chǔ)是的已排序的鏈表的頭指針*/p=l->next;/*已排好序的頭指針賦給p,準(zhǔn)備填寫(xiě)名次*/while(p!=NULL)/*當(dāng)p不為空時(shí),進(jìn)行下列操作*/i+;/*結(jié)點(diǎn)序號(hào)*/p->=i;/*將名次賦值*/p=p->next;/*指針后移
47、*/printf("nn名次排序后的學(xué)生信息表:");show(l);saveflag=1;printf("n 學(xué)生記錄按總分降序排名完成!n");getchar();u 保存學(xué)生記錄模塊用函數(shù)void Save(Link l);來(lái)實(shí)現(xiàn)。主要功能是用來(lái)對(duì)更新后的學(xué)生記錄進(jìn)行保存,并將其寫(xiě)進(jìn)相應(yīng)的數(shù)據(jù)文件中。函數(shù)首先進(jìn)行文件的打開(kāi)工作,檢查當(dāng)前文件的打開(kāi)正常與否。如果打開(kāi)失敗則提示信息并返回主菜單,否則系統(tǒng)會(huì)將鏈表中的數(shù)據(jù)寫(xiě)入到磁盤(pán)文件中的數(shù)據(jù)文件中。如果用戶(hù)對(duì)數(shù)據(jù)進(jìn)行了更新但是沒(méi)有使用該功能,則系統(tǒng)將會(huì)在用戶(hù)想退出系統(tǒng)時(shí)提示用戶(hù)是否進(jìn)行保存。void S
48、ave(Link l)FILE* fp;Node *p;int count=0;if(!l->next) system("cls");printf("n=>鏈表為空,沒(méi)有信息記錄!按回車(chē)鍵返回.n");getchar();getchar();return;fp=fopen("D:studentfile","w");/*以只寫(xiě)方式打開(kāi)文件*/if(fp=NULL)/*打開(kāi)文件失敗*/printf("n=>打開(kāi)文件發(fā)生錯(cuò)誤!按回車(chē)鍵返回.n");getchar();return ;
49、p=l->next;while(p)if(fwrite(p,sizeof(Node),1,fp)=1)/*每次寫(xiě)一個(gè)結(jié)點(diǎn)的信息至文件*/ p=p->next;count+;elsebreak;if(count>0)getchar();printf("nnnnn=>保存文件成功!保存的記錄一共有:%d條n",count);getchar();saveflag=0;elsesystem("cls");printf("空表!沒(méi)有學(xué)生信息記錄需要保存!n");getchar();fclose(fp); /*關(guān)閉此文件*
50、/u 顯示學(xué)生記錄模塊用函數(shù)void show(Link l);來(lái)實(shí)現(xiàn)。主要功能是用來(lái)顯示學(xué)生的信息進(jìn)行輸出。在系統(tǒng)已經(jīng)錄入了學(xué)生記錄的前提下,使用該功能可以顯示學(xué)生的信息資料等等。同時(shí)按提示可跳出主菜單進(jìn)行后續(xù)操作。主要的程序代碼就是從鏈表表頭開(kāi)始詢(xún)查,把每個(gè)結(jié)點(diǎn)包含的信息輸出到界面,顯示出來(lái)即可。3.3 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)3.3.1 學(xué)生成績(jī)信息結(jié)構(gòu)體/*定義與學(xué)生有關(guān)的數(shù)據(jù)結(jié)構(gòu)*/struct student/*標(biāo)記為student*/char num10;/*學(xué)號(hào)*/char name15;/*姓名*/intcgrade;/*C語(yǔ)言成績(jī)*/intmgrade;/*數(shù)學(xué)成績(jī)*/integrade;/*英語(yǔ)成績(jī)*/int total;/*總分*/float ave;/*平均分*/intmingci;/*名次*/;結(jié)構(gòu)體將用于存儲(chǔ)學(xué)生的基本信息,它將作為單鏈表的數(shù)據(jù)域。3.3.2 單鏈表node結(jié)構(gòu)體typedefstruct nodestruct student data;/*數(shù)據(jù)域*/struct node *next;/*指針域*/Node,*Link; /*Node為node類(lèi)型的結(jié)構(gòu)變量,*Link為node類(lèi)型的指針變量*/這樣定義了一個(gè)單鏈表的結(jié)構(gòu),結(jié)構(gòu)標(biāo)記為node,data為結(jié)構(gòu)體類(lèi)型的數(shù)據(jù),作為單鏈表結(jié)構(gòu)中的數(shù)據(jù)域,nex
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄰居開(kāi)門(mén)合同范本
- 歌曲版權(quán)合同范本
- 防盜報(bào)警合同范本
- 租學(xué)校合同范本
- 產(chǎn)品技術(shù)合同范本
- 中國(guó)工商銀行委托貸款委托合同范本
- 弱電智能化系統(tǒng)合同范本
- 滿(mǎn)詩(shī)深淺色惟歌生民病-《賣(mài)炭翁》教學(xué)設(shè)計(jì)
- 個(gè)人勞動(dòng)合同格式
- 第三章 代數(shù)式 小結(jié) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年人教版數(shù)學(xué)七年級(jí)上冊(cè)
- 客服專(zhuān)員+云客服安全知識(shí)雙11阿里淘寶云客服在線+語(yǔ)音+專(zhuān)項(xiàng)云客服考試試題及答案
- 《欣賞 中華人民共和國(guó)國(guó)歌(簡(jiǎn)譜、五線譜)》課件
- 羽毛球教案18課時(shí)
- 初三化學(xué)一輪復(fù)習(xí)計(jì)劃
- 鏈家新人成長(zhǎng)手冊(cè)10
- 成人重癥患者人工氣道濕化護(hù)理專(zhuān)家共識(shí) 解讀
- 關(guān)于進(jìn)一步加強(qiáng)路基路面施工質(zhì)量的通知
- 新版蘇教版六年級(jí)數(shù)學(xué)上冊(cè)全冊(cè)解析
- AQ/T 2080-2023 金屬非金屬地下礦山在用人員定位系統(tǒng)安全檢測(cè)檢驗(yàn)規(guī)范(正式版)
- GB/T 36548-2024電化學(xué)儲(chǔ)能電站接入電網(wǎng)測(cè)試規(guī)程
- JTT 1499-2024 公路水運(yùn)工程臨時(shí)用電技術(shù)規(guī)程(正式版)
評(píng)論
0/150
提交評(píng)論