數據結構課程設計(學生成績管理系統)(20210407195922)_第1頁
數據結構課程設計(學生成績管理系統)(20210407195922)_第2頁
數據結構課程設計(學生成績管理系統)(20210407195922)_第3頁
數據結構課程設計(學生成績管理系統)(20210407195922)_第4頁
數據結構課程設計(學生成績管理系統)(20210407195922)_第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、數據結構課程設計(學生成績管理系統) # / 26數據結構課程設計(學生成績管理系統) / 26目錄 TOC o 1-5 h z HYPERLINK l bookmark0 o Current Document 一、運行環境 0一、運行環境 1 HYPERLINK l bookmark2 o Current Document 二、設計目的和意義 1設計目的 1設計意義 1 HYPERLINK l bookmark4 o Current Document 三、算法思想 1 HYPERLINK l bookmark6 o Current Document 四、模塊劃分 4 HYPERLINK l

2、bookmark8 o Current Document 五、數據結構 5 HYPERLINK l bookmark10 o Current Document 六、程序流程圖 6 HYPERLINK l bookmark12 o Current Document 七、程序源代碼 8 HYPERLINK l bookmark14 o Current Document 八、程序調試過程分析 18 HYPERLINK l bookmark16 o Current Document 九、測試數據 18 HYPERLINK l bookmark18 o Current Document 十、測試結果及分

3、析 19 HYPERLINK l bookmark20 o Current Document 十一、小結 23 HYPERLINK l bookmark22 o Current Document 參考文獻 24數據結構課程設計(學生成績管理系統) / 26數據結構課程設計(學生成績管理系統) / 26一、運行環境硬件環境:電腦軟件環境: vc+6.0二、設計目的和意義設計目的此次課程設計的目的是讓學生在學習完G數據結構等課程基礎上,進一步掌握設計、實現較大系統的完整過程,包括系統分析、編碼設計、系統集成、以及調試分析,熟練掌握數據結構的選擇、設計、實現以及操作方法,為進一步的應用開發打好基礎。

4、設計意義此次設計意義在于讓我們更好的去掌握C的基本語法、函數以及Visual C+琛成編譯環境。掌握樹、圖、鏈表等基本數據結構及其應用。掌握程序流程以及基本應用方法。應用軟件工程方面的知識,熟悉軟件開發的流程。通過本課程設計,培養學生進行軟件設計能力。首先進行需求分析,針對目標對象完成程序結構設計、對象設計、主要數據結構設計、輸入輸出設計、人機界面設計等。三、算法思想整個系統除了主函數外,另外還有12 個函數,實現十大功能:菜單選擇、輸入功能、顯示功能、查找功能、刪除功能、排序功能、插入功能、保存功能、讀取功能、修改。各個函數的詳細設計說明分別如下:主函數 main()利用無限次循環for(;

5、) 和 swithch() 實現各函數的調用, 系統根據輸入的數字選項來調用相應的函數。初始化函數STUDENT *init()這是一個無參函數,里面只有一個語句,它的作用是使鏈表初始化 , 使 head 的值為NULL比如:沒有這個函數的話,在你沒有輸入任何數據的情況下,去執行顯示功 能的時候會顯示一些亂碼!菜單選擇函數int menu_select();這是一個無參函數,主要實現“功能選擇”的界面,在這個界面里有顯示系統的九大功能,根據每個功能前面的序號進行選擇,中間還顯示系統當前的時間。等執行完每一個函數功能后,按任一鍵回到主界面也要通過這個函數來實現!輸入記錄函數STUDENT *cr

