至诚Matlab课程设计报告

          

至诚学院

《 MATLAB 实践 》

课程设计

学生姓名:       李志航           

    号:      210991026           

专业班级:      电子信息工程        

指导教师:        郑晓明           

二○一二年四月二十日

       

1.设计目的…………………………………………………3

2.题目分析……………………………………………………3

3.总体设计……………………………………………………3

4. 具体设计……………………………………………………4

5. 小结和心得…………………………………………………16

1、设计目的

MATLAB语言是集数值计算、图形绘制处理、文件管理、程序设计等功能于一身的系统软件。其操作简单方便,它的数值分析、模拟与运算功能非常强大。在欧美国家,它已成为攻读学位的大学生、硕士生、博士生必须掌握的基本技能,它是研究和解决各种具体工程问题所必备的工具。
    《MATLAB实践》课程是信息工程类专业的重要实践性课程。主要通过MATLAB实践设计的训练,提高我们对已学相关专业知识的掌握和应用水平。通过学习侧重培养我们树立如何运用所学的专业基础课程来选择设计题目,并培养我们合理安排实现设计的基本程序流程,利用强大的仿真功能与丰富的工具箱来制作、调试、评价自己设计的作品。
    通过课程实践教学,培养我们将已学课程基础理论与实践环节实际相结合。提高我们实践动手能力,为日后参加工作奠定一定的实践基础。

2题目分析

       此次我选择的实践题目是基于MATLAB GUI的成绩管理系统,通过软件设计能更准确迅速获得学生学习的状况,有一个整体思想,其次更能很好的认知并熟练运用MATLAB进行操作与设计。根据要求,我设计了以下内容:添加,查找,删除,修改、图表等功能。并能对excel表格进行操作读与写。

3、总体设计

  根据题目所叙述,一个成绩管理系统至少要包含录入、添加、查询、删除等功能。因此我分成七个界面来更好的实施功能化。

  第一个界面是主界面,以便用户来选择操作,里面有查询,统计、录入、一览、修改、删除。单击不同按钮就能进入相应的界面。

  第二个界面是查询界面。里面有以科目查询、以学号查询、以姓名查询。

  第三个界面是统计界面。里面有成绩分布表、平均分、以及高低分和对应的同学。

  第四个界面是录入界面。里面有添加按钮,添加一个学生的信息。并提供显示学生信息。

第五个界面是成绩一览界面。里面有所有学生的信息,和他们的成绩状况。

第六个界面是成绩修改界面。里面有以学号或者姓名查询后修改。

第七个界面是成绩删除几面。里面有以学号或者姓名查询后删除。并提供一个可视显示框。

4、具体设计

4.1 成绩管理系统主界面

4.1.1(GUI界面设计)

4.1.2(功能模块实现)

在界面上添加一个button按钮,在其回调函数写入run(**),其中**是指向对应另一个GUI功能模块的名字。例如在成绩查询按钮,其回调函数为run(inquest)

4.1.3(实现结果)

  跳转到相应的界面。

4.2 查询主界面

4.2.1(GUI界面设计)

4.2.2(功能模块实现)

对于学号查询,利用可编辑文本框作为输入信息,学号查询按钮作为执行操作按钮。有若干个静态文本框作为标识来表明信息。

学号查询按钮的回调函数:

i =str2num(get(handles.edit1,'string'));

[a xingming]=xlsread('chengji.xls');

[ia,ja]=find(a==i);

ic=ia+1;

set(handles.edit7,'string',handles.xingming(ic,2));

set(handles.edit6,'string',handles.chengji(ia,:));

set(handles.edit9,'string',handles.xuehao(ia,:));

输入参数为可编辑文本框的string,输出参数为xingming、chengji、xuehao的string。

此回调函数首先读取可编辑文本框的string并赋值给i,后读取表格中的信息。通过find函数找到与i一样的行与列,利用行的信息,通过set函数,对各个文本框的string进行赋值。

对于科目查询,利用可编辑文本框作为输入信息,科目查询按钮作为执行操作按钮。有若干个静态文本框作为标识来表明信息。

科目查询按钮的回调函数:

