嵌入式的農(nóng)作物圖像采集系統(tǒng)及位數(shù)大小排列、奇異的三位數(shù)、簡單的計算器、學生成績管理系統(tǒng)(C語言課程設(shè)計報告)_第1頁
嵌入式的農(nóng)作物圖像采集系統(tǒng)及位數(shù)大小排列、奇異的三位數(shù)、簡單的計算器、學生成績管理系統(tǒng)(C語言課程設(shè)計報告)_第2頁
嵌入式的農(nóng)作物圖像采集系統(tǒng)及位數(shù)大小排列、奇異的三位數(shù)、簡單的計算器、學生成績管理系統(tǒng)(C語言課程設(shè)計報告)_第3頁
嵌入式的農(nóng)作物圖像采集系統(tǒng)及位數(shù)大小排列、奇異的三位數(shù)、簡單的計算器、學生成績管理系統(tǒng)(C語言課程設(shè)計報告)_第4頁
嵌入式的農(nóng)作物圖像采集系統(tǒng)及位數(shù)大小排列、奇異的三位數(shù)、簡單的計算器、學生成績管理系統(tǒng)(C語言課程設(shè)計報告)_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

佳木斯大學申請書項目名稱基于嵌入式的農(nóng)作物圖像采集系統(tǒng)學生所在單位申報單位項目負責人起止年限教務(wù)處二〇年制填表說明一、本表請如實填寫,表達明確嚴謹。所需簽字之處,由相應(yīng)人員親筆簽名。如有弄虛作假現(xiàn)象,一經(jīng)核實,將按照撤項處理。二、所列各項內(nèi)容不能簡單標注“見附件”,否則視為不合格;創(chuàng)業(yè)實踐項目必須有校外導師,需填寫校外導師相關(guān)信息并由校外導師在相應(yīng)欄目簽字。三、電子版填表字體用小四號宋體,1.5倍行距,申請書報送一式3份。要求統(tǒng)一用A4紙雙面印制、裝訂,所附材料用小四號宋體打印,附于申請書后。四、各學院要統(tǒng)一組織申報,對申報的項目集中進行初評,確定最終申報名單,并以學院為單位上報到教務(wù)處,相關(guān)學院相關(guān)負責人均需在申請表上簽字。PAGEPAGE21項目名稱基于嵌入式的農(nóng)作物圖像采集系統(tǒng)項目類型創(chuàng)新訓練項目申請經(jīng)費5000元起止時間2012年5月至2014年5月申請團隊姓名學號年級所屬學院及專業(yè)聯(lián)系電話E-mail信息電子技術(shù)學院電子信息工程一班信息電子技術(shù)學院電子信息工程一班信息電子技術(shù)學院電子信息工程一班信息電子技術(shù)學院通信工程一班指導教師姓名職務(wù)/職稱副院長/副教授電話E-mail工作單位大學信息電子技術(shù)學院企業(yè)指導教師姓名職務(wù)/職稱電話E-mail工作單位立項依據(jù)(研究目的、意義,國內(nèi)外研究現(xiàn)狀及發(fā)展動態(tài))研究目的、意義:在我國,限制我國農(nóng)業(yè)發(fā)展的瓶頸之一就是智能科技在農(nóng)業(yè)的應(yīng)用還不廣泛,農(nóng)業(yè)勞動生產(chǎn)效率低,特別是在東北、新疆等耕作面積比較大的地區(qū),在觀察了解農(nóng)作物生長狀態(tài)時主要是依賴于人工巡察方式,不僅費時費力,還增加生產(chǎn)開支。因此,充分利用信息采集技術(shù)輔助農(nóng)業(yè)生產(chǎn)的思想應(yīng)用前景尤為可觀?;谶@一點我們研究搭載于小型無人飛機的農(nóng)田作物生長狀況的圖像采集系統(tǒng),來對大范圍種植的農(nóng)作物生長進行跟蹤觀察。該信息采集系統(tǒng)應(yīng)用到大田種植上將大大減輕人工巡察作物生長狀況帶來的不便。例如:巡查時對大田中間部分作物生長狀況了解有限制;人工巡查是比較費時費力;為及時的了解情況,頻繁地去巡查,將加大生產(chǎn)投入……利用先進的技術(shù)來觀察植物的生長狀態(tài),與人工巡查相比,最大的好處就是能夠降低人力物力的投入,并且能提高生產(chǎn)效率。對生長環(huán)境狀態(tài)要求比較高的植物來說,更能避免因為人為因素而造成生產(chǎn)損失,智能化的系統(tǒng)對于檔次較高的經(jīng)濟作物有更重要的意義。國內(nèi)外研究現(xiàn)狀及發(fā)展動態(tài):目前,國外已經(jīng)出現(xiàn)了一批商品化的農(nóng)情信息采集軟硬件產(chǎn)品,軟件設(shè)計功能強大,尤其是在圖形處理、可視化分析方面技術(shù)比較成熟,硬件設(shè)計上考慮到系統(tǒng)應(yīng)用的實際環(huán)境,可滿足機載或徒步采集的不同要求。國內(nèi)基于GPS和GIS的農(nóng)情信息定位采集系統(tǒng)的研究較國外起步晚,多數(shù)還處于人工采集階段。一些科研院所正積極著手開發(fā)適于中國國情的農(nóng)情信息采集系統(tǒng),主要有:1)以單片機為核心進行開發(fā),結(jié)合GPS技術(shù)實現(xiàn)對某幾個農(nóng)情信息要素(如土壤水分、養(yǎng)分、電導率等)的定位測量,然后將采集的信息在GIS平臺上進行事后管理和分析,這類設(shè)備功能簡單、實用、開發(fā)成本較低,但功能過于單一。2)在便攜式計算機上進行開發(fā),可實現(xiàn)大量農(nóng)情信息現(xiàn)場快速采集及可視化分析處理。目前已開發(fā)了能夠?qū)崿F(xiàn)農(nóng)情信息采集的通用型軟件.但便攜式計算機存在體積和質(zhì)量較大、強光下操作不便等問題。3)基于嵌入式農(nóng)情信息采集系統(tǒng)的開發(fā)。該系統(tǒng)體積小、功耗低、功能強、可靠性高。隨著嵌入式系統(tǒng)的快速發(fā)展,其相關(guān)的技術(shù)也在不斷成熟,開發(fā)基于嵌入式的農(nóng)情信息采集系統(tǒng)必將成為今后的主要發(fā)展方向。項目研究內(nèi)容、研究目標,以及擬解決的關(guān)鍵技術(shù)問題研究內(nèi)容、研究目標:本項目研究內(nèi)容是圍繞著“如何采集作物生長狀況?”、“如何遠距離傳輸回采集的信息?”、“如何對采集的信息進行處理?”等問題,開發(fā)出功能適當、界面友好、符合用戶使用習慣的農(nóng)田作物圖像采集系統(tǒng)?;谝陨蠋c我們的研究目標是制作出搭載于小型無人飛機上的農(nóng)作物圖像采集系統(tǒng)。該系統(tǒng)通過GPS獲取田間位置信息,照相機采集作物生長狀況圖像,遠距離無線傳輸傳回現(xiàn)場信息,并對接收的圖像進行相關(guān)的處理,將處理結(jié)果反饋給用戶,為用戶實施科學種田的決策提供依據(jù)。擬解決的關(guān)鍵技術(shù)問題:利用遠距離無線傳輸技術(shù),確保傳輸距離和傳輸質(zhì)量;基于嵌入式的模塊驅(qū)動、用戶界面開發(fā);利用多種圖像處理方法,對不同作物的多種狀態(tài)分析處理。研究方案、技術(shù)路線研究方案:主控制器主控制器ARM11照相機電源數(shù)據(jù)傳輸模塊GPS模塊人機交互(1)主控制器系統(tǒng)的核心控制及相關(guān)信息處理。選用ARM11為主控制器,該處理器性能卓越,實現(xiàn)的硬核則是為了滿足那些極高性能和速度要求的應(yīng)用。它包含了多媒體處理指令來加速視頻和音頻處理,而且它的新型存儲器系統(tǒng)進一步提高了操作系統(tǒng)的性能,同時也節(jié)省實現(xiàn)的成本和時間。照相機本系統(tǒng)的核心傳感器,對指定的農(nóng)田區(qū)域進行圖像采集。GPS模塊飛行器的位置坐標進行監(jiān)測。由ARM進行接收反饋的地理坐標,將地理位置與圖像相關(guān)聯(lián),然后經(jīng)過無線數(shù)據(jù)傳輸模塊傳回操作終端。數(shù)據(jù)傳輸模塊通過大功率Wifi對數(shù)據(jù)進行無線傳輸,也是用戶與整個系統(tǒng)的通信通道。(5)人機交互采用基于嵌入式的圖形界面編程,完成信息顯示,方便用戶查看。技術(shù)路線:子模塊焊接與調(diào)試子程序編寫與調(diào)試硬件方案確定軟件方案確定模塊聯(lián)合調(diào)試程序聯(lián)合調(diào)試相關(guān)調(diào)研,資料查找,專業(yè)人士咨詢總方案討論與確定分析與討論問題子模塊焊接與調(diào)試子程序編寫與調(diào)試硬件方案確定軟件方案確定模塊聯(lián)合調(diào)試程序聯(lián)合調(diào)試相關(guān)調(diào)研,資料查找,專業(yè)人士咨詢總方案討論與確定分析與討論問題軟硬件聯(lián)合調(diào)試結(jié)題、作品驗收程序流程圖PCB制作項目特色與創(chuàng)新之處遠距離Wifi網(wǎng)絡(luò)的無線傳輸技術(shù)在農(nóng)業(yè)上的應(yīng)用;多種圖像方法處理不同作物的多種生長狀態(tài)信息。年度計劃1、2012年6月~~2012年9月:查找相關(guān)資料,咨詢專業(yè)人士,實地調(diào)研;2、2012年10月~~2012年12月:根據(jù)收集的資料,分析問題,指定方案,3、2013年1月~~2013年10月:根據(jù)指定的方案,進行功能模塊軟件開發(fā);4、2013年11月~~2013年12月:制作硬件電路并調(diào)試;5、2014年1月~~2014年4月:軟硬件整體組合、調(diào)試、優(yōu)化;6、2014年5月:結(jié)題。六、預期成果(專利、論文、產(chǎn)品或裝置)制作樣機撰寫論文申請專利七、項目責任人承諾在獲得立項后,本人將與項目組成員團結(jié)一致,努力做好該項目的研究工作,實現(xiàn)制定的目標。如果因主觀原因?qū)е马椖繄?zhí)行不力,未達到預期目標,本人與項目組成員愿意承擔相應(yīng)損失。負責人簽名:年月日經(jīng)費預算支出項目金額(元)計算依據(jù)會議費/差旅費200.00采購元器件、定做殼體等論文版面費400.00電子制作等相關(guān)電子雜志版面費為400元左右專利申請費2000.00實用新型專利申請費2000元實驗材料費2000.00ARM11開發(fā)平臺、小型無人飛機、照相機、Wifi無線模塊、電阻包、電容包、三極管包、電池、電路板等其他400.00參考書、萬用表、烙鐵、焊錫、稿紙等總計(元):5000元導師意見:簽名:年月日學院意見:簽名:蓋章年月日學校專家評審意見:負責人簽名:蓋章年月日學校意見:簽名:蓋章年月日位數(shù)的大小排列、奇異的三位數(shù)、簡單的計算器、學生成績管理系統(tǒng)(C語言課程設(shè)計報告)目錄1內(nèi)容提要32位數(shù)的大小排列42.1實驗的準備42.1.1實驗?zāi)康?2.1.2實驗要求42.2算法思想、關(guān)鍵數(shù)據(jù)說明...42.2.1思路算法42.2.2關(guān)鍵數(shù)據(jù)的數(shù)據(jù)類型、名稱、用途的說明42.3算法框圖42.4關(guān)鍵算法的源程序及注釋62.5調(diào)試運行情況的說明73奇異的三位數(shù)83.1實驗的準備83.1.1實驗?zāi)康?.1.2實驗要求3.2算法思想、關(guān)鍵數(shù)據(jù)說明...83.2.1思路算法83.2.2關(guān)鍵數(shù)據(jù)的數(shù)據(jù)類型、名稱、用途的說明83.3算法框圖93.4關(guān)鍵算法的源程序及注釋93.5調(diào)試運行情況的說明94簡單的計算器104.1實驗的準備104.1.1實驗?zāi)康?.1.2實驗要求4.2算法思想、關(guān)鍵數(shù)據(jù)說明...104.2.1思路算法104.2.2關(guān)鍵數(shù)據(jù)的數(shù)據(jù)類型、名稱、用途的說明104.3算法框圖104.4關(guān)鍵算法的源程序及注釋114.5調(diào)試運行情況的說明135學生成績管理系統(tǒng)145.1實驗?zāi)康?45.2總功能說明(題目)145.3系統(tǒng)總體設(shè)計145.3.1全局數(shù)據(jù)結(jié)構(gòu)145.3.2系統(tǒng)總功能圖或主函數(shù)流程圖145.3.3主函數(shù)源程序代碼155.4學生成績子菜單函數(shù)165.4.1功能說明165.4.2參數(shù)說明165.4.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)165.4.4算法流程圖165.4.5源程序代碼175.4.6調(diào)試運行175.5輸入學生成績子函數(shù)185.6顯示學生成績子函數(shù)215.7按姓名查詢學生成績子函數(shù)235.8按學號查詢學生成績子函數(shù)265.9按學號刪除學生成績子函數(shù)285.10按平均分進行插入法排序子函數(shù)325.11插入學生成績子函數(shù)355.12保存學生成績信息395.13讀取學生成績信息416課程設(shè)計心得體會467致謝478參考文獻471內(nèi)容提要現(xiàn)代計算機技術(shù)的發(fā)展為人們的學習、生活、工作提供了很大的幫助,各行各業(yè)都需要特定計算系統(tǒng)的運用,我們需要了解這些系統(tǒng)是怎么樣為我們服務(wù)以及他們是怎樣編輯出來的。我們需要學習C語言編程,根據(jù)課堂講授內(nèi)容,做相應(yīng)的自主練習,消化課堂所講解的內(nèi)容;通過調(diào)試典型例題或習題積累調(diào)試C程序的經(jīng)驗;通過完成輔導教材中的編程題,逐漸培養(yǎng)編程能力、用計算機解決實際問題的能力,能夠按照要求編輯一些基本的程序,提高自己的思維能力。C語言是一種編譯型程序設(shè)計語言,編程設(shè)計是學習該語言的一個重要環(huán)節(jié)。通過溫習已學的知識,在上機實踐中熟悉語言的編程環(huán)境,進而達到能夠編寫較復雜程序并將其實際應(yīng)用的程度。在實際編程中不斷地深入學習數(shù)據(jù)結(jié)構(gòu)、算法、編譯原理、操作系統(tǒng)原理、軟件工程等知識,加深對C語言的理解,切實提高編程水平,這是C語言課程設(shè)計的主要目的。本課程設(shè)計報告中包括四個課題的設(shè)計,其中包括各個課題的實驗的目的與要求、主要算法思想、關(guān)鍵數(shù)據(jù)的數(shù)據(jù)類型、名稱、用途的說明、算法框圖、關(guān)鍵算法的源程序及注釋、調(diào)試運行情況的說明等方面。之后,課題設(shè)計人還總結(jié)了這次為期兩周的課程設(shè)計心得體會。最后,本人向支持幫助其完成此次課程設(shè)計的人表示感謝,并注明了參考文獻。這四個課題是:位數(shù)的大小排列、奇異的三位數(shù)、簡單的計算器、學生成績管理系統(tǒng)。 2位數(shù)大小排序2.1實驗的準備2.1.1實驗的目的多位數(shù)整數(shù)與字符串的轉(zhuǎn)化,數(shù)組中的數(shù)據(jù)排序,文件操作。2.1.2實驗的要求子函數(shù)功能要求:輸入一個五位整數(shù),對此整數(shù)中的五個數(shù)值進行從大到小的順序排序,形成一個新的五位整數(shù)。同時需要編寫主函數(shù)和其它相關(guān)子函數(shù)進行調(diào)試。2.2算法思想、關(guān)鍵數(shù)據(jù)說明2.2.1思路算法將輸入的五位整數(shù)拆開成五個數(shù)字,將五個數(shù)字組成一個一維數(shù)組,用冒泡法對五個數(shù)字進行由大到小排列。排好之后,把這五個數(shù)字轉(zhuǎn)化為一個新的五位數(shù)輸出。2.2.2關(guān)鍵數(shù)據(jù)的數(shù)據(jù)類型、名稱、用途的說明 x是int型,用于表示輸入的五位數(shù);a[5]是int型,用于存放拆開后的五個數(shù)字;t、i、j都是int型,是在冒泡法排序的時候用到的;s是int型,用于存放最后處理好的新的五位數(shù)。2.3算法框圖圖2.3.1位數(shù)大小排列主函數(shù)圖2.3.22.4關(guān)鍵算法的源程序及注釋intfun(intx);#include<stdio.h>#include<math.h>main(){ FILE*fp;intx,s=0;fp=fopen("位數(shù)的排序數(shù)據(jù)文件.out","w");if(fp==NULL) {printf("fileiswrong");return0;} printf("請輸入要處理的一個五位數(shù):\n"); scanf("%d",&x); printf("\n要處理的這個五位數(shù)是:\n%d\n",x);fprintf(fp,"\n要處理的這個五位數(shù)是:\n%d\n",x);s=fun(x);/*調(diào)用函數(shù)fun*/printf("\n處理后所求的數(shù)字是:\n");printf("%d",s);fprintf(fp,"\n處理后所求的數(shù)字是:\n");fprintf(fp,"%d",s);printf("\n*****編者:通信1001盧亞軍*****\n");fprintf(fp,"\n*****編者:通信1001盧亞軍*****\n");fclose(fp);}intfun(intx){/*函數(shù)fun模塊*/ inti,j,t,s; inta[5]={0};a[0]=x/10000; a[1]=(x-10000*a[0])/1000;a[2]=(x-10000*a[0]-1000*a[1])/100; a[3]=(x-10000*a[0]-1000*a[1]-100*a[2])/10;a[4]=x-10000*a[0]-1000*a[1]-100*a[2]-10*a[3]; /*將輸入的五位整數(shù)拆開成五個數(shù)字,將五個數(shù)字組成一個一維數(shù)組*/for(j=0;j<5;j++) for(i=0;i<5-j;i++) if(a[i]<a[i+1])/*用冒泡法對五個數(shù)字進行由大到小排列*/ {t=a[i]; a[i]=a[i+1]; a[i+1]=t;}printf("排序后這五個數(shù)字是:\n"); for(i=0;i<5;i++) printf("%3d",a[i]);s=a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];/*數(shù)字被轉(zhuǎn)換成一個五位數(shù)的int型*/return(s);}2.5調(diào)試運行情況的說明運算要處理的五位數(shù)是29837.結(jié)果的屏幕顯示如圖2.3。經(jīng)運行調(diào)試,達到預期效果。圖2.3位數(shù)的大小排序運行界面3奇異的三位數(shù)3.1實驗的目的與要求一個自然數(shù)的七進制表達式是一個三位數(shù),而這個自然數(shù)的九進制表示也是一個三位數(shù),且這兩個三位數(shù)的數(shù)碼順序正好相反,求這個三位數(shù)。3.2算法思想、關(guān)鍵數(shù)據(jù)說明3.2.1根據(jù)題意可知,七進制和九進制表示的這全自然數(shù)的每一位一定小于7,可設(shè)其七進制數(shù)形式為kji(i、j、k的取值分別為1~6),然后設(shè)其九進制表示形式為ijk。如果符合i*9*9+j*9+k與i+j*7+k*7*7相等,則此時的ijk即滿足要求。多次利用循環(huán)結(jié)構(gòu)控制ijk三個的遞增,并利用條件結(jié)構(gòu)判斷是否滿足條件。3.2.2數(shù)據(jù)i、j、k、s都是int型,其中s表示所求數(shù)字的十進制數(shù)形式,其七進制數(shù)形式為kji,九進制數(shù)形式為ijk。3.3算法框圖 圖3.3奇異的三位數(shù)框圖3.4關(guān)鍵算法的源程序及注釋#include<stdio.h>main(){FILE*fp;inti,j,k,s=0;fp=fopen("奇異的三位數(shù)的數(shù)據(jù)文件.out","w");if(fp==NULL){printf("fileiswrong");return0;}for(i=1;i<7;i++)for(j=0;j<7;j++)for(k=1;k<7;k++)if(i*9*9+j*9+k==i+j*7+k*7*7)/*如果滿足題意*/{s=i*9*9+j*9+k;/*s為所求數(shù)字的十進制形式*/printf("這奇異的三位數(shù)的三種進制數(shù)形式分別是:\n");printf("%d%d%d(7)=%d%d%d(9)=%d(10)\n",k,j,i,i,j,k,s);fprintf(fp,"這奇異的三位數(shù)的三種進制數(shù)形式分別是:\n");fprintf(fp,"%d%d%d(7)=%d%d%d(9)=%d(10)\n",k,j,i,i,j,k,s);}fclose(fp);/*輸出所求數(shù)的三種進制數(shù)的形式*/}3.5調(diào)試運行情況的說明經(jīng)過運行調(diào)試后,達到預期效果。屏幕輸出如圖3.5。圖3.5奇異的三位數(shù)運行界面調(diào)試過程中,首先因為沒有對s賦初始值,最后結(jié)果出錯。在修改的時候及時發(fā)現(xiàn)了問題。可以使結(jié)果正常輸出,達到預期要求。另外,調(diào)試中還對輸出的形式進行了優(yōu)化,使所得數(shù)的三種進制的形式都能在結(jié)果中顯示,并通過在后面注釋(7)、(9)、(10)的方法,是結(jié)果和進制數(shù)形式一目了然。4簡單的計算器4.1實驗準備4.1.1實驗?zāi)康闹羔樀氖褂?,switch語句,把字符串轉(zhuǎn)化成多位數(shù)4.1.2實驗要求請編寫一個程序計算表達式:data1opdata2的值。其中,op為運算符+、-、*、/。4.2算法思想、關(guān)鍵數(shù)據(jù)說明4.2.1程序輸入的數(shù)據(jù)為字符串,用p指針指向字符串第一個字符。辨別字符是否數(shù)字的同時,只要是數(shù)字,就將指針向后移動,直到出現(xiàn)運算符,將前幾個數(shù)字轉(zhuǎn)換成一個int型的整數(shù)型式,賦值為data1.繼續(xù)將p所指的運算符賦值成op,之后將p加一,使它指向運算符之后。再將指針依次向后移動,直到此行結(jié)束。將從運算符到此行末尾的數(shù)字改寫成一個int型的整數(shù)型式,賦值為data2.利用switch語句判斷op是什么運算符,分別對應(yīng)進行加減乘除計算后,輸出結(jié)果。此過程中,主要用到指針、switch語句、while循環(huán)結(jié)構(gòu)。4.2.2*p為char型,用途是通過指針控制要操作的字符數(shù)據(jù);op也是char型,用來表示運算符;data1和data2是int型,用于分別儲存原始字符串中剔出來的數(shù)字轉(zhuǎn)化成的十進制數(shù)字;n是int型,用于分別記錄data1和datt2的位數(shù),方便進行字符串和十進制數(shù)之間的轉(zhuǎn)換;a[80]是char型字符串,用于暫存原始數(shù)據(jù)。4.3算法框圖圖4.3簡單的計算器算法框圖4.4關(guān)鍵算法的源程序及注釋#include"stdio.h"#include"math.h"#defineOUTprintf("上式的運算結(jié)果為%5.2f",output)main(){chara[80],*p,op;intn=0;intdata1,data2,i;floatoutput;printf("請輸入要計算的運算式:\n");scanf("%s",a);p=&a[0];while(*p!='\0'&&*p<='9'&&*p>='0'){p++;n++; }data1=0;for(i=0;i<n;i++){p--;data1+=(*p-'0')*pow(10,i);/*第一個輸入的數(shù)字被轉(zhuǎn)換成多位數(shù)的int型data1*/}p=p+n;op=*(p++);n=0;while(*p!='\0'&&*p<='9'&&*p>='0'){p++;n++;}data2=0;for(i=0;i<n;i++){p--;data2+=(*p-'0')*pow(10,i);/*第二個輸入的數(shù)字被轉(zhuǎn)換成多位數(shù)的int型data2*/}switch(op){/*不同運算符對應(yīng)不同的運算并將運算結(jié)果賦值為output*/case'+':output=(float)data1+data2;OUT;break;case'-':output=(float)data1-data2;OUT;break;case'*':output=(float)data1*data2;OUT;break;case'/':output=(float)data1/data2;OUT;break;default:printf("您輸入的計算式有誤,無法輸出結(jié)果\n");}}4.5調(diào)試運行情況的說明分別進行:55+8、14-8、24*5、33/9、23!78的五次運算。程序運行界面如下圖4.5.1到圖4.5.5。1、圖4.5.1簡單的計算器運行界面(1)2、圖4.5.2簡單的計算器運行界面(2)3、圖4.5.3簡單的計算器運行界面(3)4、圖4.5.4簡單的計算器運行界面(4)5圖4.5.2簡單的計算器運行界面(5)通過運行和調(diào)試,此程序可以正常運行并且滿足課題的要求,達到預期效果。5學生成績管理系統(tǒng)5.1實驗?zāi)康慕Y(jié)構(gòu)體數(shù)組、函數(shù)、指針、鏈表及文件等的綜合應(yīng)用5.2總功能說明有N個學生,每個學生的數(shù)據(jù)包含學號(不重復)、姓名、三門課的成績及平均成績,試設(shè)計一學生成績管理系統(tǒng),使之能提供以下功能:(1)成績錄入,插入后按學號自動排序,創(chuàng)建鏈表;(2)成績文件的存取,創(chuàng)建鏈表;(3)成績的多種查詢、修改;(4)成績的多種統(tǒng)計、排序;(5)學生增加、刪除、列表。5.3系統(tǒng)總體設(shè)計5.3.1全局數(shù)據(jù)結(jié)構(gòu)首先定義結(jié)構(gòu)體數(shù)組structstu,用于緩存數(shù)據(jù)。再對所有子函數(shù)進行聲明。主函數(shù)中,首先進行鏈表初始化head=NULL;然后調(diào)用菜單函數(shù),利用switch語句對菜單函數(shù)返回值n進行判斷,在0~9中,每個數(shù)字分別對應(yīng)一種功能,通過調(diào)用子函數(shù)實現(xiàn)。#include<stdio.h>#include<dos.h>#include<stdlib.h>/*其它說明*/#include<string.h>/*字符串函數(shù)*/#include<ctype.h>/*字符操作函數(shù)*/#include<malloc.h>/*動態(tài)地址分配函數(shù)*/#defineLENsizeof(STUDENT)/*宏定義*/typedefstructstu/*定義結(jié)構(gòu)體數(shù)組用于緩存數(shù)據(jù)*/{charnum[6];charname[20];intscore[3];intsum;floataverage;intorder;structstu*next;}STUDENT;5.3.2系統(tǒng)總功能圖或主函數(shù)流程圖圖5.5.3.3主函數(shù)源程序代碼./*函數(shù)原型聲明*/intmenu_select();/*菜單函數(shù)*/STUDENT*create();/*創(chuàng)建鏈表*/voidprint(STUDENT*head);/*顯示全部記錄*/voidnamesearch(STUDENT*head);/*按姓名查找記錄*/voidnumsearch(STUDENT*head);/*按學號查找記錄*/STUDENT*numdelete(STUDENT*head);/*按學號刪除記錄*/STUDENT*sort(STUDENT*head);/*排序*/STUDENT*insert(STUDENT*head,STUDENT*newnode);/*插入記錄*/voidsave(STUDENT*head);/*保存文件*/STUDENT*load();/*讀文件*//*主函數(shù)界面*/main(){STUDENT*head,newnode;head=NULL;/*鏈表初始化,使head的值為NULL*/for(;;)/*循環(huán)無限次使一次選擇執(zhí)行后不用跳出可以執(zhí)行下一個*/{switch(menu_select()){case1:head=create();break;case2:print(head);break;case3:namesearch(head);break;case4:numsearch(head);break;case5:head=numdelete(head);break;case6:head=sort(head);break;case7:head=insert(head,&newnode);break;/*&newnode表示返回地址*/case8:save(head);break;case9:head=load();break;case0:exit(0);/*如菜單返回值為9則程序結(jié)束*/}}}5.4學生成績子菜單函數(shù)5.4.1功能說明用于輸出此系統(tǒng)的菜單,使操作者對此系統(tǒng)的功能一目了然,并且引導使用者輸入要執(zhí)行的操作,返回使用者的選擇n。5.4.2參數(shù)說明該函數(shù)沒有實際參數(shù),輸入n為int型,函數(shù)返回值即是n。5.4.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)首先輸出系統(tǒng)的菜單界面。再讀入n的值,最后函數(shù)返回n5.4.4算法流程圖圖5.5.4.5源程序代碼/*菜單選擇函數(shù)*/menu_select(){intn;printf("********************************************************************************\n");printf("\t\t歡迎進入\n");printf("\n\t\t學生成績管理系統(tǒng)\n\n");printf("*********************************菜單*******************************************\n");printf("\t\t\t1.輸入學生成績記錄\n");/*輸入學生成績記錄*/printf("\t\t\t2.顯示學生成績信息\n");/*顯示*/printf("\t\t\t3.按姓名查詢學生成績信息\n");/*尋找*/printf("\t\t\t4.按學號查詢學生成績信息\n");/*尋找*/printf("\t\t\t5.按學號刪除學生成績信息\n");/*刪除*/printf("\t\t\t6.按平均分進行插入法排序\n");/*排序*/printf("\t\t\t7.插入學生成績信息\n");/*插入*/printf("\t\t\t8.保存學生成績信息\n");/*保存*/printf("\t\t\t9.讀取學生成績信息\n");/*讀取*/printf("\t\t\t0.安全退出\n");/*退出*/printf("********************************************************************************\n");do{printf("\n\t\t\t請輸入你的選擇(0~9):");canf("%d",&n);}while(n<0||n>10);/*如果選擇項不在0~9之間則重輸*/return(n);/*返回選擇項,主函數(shù)根據(jù)該數(shù)調(diào)用相應(yīng)的函數(shù)*/}5.4.6調(diào)試運行程序運行后即出現(xiàn)界面如圖5.3所示。當輸入1時,即開始進入輸入子函數(shù)。通過編譯和運行,達到預期目的。圖5.4.6菜單函數(shù)的運行界面5.5輸入學生成績子函數(shù)5.5.1功能說明用于輸入學生的成績記錄,建立新的鏈表。參數(shù)說明沒有實際參數(shù),返回值是head頭指針;i是int型,用于控制循環(huán),使p->score[i]中i依次取1、2、3;s是int型,用于暫時存放總分的累加;p是指針,它首先指向鏈表頭,隨著操作不斷進行,依次移向下一個節(jié)點。5.5.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)首先將p指向鏈表頭按順序輸入p->num(學號)、p->name(姓名),在輸入三項成績的時候,利用i循環(huán)三次,依次輸入三門成績,并用判斷語句表達當成績輸入不在1-100之間時重新輸入。累加各門成績暫存于s,之后賦值給p->sum,并分別計算每位的平均成績,賦值給p->average。而后把p后移,重復上述操作,直到鏈表結(jié)束。5.5.4算法流程圖圖5.5.4輸入函數(shù)的框圖5.5.5源程序代碼/*輸入函數(shù)*/STUDENT*create(){inti,s;STUDENT*head=NULL,*p;/*定義函數(shù),此函數(shù)帶回一個指向鏈表頭的指針*/for(;;){p=(STUDENT*)malloc(LEN);/*開辟一個新的單元*/if(!p)/*如果指針p為空*/{printf("\nOutofmemory.");/*輸出內(nèi)存溢出*/return(head);/*返回頭指針,下同*/}printf("請輸入學號(如果學號首字符為0則結(jié)束輸入):");scanf("%s",p->num);if(p->num[0]=='0')break;/*如果學號首字符為0則結(jié)束輸入*/printf("請輸入姓名:");scanf("%s",p->name);printf("請輸入3門功課成績(每門成績必須在0~100之間)\n成績1、2、3分別代表語文、數(shù)學、英語成績\n");/*提示開始輸入成績*/s=0;/*計算每個學生的總分,初值為0*/for(i=0;i<3;i++)/*3門課程循環(huán)3次*/{printf("成績%d:",i+1);scanf("%d",&p->score[i]);if(p->score[i]<0||p->score[i]>100)/*確保成績在0~100之間*/ {printf("你輸入的成績有誤,你還有一次機會重新輸入.\n");printf("成績%d:",i+1);scanf("%d",&p->score[i]);}s=s+p->score[i];/*累加各門成績*/}p->sum=s;/*將總分保存*/p->average=(float)s/3;/*先用強制類型轉(zhuǎn)換將s轉(zhuǎn)換成float型,再求平均值*/p->order=0;/*未排序前此值為0*/p->next=head;/*將頭結(jié)點做為新輸入結(jié)點的后繼結(jié)點*/head=p;/*新輸入結(jié)點為新的頭結(jié)點*/}return(head);}5.5.6調(diào)試運行選擇操作1后,開始調(diào)用輸入函數(shù)。按照輸出引導輸入合適的字符。最后在輸入學號為0時,此函數(shù)中止。經(jīng)過編譯和運行,符合設(shè)計預期要求。運行界面如圖5.5。圖5.5.6輸入函數(shù)的運行界面5.6顯示學生成績子函數(shù)5.6.1功能說明用于輸出鏈表,其中包括序號、學號、姓名、三門學科分別的成績、個人總成績、個人平均分和名次。并且通過適當?shù)呐虐孑敵觯墙Y(jié)果形式上更加清晰。5.6.2參數(shù)說明Print函數(shù)的實參是structstu的結(jié)構(gòu)體指針,沒有返回值;i是int型,用于統(tǒng)計記錄條數(shù),在輸出中表示“序號”;p是指針,它首先指向鏈表頭,隨著操作不斷進行,依次移向下一個節(jié)點。5.6.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)利用while循環(huán)結(jié)構(gòu),輸出一個學生的全部個人成績信息,而后指針向后移一移,重復上述操作。一直這樣重復操作,直到p為空指針。5.6.4算法流程圖圖5.6.4顯示函數(shù)的算法框圖5.6.5源程序代碼/*顯示全部記錄函數(shù)*/voidprint(STUDENT*head){inti=0;/*統(tǒng)計記錄條數(shù)*/STUDENT*p;/*移動指針*/p=head;/*初值為頭指針*/printf("\n************************************STUDENT************************************\n");printf("\n");printf("|序號|學號|姓名|語文成績|數(shù)學成績|英語成績|三門總分|平均分|名次|\n");printf("\n");while(p!=NULL){i++;printf("|%3d|%4s|%-4s|%3d|%3d|%3d|%3d|%4.2f|%-5d|\n",i,p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);p=p->next;}printf("\n");printf("**************************************END**************************************\n");}5.6.6調(diào)試運行 此運行是接著上述輸入函數(shù)之后的。輸入選擇2之后,調(diào)用輸出函數(shù),屏幕顯示如圖5.6.6。圖5.6.6顯示函數(shù)運行的界面5.7按姓名查詢學生成績子函數(shù)5.7.1功能說明首先輸入要查詢學生的姓名,如果這個同學成績信息在系統(tǒng)中就會顯示出你所要查找的學生的所有信息。5.7.2參數(shù)說明samesearch函數(shù)的實參是structstu的結(jié)構(gòu)體指針,沒有返回值。p是指針,它首先指向鏈表頭,隨著操作不斷進行,逐漸向后移動。s[20]是char型,是存放姓名用的字符數(shù)組。5.7.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)首先輸入要查詢學生的姓名到字符型數(shù)組s[20]中,將頭指針賦給p。利用while語句,當記錄的姓名不是要找的且指針不為空時移動指針,指向下一結(jié)點。不滿足則跳出循環(huán)。如果此時p不是空指針,則此時p所指的節(jié)點正是要找的學生信息。將這個學生信息輸出,完成此次查詢過程。若p是空地址,則系統(tǒng)中沒有此學生的信息,輸出沒有你要查找的學生信息。5.7.4算法流程圖圖5.7.4按姓名查找記錄函數(shù)的算法框圖5.7.5源程序代碼/* 按姓名查找記錄函數(shù)*/voidnamesearch(STUDENT*head){STUDENT*p;/*移動指針*/chars[20];/*存放姓名用的字符數(shù)組*/printf("請輸入要查找的學生姓名\n");scanf("%s",s);p=head;/*將頭指針賦給p*/while(strcmp(p->name,s)&&p!=NULL)/*當記錄的姓名不是要找的且指針不為空時*/p=p->next;/*移動指針,指向下一結(jié)點*/if(p!=NULL)/*如果指針不為空*/{printf("\n*************************************查找到************************************\n");printf("|學號|姓名|語文成績|數(shù)學成績|英語成績|三門總分|平均分|名次|\n");printf("\n");printf("|%4s|%-4s|%3d|%3d|%3d|%3d|%4.2f|%-5d|\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);printf("\n");printf("***************************************END**************************************\n");}elseprintf("\n對不起,系統(tǒng)中沒有姓名是%s的學生\n",s);/*顯示沒有該學生*/}5.7.6調(diào)試運行輸入要查詢的學生姓名,如果此姓名的學生在系統(tǒng)中已經(jīng)存在,則會輸出此學生的成績信息。例如輸入jack,這個名字在系統(tǒng)中是存在的,所以可以輸出學生jack的成績信息,如圖5.9所示。圖5.7.6按姓名查詢學生成績子函數(shù)運行界面5.8按學號查詢學生成績子函數(shù)5.8.1功能說明首先輸入要查詢學生的學號,如果這個同學成績信息在系統(tǒng)中就會顯示出你所要查找的學生的所有信息。5.8.2參數(shù)說明numsearch函數(shù)的實參是structstu的結(jié)構(gòu)體指針,沒有返回值。p是指針,它首先指向鏈表頭,隨著操作不斷進行,逐漸向后移動。s[6]是char型,是存放學號用的字符數(shù)組。5.8.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)首先輸入要查詢學生的學號到字符型數(shù)組s[6]中,將頭指針賦給p。利用while語句,當記錄的學號不是要找的且指針不為空時移動指針,指向下一結(jié)點。不滿足則跳出循環(huán)。如果此時p不是空指針,則此時p所指的節(jié)點正是要找的學生信息。將這個學生信息輸出,完成此次查詢過程。若p是空地址,則系統(tǒng)中沒有此學生的信息,輸出沒有你要查找的學生信息。5.8.4圖5.8.4按學號查找記錄子函數(shù)算法框圖5.8.5源程序代碼/* 按學號查找記錄函數(shù)*/voidnumsearch(STUDENT*head){STUDENT*p;/*移動指針*/chars[6];/*存放學號用的字符數(shù)組*/printf("請輸入要查找的學生學號\n");scanf("%s",s);p=head;/*將頭指針賦給p*/while(strcmp(p->num,s)&&p!=NULL)/*當記錄的姓名不是要找的,或指針不為空時*/p=p->next;/*移動指針,指向下一結(jié)點*/if(p!=NULL)/*如果指針不為空*/{printf("\n*************************************查找到************************************\n");printf("|學號|姓名|語文成績|數(shù)學成績|英語成績|三門總分|平均分|名次|\n");printf("\n");printf("|%4s|%-4s|%3d|%3d|%3d|%3d|%4.2f|%-5d|\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);printf("\n");printf("***************************************END**************************************\n");}elseprintf("\n對不起,系統(tǒng)中沒有學號是%s的學生\n",s);/*顯示沒有該學生*/}5.8.6調(diào)試運行首先輸入要查詢學生的學號,如果這個同學成績信息在系統(tǒng)中就會顯示出你所要查找的學生的所有信息。例如,輸入學號103,此學生在系統(tǒng)中存在,因此屏幕上顯示了出輸入者所要查找的學生的所有信息,如圖5.11。圖5.8.6按學號查找記錄子函數(shù)運行界面5.9按學號刪除學生成績子函數(shù)5.9.1功能說明首先輸入要刪除學生的學號,如果這個同學成績信息在系統(tǒng)中就會顯示出你所要查找的學生的所有信息,詢問你是否確定刪除,確定后該學生的信息就從鏈表中刪除了。5.9.2參數(shù)說明numdelete函數(shù)的實參是structstu的結(jié)構(gòu)體指針,沒有返回值;*p1,*p2都是結(jié)構(gòu)體指針,p1為查找到要刪除的結(jié)點指針,p2為其前驅(qū)指針;s[6]、c都是char型,s[6]用來存放學號,c用來輸入字母y/n。5.9.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)首先輸入要刪除學生的學號暫存在s[6]中,給p1和p2賦初值頭指針,利用while語句,當記錄的學號不是要找的且指針不為空時,將p1指針值賦給p2作為p1的前驅(qū)指針,將p1指針指向下一條記錄。循環(huán)結(jié)束后,如果strcmp(p1->num,s)==0,則此時p1所指的節(jié)點即是要刪除的學生信息。輸出學生信息,提示是否刪除。利用for(;;)循環(huán),若輸入Y或者y,則又分兩種情況:若p1==head,說明被刪結(jié)點是首結(jié)點,把p1所指下一個結(jié)點地址賦予head;否則將一下結(jié)點地址賦p2所指前一結(jié)點地址。5.9.4算法流程圖圖5.12按學號刪除記錄子函數(shù)算法框圖5.9.5源程序代碼/*按學號刪除記錄函數(shù)*/STUDENT*numdelete(STUDENT*head){STUDENT*p1,*p2;/*p1為查找到要刪除的結(jié)點指針,p2為其前驅(qū)指針*/charc,s[6];/*s[6]用來存放學號,c用來輸入字母*/printf("請輸入要刪除的學生學號:");scanf("%s",s);p1=p2=head;/*給p1和p2賦初值頭指針*/while(strcmp(p1->num,s)&&p1!=NULL)/*當記錄的學號不是要找的且指針不為空時*/{p2=p1;/*將p1指針值賦給p2作為p1的前驅(qū)指針*/p1=p1->next;/*將p1指針指向下一條記錄*/}if(strcmp(p1->num,s)==0)/*學號找到了*/{printf("**************************************已找到************************************\n");printf("\n");printf("|學號|姓名|語文成績|數(shù)學成績|英語成績|三門總分|平均分|名次|\n");printf("\n");printf("|%4s|%-4s|%3d|%3d|%3d|%3d|%4.2f|%-5d|\n",p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);printf("\n");printf("*********************************************************************************\n");printf("請問,你確定要刪除這個學生信息嗎?Y/N");/*提示是否要刪除,輸入Y刪除,N則退出*/for(;;) {scanf("%c",&c);if(c=='n'||c=='N')break;/*如果不刪除,則跳出本循環(huán)*/if(c=='y'||c=='Y') {if(p1==head)/*若p1==head,說明被刪結(jié)點是首結(jié)點*/head=p1->next;/*把第二個結(jié)點地址賦予head*/elsep2->next=p1->next;/*否則將一下結(jié)點地址賦給前一結(jié)點地址*/printf("\n學號是%s的學生信息已經(jīng)刪除!\n",s);printf("請不要忘記保存哦\n");break;/*刪除后就跳出循環(huán)*/ } }}elseprintf("\n對不起,系統(tǒng)中沒有學號是%s的學生\n",s);/*找不到該結(jié)點*/return(head);}5.9.6調(diào)試運行首先輸入要刪除學生的學號,如果這個同學成績信息在系統(tǒng)中就會顯示出你所要查找的學生的所有信息,詢問你是否確定刪除,確定后該學生的信息就從鏈表中刪除了。例如輸入學號103,則會達到預期目的。屏幕顯示如圖5.9.6。圖5.9.6按學號刪除記錄函數(shù)運行界面5.10按平均分進行插入法排序子函數(shù)5.10.1功能說明此函數(shù)執(zhí)行后,按照學習成績平均分由高到低排序,同時,對結(jié)構(gòu)體中的order(名次)欄進行正確的賦值。5.10.2參數(shù)說明sort函數(shù)的實參是結(jié)構(gòu)體指針,返回值是結(jié)構(gòu)體頭地址。m、i、j、k都是int型。k用于把鏈表中的average一欄依次賦值到數(shù)組a[10000]時候做循環(huán)變量。i用插入法對數(shù)組進行降序排列時做循環(huán)變量。k用于把排序好的數(shù)組中的數(shù)字依次放到鏈表中的average一欄時做循環(huán)變量。m是節(jié)點序號,把節(jié)點序號賦值給結(jié)構(gòu)體中的order一欄。a[10000],temp都是float型。a[10000]用于暫時存鏈表中的average一欄數(shù)據(jù)。temp是在插入法排序的時候,用于暫存操作數(shù)據(jù)。*p1、*p3都是結(jié)構(gòu)體指針。*p1在進行把鏈表中的average一欄依次賦值到數(shù)組a[10000]和把排序好的數(shù)組中的數(shù)字依次放到鏈表中的average一欄這兩個操作的時候,它首先指向鏈表頭,隨著操作不斷進行,向下一個節(jié)點移動。*p3是在標號名詞的時候它首先指向鏈表頭,隨著操作不斷進行,向下一個節(jié)點移動。5.10.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)首先把鏈表中的average一欄依次賦值到數(shù)組a[10000],再用插入法對數(shù)組a[10000]進行降序排列,然后把排序好的數(shù)組中的數(shù)字依次放到鏈表中的average一欄。最后利用循環(huán),把每個節(jié)點的序號依次賦值給該節(jié)點的order數(shù)據(jù)欄,即是名次。5.10.4算法流程圖圖5.14排序子函數(shù)算法框圖5.10.5源程序代碼/*按平均分排序函數(shù)*/STUDENT*sort(STUDENT*head)/*排序*/{intm=0,i,j,k;floata[10000],temp;STUDENT*p1,*p3;p1=head;for(k=0;p1!=0&&k<10000;k++)/*把鏈表中的average一欄依次賦值到數(shù)組a[10000]*/{a[k]=p1->average;p1=p1->next;}for(i=1;i<k;i++)/*用插入對數(shù)組進行降序排列*/{temp=a[i];for(j=i-1;j>=0&&temp>a[j];j--)a[j+1]=a[j];a[j+1]=temp;}p1=head;for(k=0;p1!=0&&k<10000;k++)/*把排序好的數(shù)組中的數(shù)字依次放到鏈表中的average一欄*/{p1->average=a[k];p1=p1->next;}p3=head; while(p3!=NULL)/*當p3不為空時,進行下列操作*/{m++;/*結(jié)點序號*/p3->order=m;/*將結(jié)點序號賦值給名次*/p3=p3->next;/*指針后移*/}printf("排序成功!\n");/*排序成功*/return(head);}5.10.6調(diào)試運行輸入6,調(diào)用排序函數(shù),輸出排序成功。之后再出現(xiàn)菜單欄選選項。輸入2顯示排序后的信息數(shù)據(jù)。此函數(shù)執(zhí)行后,按照學習成績平均分由高到低排序,同時,對結(jié)構(gòu)體中的order(名次)欄進行正確的賦值。達到預期目的。屏幕顯示如圖5.15圖5.15排序函數(shù)運行界面5.11插入學生成績子函數(shù)5.11.1功能說明使用者輸入新的學生信息,調(diào)用函數(shù)后,此學生信息將會插入學生成績信息系統(tǒng)的鏈表中去。5.11.2參數(shù)說明及數(shù)據(jù)結(jié)構(gòu)函數(shù)形參是兩個結(jié)構(gòu)體指針STUDENT*head,STUDENT*newnode,其中head是頭指針,*newnode是新插入的地址。n,sum1,i都是int型。其中sum1用來保存新記錄的總分,i是做結(jié)構(gòu)體操作時scor一欄的循環(huán)變量。n表示節(jié)點數(shù)。*p0,*p1,*p2都是結(jié)構(gòu)體指針變量。首先使p1指向第一個結(jié)點,在進行操作時,控制不斷的向下一個節(jié)點移動,p0指向要插入的結(jié)點,做插入的標志。p2做p1前驅(qū)。5.11.3子函數(shù)算法輸入要插入的學生信息。首先使p1指向第一個結(jié)點,p0指向要插入的結(jié)點,做插入的標志。在把p0所指的average一欄進行比較時,不相等時p1控制不斷的向下一個節(jié)點移動,直到相等。把新的信息插入到此時p1所指的節(jié)點上,在p2的幫助下,使得之后的鏈表數(shù)據(jù)依次向后移動一個。完成插入環(huán)節(jié)。5.11.4算法流程圖圖5.11.4插入記錄子函數(shù)算法框圖5.11.5源程序代碼/*插入記錄函數(shù)*/STUDENT*insert(STUDENT*head,STUDENT*newnode){STUDENT*p0,*p1,*p2;intsum1,i;p1=head;/*使p1指向第一個結(jié)點*/p0=newnode;/*p0指向要插入的結(jié)點*/printf("\n請輸入要插入的學生信息\n");/*提示輸入記錄信息*/printf("輸入學號:");scanf("%s",newnode->num);printf("輸入姓名:");scanf("%s",newnode->name);printf("請輸入三門功課成績\n");sum1=0;/*保存新記錄的總分,初值為0*/for(i=0;i<3;i++){do{printf("成績%d:",i+1);scanf("%d",&newnode->score[i]);if(newnode->score[i]>100||newnode->score[i]<0)printf("數(shù)據(jù)錯誤,請重新輸入\n");}while(newnode->score[i]>100||newnode->score[i]<0);sum1=sum1+newnode->score[i];/*累加各門成績*/}newnode->sum=sum1;/*將總分存入新記錄中*/newnode->average=(float)sum1/3;newnode->order=0;if(head==NULL)/*原來的鏈表是空表*/{head=p0;p0->next=NULL;}/*使p0指向的結(jié)點作為頭結(jié)點*/else{while((p0->average<p1->average)&&(p1->next!=NULL)){p2=p1;/*使p2指向剛才p1指向的結(jié)點*/p1=p1->next;/*p1后移一個結(jié)點*/}if(p0->average>=p1->average){if(head==p1)head=p0;/*插到原來第一個結(jié)點之前*/elsep2->next=p0;/*插到p2指向的結(jié)點之后*/p0->next=p1;}else{p1->next=p0;p0->next=NULL;}/*插到最后的結(jié)點之后*/}printf("\n學生%s已經(jīng)插入.\n",newnode->name);printf("請不要忘記儲存新的文件信息.\n");return(head);}5.11.6調(diào)試運行 輸入選項7,開始調(diào)用插入函數(shù)。輸入要插入學生的新信息,屏幕顯示插入成功,如圖5.11.6.2為檢查是否將新信息插入,輸入選擇2,顯示成績信息,發(fā)現(xiàn)插入成功。屏幕顯示如圖5.11.6.2。圖5.11.6.1插入記錄子函數(shù)運行界面(1)圖5.11.6.25.12保存學生成績信息5.12.1功能說明輸入要保存的文件名稱,然后會自動新建一個這樣的文件,并把這個學生成績管理鏈表中的數(shù)據(jù)存入此文件中去。5.12.2參數(shù)說明函數(shù)實參是結(jié)構(gòu)體頭指針,在能打開的情況下沒有返回值,否則返回值為0。*fp是指向文件的指針,用于文件操作。*p是結(jié)構(gòu)體指針,首先使p指向第一個結(jié)點,在進行操作時,控制不斷的向下一個節(jié)點移動。5.12.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)為輸出打開一個二進制文件,為只寫方式,如果打不開,就返回菜單,打得開就繼續(xù)做下面的。移動指針p從頭指針開始,利用while循環(huán),在p不為空前提下寫入一條記錄,再將指針后移,直到p為空地址,關(guān)閉文件,輸出保存文件成功。5.12.4算法流程圖圖5.12.4保存數(shù)據(jù)到文件函數(shù)算法框圖5.12.5源程序代碼/*保存數(shù)據(jù)到文件函數(shù)*/voidsave(STUDENT*head){FILE*fp;/*定義指向文件的指針*/STUDENT*p;/*定義移動指針*/charoutfile[10];printf("請輸入文件名稱,例如c:\\score\n");scanf("%s",outfile);if((fp=fopen(outfile,"wb"))==NULL)/*為輸出打開一個二進制文件,為只寫方式*/{printf("文件無法打開\n");return;/*若打不開則返回菜單*/}printf("\n正在保存文件\n");p=head;/*移動指針從頭指針開始*/while(p!=NULL)/*如p不為空*/{fwrite(p,LEN,1,fp);/*寫入一條記錄*/p=p->next;/*指針后移*/}fclose(fp);/*關(guān)閉文件*/printf("已經(jīng)成功保存文件!\n");}5.12.6調(diào)試運行輸入選項8表示執(zhí)行保存操作,按引導輸入文件名,屏幕顯示保存成功,如圖5.12.6。圖5.12.6保存數(shù)據(jù)到文件函數(shù)運行界面5.13讀取學生成績信息5.13.1功能說明輸入要讀取的文件名稱,然后此文件中去讀取,把讀入的數(shù)據(jù)新建為一個學生成績管理鏈表。輸出成功讀取。5.13.2參數(shù)說明此函數(shù)沒有實參,返回值為head鏈表的頭指針。*fp是指向文件的指針,用于文件操作。*p1、*p2是結(jié)構(gòu)體指針,首先使p1指向第一個結(jié)點,在進行操作時,控制不斷的向下一個節(jié)點移動。P2是p1的前驅(qū),用于建立新鏈表時候。infile[10]是char型,用于暫存文件名稱。5.13.3子函數(shù)算法及數(shù)據(jù)結(jié)構(gòu)打開一個二進制文件,為只讀方式。開辟一個新單元,鏈表初始化。循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束,如果沒讀到數(shù)據(jù),跳出循環(huán),為下一個結(jié)點開辟空間,使p2指向剛才p1指向的結(jié)點,指針后移,新讀入數(shù)據(jù)鏈到當前表尾。最后最后一個結(jié)點的后繼指針為空5.13.4算法流程圖圖5.13.4從文件讀數(shù)據(jù)函數(shù)算法框圖5.13.5源程序代碼/*從文件讀數(shù)據(jù)函數(shù)*/STUDENT*load(){STUDENT*p1,*p2,*head=NULL;/*定義記錄指針變量*/FILE*fp;/*定義指向文件的指針*/charinfile[10];printf("請輸入文件名稱,例如c:\\score\n");scanf("%s",infile);if((fp=fopen(infile,"rb"))==NULL)/*打開一個二進制文件,為只讀方式*/{printf("文件無法打開.\n");return(head);}printf("\n正在登陸文件!\n");p1=(STUDENT*)malloc(LEN);/*開辟一個新單元*/if(!p1){printf("Outofmemory!\n");return(head);}head=p1;/*申請到空間,將其作為頭指針*/while(!feof(fp))/*循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束*/{if(fread(p1,LEN,1,fp)!=1)break;/*如果沒讀到數(shù)據(jù),跳出循環(huán)*/p1->next=(STUDENT*)malloc(LEN);/*為下一個結(jié)點開辟空間*/if(!p1->next){printf("Outofmemory!\n");return(head);}p2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論