6、eate()這是一個無參函數,用來執行第學生成績記錄的輸入,當學生為 0 時停止輸入,函數結束后,帶回一個指向鏈表頭的指針head。算法:先聲明一個首節點head,并將head-next設為NULL每輸入一個數據就 聲明一個新節點p,把p-next設為NULL并且鏈接到之前列表的尾端。顯示記錄函數void print(STUDENT *head)這是一個不返回值的有參函數, 形參為 “鏈表頭的指針” , 負責對全部學生成績記錄的輸出,不足之處就是不能對學生成績進行分頁顯示。算法: 先將 p 結點的指針指向第一個結點, 將 p 結點 ( 即第一個結點 ) 的數據輸出。然后再將 p 結點的指針指向

7、 p 指針的的指針( 即下一結點 ) ,將 p 結點 ( 即第一結點 ) 的數據輸出。重復執行此步聚直到p指針指向NULL為止。查找記錄函數void search(STUDENT *head)這是一個不返回值的有參函數, 形參為 “鏈表頭的指針” , 實現按姓名對某個學生進行查找,并顯示所查找到的記錄。算法:采用線性查找法往下一個節點查找。輸入所要查找的學生的姓名 s ,設一個指針變量p,先指向第一個結點,當strcmp(p-name,s) & p != NULL 時,使p后 移一個結點,如果p!=NULL,輸出p所指的結點。刪除記錄函數STUDENT *delete(STUDENT *hea

8、d)這是一個有參函數,形參為“鏈表頭的指針” ,先輸入要刪除的學生記錄的學號,找到后顯示該學生信息,等確認后便可按“Y”進行刪除。算法:從p指向的第一個結點開始,檢查該結點中的num值是否等于輸入的要求刪除的那個學號。如果相等就將該結點刪除,如不相等,就將p 后移一個結點,再如此進行下去,直到遇到表尾為止。8、排序函數STUDENT *sort(STUDENT *head)這是一個有參函數, 形參為 “鏈表頭的指針” , 按學生成績的平均分高低進行排序,還可以顯示名次。9、修改函數STUDENT *xiugai(STUDENT *head)這是一個有參數函數, 形參為 “鏈表頭的指針” , 首

9、先按學生姓名對要修改的學生記錄進行查找,然后對找到的記錄進行修改。算法:采用線性查找法往下一個節點查找。輸入所要查找的學生的姓名s ,設一個指針變量p,先指向第一個結點,當strcmp(p-name,s) & p != NULL 時,使p后 移一個結點,如果p!=NULL,修改p所指的結點的相關記錄,修改完成后對記錄進行 輸出,然后重新調用排序 sort 函數,對新修改的數據進行排序。10、 插入函數 STUDENT *insert(STUDENT *head,STUDENT *new)這是一個有參函數, 形參有兩個, 一個是 “鏈表頭的指針” , 一個是 “待插入指針” , 按照原來成績平均

10、分的高低進行插入,插入后會重新進行排序,并返回。算法: 先將學生的成績按平均分由高分到低分進行排序, 再插入一個新生的結點 ,要求按平均分的高低順序插入。先用指針變量 p0 指向待插入的結點, p1 指向第一個結點。 如果 p0-averageaverage , 則待插入的結點不應插在 p1 所指的結點之前。此時將 p1 后移,并使p2 指向剛才p1 所指的結點。重復以上的步驟,直到p0-average=p1-average 為止。這時將p0 指向的結點插到 p1 所指結點之前。但是如果 p1 所指的已是表尾結點,則 p1 就不應后移了。如果p0-average 比所有結點的average 都

11、小,則應將p0 所指的結點插到鏈表末尾。如果插入的位置既不在第一個結點之前,又不在表尾結點之后,則將p0 的值賦給p2- ,使p2-next 指向待插入的結點,然后將p1 的值賦給 p0-next ,使得 p0-next 指向 p1 指向的變量。如果插入位置為第一個結點之前,則將p0賦給head,將pl賦給p0-next。如果要插到表尾之后, 應將p0賦給p1-next , NULL賦Zp p0-next。最后再調用排序的函數,將學生成績重 新排序 .11、保存數據到文件函數void save(STUDENT *head)這是一個不返回值的有參函數,形參為 “鏈表頭的指針”,可以把學生記錄保存

