耿愛華 魏幼平 李春奇 陳薪



摘要:隨著學生規模和信息量的日益擴大,就需要開發一個實用的成績分析系統來提高老師們的工作效率。本著這樣的需求設計開發出一款基于MATLAB GUI成績分析系統,通過讀取一份成績單文件便可以對學生成績做一個數據處理和細致分析。該數據分析界面友好、操作方便、交互性強、維護簡易,實現了數據的可視化操作,并極大提高了教學辦公的效率和效果。
關鍵詞:MATLAB;GUI設計;數據處理;成績分析
中圖分類號:TP311 ? ? ? ? ?文獻標識碼:A
文章編號:1009-3044(2020)25-0031-05
Abstract: With the increasing of student size and information, it is necessary to develop a practical achievement analysis system to improve the work efficiency of teachers. In line with such requirements to design and develop a performance analysis system based on MATLAB GUI, just by reading a transcript file can do a detailed analysis of student performance. The data analysis interface is friendly, easy to operate, interactive, easy to maintain, the realization of data visualization operation, greatly improve the efficiency and effect of teaching office.
Key words: MATLAB; GUI design; data processing; performance analysis
1引言
吳浩宏[1]在對中職院校學生成績管理信息系統的研究技術主要涉及Java開發技術的SQL Server 2005數據庫開發技術,研究所使用的分析方法是UML面向對象分析方法。樸承哲[2]在成績管理系統設計提出了通過HTML5和SSH框架技術,遵循MVC設計模式搭建平臺的解決方案。本文是通過MATLAB的GUI平臺開發的圖形用戶界面設計方案,界面設計簡單一致,應用GUI生成的操作界面用戶不用向上述兩種方法去閱讀冗雜的代碼進行操作,卻可較快地理解該平臺的功能和使用方法。
2 MATLAB及GUI簡介
MATLAB可稱為強大的數學軟件,它將矩陣運算、數值分析、繪制函數、實現算法、創建用戶界面和仿真等許多強大功能都集成在一個視窗環境中。它擺脫了傳統非交互式程序設計語言的編輯方式,為眾多的科學領域提供了一種綜合而全面的處理方案,代表了科學計算軟件的先進水平[3-4]。
MATLAB GUI為圖形用戶界面,是MATLAB用戶可視化交互式的工具。用戶可通過command窗口輸入guide命令創建GUI,GUI編輯界面主要包括對象選擇區,GUI工具欄,GUI布局區和狀態欄四部分[5]。首先在對象選擇區選擇需要的組件并拖曳到布局區適當的位置上,打開對象的屬性查看器或者直接雙擊對象,設置其相應屬性。然后把設計好的GUI保存到FIG文件中,右鍵控件的View Callback選項可查看或修改該對象所有的Callback函數,會自動生成一個GUI所對應的M文件參考框架,最后在框架內編寫必要的程序即可。
3成績分析系統的設計
3.1系統設計
系統的設計框圖如圖1所示:
3.2登錄界面設計
為了增加系統的安全性和保密性,設計了一個賬號和密碼登錄界面,GUI登錄界面由背景圖片,退出圖片,文本框,編輯框和按鈕組成,登錄界面如圖2所示。
用戶名輸入的賬號和密碼的字符A和B用strcmp函數與程序里預置的字符串S1和S2比較,只要有一個不相同就會彈出輸入錯誤的警告,直到輸入正確登陸成功才可以跳轉進入主界面,主界面的文件名為Analysis _of the_ score,登錄按鈕的回調函數主要程序如下:
X1 = strcmp(A,S1);
X2 = strcmp(B,S2);
if (X1==1)&&(X2==1)
h=gcf;
Analysis _of the_ score;
close(h)
else
errordlg('請重新輸入','input error');
return;
end
還應再添加返回退出功能,為了美化界面可給退出按鈕設置背景圖片,新建一按鈕,在界面m文件中找到界面的OpeningFcn函數,在此框架中讀入背景圖片,設置按鈕的CData屬性為此圖片。程序如下:
I = imread('quit.png');
set(handles.pushbutton2,'CData',I);
3.3主界面設計
這個主界面主要分為四個模塊,分別是數據輸入模塊、查詢模塊、統計模塊、繪圖模塊。
3.3.1數據輸入模塊
所有的數據分析均來自一份成績單,所以我們的第一步也是至關重要的一步就是將成績單快速準確地導入到MATLAB中。
由uigetfile函數創建文件打開對話框,由對話框獲得用戶輸入的文件,返回相應的文件名和路徑。
[filename,pathname]=uigetfile('*.xls','Excel File(*.xls)','選擇文件');
str=[pathname filename];
此平臺既可以讀取Excel格式文件,也可以讀取Txt文件,增加了程序的兼容性。其次無須進行數據預處理,直接在本系統進行統計即可,操作簡便,使用方便,如圖3所示。
以Excel格式為例,xlsread函數讀文件第一個工作頁中所有的數值到成績數組score中,所有字符串到單元數組文本中,再把文本分解為科目數組subject和姓名數組name,由于整個程序會多次運用到姓名和成績數組變量,為后面成績的輸入輸出提供數據支撐,應設為全局變量,程序如下:
[scoretxt]=xlsread(str);
[M,N]=size(txt);
for i =2:N
subject(i) = txt(1,i);
end
for i =1:M
name(i)=txt(i,1);
end
為了便于用戶觀察讀取文件數據處理的進度,可加入進度條,增加界面操作的友好度。
所以在讀取文件前后分別加入程序:
H =waitbar(0,'請稍等,正在讀取');
waitbar(1,H,'已完成');
用戶還可直接在列表框中瀏覽所有學生的具體成績,當雙擊列表框中的某名字時就將其成績信息顯示于右邊的編輯框中,程序如下:
ifisequal(get(handles.figure1,'SelectionType'),'open')
value=get(hObject,'value')-1;
u=find(index==value);
v=(handles.count)+1-u;
…
end
3.3.2查詢模塊
在眾多的名單當中查找某人的名字非常浪費時間,據此這里提供了便捷快速的輸入搜索法,只要將其姓名輸入至搜索框中立即可查詢到其各科成績,總分以及總排名,并顯示于下方的編輯框中如圖4:
MATLAB通過對矩陣score行數M-1行和列數N-1列的循環索引實現,再求和計算出所有學生的總成績并儲存到sum矩陣中,以便對學生的總成績的排名,程序如下:
for i =1:handles.(M-1)
for j=1: handles.(N-1)
sum(i)=handles.score(i,j)+sum(i-1);
end
end
使用sort函數對sum求和矩陣進行升序排序,并返回排序后的矩陣sum_1和在原矩陣中的列位置的索引,即所得的sum_1矩陣為總分由低到高的排隊,index矩陣為排好序對應的編號,程序如下:
[sum_1,index]=sort(sum);
用戶在姓名搜索框內輸入想查詢學生的姓名,使用strcmp函數系統會自動比對所有姓名數組,相同則記為1,不同則記為0,并使用find函數找1的位置j并標記,通過這個位置可方便地查詢該生相關的成績信息,并且查找該生由小到大的次序為u,則該生的名次為M-u,用戶然后點確定鍵即可按行顯示出該生的各科目成績以及總成績和在班級里的排名情況程序如下:
tf= strcmp(A, handles.name);
j = find(tf);
u=find(index==(j-1));
v=(handles.M)-u;
如用戶輸入錯誤則會提示重新輸入的錯誤警告。程序如下:
if tf==0
errordlg('請重新輸入','input error');
return;
end
3.3.3統計模塊
統計模塊可以將學生不同學科的成績進行匯總和統計,該模塊分成三個部分,分別是平均成績、最高成績以及最低成績,統計結果如圖5。
教師可以通過平均成績評估本班級學習的平均水平,并根據實際情況矯正授課方式和授課難度;學生可以根據平均成績判斷其在班級的位置。最高成績和最低成績則可以幫助教師明確班內學習成績較好和較差的學生和學習差異,方便提供特色的、針對的教學方案,并有差異性地對不同學生采取不同教學模式。當然綜合統計還可以進一步進行及格率、優秀率、合格率等的統計。
程序可通過兩層for循環的嵌套求得最值和累加和,程序如下:
for j = 1 : handles. (N-1)
Cax(j) =handles. score (1,j);
for i =1:handles.(M-1)
if handles. score (i,j)>=Cax (j)
Cax(j)=handles. score (i,j);
Ca(j)=i;
end
end
Cin(j) = handles. score (1,j);
for i = 1:handles. (M-1)
if handles. score (i,j)<= Cin(j)
Cin(j) = handles. score (i,j);
Ci (j)= i;
end
end
Csum(j) = 0;
for i = 1:handles. (M-1)
Csum(j) = Csum(j) + handles. score (i,j);
end
Caverage(j) = Csum(j) / handles. (M-1);
end
3.3.4直方圖模塊
各分數段人數直方圖,指的是對不同科目不同的成績段(60分以下、60-70分、70-80分、80-90分、90-100分)的學生人數進行統計,通過該統計圖不僅可以清晰地顯示出不同分數段的學生人數,另外還可以對比不同科目在相同成績段的人數,如圖6所示,了解并且知悉本班級學生不同學科的學習差異,方便各科教師集中力量對本班級的學習情況進行不斷改進和完善。
使用if語句來判斷分數區間并累加計數,獲得每門課程的分數段人數,并用bar函數創建一個條形圖,能清晰地看到每門課程不同分數段的人數,并且也能比較出不同科目的差別,統計數據非常直觀實用,程序如下:
value=[c1 d1 e1;c2 d2 e2; c3 d3 e3; c4 d4 e4; c5 d5 e5];
bar(value);
set(gca,'XTicklabel',{'>=90','>=80','>=70','>=60','<60'});
xlabel('分數段');
ylabel('人數');
title(['各分數段人數']);
3.3.5餅狀圖模塊
在教學中需要獲悉每門科目不同分數段的占比,要通過各個部分除以總數煩瑣地計算得到。我們能夠使用餅狀圖表工具,快速直觀地以圖形的形式表示各個組成部分所占比例。借用餅狀圖的直觀性,可以將該班級的學生平均學習情況進行可視化處理,方便教師快速了解整個教學階段的學習情況,并且指定針對本班級的教學策略。
在MATLAB中直接調用pie(x)函數來繪制餅狀圖,餅狀圖中顯示一組數據中各項的大小與各項總和的比例,每項用不同顏色在圖表中表現出來。
調用pie函數時還可以指定參數explode來分離餅圖切塊,突出重視的一部分:
pie(x,explode),參數x是輸入數據,explode是與數組x相同維數的變量,explode中非零元素所對應的那部分繪圖時就會分離開來強調。
餅狀圖如圖7,以三維格式顯示每組數值更立體好看一些,即pie3(x)函數。
這個模塊的程序如下:
x = [c1 c2 c3 c4 c5];
explode=[1 0 0 0 0];
P=x/sum(x);
B=num2str(P*100,'%1.1f');
B=[repmat(blanks(2),length(x),1),B,repmat('%',length(x),1)];
B=cellstr(B);
T1={'90~100','80~90','70~80','60~70','0~60'};
Label=strcat(T,B);
pie3(x,explode,Label);
T2= strcat(handles.str2,'的各分數段占比');
title(T2);
3.3.6多重曲線模塊
無論是對于教師還是學生而言,了解并且熟悉歷次考試成績的變化動態,對于提高教師的教學能力和學生的學習能力有著重大意義。
對于教師而言,通過對學生的歷次成績進行追蹤,有助于及時掌握不同學生的問題和發展趨勢,方便教師因材施教,對學生做出針對性的指導。對于學生而言,他們可以了解自己的成績波動軌跡,分析每次考試的進步和退步原因,方便進行調整學習策略,針對有可能出現的偏科情況進行及時的總結和糾正,不斷提高自身的學習水平。
MATLAB繪制多重曲線非常方便,例如:plot(x,y1,x,y2);其中x是自變量數組,y1,y2是函數數組。
另一種畫法是使用hold on命令,MATLA會把下面的plot命令繪制的曲線繪在原來的圖形上,使用hold off命令則可取消hold on命令。
MATLAB可以設置多種曲線的顏色和線型的組合加以區別不同的曲線,具體如下:
線型線方式: - 實線-. 虛點線:點線 ?- - 波折線
線型點方式: . 圓點 ?+加號 ?*星號 ?x x形 ?o小圓
顏色:r紅;y黃;w白;g綠; b藍; k黑; m紫;
系統繪制的歷次成績趨勢圖如圖8所示,程序如下:
[score_1 name_1]=xlsread(str);
x = 1:1:6;
y1 = score_1 (:,1);
y2 = score_1 (:,2);
y3 = score_1 (:,3);
axes (handles.axes3);
plot (x,y1,':.m',x,y2,'-*b',x,y3, '-g');
grid on
legend (name_1 (1,2), name_1 (1,3), name_1 (1,4));
sti = name_1(2,1);
sti = strcat(sti,'歷次成績趨勢圖');
title (sti);
xlabel('考試次數');
ylabel ('分數');
3.3.7整個系統GUI模塊
為了豐富界面,在界面左上角加入了一個時間顯示模塊,在MATLAB中調用系統日期和時間即可,程序如下:
cur_data = date;
cur_time = fix(clock);
str = sprintf('%s %.2d:%.2d:%.2d\n', cur_data, cur_time(4), cur_time(5), cur_time(6));
disp(str);
最后運行此系統的所有M文件,可顯示如圖9所示的整體效果。綜合統計了各門課程的測試結果,功能實用,結果清晰明了。既可以查詢個人的成績情況也可掌握所在班級整體的成績分布。界面友好簡潔,操作簡單方便,只要用鼠標點擊GUI按鈕即可動作產生相應效果,是理想的成績分析平臺。
4結語
本文基于MATLAB GUI設計的成績分析系統非常實用,通過利用MATLAB軟件,從界面中可以很清楚地看到數據產生的文本和圖形顯示的詳細結果,這個系統不僅避免了老師和家長僅從一份單調的成績單的枯燥研究計算來得出結論,而且每位學生他們也可以看到自己在班級里的準確定位,以便有效提升學習成績。由于數據本身的信息量有限,該成績分析系統還有待進一步完善和提高。但是本文分析成績數據的設計思想和程序提高了數據資源的利用率,并對我們分析更大的數據提供重要的借鑒作用。
參考文獻:
[1] 吳浩宏.中職院校學生成績管理系統的分析與設計[D].南昌:江西財經大學,2016.
[2] 樸承哲.基于HTML5和SSH的課堂成績管理系統設計[J].遼寧師專學報(自然科學版),2019,21(3):39-42.
[3] 董辰輝,胡曉冬. MATLAB經典教程—從入門到精通[M].2版.北京:人民郵電出版社,2018.
[4] 王正林,劉明.精通MATLAB 7[M].北京:電子工業出版社,2006.
[5] 羅華飛. MATLAB GUI 設計學習筆記[M].3版.北京:北京航空航天大學出版社,2014.8.
[6] 尚濤.MATLAB基礎及其應用教程[M].北京:電子工業出版社,2014.
【通聯編輯:唐一東】