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显示模块模块:

      显示模块需要完成的是对于学生姓名、序号以及成绩的显示,并且在点击姓名显示框里面的学生姓名时,成绩管理的模块里面可以自动显示学生的以上基本信息。设计界面如下:

对于姓名显示框的程序设计如下:

% --- Executes on selection change in xmlist.

function xmlist_Callback(hObject, eventdata, handles)

% hObject    handle to xmlist (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

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打开成绩文件的按钮的设计程序:

% --- Executes on button press in pushbutton1.

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton1 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

[filename,pathname]=uigetfile({'*.xls';'*.*'},'打开成绩文件');

if isequal(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保存文件按钮设计程序:

% --- Executes on button press in baocunbutton.

function baocunbutton_Callback(hObject, eventdata, handles)

% hObject    handle to baocunbutton (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

[filename,pathname]=uigetfile({'*.xls';'*.*'},'打开成绩文件');

if isequal(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;

    if row<oldcount

        M=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修改按钮的程序设计:

% --- Executes on button press in pushbutton2.

function pushbutton2_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton2 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

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添加按钮的程序设计:

% --- Executes on button press in tianjiabutton.

function tianjiabutton_Callback(hObject, eventdata, handles)

% hObject    handle to tianjiabutton (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

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两个删除按钮的程序设计(以第一个删除为例,第二个原理同第一个):

% --- Executes on button press in shanchubutton.

function shanchubutton_Callback(hObject, eventdata, handles)

% hObject    handle to shanchubutton (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

name=get(handles.xmedit,'string');

[lia,id]=ismember(name,handles.xingming);

if lia

      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姓名查询按钮的程序设计:

% --- Executes on button press in chaxunbutton.

function chaxunbutton_Callback(hObject, eventdata, handles)

% hObject    handle to chaxunbutton (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

name=get(handles.xmedit,'string');

[lia,id]=ismember(name,handles.xingming);

if lia

    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学号查询按钮的程序设计:

% --- Executes on button press in pushbutton9.

function pushbutton9_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton9 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

xh=get(handles.xuehaoedit,'string');

[lia,id]=ismember(str2num(xh),handles.xuehao);

if lia

    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总分查询按钮的程序设计:

% --- Executes on button press in zfbutton.

function zfbutton_Callback(hObject, eventdata, handles)

% hObject    handle to zfbutton (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

name=get(handles.lredit13,'string');

[lia,id]=ismember(name,handles.xingming);

if lia

    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

    查询是否有这个名字在保存的名字的数组里面,获取需要删除的名字在保存的数组里面是第几个的,获取三个数组,设置三个list里面这个学生的信息为高亮,同时计算她(他)的总分,并显示。

4.1.4.5平均分查询按钮的程序设计:

% --- Executes on button press in pjfbutton.

function pjfbutton_Callback(hObject, eventdata, handles)

% hObject    handle to pjfbutton (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

chengji=handles.chengji;

shuxue=chengji(1:end,1);

yuwen=chengji(1:end,2);

avesshuxue=mean(shuxue);

avesyuwen=mean(yuwen);

set(handles.sxedit,'string',num2str(avesshuxue));

set(handles.ywedit,'string',num2str(avesyuwen));

    通过按钮,调用成绩数组,计算平均分并显示。

4.1.5成绩概况模块:

成绩概况的设计比较简单,仅包含通过点击查询最高分或者最低分按钮来查询各科学生成绩里面的最高分和最低分并显示。程序设计界面如下:

4.1.5.1最高分按钮程序设计:

% --- Executes on button press in pushbutton7.

function pushbutton7_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton7 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

chengji=handles.chengji;

count=handles.count;

x=max(chengji(1:count,1));

y=max(chengji(1:count,2));

set(handles.lredit6,'string',num2str(x));

set(handles.lredit7,'string',num2str(y));

    调用成绩数组,根据人数,设置比较次数,按照科目比较,并设置显示。

4.1.5.2最低分程序设计:

% --- Executes on button press in pushbutton8.

function pushbutton8_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton8 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

chengji=handles.chengji;

count=handles.count;

x=min(chengji(1:count,1));

y=min(chengji(1:count,2));

set(handles.lredit8,'string',num2str(x));

set(handles.lredit9,'string',num2str(y));

    调用成绩数组,根据人数,设置比较次数,按照科目比较,并设置显示。

4.1.6成绩统计直方图模块:

本模块的设计为:将各科学生的成绩分段统计,画出学生成绩的分布直方图。采用的分数段为:0~60、61~70、71~80、81~90、91~100五个分数段。设计界面图如下:

4.1.6.1显示数学成绩分数段统计直方图按钮的程序设计:

% --- Executes on button press in zftbutton.

function zftbutton_Callback(hObject, eventdata, handles)

% hObject    handle to zftbutton (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

axes(handles.axes1);

cla;

chengji=handles.chengji;

shuxue=chengji(1:end,1);

count=handles.count;

aa=[0 0 0 0 0];

for i=1:count

    if shuxue(i)<60

        aa(1)=aa(1)+1;

    else if shuxue(i)<70

            aa(2)=aa(2)+1;

        else if shuxue(i)<80

                aa(3)=aa(3)+1;

            else if shuxue(i)<90

                    aa(4)=aa(4)+1;

                else aa(5)=aa(5)+1;

                end

            end

        end

    end

end

x=[50 65 75 85 95];

bar(x,aa);

title('数学成绩分数段统计直方图');

    调用数学成绩数组,设定空数组aa用来存放分数段的统计数据。设定循环函数,分别比较五个数值:60、70、80、90、100,并记录。最后用bar函数画出函数图像。

4.1.6.2显示语文成绩分数段统计直方图:

% --- Executes on button press in pushbutton14.

function pushbutton14_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton14 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

axes(handles.axes2);

cla;

chengji=handles.chengji;

yuwen=chengji(1:end,2);

count=handles.count;

aa=[0 0 0 0 0];

for i=1:count

    if yuwen(i)<60

        aa(1)=aa(1)+1;

    else if yuwen(i)<70

            aa(2)=aa(2)+1;

        else if yuwen(i)<80

                aa(3)=aa(3)+1;

            else if yuwen(i)<90

                    aa(4)=aa(4)+1;

                else aa(5)=aa(5)+1;

                end

            end

        end

    end

end

x=[50 65 75 85 95];

bar(x,aa);

title('语文成绩分数段统计直方图');

    调用语文成绩数组,设定空数组aa用来存放分数段的统计数据。设定循环函数,分别比较五个数值:60、70、80、90、100,并记录。最后用bar函数画出函数图像。

4.2调试结果

4.2.1导入数据调试界面:

4.2.2总体调试后界面图(添加一个新的学生信息,同时删除东的信息后并保存):

保存数据前:

保存数据后:

4.3问题分析:

4.3.1无法打开.xls文件

解决方法:查看程序的编写是否有误,找到有误的地方并改正;查看文件的命名和格式,是否为实验里面要求的数据;查看文件里面生成的数组的大小是否与实验设计的存放信息的数组的大小相同。

4.3.2不能正常显示学生的信息

解决办法:查看程序设计的是否是否从全局变量的handles里面调出需要设置的信息的数组,关于设置显示信息框的set函数的设置格式是否正确,以及显示框的tag是否与实验set函数里面的引用是否一致。Set函数里面赋值给显示框是赋的值为str类型,查看需要赋值的数字是否为str类型,不是的话则需要转换类型。

4.3.3无法保存文件

解决办法:程序修改完成后,我法将修改后的信息和新添加的信息保存到文件里面时,第一:检查程序的数组,查看是否有获取变更后的信息并更新到全局变量handles里面;第二:写入函数的开始行,本实验写入从A2行开始写入,写入行的出错也会导致文件写入的错误。

4.3.4在删除信息后,重新写入,但是数据从原来的四个人,删除后剩下三个人的信息,可是文件里面依旧保存着四个人的信息,而且最后一个的信息和倒数第二个的信息重复了

解决办法:在打开文件的回调函数后面加上一句程序,记录下读取文件的行数,后面保存文件时,判断原来的数据的行数时候与改变后的数据的行数一致,不一致时,调节保存的数据的行数为调节后的行数。避免出现上述情况。

4.3.5绘制直方图时无法正常统计分数段的分布情况

解决办法:采用一个包含五个元素的空数组(赋初值为0),记录下各个分数段的人数的大小,在绘图时,设置纵坐标轴为记录下分数段情况的数组。

5、小结和心得

实验需要用到的都是学过的知识。在做实验的时候需要的是耐心和细心。我们在发现问题的时候需要的是认真观察程序,有时候会不小心输入中文的符号,这样就会导致错误,但是有不容易发现错误的所在。本次程序设计的时候需要用到的最重要的是数组的应用,数组的调用,需要类型一致。总之,本次的实验需要我们认真,这就教会了我:我们要认真做好每一件事,出现错误时也不要着急,要认真检查,一步一个脚印地发现错误。

参考书目:(五号,宋体加粗)

【1】《MATLAB实用教程(第三版)》                ——主编郑阿奇  电子工业出版社

【2】《MATLAB应用实例精讲——图像处理与GUI设计篇》

                                              ——主编陈超      电子工业出版社

【3】《精通MATLAB GUI设计(第2版)》           ——主编陈垚光    电子工业出版社

相关推荐