12、在電腦上由自己任意命名的二進制文件。12、從文件讀數據函數STUDENT*load()這是一個不返回值的有參函數,形參為 “鏈表頭的指針”,根據輸入的文件地址進行讀取。四、模塊劃分學生成績管理的設計, 除了主函數和初始化函數外, 主要還設計了十個功能函數:菜單選擇、輸入功能、輸出功能、查找功能、刪除功能、排序功能、插入功能、保存功能、讀取功能、修改函數。通過分組設計現實現部分功能函數說明如下:1、菜單選擇:int menu_select();提供十種 可 以選 擇 的操作 , 在 main 函數 中通過 switch 語句 調用 菜單 menu_select() 函數,進入不同的功能函數中完成

13、相關操作。2、輸入功能:STUDENT *create();通過一個 for 循環語句的控制,可以一次完成無數條記錄的輸入。并將其存入鏈表。3、輸出功能:void print(STUDENT *head);通過一個 while 的循環控制語句, 在指針 p!=0 時, 完成全部學生記錄的顯示。 知 道不滿足循環語句,程序再次回到菜單選擇功能界面。4、查找功能:void search(STUDENT *head);通過 strcmp 來判斷是否找到所需查找的學生記錄, 在不滿足該條件時, 通過 while語句完成結點的下移,最后若查找成功則完成顯示。返回主菜單界面。5、刪除功能:STUDENT

14、*Delete(STUDENT *head);按想要刪除的學生的學號首先進行查找, 通過指針所指向結點的下移來完成, 如果找到該記錄,則完成前后結點的連接,同時對以查找到的結點進行空間的釋放,最后完成對某個學生記錄進行刪除,并重新存儲。6、修改功能:STUDENT *xiugai(STUDENT *head);首先通過想核對想要修改的學生姓名進行查到, 相當于調用一次查找函數search,如果查找成功則對數據進行修改, 最后計算其總分和平均分, 調用一次排序函數sort,重新進行排序,并重新存儲記錄。五、數據結構定義了一個typedef struct stu 的結構體數組,相關描述如下:#de

15、fine LEN sizeof(STUDENT)typedef struct stu /*定義結構體數組用于緩存數據 */char num6;char name20;int score3;int sum;float average;int order;struct stu *next;STUDENT;數據結構課程設計(學生成績管理系統) / 26數據結構課程設計(學生成績管理系統) # / 26六、程序流程圖6. 1、程序的總體模塊流程圖如下:數據結構課程設計(學生成績管理系統)圖6-3 / 26數據結構課程設計(學生成績管理系統)圖6-3 / 266. 2、刪除學生記錄流程圖如下:圖6-26

16、.3、插入學生記錄流程圖如下:數據結構課程設計(學生成績管理系統) / 26數據結構課程設計(學生成績管理系統) / 26七、程序源代碼其它說明 */字符串函數*/字符操作函數*/定義結構體數組用于緩存數據 */#include #include#include /*#include/*#include/*#define LEN sizeof(STUDENT) typedef struct stu /*char num6;char name20;int score3;int sum;float average;int order;struct stu *next;STUDENT;/* 函數原型

17、 */STUDENT *init(); /* int menu_select(); /*STUDENT *create(); /*void print(STUDENT *head); /*void search(STUDENT *head); /*STUDENT *Delete(STUDENT *head);STUDENT *insert(STUDENT *head,STUDENT *New);STUDENT *sort(STUDENT *head);初始化函數*/菜單函數 */創建鏈表 */顯示全部記錄*/查找記錄 */* 刪除記錄 */* 排序 */* 插入記錄 */STUDENT *xi

