耿愛華 魏幼平 李春奇 陳薪
摘要:隨著學(xué)生規(guī)模和信息量的日益擴(kuò)大,就需要開發(fā)一個(gè)實(shí)用的成績分析系統(tǒng)來提高老師們的工作效率。本著這樣的需求設(shè)計(jì)開發(fā)出一款基于MATLAB GUI成績分析系統(tǒng),通過讀取一份成績單文件便可以對學(xué)生成績做一個(gè)數(shù)據(jù)處理和細(xì)致分析。該數(shù)據(jù)分析界面友好、操作方便、交互性強(qiáng)、維護(hù)簡易,實(shí)現(xiàn)了數(shù)據(jù)的可視化操作,并極大提高了教學(xué)辦公的效率和效果。
關(guān)鍵詞:MATLAB;GUI設(shè)計(jì);數(shù)據(jù)處理;成績分析
中圖分類號:TP311 ? ? ? ? ?文獻(xiàn)標(biāo)識碼: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]在對中職院校學(xué)生成績管理信息系統(tǒng)的研究技術(shù)主要涉及Java開發(fā)技術(shù)的SQL Server 2005數(shù)據(jù)庫開發(fā)技術(shù),研究所使用的分析方法是UML面向?qū)ο蠓治龇椒?。樸承哲[2]在成績管理系統(tǒng)設(shè)計(jì)提出了通過HTML5和SSH框架技術(shù),遵循MVC設(shè)計(jì)模式搭建平臺的解決方案。本文是通過MATLAB的GUI平臺開發(fā)的圖形用戶界面設(shè)計(jì)方案,界面設(shè)計(jì)簡單一致,應(yīng)用GUI生成的操作界面用戶不用向上述兩種方法去閱讀冗雜的代碼進(jìn)行操作,卻可較快地理解該平臺的功能和使用方法。
2 MATLAB及GUI簡介
MATLAB可稱為強(qiáng)大的數(shù)學(xué)軟件,它將矩陣運(yùn)算、數(shù)值分析、繪制函數(shù)、實(shí)現(xiàn)算法、創(chuàng)建用戶界面和仿真等許多強(qiáng)大功能都集成在一個(gè)視窗環(huán)境中。它擺脫了傳統(tǒng)非交互式程序設(shè)計(jì)語言的編輯方式,為眾多的科學(xué)領(lǐng)域提供了一種綜合而全面的處理方案,代表了科學(xué)計(jì)算軟件的先進(jìn)水平[3-4]。
MATLAB GUI為圖形用戶界面,是MATLAB用戶可視化交互式的工具。用戶可通過command窗口輸入guide命令創(chuàng)建GUI,GUI編輯界面主要包括對象選擇區(qū),GUI工具欄,GUI布局區(qū)和狀態(tài)欄四部分[5]。首先在對象選擇區(qū)選擇需要的組件并拖曳到布局區(qū)適當(dāng)?shù)奈恢蒙?,打開對象的屬性查看器或者直接雙擊對象,設(shè)置其相應(yīng)屬性。然后把設(shè)計(jì)好的GUI保存到FIG文件中,右鍵控件的View Callback選項(xiàng)可查看或修改該對象所有的Callback函數(shù),會自動(dòng)生成一個(gè)GUI所對應(yīng)的M文件參考框架,最后在框架內(nèi)編寫必要的程序即可。
3成績分析系統(tǒng)的設(shè)計(jì)
3.1系統(tǒng)設(shè)計(jì)
系統(tǒng)的設(shè)計(jì)框圖如圖1所示:
3.2登錄界面設(shè)計(jì)
為了增加系統(tǒng)的安全性和保密性,設(shè)計(jì)了一個(gè)賬號和密碼登錄界面,GUI登錄界面由背景圖片,退出圖片,文本框,編輯框和按鈕組成,登錄界面如圖2所示。
用戶名輸入的賬號和密碼的字符A和B用strcmp函數(shù)與程序里預(yù)置的字符串S1和S2比較,只要有一個(gè)不相同就會彈出輸入錯(cuò)誤的警告,直到輸入正確登陸成功才可以跳轉(zhuǎn)進(jìn)入主界面,主界面的文件名為Analysis _of the_ score,登錄按鈕的回調(diào)函數(shù)主要程序如下:
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
還應(yīng)再添加返回退出功能,為了美化界面可給退出按鈕設(shè)置背景圖片,新建一按鈕,在界面m文件中找到界面的OpeningFcn函數(shù),在此框架中讀入背景圖片,設(shè)置按鈕的CData屬性為此圖片。程序如下:
I = imread('quit.png');
set(handles.pushbutton2,'CData',I);
3.3主界面設(shè)計(jì)
這個(gè)主界面主要分為四個(gè)模塊,分別是數(shù)據(jù)輸入模塊、查詢模塊、統(tǒng)計(jì)模塊、繪圖模塊。
3.3.1數(shù)據(jù)輸入模塊
所有的數(shù)據(jù)分析均來自一份成績單,所以我們的第一步也是至關(guān)重要的一步就是將成績單快速準(zhǔn)確地導(dǎo)入到MATLAB中。
由uigetfile函數(shù)創(chuàng)建文件打開對話框,由對話框獲得用戶輸入的文件,返回相應(yīng)的文件名和路徑。
[filename,pathname]=uigetfile('*.xls','Excel File(*.xls)','選擇文件');
str=[pathname filename];
此平臺既可以讀取Excel格式文件,也可以讀取Txt文件,增加了程序的兼容性。其次無須進(jìn)行數(shù)據(jù)預(yù)處理,直接在本系統(tǒng)進(jìn)行統(tǒng)計(jì)即可,操作簡便,使用方便,如圖3所示。
以Excel格式為例,xlsread函數(shù)讀文件第一個(gè)工作頁中所有的數(shù)值到成績數(shù)組score中,所有字符串到單元數(shù)組文本中,再把文本分解為科目數(shù)組subject和姓名數(shù)組name,由于整個(gè)程序會多次運(yùn)用到姓名和成績數(shù)組變量,為后面成績的輸入輸出提供數(shù)據(jù)支撐,應(yīng)設(shè)為全局變量,程序如下:
[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
為了便于用戶觀察讀取文件數(shù)據(jù)處理的進(jìn)度,可加入進(jìn)度條,增加界面操作的友好度。
所以在讀取文件前后分別加入程序:
H =waitbar(0,'請稍等,正在讀取');
waitbar(1,H,'已完成');
用戶還可直接在列表框中瀏覽所有學(xué)生的具體成績,當(dāng)雙擊列表框中的某名字時(shí)就將其成績信息顯示于右邊的編輯框中,程序如下:
ifisequal(get(handles.figure1,'SelectionType'),'open')
value=get(hObject,'value')-1;
u=find(index==value);
v=(handles.count)+1-u;
…
end
3.3.2查詢模塊
在眾多的名單當(dāng)中查找某人的名字非常浪費(fèi)時(shí)間,據(jù)此這里提供了便捷快速的輸入搜索法,只要將其姓名輸入至搜索框中立即可查詢到其各科成績,總分以及總排名,并顯示于下方的編輯框中如圖4:
MATLAB通過對矩陣score行數(shù)M-1行和列數(shù)N-1列的循環(huán)索引實(shí)現(xiàn),再求和計(jì)算出所有學(xué)生的總成績并儲存到sum矩陣中,以便對學(xué)生的總成績的排名,程序如下:
for i =1:handles.(M-1)
for j=1: handles.(N-1)
sum(i)=handles.score(i,j)+sum(i-1);
end
end
使用sort函數(shù)對sum求和矩陣進(jìn)行升序排序,并返回排序后的矩陣sum_1和在原矩陣中的列位置的索引,即所得的sum_1矩陣為總分由低到高的排隊(duì),index矩陣為排好序?qū)?yīng)的編號,程序如下:
[sum_1,index]=sort(sum);
用戶在姓名搜索框內(nèi)輸入想查詢學(xué)生的姓名,使用strcmp函數(shù)系統(tǒng)會自動(dòng)比對所有姓名數(shù)組,相同則記為1,不同則記為0,并使用find函數(shù)找1的位置j并標(biāo)記,通過這個(gè)位置可方便地查詢該生相關(guān)的成績信息,并且查找該生由小到大的次序?yàn)閡,則該生的名次為M-u,用戶然后點(diǎn)確定鍵即可按行顯示出該生的各科目成績以及總成績和在班級里的排名情況程序如下:
tf= strcmp(A, handles.name);
j = find(tf);
u=find(index==(j-1));
v=(handles.M)-u;
如用戶輸入錯(cuò)誤則會提示重新輸入的錯(cuò)誤警告。程序如下:
if tf==0
errordlg('請重新輸入','input error');
return;
end
3.3.3統(tǒng)計(jì)模塊
統(tǒng)計(jì)模塊可以將學(xué)生不同學(xué)科的成績進(jìn)行匯總和統(tǒng)計(jì),該模塊分成三個(gè)部分,分別是平均成績、最高成績以及最低成績,統(tǒng)計(jì)結(jié)果如圖5。
教師可以通過平均成績評估本班級學(xué)習(xí)的平均水平,并根據(jù)實(shí)際情況矯正授課方式和授課難度;學(xué)生可以根據(jù)平均成績判斷其在班級的位置。最高成績和最低成績則可以幫助教師明確班內(nèi)學(xué)習(xí)成績較好和較差的學(xué)生和學(xué)習(xí)差異,方便提供特色的、針對的教學(xué)方案,并有差異性地對不同學(xué)生采取不同教學(xué)模式。當(dāng)然綜合統(tǒng)計(jì)還可以進(jìn)一步進(jìn)行及格率、優(yōu)秀率、合格率等的統(tǒng)計(jì)。
程序可通過兩層for循環(huán)的嵌套求得最值和累加和,程序如下:
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直方圖模塊
各分?jǐn)?shù)段人數(shù)直方圖,指的是對不同科目不同的成績段(60分以下、60-70分、70-80分、80-90分、90-100分)的學(xué)生人數(shù)進(jìn)行統(tǒng)計(jì),通過該統(tǒng)計(jì)圖不僅可以清晰地顯示出不同分?jǐn)?shù)段的學(xué)生人數(shù),另外還可以對比不同科目在相同成績段的人數(shù),如圖6所示,了解并且知悉本班級學(xué)生不同學(xué)科的學(xué)習(xí)差異,方便各科教師集中力量對本班級的學(xué)習(xí)情況進(jìn)行不斷改進(jìn)和完善。
使用if語句來判斷分?jǐn)?shù)區(qū)間并累加計(jì)數(shù),獲得每門課程的分?jǐn)?shù)段人數(shù),并用bar函數(shù)創(chuàng)建一個(gè)條形圖,能清晰地看到每門課程不同分?jǐn)?shù)段的人數(shù),并且也能比較出不同科目的差別,統(tǒng)計(jì)數(shù)據(jù)非常直觀實(shí)用,程序如下:
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('分?jǐn)?shù)段');
ylabel('人數(shù)');
title(['各分?jǐn)?shù)段人數(shù)']);
3.3.5餅狀圖模塊
在教學(xué)中需要獲悉每門科目不同分?jǐn)?shù)段的占比,要通過各個(gè)部分除以總數(shù)煩瑣地計(jì)算得到。我們能夠使用餅狀圖表工具,快速直觀地以圖形的形式表示各個(gè)組成部分所占比例。借用餅狀圖的直觀性,可以將該班級的學(xué)生平均學(xué)習(xí)情況進(jìn)行可視化處理,方便教師快速了解整個(gè)教學(xué)階段的學(xué)習(xí)情況,并且指定針對本班級的教學(xué)策略。
在MATLAB中直接調(diào)用pie(x)函數(shù)來繪制餅狀圖,餅狀圖中顯示一組數(shù)據(jù)中各項(xiàng)的大小與各項(xiàng)總和的比例,每項(xiàng)用不同顏色在圖表中表現(xiàn)出來。
調(diào)用pie函數(shù)時(shí)還可以指定參數(shù)explode來分離餅圖切塊,突出重視的一部分:
pie(x,explode),參數(shù)x是輸入數(shù)據(jù),explode是與數(shù)組x相同維數(shù)的變量,explode中非零元素所對應(yīng)的那部分繪圖時(shí)就會分離開來強(qiáng)調(diào)。
餅狀圖如圖7,以三維格式顯示每組數(shù)值更立體好看一些,即pie3(x)函數(shù)。
這個(gè)模塊的程序如下:
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,'的各分?jǐn)?shù)段占比');
title(T2);
3.3.6多重曲線模塊
無論是對于教師還是學(xué)生而言,了解并且熟悉歷次考試成績的變化動(dòng)態(tài),對于提高教師的教學(xué)能力和學(xué)生的學(xué)習(xí)能力有著重大意義。
對于教師而言,通過對學(xué)生的歷次成績進(jìn)行追蹤,有助于及時(shí)掌握不同學(xué)生的問題和發(fā)展趨勢,方便教師因材施教,對學(xué)生做出針對性的指導(dǎo)。對于學(xué)生而言,他們可以了解自己的成績波動(dòng)軌跡,分析每次考試的進(jìn)步和退步原因,方便進(jìn)行調(diào)整學(xué)習(xí)策略,針對有可能出現(xiàn)的偏科情況進(jìn)行及時(shí)的總結(jié)和糾正,不斷提高自身的學(xué)習(xí)水平。
MATLAB繪制多重曲線非常方便,例如:plot(x,y1,x,y2);其中x是自變量數(shù)組,y1,y2是函數(shù)數(shù)組。
另一種畫法是使用hold on命令,MATLA會把下面的plot命令繪制的曲線繪在原來的圖形上,使用hold off命令則可取消hold on命令。
MATLAB可以設(shè)置多種曲線的顏色和線型的組合加以區(qū)別不同的曲線,具體如下:
線型線方式: - 實(shí)線-. 虛點(diǎn)線:點(diǎn)線 ?- - 波折線
線型點(diǎn)方式: . 圓點(diǎn) ?+加號 ?*星號 ?x x形 ?o小圓
顏色:r紅;y黃;w白;g綠; b藍(lán); k黑; m紫;
系統(tǒng)繪制的歷次成績趨勢圖如圖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('考試次數(shù)');
ylabel ('分?jǐn)?shù)');
3.3.7整個(gè)系統(tǒng)GUI模塊
為了豐富界面,在界面左上角加入了一個(gè)時(shí)間顯示模塊,在MATLAB中調(diào)用系統(tǒng)日期和時(shí)間即可,程序如下:
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);
最后運(yùn)行此系統(tǒng)的所有M文件,可顯示如圖9所示的整體效果。綜合統(tǒng)計(jì)了各門課程的測試結(jié)果,功能實(shí)用,結(jié)果清晰明了。既可以查詢個(gè)人的成績情況也可掌握所在班級整體的成績分布。界面友好簡潔,操作簡單方便,只要用鼠標(biāo)點(diǎn)擊GUI按鈕即可動(dòng)作產(chǎn)生相應(yīng)效果,是理想的成績分析平臺。
4結(jié)語
本文基于MATLAB GUI設(shè)計(jì)的成績分析系統(tǒng)非常實(shí)用,通過利用MATLAB軟件,從界面中可以很清楚地看到數(shù)據(jù)產(chǎn)生的文本和圖形顯示的詳細(xì)結(jié)果,這個(gè)系統(tǒng)不僅避免了老師和家長僅從一份單調(diào)的成績單的枯燥研究計(jì)算來得出結(jié)論,而且每位學(xué)生他們也可以看到自己在班級里的準(zhǔn)確定位,以便有效提升學(xué)習(xí)成績。由于數(shù)據(jù)本身的信息量有限,該成績分析系統(tǒng)還有待進(jìn)一步完善和提高。但是本文分析成績數(shù)據(jù)的設(shè)計(jì)思想和程序提高了數(shù)據(jù)資源的利用率,并對我們分析更大的數(shù)據(jù)提供重要的借鑒作用。
參考文獻(xiàn):
[1] 吳浩宏.中職院校學(xué)生成績管理系統(tǒng)的分析與設(shè)計(jì)[D].南昌:江西財(cái)經(jīng)大學(xué),2016.
[2] 樸承哲.基于HTML5和SSH的課堂成績管理系統(tǒng)設(shè)計(jì)[J].遼寧師專學(xué)報(bào)(自然科學(xué)版),2019,21(3):39-42.
[3] 董辰輝,胡曉冬. MATLAB經(jīng)典教程—從入門到精通[M].2版.北京:人民郵電出版社,2018.
[4] 王正林,劉明.精通MATLAB 7[M].北京:電子工業(yè)出版社,2006.
[5] 羅華飛. MATLAB GUI 設(shè)計(jì)學(xué)習(xí)筆記[M].3版.北京:北京航空航天大學(xué)出版社,2014.8.
[6] 尚濤.MATLAB基礎(chǔ)及其應(yīng)用教程[M].北京:電子工業(yè)出版社,2014.
【通聯(lián)編輯:唐一東】