數(shù)據(jù)結(jié)構(gòu)課程設計 學生成績管理系統(tǒng).doc_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設計 學生成績管理系統(tǒng).doc_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設計 學生成績管理系統(tǒng).doc_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設計 學生成績管理系統(tǒng).doc_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設計 學生成績管理系統(tǒng).doc_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

課 程 設 計 報 告課程名稱 數(shù)據(jù)結(jié)構(gòu) 課題名稱 學生成績管理系統(tǒng) 專 業(yè) 通信工程 班 級 1301 學 號 201303020102 姓 名 momom 指導教師 張鏖烽 彭幀 黃哲 2015年 7月 2日湖南工程學院課 程 設 計 任 務 書課程名稱 數(shù)據(jù)結(jié)構(gòu) 課 題 學生成績管理系統(tǒng) 專業(yè)班級 通信工程1301 學生姓名 momom 學 號 201303020102 指導老師 張鏖烽 彭幀 黃哲 審 批 張鏖烽 任務書下達日期 2015年 6月 29日任 務 完成日期 2015年 7月 5日 目 錄一、課程設計的分析41.課程設計目的:42.課程設計題目43.需求分析5二、概要設計5三、詳細設計6四、調(diào)試分析11(1)調(diào)試過程中遇到的問題11(2)經(jīng)驗和體會11五、用戶使用說明12六、測試結(jié)果13七、附錄18八、課程設計評分表37一、課程設計的分析1.課程設計目的:課程設計是對學生的一種全面綜合訓練,是與課堂聽講、自學和練習相輔相成的必不可少的一個教學環(huán)節(jié)。通常,實習題中的問題比平時的習題復雜得多,也更接近實際。實習著眼于原理與應用的結(jié)合點,使讀者學會如何把書上學到的知識用于解決實際問題,培養(yǎng)軟件工作所需要的動手能力;另一方面,能使書上的知識變“活”,起到深化理解和靈活掌握教學內(nèi)容的目的。平時的練習較偏重于如何編寫功能單一的“小”算法,而實習題是軟件設計的綜合訓練,包括問題分析、總體結(jié)構(gòu)設計、用戶界面設計、程序設計基本技能和技巧,多人合作,以至一整套軟件工作規(guī)范的訓練和科學作風的培養(yǎng)。2.課程設計題目【課題】學生成績管理系統(tǒng)【問題描述】根據(jù)自己這個學期的課程表,設計一個成績管理系統(tǒng)管理自己班的成績;每個學生記錄包含學號、姓名、每門課程成績、總分以及加權(quán)平均分?!净疽蟆恳粋€完整的成績管理系統(tǒng)應具有以下功能:(1)輸入:成績錄入;(2)輸出:輸出成績表;(3)插入:在成績表中適當位置插入某個學生成績;(4)刪除:在成績表中刪除某個學生成績;(5)查找:根據(jù)某個關(guān)鍵字查找某個學生成績;(6)排序:根據(jù)某一個或某幾個關(guān)鍵字進行排序;(7)篩選:根據(jù)某個關(guān)鍵字篩選出符合某些條件的數(shù)據(jù);【測試數(shù)據(jù)】用本班的成績總表作為測試數(shù)據(jù)。3.需求分析本次課程設計的題目是學生成績管理系統(tǒng),要求可以存入學生,學生信息包括學生學號、姓名、每科成績和平均成績以及加權(quán)平均成績等。該系統(tǒng)主要有以下七個功能,即對學生信息進行:輸入、輸出、插入、刪除、查找、排序、篩選等功能。對學生進行操作可以有很多思路,而我選用的是單鏈表村學生信息那一條思路,即設置一個單鏈表,其中節(jié)點數(shù)據(jù)域保存學生基本信息。由于我們學號比較長,用整型數(shù)據(jù)無法保存,所以我定義char型的字符串來保存學號和姓名。用一個數(shù)組來保存學生每一科的成績,此外在定義一個總分和平均分變量。定義學生如下:typedef struct Studentchar mun12; /學號char name20; /姓名float score8; /成績float all_score; /總分float ave_score; /加權(quán)平均分struct Student *next;LinkList;二、概要設計本程序采用鏈表的方法將每一個學生設置成為一個鏈表中的數(shù)據(jù)節(jié)點,節(jié)點中有字符型mun12(學號)、name20(姓名)、浮點型數(shù)據(jù)score8(放置每一科成績的數(shù)組)、all_score(總分)和ave_score(加權(quán)平均分)。主函數(shù)中在執(zhí)行成績管理系統(tǒng)之前會先創(chuàng)建一個鏈表,并調(diào)用void InitList (LinkList *&L)函數(shù)來初始化鏈表;而后進入菜單選擇項選擇功能進行操作,主程序流程圖如下:三、詳細設計1、添加學生: 2、輸出學生:創(chuàng)建節(jié)點s LinkList *p=L-next;輸入學生信息,計算總分與加權(quán)分 for(m=1;mnext=s;r=s;(尾插法插入鏈表)輸出學生信息,p=p-nextcount=count+1;學生總數(shù)加13、插入學生4、刪除學生輸入要插入的位置 數(shù)字選擇刪除方式scanf(%d,&w); 按編號刪除和學號刪除調(diào)用插入函數(shù) 1編號 調(diào)用Delete_StudentInsert_Student(h,w); 2學號 調(diào)用Locate_Student找到 學生位置,在用Delete_Student的流程圖如下:Insert_Student 函數(shù) Delete_Student的函數(shù)流程圖: Locate_Student函數(shù)的流程圖與如下:Locate_Student1的流程圖類似,不再重復了 5查找學生:調(diào)用Seek_Student函數(shù),分為按學號查找和按姓名查找1按編號 調(diào)用Locate_Student函數(shù)返回i在調(diào)用Out_one_Student輸出第i個學生2 按姓名調(diào)用Locate_Student1函數(shù)返回i在調(diào)用Out_one_Student輸出第i個學生6排序函數(shù) 調(diào)用Queue_Student函數(shù):其中有按學號,總分,各科成績排序我這里采用的是冒泡排序法進行排序,分別定義了兩個節(jié)點指針q指向頭指針p指向q的下一個節(jié)點,在進入雙重循環(huán)進行比較排序 流程圖如下:排序的方法都類似,知識比較數(shù)據(jù)不同,所以就沒有一一畫出來了7 篩選創(chuàng)建另一個鏈表r用于存篩選出來的學生,并調(diào)用output_Student函數(shù)輸出篩選程序流程圖如下:篩選程序又分為1 按總分選 2 全部及格的人 3 按各科成績1 而總分篩選主要是輸入一個數(shù)值,判斷數(shù)據(jù)是否大于輸入數(shù)據(jù),大于的都輸出2 去不幾個的人通過比較每一科成績是否都大于60分,大于的就選出插入新鏈表并輸出3 各科成績的話是只比較其中一科來創(chuàng)建鏈表并輸出其比較流程圖都如上圖所示,這里便不再一一畫出來了。四、調(diào)試分析(1)調(diào)試過程中遇到的問題是如何解決的以及對設計與實現(xiàn)的回顧討論和分析在調(diào)試過程中遇到的第一個問題是輸出學生的問題,因為輸出的問題,其中總是發(fā)現(xiàn)輸出亂碼,找了好久,后來終于發(fā)現(xiàn)是輸入時出了問題,因為姓名我定義了字符串型,而字符串長度我定義了20,在創(chuàng)建節(jié)點的時候我卻把name20給了學生節(jié)點,導致輸出時地址錯誤而輸出亂碼。第二個問題是查找,我開始一直想不到怎么把查找到的學生輸出,后來想了很久,找到了方法,我先通過查找關(guān)鍵字去找到該學生是在鏈表的那個位置,在通過返回的位置的值來輸出想要輸出的那個學生,所以就定義了Locate_Student和Out_one_Student來完成查找功能。第三個問題是篩選功能的實現(xiàn),我本來想通過比較,將符合關(guān)鍵字的學生篩選出來在輸出,結(jié)果發(fā)現(xiàn)輸出函數(shù)是已經(jīng)定義成一次性全部輸出的形式。導致我一直想不到好的方法來進行這個功能的代碼編寫。后來經(jīng)過老師的指導,我知道了一種新的方法來編寫,就是通過創(chuàng)建一個新的學生鏈表來存已經(jīng)篩選出來的學生。然后在通過輸出函數(shù)來將新鏈表進行輸出,這樣就可以達到篩選的目的。改進方法:現(xiàn)在想了一下,其實可以將輸出函數(shù)進行改進,改成一個一個學生輸出的形式,在通過一個判斷語句進行選擇性輸出,用這個輸出的方法可以減少代碼的的量,而達到同樣的效果。第四個問題是主函數(shù)的問題,因為我想讓主函數(shù)看起來簡潔一點,就把主函數(shù)分成兩部分,一部分用于選擇操作,另一部分用于進行選擇好的操作,可是這樣一來卻出現(xiàn)了問題,就是輸出數(shù)據(jù)之后無法暫停在輸出界面,而是閃了一下就退出來進入主界面了,這個問題我開始以為是輸出函數(shù)的問題,結(jié)果我去改了輸出函數(shù),結(jié)果還是無法停留。后來知道原因了,主函數(shù)退出switch循環(huán)之后會立即回到主菜單界面,到時無法停在輸出界面。我在主函數(shù)最后加一個system(“pause”)之后才打到可以觀察到的地方。改進方法:可以將主函數(shù)定義成一個,不用分開,去掉for(;)這個循環(huán)會好點。(2)經(jīng)驗和體會本次課程設計的題目我一開始看到的時候以為很容易就能做出來,所以只是大概想了一下思路,就直接開始了,其實這個實驗可以用順序表做會思路更清晰一些,我沒有選擇順序表來做,因為我在單鏈表這一部分有點模糊,所以想挑戰(zhàn)一下用單鏈表來做。這個程序的每一個代碼都是我經(jīng)過一步一步分析寫出來的,在編寫的過程中遇到了很多的阻礙,很多自己無法預知的錯誤,在不斷的找錯過程中,我感覺到自己在c語言這一方面的不足,對算法的精髓還不是很了解, 對于單鏈表的操作也不是很熟練,尤其是在節(jié)點指針多起來的時候會有點亂,甚至搞不清指針到底指向哪里了。然而,在編程過程中,一次次的測試失敗,再一次次修改正確卻讓我慢慢的熟悉了數(shù)據(jù)結(jié)構(gòu)一些用法,漸漸的知道要編寫一個系統(tǒng),需要各種功能協(xié)調(diào)才能算一個系統(tǒng),而每一個功能有需要很多函數(shù)之間的相互聯(lián)系來調(diào)用與支撐。同時要想將課程設計完成的好,就需要積極提問,遇到不懂的地方可以找老師或同學相互交流經(jīng)驗,這樣才會更加有效率的完成課設。經(jīng)過這一段時間的課設,我學到的不僅僅是數(shù)據(jù)結(jié)構(gòu)的想關(guān)知識,也懂得了團隊協(xié)作的重要性,知道學習需要真正扎實去學習,這樣才能真正學到知識,并靈活運用這些所學知識。五、用戶使用說明1、添加學生功能:進入系統(tǒng)后先選擇1回車即可進入輸入界面,然后按照提示輸入學生學號、姓名和數(shù)據(jù)結(jié)構(gòu)、數(shù)字信號處理、數(shù)字電子技術(shù)基礎的分數(shù)在按回車,如果還想再繼續(xù)添加就按1繼續(xù),否則可以按任何鍵退出。2、輸出學生:用戶在輸入完學生數(shù)據(jù)后既可以按2輸出所輸入的全部學生3、插入學生:用戶需在主界面按3即可以進入插入界面,此時可以按數(shù)字鍵在選擇要插入的位置,如輸入1即可以將要插入的學生插入到第一個位置,可以在主界面輸入2進行查看是否插入到指定位置。4、刪除學生:用戶可以在主界面輸入4進入刪除,在通過選擇編號來刪除要刪除的學生。5、查找:查找查找功能有按學號和姓名查找,如按一進入學號查找,可以輸入要查找的學號,回車即可以輸出要查找的學生。6、排序:排序可以通過學號,總分,和各科成績,輸入1可以按學號從小到大排序,輸入2可以按總分從小到大進行排序,輸入3可以進入科目選擇,再按1進行數(shù)據(jù)結(jié)構(gòu)排序,2進行數(shù)字型號處理排序,3進行數(shù)電的排序。7、篩選:可以按1進入總分篩選,進入之后輸入篩選多少分以上的人,輸入分數(shù),如:200,即可輸出所有大于200分的學生;在篩選界面輸入2可以輸出全部及格的學生;按3可以進入各科成績的篩選,再按1選出所有數(shù)據(jù)結(jié)構(gòu)及格的學生、再按2選出所有數(shù)字信號處理及格的學生、再按3選出所有數(shù)字電子技術(shù)基礎及格的學生。8、退出:退出程序只需要在主界面按0再回車即可以退出程序。六、測試結(jié)果1、添加學生:2、輸出學生:3、 插入學生: 4、刪除學生: 5、查找學生:6、排序7、篩選0、退出程序:七、附錄#include #include #include #include int count =0; /記錄學生人數(shù)typedef struct Studentchar mun12; /學號char name20; /姓名float score8; /成績float all_score; /總分float ave_score; /加權(quán)平均分struct Student *next;LinkList;void InitList (LinkList *&L) /初始化鏈表L=(LinkList *)malloc(sizeof(LinkList);L-next=NULL;void Creat_Student (LinkList *&L) /輸入學生并添加到鏈表里面LinkList *r=L,*s;int i=0,j=1;float all=0,ave,a8;while(j=1)while(r-next!=NULL)r=r-next;s=(LinkList *)malloc(sizeof(LinkList);s-next=NULL;printf(輸入學生學號、姓名、每科成績n);printf(學號:);scanf(%s,&s-mun);printf(姓名:);scanf(%s,&s-name);/*數(shù)據(jù)結(jié)構(gòu)3.0、數(shù)字信號處理4.0、數(shù)字電子技術(shù)基礎2.5 這里只輸入三門成績作為示范*/for(i=0;iscorei=ai;if(i=1)printf(輸入數(shù)字信號處理分數(shù)n);scanf(%f,&ai);s-scorei=ai;if(i=2)printf(輸入數(shù)字電子技術(shù)基礎分數(shù)n);scanf(%f,&ai);s-scorei=ai;all=a0+a1+a2;s-all_score=all;ave=(a0*3.0+a1*4.0+a2*2.5)/9.5;s-ave_score=ave;r-next=s;r=s;count=count+1;printf(是否繼續(xù)?(按1繼續(xù),其他退出。));scanf(%d,&j);void output_Student (LinkList *&L,int n) /輸出全部學生LinkList *p=L-next;if(p=NULL)printf(沒有學生成績!請?zhí)砑訉W生。n);return;printf(tt 學生成績表 n);printf(編號 學號 姓名 數(shù)據(jù)結(jié)構(gòu) 數(shù)字信號 數(shù)字電路 總分 加權(quán)平均分n);int m;for(m=1;mmun,p-name,p-score0,p-score1,p-score2,p-all_score,p-ave_score);p=p-next;void Delete_Student(LinkList *&L,int i) /刪除第i個學生int j=0;LinkList *p=L,*q;if (i=0)printf(沒有找到該學生);return;while(jnext;if(p=NULL)printf(沒有找到該學生);return ;elseq=p-next;if(q=NULL)return ;p-next=q-next;free(q);count=count-1;printf(刪除成功!n);return;int Locate_Student(LinkList *L,char* mun) /按學號定位,返回第i個學生int i=1;LinkList *p=L-next;while(p!=NULL&strcmp(p-mun,mun)!=0)i+;p=p-next;if(p=NULL)return (0);else return (i);int Locate_Student1(LinkList *L,char* name) /按姓名定位,返回第i個學生int i=1;LinkList *p=L-next;while(p!=NULL&strcmp(p-name,name)!=0)i+;p=p-next;if(p=NULL)return (0);else return (i);void Queue_Subject(LinkList *&L) /不同科目排序int i;LinkList *q,*p,*t1,*t2;printf(請輸入科目的代號:1 數(shù)據(jù)結(jié)構(gòu) 2 數(shù)字信號處理 3 數(shù)電n請輸入:);scanf(%d,&i);if(i=1|inext!=NULL;q=q-next)for(p=q-next;p-next!=NULL;p=p-next)if(q-next-scorei-1p-next-scorei-1)if(q-next=p)t1=p-next;p-next=p-next-next;t1-next=q-next;q-next=t1;p=t1;elset1=p-next;t2=q-next;p-next=p-next-next;q-next=q-next-next;t1-next=q-next;q-next=t1;t2-next=p-next;p-next=t2;elseprintf(沒有找到該科目!n);return;void Queue_Student(LinkList *&L) /排序函數(shù)int i,j=1;printf(1、按照學號 2、總分3、按各科分排序n請輸入:);scanf(%d,&i);LinkList *q,*p,*t1,*t2;switch(i) case 1: /學號排序for(q=L;q-next!=NULL;q=q-next)for(p=q-next;p-next!=NULL;p=p-next)if(strcmp(q-next-mun,p-next-mun)=1)if(q-next=p)t1=p-next;p-next=p-next-next;t1-next=q-next;q-next=t1;p=t1;elset1=p-next;t2=q-next;p-next=p-next-next;q-next=q-next-next;t1-next=q-next;q-next=t1;t2-next=p-next;p-next=t2;break;case 2: /總分排序for(q=L;q-next!=NULL;q=q-next)for(p=q-next;p-next!=NULL;p=p-next)if(q-next-all_scorep-next-all_score)if(q-next=p)t1=p-next;p-next=p-next-next;t1-next=q-next;q-next=t1;p=t1;elset1=p-next;t2=q-next;p-next=p-next-next;q-next=q-next-next;t1-next=q-next;q-next=t1;t2-next=p-next;p-next=t2;break;case 3:Queue_Subject(L); /科目排序break;void Out_one_Student(LinkList *L,int i) /輸出第i個學生int j=0;LinkList *p=L;while(jnext;printf(%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1fn,p-mun,p-name,p-score0,p-score1,p-score2,p-all_score,p-ave_score);int Seek_Student(LinkList *L) /查找學生 1 按學號查找 2 按姓名查找int m;printf(1 按學號查找 2 按姓名查找 3 退出n請輸入:);scanf(%d,&m);switch(m)case 1:char a12;printf(輸入學號:);scanf(%s,&a);return (Locate_Student(L,a); /返回學號查找到的值break;case 2:char b20;printf(輸入姓名:);scanf(%s,&b);return(Locate_Student1(L,b);break;case 3:break;void Filter_Student(LinkList *&L) /篩選LinkList *s,*p=L-next,*r,*q;int y,count2=0;printf(1 按總分選 2 全部及格的人 3 按各科成績 4 退出n請輸入:);scanf(%d,&y);switch(y)case 1:s=(LinkList *)malloc(sizeof(LinkList);q=s;int i;float all;printf(您要總分多少分以上的人,請輸入:);scanf(%f,&all);for (i=0;inext)if (p=NULL)printf(沒有);return;if(p-all_scoreall)r=(LinkList *)malloc(sizeof(LinkList);strcpy(r-mun,p-mun);strcpy(r-name,p-name); r-score1=p-score1;r-score2=p-score2;r-score0=p-score0;r-all_score=p-all_score;r-ave_score=p-ave_score;q-next=r;q=q-next;q-next=NULL;count2+;output_Student(s,count2);free(s);break;case 2:s=(LinkList *)malloc(sizeof(LinkList);q=s;int j;for (j=0;jnext)if (p=NULL)printf(沒有);return;if(p-score059&p-score159&p-score259)r=(LinkList *)malloc(sizeof(LinkList);strcpy(r-mun,p-mun);strcpy(r-name,p-name); r-score1=p-score1;r-score2=p-score2;r-score0=p-score0;r-all_score=p-all_score;r-ave_score=p-ave_score;q-next=r;q=q-next;q-next=NULL;count2+;output_Student(s,count2);free(s);break;case 3:s=(LinkList *)malloc(sizeof(LinkList);q=s;int k,x;printf(選擇 1 數(shù)據(jù)結(jié)構(gòu)及格的 2 數(shù)字信號處理及格的 3 數(shù)電及格的n);printf(請輸入:);scanf(%d,&x);for (k=0;knext)if (p=NULL)printf(沒有);return;if(p-scorex-159)r=(LinkList *)malloc(sizeof(LinkList);strcpy(r-mun,p-mun);strcpy(r-name,p-name); r-score1=p-score1;r-score2=p-score2;r-score0=p-score0;r-all_score=p-all_score;r-ave_score=p-ave_score;q-next=r;q=q-next;q-next=NULL;count2+;output_Student(s,count2);free(s);break;case 4:break;bool Insert_Student(LinkList *&L,int i) /插入學生int j=0;LinkList *p=L,*s;if (i=0)printf(對不起,沒有該位置!n);return false;while(jnext;if(p=NULL)printf(對不起,沒有該位置!n);return false;elses=(LinkList *)malloc(sizeof(LinkList);s-next=NULL;float all,ave,score;printf(輸入學生學號、姓名、每科成績n);printf(學號:);scanf(%s,&s-mun);printf(姓名:);scanf(%s,&s-name);for(i=0;iscorei=score;if(i=1)printf(輸入數(shù)字信號處理分數(shù)n);scanf(%f,&score);s-scorei=score;if(i=2)printf(輸入數(shù)字電子技術(shù)基礎分數(shù)n);scanf(%f,&score);s-scorei=score;all=s-score1+s-score2+s-score0;s-all_score=all;ave=(s-score0*3.0+s-score1*4.0+s-score2*2.5)/9.5;s-ave_score=ave;s-next=p-next;p-next=s;count+;printf(插入成功n);return true;int menu_select() /*菜單選擇程序*/ int c; do system(cls); printf(nt 歡迎使用學生成績管理系統(tǒng) n);printf(t 1. 添加學生 n);

溫馨提示

  • 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

提交評論