18、ugai(STUDENT *head);/* 修改記錄 */void save(STUDENT *head);/*保存文件 */STUDENT *load();/*讀文件 */* 主函數界面*/ void main()STUDENT *head,New;head=init();/*鏈表初始化 , 使 head 的值為NULL*/for(;)/*循環無限次*/switch(menu_select()case 1:head=create();break;case 2:print(head);break;case 3:search(head);break;case 4:head=Delete(hea

19、d);break;case 5:head=sort(head);break;表示返回地址*/case 6:head=insert(head,&New);break; /*&new case 7:save(head);break;case 8:head=load(); break;case 9:xiugai(head);break;case 10:exit(0);/*如菜單返回值為9 則程序結束*/* 初始化函數*/STUDENT *init()return NULL; /*返回空指針 */數據結構課程設計(學生成績管理系統) / 26數據結構課程設計(學生成績管理系統) / 26/* 菜單選擇

20、函數*/ menu_select() int n;printf(*n);printf(ttWelcome ton);printf(nttThe student score manage systemn);printf(ttt1.輸入學生記錄n);/*輸入學生成績記錄*printf(ttt2.輸出學生記錄n);/*顯示 */printf(ttt3.查找學生記錄n);/*尋找 */printf(ttt4.刪除學生記錄n);/*刪除 */printf(ttt5.將學生成績進行排序 n);/*排序 */printf(ttt6.插入一個新的學生記錄n);/*插入 */printf(ttt7.保存記錄n)

21、;/*保存 */printf(ttt8.讀取記錄 n);/*讀取 */printf(ttt9.修改記錄n);/*修改 */printf(ttt10.退出 n);/*退出 */夏翠玉、陳潔麗.n);printf(nttprintf(*MENU*n);printf(*n);doprintf(nttt輸入您的選擇(110):);scanf(%d,&n);while(n10);/*如果選擇項不在19之間則重輸*/return(n);/*返回選擇項, 主函數根據該數調用相應的函數*/* 輸入函數 */STUDENT *create()int i,s,k;int j=0;STUDENT *head=NUL

22、L,*p; /* 定義函數 . 此函數帶回一個指向鏈表頭的指針 */system(cls);printf(n 請輸入您想輸入的學生個數: );scanf(%d,&k);for(j=0;jnum);if(p-num0=0) break; /*如果學號首字符為 0 則結束輸入 */printf( 輸入姓名 :);scanf(%s,p-name);printf( 請分別輸入語文、數學、英語的分數%d scoresn,3);/* 開始輸入 */s=0;/*計算每個學生的總分,初值為 0*/for(i=0;iscorei);if(p-scoreiscorei100)/* 確保成績在0100之間 */pr

23、intf(Data error,please enter again.n);while(p-scoreiscorei100);s=s+p-scorei; /* 累加各門成績*/p-sum=s; /* 將總分保存*/p-average=(float)s/3;/*先用強制類型轉換將s轉換成float型,再求平均值*/p-order=0;/*p-next=head;/*head=p;/*未排序前此值為 0*/將頭結點做為新輸入結點的后繼結點 */新輸入結點為新的頭結點 */return(head);/* 顯示全部記錄函數*/void print(STUDENT *head)STUDENT *p;/*

24、 移動指針 */ system(cls); TOC o 1-5 h z p=head; /* 初值為頭指針*/printf(n*STUDENT*n);printf(n);printf(| 學號 | 姓名 | 語文 | 數學 | 英語 | 總分 | 平 均成績 | 名次 |n);printf(n);while(p!=NULL)printf(|%4s | %-4s | %3d | %3d | %3d | %3d| %4.2f | %-5d|n,p-num,p-name,p-score0,p-score1,p-score2,p-sum,p-average,p數據結構課程設計(學生成績管理系統) /

25、26數據結構課程設計(學生成績管理系統) / 26-order);p=p-next;n);printf( printf(*END*n);/* 查找記錄函數*/void search(STUDENT *head)STUDENT *p;/*移動指針 */char s5;/* 存放姓名用的字符數組 */system(cls);printf( 請輸入查找者姓名 .n);scanf(%s,s);p=head; /* 將頭指針賦給p*/while(strcmp(p-name,s) & p != NULL) /* 當記錄的姓名不是要找的,或指針不為空時*/p=p-next; /* 移動指針,指向下一結點 *

26、/if(p!=NULL) /*如果指針不為空*/printf(n*FOUND*n);printf(n);printf(| 學號 | 姓名 | 語文 | 數學 | 英語 | 總分 | 平均成績 | 名次 |n);printf(n);printf(| %4s |%4s |%3d |%3d|%3d|%3d | %4.2f | %-5d|n,p-num,p-name,p-score0,p-score1,p-score2,p-sum,p-average,p-or der);n);printf(printf(*END*n);else顯示沒有該學生*/ TOC o 1-5 h z printf(n 無此記錄

27、 .n,s);/*/* 刪除記錄函數*/STUDENT *Delete(STUDENT *head)STUDENT *p1,*p2; /*p1 為查找到要刪除的結點指針, p2 為其前驅指針 */char c,s6;/*s6 用來存放學號,c 用來輸入字母*/ system(cls);printf( 請輸入要刪除的學生的學號: );scanf(%s,s);p1=p2=head; /* 給 p1 和 p2 賦初值頭指針 */while(strcmp(p1-num,s) & p1 != NULL) /* 當記錄的學號不是要找的,或指針不為空時*/p2=p1;/* 將pl指針值賦給p2作為pl的前驅

28、指針*/p1=p1-next; /* 將 p1 指針指向下一條記錄*/ if(strcmp(p1-num,s)=0) /* 學號找到了 */printf(*FOUND*n);prin);printf(| 學號 | 姓名 | 語文 | 數學 | 英語 | 總分 |平均成績 | 名次 |n);printf(n);printf(| %4s | %4s | %3d | %3d | %3d | %3d| %4.2f | %-5d|n,p1-num,p1-name,p1-score0,p1-score1,p1-score2,p1-sum,p1-averag e,p1-order);printf(n);pr