kemu=get(handles.edit2,'string');

    switch kemu

        case'Chinese'

            set(handles.edit6,'string',handles.chengji(:,5));

            set(handles.edit7,'string',handles.xingming(2:end,2));

            set(handles.edit9,'string',handles.xuehao(:,:));

        case'Math'

            set(handles.edit6,'string',handles.chengji(:,3));

            set(handles.edit7,'string',handles.xingming(2:end,2));

            set(handles.edit9,'string',handles.xuehao(:,:));

        case'English'

            set(handles.edit6,'string',handles.chengji(:,4));

            set(handles.edit7,'string',handles.xingming(2:end,2));

            set(handles.edit9,'string',handles.xuehao(:,:));

        otherwise

    end

输入参数为可编辑文本框的string,输出参数为xingming、chengji、xuehao的string。

此回调函数首先读取可编辑文本框的string并赋值给kemu的局部变量,通过switch case对比里面的值,找到后通过set函数,对各个文本框的string进行赋值。

对于姓名查询,利用可编辑文本框作为输入信息,姓名查询按钮作为执行操作按钮。有若干个静态文本框作为标识来表明信息。

  姓名查询的回调函数:

[a xingming]=xlsread('chengji.xls');

name=xingming(2:end,2);

NAME=get(handles.lxingming,'string');

name1=strcmp(name,NAME);

[i,j]=find(name1==1)

zzz=i+1;

set(handles.edit6,'string',handles.chengji(i,:));

set(handles.edit7,'string',handles.xingming(zzz,2));

set(handles.edit9,'string',handles.xuehao(i,1));

输入参数为可编辑文本框的string,输出参数为xingming、chengji、xuehao的string。

此回调函数首先读取可编辑文本框的string并赋值给NAME,后读取表格中的信息。通过strcmp函数找到与i一样的数值,由于字符串的比较会赋值为1,所以利用find函数找到行列的信息,通过set函数,对各个文本框的string进行赋值。

4.2.3(实现结果)

在本次试验中由于学号与科目较好做,能迅速的完成,但是在姓名查询,由于是字符串的比较,没注意到strcmp比较出来是1,因此一直没寻找到。最后在查询书籍求证老师后,并在那边MATLAB试验下,发现问题所在,修改find的比较条件,成功找到。另外一个小细节是由于姓名方面少了一行。所以要多加一行才能是正确的对应。

4.3删除主界面

4.3.1(GUI贴图)

4.3.2(功能模块实现)

对于删除界面,利用可编辑文本框作为输入信息,学号查询按钮作为执行操作按钮。有若干个静态文本框和listbox作为标识来表明和现实信息。

以学号删除回调函数:

i=str2double(get(handles.num,'String'));

ind = find(handles.numb==i);

[m,n] = ind2sub(size(handles.numb),ind);

lie = find(n==1);

hang=m( lie );

handles.numb(hang,:)=[];

handles.txt(hang+1,:)=[];

guidata(hObject,handles);

m = size(handles.numb,1);

set( handles.list_name,'String', handles.txt(2:m+1,2));

set( handles.list_point,'String',num2str(handles.numb(:,3:5)));

set( handles.list_num,'String', handles.numb(:,1));

m = size(handles.numb,1);

for a=1:1:m

    handles.txt(a+1,1)={num2str(handles.numb(a,1))};

    handles.txt(a+1,3)={num2str(handles.numb(a,3))};

    handles.txt(a+1,4)={num2str(handles.numb(a,4))};

    handles.txt(a+1,5)={num2str(handles.numb(a,5))};

end

for a=m+1:1:handles.m

    handles.txt(a+1,:)={''};

end

xlswrite('chengji.xls',handles.txt, 'Sheet1');

输入参数为可编辑文本框的string,输出参数为xingming、chengji、xuehao的listbox的string,并对表格进行读写。

此回调函数同学号查询一样,先找到该数据的行与列,然后对行的数据赋于一个空矩阵,通过一个个的列赋值空矩阵。由于赋值完空矩阵后MATLAB会自动上移。此后我们将数据储存到一个临时空间handles.txt里。然后在写回表中。同时在显示框内删除掉该行的string。

对于以姓名删除的回调函数:

[aa txt]=xlsread('chengji.xls');

