Matlab课程设计报告.docx
《Matlab课程设计报告.docx》由会员分享,可在线阅读,更多相关《Matlab课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
Matlab课程设计报告
至诚学院
《MATLAB实践》
课程设计
学生姓名:
学号:
专业班级:
(2)
指导教师:
二○一四年四月三十日
1.设计目的…………………………………………………第3页
2.题目分析…………………………………………………第3页
3.总体设计…………………………………………………第3页
4.具体设计…………………………………………………第4页
5.小结和心得………………………………………………第15页
1、设计目的:
使用MATLAB的GUI程序设计学生成绩管理系统。
完成需学生成绩的基本管理,包含对学生成绩的读入、修改、添加和查询等基本的功能。
本课题主要解决对学生成绩总体的客观评价,通过一系列数据的分析比较,例如平均值,成绩分布等整体数据的处理,以及matlab和excel在数据联动功能方面的应用,所绘制的直方图、正态分布图等图像信息使得分析成绩系统更直观、有效地反映学生此课程这一阶段的表现,进而研究今后的教学重点,以及从教学到考试等一连串过程中的薄弱环节,从而达到教学相长的目的。
不论是对学生的整体学习情况还是单独考虑每个学生的学习情况都能够进行较好的评价。
面比起单纯的"绝对分数"评价学生的学习状况,忽略了基础条件的差异,我们运用了各种方法和模型来去避免这类现象的发生,动态的分析每个学生的情况,并从定性和定量两方面分别给出了数值与建议。
2、题目分析
根据课题的要求,分析成绩管理系统的现实需求,我们可以概括为设计的程序应该包含的几个基本模块及应该完成的功能如下:
1.文件管理:
完成成绩表格的导入(.xls文件),完成对修改后的成绩文件的保存。
2.成绩管理:
完成对学生成绩、学号、成绩、总分的显示和修改,还有添加新的学生的信息。
3.查询管理:
完成对姓名或者学号的查询的显示和删除,学生的信息显示在成绩管理里面的显示框里面。
4.在学生的姓名显示框点击学生姓名,成绩管理系统里面自动获取学生的基本信息。
5.统计出学生的最高分和最低分以及各科成绩的平均分情况。
6.通过各科成绩的统计分布直方图,直观地分析学生的各科的成绩状况。
3、总体设计
围绕设计的题目范围,我们可以将起绘制成功能模块的总体模块图如下图1。
根据设计的模块设计成GUI的设计图如下图2。
通过将导入的学生信息的数据保存到全局变量的数组里面,到每个模块需要使用时,导出数据即可完成对数据的引用,在需要完成操作的按钮下编写回调函数来达到需要完成的功能。
设计内容包含对回调函数的编写和对于程序功能的调试,分析问题原因,在实现程序功能时,进一步改善程序的设计构架。
图1
图2
4、具体设计
利用MATLAB的GUI程序设计实现成绩管理系统的功能。
各个模块功能的实现及程序设计如下:
4.1.模块设计界面及程序设计
4.1.1显示模块模块:
显示模块需要完成的是对于学生姓名、序号以及成绩的显示,并且在点击姓名显示框里面的学生姓名时,成绩管理的模块里面可以自动显示学生的以上基本信息。
设计界面如下:
对于姓名显示框的程序设计如下:
%---Executesonselectionchangeinxmlist.
functionxmlist_Callback(hObject,eventdata,handles)
%hObjecthandletoxmlist(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
content=get(hObject,'value');
set(handles.chengjilist,'value',content);
set(handles.xhlist,'value',content);
chengji=handles.chengji;
xingming=handles.xingming;
xuehao=handles.xuehao;
set(handles.lredit1,'string',xingming(content));
set(handles.lredit2,'string',chengji(content,1));
set(handles.lredit3,'string',chengji(content,2));
set(handles.lredit4,'string',xuehao(content,1));
set(handles.xmedit,'string',xingming(content));
set(handles.xuehaoedit,'string',xuehao(content));
set(handles.lredit13,'string',xingming(content))
set(handles.zfedit,'string',(chengji(content,1)+chengji(content,2)));
首先设置姓名显示的高亮位置表示选中的学生,调出handles里面的信息,然后通过set函数将数字赋值给显示框。
4.1.2文件管理模块:
文件管理模块要实现的是对于保存成绩的表格文件(.xls文件)的读取和对于学生信息修改或者删除之后的保存功能。
因此添加了两个控件按钮来实现,在点击按钮后,弹出读取(或保存)文件的所在位置,添加文件后,系统完成对成绩的读取(或保存)功能。
没有选中文件时,提示“没有选择文件”。
设计界面如下:
4.1.2.1打开成绩文件的按钮的设计程序:
%---Executesonbuttonpressinpushbutton1.
functionpushbutton1_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton1(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
[filename,pathname]=uigetfile({'*.xls';'*.*'},'打开成绩文件');
ifisequal(filename,0)|isequal(pathname,0)
errordlg('没有选择文件','出错');
return
else
str=[pathname,filename];
[word,txt]=xlsread(str);
xingming=txt(2:
end,1);
xuehao=word(1:
end,1);
chengji=word(1:
end,2:
3);
set(handles.xmlist,'string',xingming);
set(handles.chengjilist,'string',num2str(chengji));
set(handles.xhlist,'string',num2str(xuehao));
handles.count=length(xingming);
handles.chengji=chengji;
handles.xuehao=xuehao;
handles.xingming=xingming;
guidata(hObject,handles);
End
读取文件里面的信息,保存为数组的形式,分别给成绩、姓名、学号数组赋值,并设置三个list显示全部学生的信息,并保存这些数据到全局变量handles里面。
4.1.2.2保存文件按钮设计程序:
%---Executesonbuttonpressinbaocunbutton.
functionbaocunbutton_Callback(hObject,eventdata,handles)
%hObjecthandletobaocunbutton(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
[filename,pathname]=uigetfile({'*.xls';'*.*'},'打开成绩文件');
ifisequal(filename,0)|isequal(pathname,0)
errordlg('没有选择文件','出错');
return
else
str=[pathname,filename];
xingming=handles.xingming;
chengji=handles.chengji;
xuehao=handles.xuehao;
oldcount=handles.count;
[row,co]=size(chengji);
col=co+1;
ifrowM=cell(oldcount,col);
else
M=cell(row,col);
end
M(1:
row,1)=xingming;
M(1:
row,2)=num2cell(xuehao);
M(1:
row,3:
col+1)=num2cell(chengji);
xlswrite(str,M,1,'A2');
handles.count=row;
guidata(hObject,row);
End
将新获取的数据保存到M数组里面,调出原本数组的行数count,比较新获得的数组的行数和原来行数count的大小,根据实际调节写入数组的大小,并保存新的数据的行数。
4.1.3成绩管理模块:
成绩管理模块需要完成的是对于学生的姓名、学号和成绩的显示(显示在上面的显示模块里面完成),以及修改学生信息的修改和添加新的学生信息。
添加两个控件,控制学生信息的修改和添加。
界面设计图如下:
4.1.3.1修改按钮的程序设计:
%---Executesonbuttonpressinpushbutton2.
functionpushbutton2_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton2(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
content=get(handles.xmlist,'value');
xingming=handles.xingming;
chengji=handles.chengji;
xuehao=handles.xuehao;
newname=get(handles.lredit1,'string');
shuxue=str2num(get(handles.lredit2,'string'));
yuwen=str2num(get(handles.lredit3,'string'));
newxuehao=str2num(get(handles.lredit4,'string'));
xingming(content)=newname;
chengji(content,:
)=[shuxue,yuwen];
xuehao(content)=newxuehao;
set(handles.xmlist,'string',xingming);
set(handles.chengjilist,'string',num2str(chengji));
set(handles.xhlist,'string',num2str(xuehao));
handles.xuehao=xuehao;
handles.xingming=xingming;
handles.chengji=chengji;
guidata(hObject,handles);
获取输入的数据,调出原来的成绩、学号和姓名数组,根据新修改的信息,修改原本的三个数据的数值,并保存到全局变量handles里面。
4.1.3.2添加按钮的程序设计:
%---Executesonbuttonpressintianjiabutton.
functiontianjiabutton_Callback(hObject,eventdata,handles)
%hObjecthandletotianjiabutton(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
newname=get(handles.lredit1,'string');
shuxue=str2num(get(handles.lredit2,'string'));
yuwen=str2num(get(handles.lredit3,'string'));
newxuehao=str2num(get(handles.lredit4,'string'));
handles.xingming=[handles.xingming;newname];
handles.chengji=[handles.chengji;shuxue,yuwen];
handles.xuehao=[handles.xuehao;newxuehao];
guidata(hObject,handles);
set(handles.xmlist,'string',handles.xingming);
set(handles.xhlist,'string',num2str(handles.xuehao));
set(handles.chengjilist,'string',num2str(handles.chengji));
获取输入的数据,调出原来的成绩、学号和姓名数组,根据新添加的信息,修改原本的三个数据的数值,并保存到全局变量handles里面。
4.1.4查询管理模块:
本模块需要完成的是通过查询学生姓名或者学号,让成绩管理里面可以显示该学生的基本信息并可以通过删除按钮删除该生的信息,没有查询到该生的信息,即提示“没有找到”。
通过平均分查询按钮来查询各科的平均分成绩。
通过查询学生姓名,找到学生的总分并显示。
基本设计模块如下图:
4.1.4.1两个删除按钮的程序设计(以第一个删除为例,第二个原理同第一个):
%---Executesonbuttonpressinshanchubutton.
functionshanchubutton_Callback(hObject,eventdata,handles)
%hObjecthandletoshanchubutton(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
name=get(handles.xmedit,'string');
[lia,id]=ismember(name,handles.xingming);
iflia
xingming=handles.xingming;
chengji=handles.chengji;
xuehao=handles.xuehao;
xingming(id)=[];
xuehao(id)=[];
chengji(id,:
)=[];
handles.chengji=chengji;
handles.xuehao=xuehao;
handles.xingming=xingming;
guidata(hObject,handles);
set(handles.xmlist,'string',xingming);
set(handles.chengjilist,'string',num2str(chengji));
set(handles.xhlist,'string',num2str(xuehao));
set(handles.xmlist,'value',1);
set(handles.xhlist,'value',1);
set(handles.chengjilist,'value',1);
Else
查询时候有这个名字在保存的名字(或学号)的数组里面,调出姓名、学号和成绩数组,获取需要删除的学生在数组里面保存在第几个的位置,将数组里面的这儿位置清空,设置三个list的显示高亮位置回到第一行,同时更新handles里面的三个数组存放。
4.1.4.2姓名查询按钮的程序设计:
%---Executesonbuttonpressinchaxunbutton.
functionchaxunbutton_Callback(hObject,eventdata,handles)
%hObjecthandletochaxunbutton(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
name=get(handles.xmedit,'string');
[lia,id]=ismember(name,handles.xingming);
iflia
set(handles.xmlist,'value',id);
set(handles.xhlist,'value',id);
set(handles.chengjilist,'value',id);
xingming=handles.xingming;
chengji=handles.chengji;
xuehao=handles.xuehao;
set(handles.lredit1,'string',xingming(id));
set(handles.lredit2,'string',chengji(id,1));
set(handles.lredit3,'string',chengji(id,2));
set(handles.lredit4,'string',xuehao(id));
else
msgbox('没有找到');
end
查询是否有这个名字在保存的名字的数组里面,获取需要删除的名字在保存的数组里面是第几个的,获取三个数组,设置三个list里面这个学生的信息为高亮,并显示在成绩管理里面。
4.1.4.3学号查询按钮的程序设计:
%---Executesonbuttonpressinpushbutton9.
functionpushbutton9_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton9(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
xh=get(handles.xuehaoedit,'string');
[lia,id]=ismember(str2num(xh),handles.xuehao);
iflia
set(handles.xmlist,'value',id);
set(handles.xhlist,'value',id);
set(handles.chengjilist,'value',id);
xingming=handles.xingming;
chengji=handles.chengji;
xuehao=handles.xuehao;
set(handles.lredit1,'string',xingming(id));
set(handles.lredit2,'string',chengji(id,1));
set(handles.lredit3,'string',chengji(id,2));
set(handles.lredit4,'string',xuehao(id));
else
msgbox('没有找到');
End
查询是否有这个学号在保存的名字的数组里面,获取需要删除的学号在保存的数组里面是第几个的,获取三个数组,设置三个list里面这个学生的信息为高亮,并显示在成绩管理里面。
4.1.4.4总分查询按钮的程序设计:
%---Executesonbuttonpressinzfbutton.
functionzfbutton_Callback(hObject,eventdata,handles)
%hObjecthandletozfbutton(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
name=get(handles.lredit13,'string');
[lia,id]=ismember(name,handles.xingming);
iflia
set(handles.xmlist,'value',id);
set(handles.xhlist,'value',id);
set(handles.chengjilist,'value',id);
xingming=handles.xingming;
chengji=handles.chengji;
xuehao=handles.xuehao;
set(handles.zfedit,'string',(chengji(id,1)+chengji(id,2)));
else
msgbox('没有找到');
end
查询是否有这个名字在保存的名