29、intf(*END*n);printf( 您確定要刪除該學生的記錄嗎 Y/N ?); /* 提示是否要刪除, 輸入 Y刪除 ,N 則退出 */for(;) scanf(%c,&c);如果不刪除, 則跳出本循環*/若p1=head,說明被刪結點是首結點*/把第二個結點地址賦予 head*/if(c=n|c=N) break; /*if(c=y|c=Y)if(p1=head) /*head=p1-next; /*elsep2-next=p1-next;free(p1);/* 否則將一下結點地址賦給前一結點地址*/printf(n 學號為 %s 的學生記錄已被刪除.n,s);printf( 別忘了重

30、新存儲記錄 .n);break; /* 刪除后就跳出循環*/elseprintf(n 找不到學號為 %s 的學生記錄.n,s); /* 找不到該結點 */return(head);數據結構課程設計(學生成績管理系統) / 26數據結構課程設計(學生成績管理系統) / 26/* 修改函數 */STUDENT *xiugai(STUDENT *head)STUDENT *q;/*移動指針 */char s5;/* 存放姓名用的字符數組 */system(cls);printf( 請輸入查找者姓名 .n);scanf(%s,s);q=head; /* 將頭指針賦給p*/while(strcmp(q-

31、name,s) & q != NULL) /* 當記錄的姓名不是要找的,或指針不為空時*/q=q-next; /* 移動指針,指向下一結點 */if(q!=NULL) /*如果指針不為空*/printf(n*FOUND*n);int sum1,i;printf(n 請在下面輸入要修改成的學生的記錄 .n);/*提示輸入記錄信息 */printf(學號 :);scanf(%s,q-num);printf(姓名:);scanf(%s,q-name);printf( 分別輸入 %d 科的分數 .n,3);sum1=0;/* 保存新記錄的總分,初值為 0*/for(i=0;iscorei);if(q-

32、scorei100|q-scoreiscorei100|q-scoreiscorei; /* 累加各門成績*/q-sum=sum1;q-average=(float)sum1/3;q-order=0;printf(n);printf(| 學號 | 姓名 | 語文 | 數學 | 英語 | 總分 | 平均成績 | 名次 |n);printf(n);printf(| %4s |%4s |%3d |%3d|%3d|%3d| %4.2f | %-5d|n, q-num,q-name,q-score0,q-score1,q-score2,q-sum,q-average,q-or der);printf(n

33、);printf(I*END*n);head=sort(head);/* 調用排序的函數, 將學生成績重新排序 */printf(n 學生 %s 已經修改成功 .n,q-name);printf( 請別忘了重新存儲 .n);elseprintf(n 無此記錄 .n,s);/* 顯示沒有該學生*/return(head);數據結構課程設計(學生成績管理系統) / 26數據結構課程設計(學生成績管理系統) / 26八、程序調試過程分析(1)剛開始沒有那個初始化函數,程序運行后,沒有輸入任何數據就試得去執行 顯示功能,結果顯示的是一些亂碼!加入初始化函數后,這種現象也隨之消失。(2)剛開始執行輸入函

34、數,按學號順序輸入十個學生的成績 ,輸完后執行顯示功 能,學生成績記錄是按學號的反順序顯示的,試著在其中增加一些語句,希望能把學 號按正常順序顯示,但暫時沒有成功,所以在輸入成績時只能按學號反順序輸入,最 后就按學號正常順序輸出了。(3)剛開始時,先把成績按平均分排序,再插入一個學生的成績,執行顯示功能, 雖然插入的學生的成績能正常插入,但該學生的名次為0o后來,在插入成績之后,調用排序函數,把所有成績重新排序一次。(4)在輸入函數中設了一個無限循環,可以輸入無數個學生的成績信息,當學號 為0的時候則停止輸入。(5)輸入太多個學生的成績時,屏幕顯示不能控制為一頁一頁顯示, 所以為了方 便起見,

35、不要輸入太多記錄,十七左右為最佳。(6)在沒有輸入任何信息的情況下,去執行排序功能,最后顯示有一個記錄,學 號、姓名為空白,成績都為0,名次為1。(7)在輸入選項時不能輸入字母,否則會死循環,建議不要亂輸字母。(8)在編寫修改函數時,發現平均成績和總成績沒有變化,原因為循環語句之后 沒有進行數據的重新賦值,以至于新的數據沒能插進鏈表。九、測試數據下面對所設計系統進行數據測試:1、在主菜單選擇1、輸入學生記錄,分別輸入三組學生記錄為:學號姓名語文成績數學成績英語成績1Xai4556662Cui5644563yu4566772、在主菜單選擇6、插入一個新的學生記錄,插入數據為: 學號4姓名Gu語文

36、成績45數學成績44英語成績333、在主菜單選擇9、修改記錄,修改的數據為:學號5姓名ze語文成績45數學成績33英語成績554、在主菜單選擇2、輸出學生記錄,得到一組如下的輸出:學號姓名語文成績數學成績英語成績總分平均成績名次3yu45667718862.6712Cui56445615652.0025Ze45335513344.3334Gu45443312240.6745、在主菜單選擇4、刪除學生記錄,刪除的數據為:學號 2姓名cui6、在主菜單選擇5、將學生成績進行排序,然后在選擇 2、進行一次輸出,得到最后記錄:學號姓名語文成績數學成績英語成績總分平均成績名次3yu45667718862.6715Ze45335513344.3334Gu45443312240.6747、在主菜單分別選擇7、保存記錄和8、讀取記錄,進行一次文件的讀寫測試十、測試結果及分析測試結果如下:(1)進入主菜單,界面如下:G八敷據結構隨諛計t普建文件夾Debngn.一二日回I - a= 1 a *,- -=_ -J m-i mJ - -Jj - -j mj mJ _- -m-i

溫馨提示

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

最新文檔

評論

0/150

提交評論