name=txt(2:end,2);

NAME=get(handles.xm,'string');

name1=strcmp(name,NAME);

handles.aa=aa;

[i,j]=find(name1==1)

handles.numb(i,:)=[];

handles.txt(i+1,:)=[];

guidata(hObject,handles);

m = size(handles.numb,1);

set( handles.list_name,'String', handles.txt(2:m+1,2));

set( handles.list_point,'String',num2str(handles.numb(:,3:5)));

set( handles.list_num,'String', handles.numb(:,1));

m = size(handles.aa,1);

m=m-1;

for a=1:1:m

    handles.txt(a+1,1)={num2str(handles.numb(a,1))};

    handles.txt(a+1,3)={num2str(handles.numb(a,3))};

    handles.txt(a+1,4)={num2str(handles.numb(a,4))};

    handles.txt(a+1,5)={num2str(handles.numb(a,5))};

end

for a=m+1:1:handles.m

    handles.txt(a+1,:)={''};

end

xlswrite('chengji.xls',handles.txt, 'Sheet1');

输入参数为可编辑文本框的string,输出参数为xingming、chengji、xuehao的listbox的string,并对表格进行读写。

  此个回调函数操作与学号删除方法一样,唯一的不同点是在查找字符串的时候改变find的查找条件。找到行之后进行的操作与学号一样,这里不再叙述。

4.3.2(调试结果)

 

此次由于查询的条件修改正确了,因此这里做得很快。但是还是出现了一个问题,在删除的时候,由于直接赋值空格后,删除后在MATLAB中数据上移,但表格并未上移,因此,会留出一个空的一行,很难看。后来请教了老师和同学后,发现自己在删除方面赋值错了,应该赋值一个空矩阵而不是一个空格。

4.4统计主界面

4.4.1(GUI主界面)

4.4.2(功能模块实现)

输入参数为数据中的成绩和名字部分,还有一个是可选择的菜单,输出参数为各个文本框的listbox的string,和一个axes用来画图 。

求平均、最大值、最小值回调函数;

[a xingming]=xlsread('chengji.xls');

chengji=a(:,1:5);

handles.chengji=chengji;

guidata(hObject,handles);

chin=chengji(:,5);

math=chengji(:,3);

engl=chengji(:,4);

b=max(chin);

c=min(chin);

sum=0;

n=length(chin);

for i=1:n

 sum=sum+chin(i);

end

d=sum/n;

set(handles.edit3,'string',d);

set(handles.edit4,'string',b);

set(handles.edit5,'string',c);

此回调函数为语文成绩的回调函数。通过MATLAB内自带的min和max很方便求出每一列最大值。而求平均通过每一个累加最后除以矩阵的大小。最后将这些值赋值给相应的表格。由于数学和英语的算法和语文一样,在此不列出。

画图程序的回调函数:

[chengji xingming]=xlsread('chengji.xls');

    handles.chengji=chengji;

    len=length(chengji);%Çó¾ØÕóµÄ³¤¶È

    d1=chengji(1:len,5);

    ave1=sum(d1);%ÇóÓïÎĵÄ×Ü·Ö

    d2=chengji(1:len,3);

    ave2=sum(d2);%ÇóÊýѧµÄ×Ü·Ö

    d3=chengji(1:len,4);

    ave3=sum(d3);%ÇóÓ¢ÓïµÄ×Ü·Ö

  guidata(hObject,handles);

val=get(hObject,'Value');

str=get(hObject,'String');

global len;

global d1;global d2;global d3;

global d;

global ave1;global ave2;global ave3;

global ave;

switch str{val}   

    case 'chinese'

        d=d1;

        ave=ave1/len;%ÇóÓïÎĵÄƽ¾ù·Ö

    case  'math'

       d=d2;

       ave=ave2/len;%ÇóÊýѧµÄƽ¾ù·Ö

    case 'english'

       d=d3;

       ave=ave3/len;%ÇóÓ¢ÓïµÄƽ¾ù·Ö

end

global hline;

global len;

global d;

t=1:1:len;

