1.程式要求
2.算法分析
3.流 程 圖
4.源 程 序
5.調試結果
6.實習體會
2 程式要求
學生成績管理是高等學校教務管理的重要組成部分,其內容較多,為了簡化計論,要求設計的管理系統能夠完成以下六種功能:
(1)學生註冊登記;
(2)登記學生成績;
(3)修改學生成績;
(4)列印一個班級學生的單科成績;
(5)求出每個學生一學期中各科的平均成績;
(6)列印某一課程成績處於指定分數段內的學生名單。
3 算法分析
1. 學生成績管理軟體的數據結構
學生成績一般都是以班級為單位進行管理的,一個班級用一個結點來表示。考慮到插入和刪除的方便,這些以班級為單位的結點用鍊表方式組成一個主目錄。每個結點有四個域:
(1)班級代號;
(2)課程情況;
(3)學生情況;
(4)班級順序鏈。
課程情況應能反映出大專生所學過的全部課程。因課程是逐年增多的,所以採用鍊表結構以便能不斷插入新的課程。該班學過的課程構成一個課程鍊表,所以班級結點中的課程情況用課程鍊表表示。學生情況主要反映學生的學號,姓名,每學期學生的成績情況。因為學號總是順序排列的,所以選用一個結構體數組作為反映學生情況的登入記表。該 數組的下標值接上班級結點中的班級號就是學號。例如,設每班學生數不超過40個人,班級號為9612,某學生在登記表中相應分量的下標值為26,則該學生的學號為961226。另外
,學生成績管理要分6個學期,所以在學生登記表中,開設6個指針域,每個指針指向該生某學期某門課程學成績的結點。
各結點結構如下所示:
(1)主目錄中班級的結點為:
班級號 課程鏈 班級順序鏈 學生登記表
(2)程鍊表中的結點:
課程代號 學期號 二叉樹鏈 課程順序鏈
(3)分數鍊表中的結點為:
左鏈 學號 課程代號 成績分數順序 右鏈
為了便於登記和查詢學生的成績,選擇二叉排序來存放學生的成績。
每個班級的每門課程對應一棵二叉樹。通過主目錄中班級結點的課程鏈找到指定的課程結點,再通過課程結點中的二叉樹指針指向該門課程的成績二叉排序樹。另外通過主目錄中班級結點的學生登記表中的學期指針,指向該學生本學期某門課程的分數結點,並以分數結點的分安數順序鏈勾鏈該生各門課程的成績。
在登記成績和查詢分數時,都要用到課程代號。課程 代和課程名稱是一一對應的。為了簡化程式,課程名稱和代號對照表設計為一個向量,向量的下標值就作為課程代號,而向量中的元素就是課程名稱,這樣可以省去代號域。
1.各函式的功能和實現
學生成績管理的相關功能由對應的函式來實現。
(1)學生註冊登記
學生入學後,首先應是註冊登記。註冊時應先檢查該學生所在班級是否已經登入主目錄,未登入則若調用新結點後登入入主目錄。然後將新調入的班級結點中對應域賦初值,最後再讀入學生的學號和姓名並一一填入學生登記表。這樣就完成了一個班級的註冊和登記工作。
(2)登記學生成績
學生註冊後才可以登記成績,所以先要檢查這個班級是否已經註冊,班級中是否有這個學生。在確認有此學生後,登記該生成績。這時需完成兩個操作。一個查詢課程代號,另一個是將成績填入二叉樹。這兩個操作分別用兩個函式來實現:
① 查詢課程代號;
② 插入二叉排序樹。
有了這兩個函式,登記學生成績的工作可以很方便地完成。首先查處課程代號,調用課程結點,填入課程代號和學期號;再在二叉樹鏈域中置初值為NULL,將課程結點插入為課程鍊表的頭結點。接著讀入每個學生的學號和成績,每個學生的每門課程都生成一分數結點插入到相應課程的二叉樹中。同時,還要將該分數結點鏈入該生這學期各科成績的分數鍊表中。學生登記表中的學期指針域中存放該分數鍊表的頭結點地址。
(3)修改學生成績
若登記的學生成績有錯誤,則調用修改學生成績的函式便可以加以修改。修改時從主目錄出發,查到班級,再從學生登記表中查對學號和姓名,再在與學期匹配的學期指針域中取得該生的學生鍊表的頭指針,然後搜尋分數鍊表,查到指定課程的分數結點,就可修改成績。
(4)列印一個班級學生的單科成績
由於學生成績是用二叉樹排序樹來存儲的,所以採用中序遍歷的方法就可以按次序列印出學姓名和成績。在列印了程式中,從主目錄開始查到班級號,就可以從課程結點的二叉樹鏈域中取得成績二叉排序樹的頭指針;然後調用中序遍歷了程式就可進行列印,同時可求出平均成績和各個分數段的人數。
(1) 求出每個學生一學期中各科的平均成績
此了程式從主目錄查對班級號開始,通過學生登記表中每個學生的學期指針取得各自的分數鍊表的頭指針。順著分數鏈就可求出該生本學期各科的平均成績。
(2)列印某一課程成績處於指定分數段內的學生名單
對二叉樹序樹進行中序扁歷,但扁歷時應判斷當前成績是否處於分數段內而決定是否列印。4 流 程 圖
5 程式原始碼
include<STDIO.H>
#include<CONIO.H>
#include<STDLIB.H>
#include<BIOS.H>
#include<IO.H>
#define CR 13
#define ESC 27
#define UP 72
#define DOWN 80
#include<string.h>
#include<stdio.h>
#define CRNUM 200
#define STNUM 40