耿爱华 魏幼平 李春奇 陈薪
摘要:随着学生规模和信息量的日益扩大,就需要开发一个实用的成绩分析系统来提高老师们的工作效率。本着这样的需求设计开发出一款基于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.
【通联编辑:唐一东】