hline=plot(t,d,'linewidth',2);

  此回调函数为各个每个学生成绩的分布。以成绩作为y轴的值,以每个学生的学号作为x轴。到string为linewidth绘画。这样更能直观的看出每一个学生成绩的高低。由于部分是两部分,因此我们声明了全局变量来避免重复赋值。

4.4.3(测试结果)

  此次在求平均方面有点繁琐,后检查完后在老师的提醒下发现可以用sum函数进行求和,增加效率。另外由于自己的不注意,没用全局变量进行设置,有些部分重新赋值了。因此程序能在优化,更高效率的运行。

4.5一览界面

4.5.1(GUI界面)

4.5.2(功能模块实现)

输入参数为数据中的成绩和名字部分,输出参数为各个文本框的的string。

一览回调函数:

[a xingming]=xlsread('chengji.xls');

xuehao=a(:,1);

chengji=a(:,3:5);

handles.xuehao=xuehao;

handles.chengji=chengji;

handles.xingming=xingming;

guidata(hObject,handles);

set(handles.edit1,'string',num2str(handles.chengji(:,:)));

set(handles.edit2,'string',xuehao(:,1));  

set(handles.edit3,'string',xingming(2:end,2));

  此回调函数只是简单的调用各个数据,将chengji变量分开赋值给handles的变量,通过set让其显示所有的结果。

4.5.3(测试结果)

4.7录入界面

4.7.1(GUI界面)

4.7.2(功能模块实现)

输入参数为数据中的成绩和名字部分、各个编辑文本框的string,输出参数为表格。

添加回调函数:

xuehao=str2num(get(handles.xuehao,'string'));

xingming=get(handles.xingming,'string');

shuxue=str2num(get(handles.shuxue,'string'));

yingyu=str2num(get(handles.yingyu,'string'));

yuwen=str2num(get(handles.yuwen,'string'));

d={xuehao,xingming,shuxue,yingyu,yuwen;};

a=xlsread('chengji.xls','sheet1','A:A');

length(a);

L=length(a)+2;

xlswrite('chengji.xls',d,'sheet1',num2str(L));

  此回调函数首先获取各个文本框的string并将字符串转为数字型的。后用一个元胞数组d进行整合。整合后,算出整个矩阵的长度,然后在表格数据的下一行进行数据的写入。

4.7.3(测试结果)

  此个函数由于没做成元胞数组,首先给数据的写入照成了很多不便,即使最精炼的语言也是需要很多。因此通过查询与询问老师以后,我明白了做成元胞数组是更加简易的,因此利用{}改为元胞数组进行读写。

5、小结和心得

此次的做的成绩管理系统是基于MATLAB的GUI进行制作的。一方面不仅仅完成了老师布置的课题,另一方面更是锻炼了我们熟练操作软件的能力,更是对我们的思考方式进行了调动。

此次实验完好的完成了我预订的目标,甚至提前完成了作业量还利用图形进行显示与修改,超出了自己的预期。

  在这次实验中遇到最大的困难的是对矩阵的添加。由于一开始就思考方向不对,因此造成了在这个环节卡住的时间最久。由于数字与字符串的关系,MATLAB读取会分开来进行读取,并存储在不同的位置。因此如果要对数据进行整体的读写,要做成元胞数组,否则会造成,先对表格写入一次数据后,再次填写另外一个存储位置的数据,会造成数据的覆盖从而丢失。此外,还发现了一个现象,如果对表格操作失败的话,在表格上并不会显示异常,然后在MATLAB读取必爱歌时候会出现错误提示,因此如果不注意的话,很容易误以为是程序的错误而过多的浪费时间查找程序。

  此外,MATLAB主界面的调用应该充分认识到他的作用与强大。因为在那里可以很好的观察每一步自己程序读取数据的时候,他的变化,读写数据的时候,整体的变化,这样能很好的方便我们对程序作出调整,加快我们工作的效率。

  最后,这次郑晓明老师的实践课很好的督促了我学习新的知识,加深对MATLAB这个软件功能强大的看法,矩阵的操作,数据的读写等,等能轻松胜任。但是通过这个实践课明白自己所学的知识还是有局限性的,应该要更加多拓展视野,学习新的知识来丰富自己。

参考书目

[1]  《MATLAB实用教程》 郑阿奇  电子工业出版社

相关推荐