一、 课程设计的意义
通常在开发一个实际的应用程序时都会尽量做到界面友好,最常用的方法就是使用图形界面,而Matlab是一门面向对象的语言。提供图形用户界面的应用程序能够使用的学习和使用更为方便容易。用户不需要知道应用程序究竟是怎样执行各种命令的,而只需要了解可见界面组件的使用方法;用户也不需要知道命令是怎样执行的,只要通过与界面交互就可以是指定的行为得以正确执行,这比用在DOS环境下运行的程序交互性友好。
在Matlab中,图形用户界面是一种包含多种对象的图形窗口。用户必须对每一种对象进行界面布局和编程,从而使用户激活GUI每个对象时都能够执行相应的行为。另外,用户必须保存和发布所创建的GUI,使得GUI能够真正地得到应用。
Matlab为用户开发图形界面提供了一个方便高效的集成开发环境:Matlab图形用户界面开发环境GUIDE。上述所有工作都能够使用GUIDE方便地实现,GUIDE主要是一个界面设计工具集,Matlab将所有GUIDE支持的用户控件都集成在这个环境中并提供界面外观、属性和行为响应方式的设置方法。GUIDE将用户保存设计好的GUIDE界面保存在一个Fig资源文件中,同时还能够生成包含GUI初始化和组件界面布局控制的M文件。这个M文件为实现回调函数提供了一个参考框架。
这次不到一周课程设计使我对Matlab有了更深刻的认识,尤其是编程方面,掌握了一些编程思维,这对我们以后再学习其它语言是有很大的益处的,掌握一种编程思维方式比多学几门语言都有用。
2、课程设计的要求
1.用GUI设计一个计算器要求至少完成加、减、乘、除功能;
扩充:矩阵运算(加、减、点乘,点除,乘,除,乘方等)
2.设计一个绘图界面要求能选择绘制二维曲线,三维曲线,三维网格,三维曲面,柱状图,饼图等功能。
要求界面要整齐划一,富有美感。
需求分析和总体设计
1、任务描述
1.课程设计目标
用GUIDE编写一个简易计算器和一个能自动画图的程序。
2.功能描述
(1).计算器能实现的功能
● 加、减、乘、除、乘方、开方;
● 可以后退、清零;
● 可以更换背景颜色、查看帮助等操作。
(2).画图程序能实现的功能
● 可以画出二维曲线、三维曲线、三维网格、三维曲面、柱状图、饼图;
● 有简单菜单(就包括一项:文件)。
2、任务设计
1.计算器
(1).运行Matlab主程序;
(2).新建Gui文件命名为“wodejisuanqi.fig” ;
(3).在出现的界面创建需要的文本框(tag为wenben),按钮:0、1、2、3、4、5、6、7、8、9、CE(清零)、backplace(后退)、'+'、'-' 、 '*'、
'÷'、'√'、 '∧'、 '.' ,菜单:(文件,关闭);背景色(浅紫色,浅绿色,粉红色,默认色);帮助(关于)。
(4).编写M文件。
2.画图
(1).运行Matlab主程序;
(2).新建Gui文件并命名为“huatu.fig”;
(3).再出现的界面创建需要的坐标系(tag为zuobiaoxi),按钮:二维曲线、三位曲线、三维网格、三维曲面、柱状图、饼状图;
(4).将它们的tag都设为它们的汉语拼音;
(5).编写M文件。
第3章 编码
1、代码编写步骤
1、计算器
(1).主函数
在主函数fanction wodejisuanqi-OpeningFcn中编写主函数代码。先申请一个全局变量s ,用于判断文本框里的字符串是不是有:'+'、'-' 、 '*'、'÷',如果有的话,就把s置为1,否则,置为0。再获得文本框中字符串的句柄,并赋给变量h。申请全局变量p,为了判断响应等号时文本框里的运算符号,其中令p='\'是没有实际意义的,只是为了判断运算符不是加减乘除中的任一个。代码如下:
global s ;
h=get(handles.wenben,'string');
switch(h)
case{'+','-','*','\'}
s=1;
otherwise
s=0;
end
global p;
p='\';
(2).数字函数
在这个函数里主要是判断文本框里是不是有加减乘除符号,如果有的话,就把文本框中的字符串设置为数字,否则,再判断是不是0,是的话,就把文本框中的值置为数字,不是的话,就把数字连接到文本框中的字符串上。代码如下(以0为例):
global s;
hh=handles.wenben; %把文本框的句柄赋给hh
if(s==1)
set(hh,'string','0');
s=0; %把s再次置为0,为了下次判断不出错
elseif(s==0)
h=get(hh,'string');
switch(h) %在判断h是否为0
case '0';
set(hh,'string','0');
otherwise
t=strcat(h,'0'); %把0连接到原有的字符后面
set(hh,'string',t);
end
end
(3).小数点函数
判断原来文本框里有几个小数点,如果有的话,就保持不变,否则,加上小数点。判断方法是用strfind函数,测试其返回的矩阵大小。代码如下:
hh=handles.wenben;
a=get(hh,'string');
set(hh,'string','.');
b=get(hh,'string');
c=strcat(a,'.');
[p,q]=size(m); %测试矩阵m
if q>=1
set(hh,'string',a);
else
set(hh,'string',c);
end
(4)运算符号(以加号为例)函数
申请全局变量p,s,v1,p用于响应等号时判断,s用于判断按加好时文本框里是不是有加减乘除,如果没有就把文本框里的字符串转换成数字,并赋给全局变量v1。代码如下:
hh=handles.wenben;
p='+';
global s;
if(s==0)
global v1; %按加号之前的数值
v1=str2num(get(hh,'string'));
s=1;
end
(5).根号和幂(以根号为例)函数
申请全局变量s,如果s=0,即文本框里没有加减乘除符号,就把文本框里的字符串转换成数字并开方。代码如下:
hh=handles.wenben;
global s;
if (s==0)
r=sqrt(str2num(get(hh,'String')));
set(hh,'String',num2str(r));
end
(6).等号函数
这是整个程序中最重要的一个函数,申请全局变量p,判断p的值,并作出相应的处理。代码如下:
hh=handles.wenben;
global v1;
global v2;
global v3;
global v4;
global v5;
global v6;
v5=str2num(get(hh,'string'));
global p;
switch(p)
case'+';
r=v1+v5
set(hh,'string',num2str(r));
v1=0;
p=' ';
case'-';
r=v2-v5;
set(hh,'string',num2str(r));
v2=0;
p=' ';
case'*';
r=v3*v5;
set(hh,'string',num2str(r));
v3=0;
p=' ';
case'/';
r=v4/v5;
set(hh,'string',num2str(r));
v4=0;
p=' ';
case'^';
r=v6^v5;
set(hh,'string',num2str(r));
v5=0;
p=' ';
otherwise
b=(get(hh,'string'))
set(hh,'string',b)
end
(7)菜单函数(以颜色中的粉红色为例)
设置面板(tag为pane)的background属性。代码如下:
set(handles.pane,'backgroundcolor',[0.992 0.51 0.627]);
set(handles.biaoti,'backgroundcolor',[0.992 0.51 0.627]);
2、画图程序
(1).画图按钮函数(以二维曲线函数为例)
代码如下:
x=[0:0.1:2*pi];
y=[0:0.1:2*pi];
y=sin(x);
plot(handles.zuobiao,x,y)
(2). 菜单函数
文件中的关闭函数,代码如下:
function guanbi_Callback(hObject, eventdata, handles)
close;
2、遇到问题及解决方案
1 、在计算器方面,刚做完时漏洞比较多,最严重的是小数点可以连续输入,很不方便。解决方法是:用strfind函数查看文本框里有几个小数点,如果已经有一个了,再按小数点就保持不变。另外一个漏洞是按过运算符号后一个数不等于一个数,比如:输入1,按等号,会出来一个3,经过长时间分析得知,这是由于在按运算符号时,系统记录了文本框里的数但没有清空,才会出现这种问题。解决方法是再申请一个不同于加减乘除的另一个符号,并将按过运算符后记录的数值置0,问题解决,很高兴。
2 、在画图程序中基本上没什么难度,就是有的图形不能在规定的坐标系中出现。解决方法,先获得坐标系的句柄,在画图,问题解决。
三 程序运行结果
1 、计算器程序
2、画图程序
(1).初始界面
(2).按二维曲线按钮后的界面
(3)按三维曲线按钮后的界面
(4)按三维曲面后的界面
(5).按三维网格按钮后的界面
(6).按柱形图按钮后的界面
(7).按饼图按钮后的界面
第4章 感想认识
经过不到一周的matlab课程设计使我感觉到,学习一学期的知识还是有些不连贯,造成编程时,没有思路,有不会的只好去网上查询,有时候会因为某个帖子是我茅塞顿开,从而有了思路,完成了课程设计的任务。Matlab Gui是很有用的东西,比我们学的C语言界面好看,又有实用价值。
以后我还要学习matlab,为了迎接考试也是为了自己以后能够用到。
附录(源代码)
1、计算器
function varargout = wodejisuanqi(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @wodejisuanqi_OpeningFcn, ...
'gui_OutputFcn', @wodejisuanqi_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before wodejisuanqi is made visible.
function wodejisuanqi_OpeningFcn(hObject, eventdata, handles, varargin)
global s;
h=get(handles.wenben,'string');
switch(h)
case{'+','-','*','\'}
s=1;
otherwise
s=0;
end
global p;
p='\';
handles.output = hObject;
guidata(hObject, handles);
%
function varargout = wodejisuanqi_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% --- Outputs from this function are returned to the command line.
function wenben_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function wenben_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in point.
function point_Callback(hObject, eventdata, handles)
hh=handles.wenben;
a=get(hh,'string');
set(hh,'string','.');
b=get(hh,'string');
c=strcat(a,b);
m=strfind(a,'.');
[p,q]=size(m);
if q>=1
set(hh,'string',a);
else
set(hh,'string',c);
end
% --- Executes on button press in zero.
function zero_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','0');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','0');
otherwise
t=strcat(h,'0');
set(hh,'string',t);
end
end
% --- Executes on button press in one.
function one_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','1');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','1');
otherwise
t=strcat(h,'1');
set(hh,'string',t);
end
end
% --- Executes on button press in two.
function two_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','2');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','2');
otherwise
t=strcat(h,'2');
set(hh,'string',t);
end
end
% --- Executes on button press in three.
function three_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','3');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','3');
otherwise
t=strcat(h,'3');
set(hh,'string',t);
end
end
% --- Executes on button press in four.
function four_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','4');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','4');
otherwise
t=strcat(h,'4');
set(hh,'string',t);
end
end
% --- Executes on button press in five.
function five_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','5');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','5');
otherwise
t=strcat(h,'5');
set(hh,'string',t);
end
end
% --- Executes on button press in six.
function six_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','6');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','6');
otherwise
t=strcat(h,'6');
set(hh,'string',t);
end
end
% --- Executes on button press in seven.
function seven_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','7');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','7');
otherwise
t=strcat(h,'7');
set(hh,'string',t);
end
end
% --- Executes on button press in eight.
function eight_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','8');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','8');
otherwise
t=strcat(h,'8');
set(hh,'string',t);
end
end
% --- Executes on button press in nine.
function nine_Callback(hObject, eventdata, handles)
global s;
hh=handles.wenben;
if(s==1)
set(hh,'string','9');
s=0;
elseif(s==0)
h=get(hh,'string');
switch(h)
case '0';
set(hh,'string','9');
otherwise
t=strcat(h,'9');
set(hh,'string',t);
end
end
% --------------------------------------------------------------------
function wenjian_Callback(hObject, eventdata, handles)
% --------------------------------------------------------------------
function guanbi_Callback(hObject, eventdata, handles)
close;
% --------------------------------------------------------------------
function qianlvse_Callback(hObject, eventdata, handles)
set(handles.pane,'backgroundcolor',[0.6 0.902 0.608]);
set(handles.biaoti,'backgroundcolor',[0.6 0.902 0.608]);
% --------------------------------------------------------------------
function beijingse_Callback(hObject, eventdata, handles)
% --------------------------------------------------------------------
function moren_Callback(hObject, eventdata, handles)
set(handles.pane,'backgroundcolor',[0.502, 0.502 1.0]);
set(handles.biaoti,'backgroundcolor',[0.502, 0.502 1.0]);
% --------------------------------------------------------------------
function qianzise_Callback(hObject, eventdata, handles)
set(handles.pane,'backgroundcolor',[0.855 0.561 0.937]);
set(handles.biaoti,'backgroundcolor',[0.855 0.561 0.937]);
% --------------------------------------------------------------------
function fenhongse_Callback(hObject, eventdata, handles)
set(handles.pane,'backgroundcolor',[0.992 0.51 0.627]);
set(handles.biaoti,'backgroundcolor',[0.992 0.51 0.627]);
% --------------------------------------------------------------------
function bangzhu_Callback(hObject, eventdata, handles)
% --------------------------------------------------------------------
function guanyu_Callback(hObject, eventdata, handles)
msgbox('°ú ','÷','warn');
global p;
p='';
% --- Executes on button press in jia.
function jia_Callback(hObject, eventdata, handles)
global p;
hh=handles.wenben;
p='+';
global s;
if(s==0)
global v1;
v1=str2num(get(hh,'string'));
s=1;
end
% --- Executes on button press in jian.
function jian_Callback(hObject, eventdata, handles)
global p;
hh=handles.wenben;
p='-';
global s;
if(s==0)
global v2;
v2=str2num(get(hh,'string'));
s=1;
end
% --- Executes on button press in cheng.
function cheng_Callback(hObject, eventdata, handles)
global p;
hh=handles.wenben;
p='*';
global s;
if(s==0)
global v3;
v3=str2num(get(hh,'string'));
s=1;
end
% --- Executes on button press in chu.
function chu_Callback(hObject, eventdata, handles)
global p;
hh=handles.wenben;
p='/';
global s;
if(s==0)
global v4;
v4=str2num(get(hh,'string'));
s=1;
end
% --- Executes on button press in gen.
function gen_Callback(hObject, eventdata, handles)
hh=handles.wenben;
global s;
if (s==0)
r=sqrt(str2num(get(hh,'String')));
set(hh,'String',num2str(r));
end
% --- Executes on button press in mi.
function mi_Callback(hObject, eventdata, handles)
global p;
hh=handles.wenben;
p='^';
global s;
if(s==0)
global v6;
v6=str2num(get(hh,'string'));
s=1;
end
% --- Executes on button press in deng.
function deng_Callback(hObject, eventdata, handles)
hh=handles.wenben;
global v1;
global v2;
global v3;
global v4;
global v5;
global v6;
v5=str2num(get(hh,'string'));
global p;
switch(p)
case'+';
r=v1+v5
set(hh,'string',num2str(r));
v1=0;
p=' ';
case'-';
r=v2-v5;
set(hh,'string',num2str(r));
v2=0;
p=' ';
case'*';
r=v3*v5;
set(hh,'string',num2str(r));
v3=0;
p=' ';
case'/';
r=v4/v5;
set(hh,'string',num2str(r));
v4=0;
p=' ';
case'^';
r=v6^v5;
set(hh,'string',num2str(r));
v5=0;
p=' ';
otherwise
b=(get(hh,'string'))
set(hh,'string',b)
end
% --- Executes on button press in ce.
function ce_Callback(hObject, eventdata, handles)
hh=handles.wenben;
set(hh,'string','0');
% --- Executes on button press in pushbutton20.
function pushbutton20_Callback(hObject, eventdata, handles)
% --- Executes on button press in pushbutton22.
function pushbutton22_Callback(hObject, eventdata, handles)
% --- Executes on button press in backplace.
function backplace_Callback(hObject, eventdata, handles)
hh=get(handles.wenben,'String');
t=length(hh);
set(handles.wenben,'String',hh(1:t-1));
% --- Executes during object creation, after setting all properties.
function pane_CreateFcn(hObject, eventdata, handles)
2、画图
function varargout = huatu(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @huatu_OpeningFcn, ...
'gui_OutputFcn', @huatu_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before huatu is made visible.
function huatu_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for huatu
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = huatu_OutputFcn(hObject, eventdata, handles)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in erweiquxian.
function erweiquxian_Callback(hObject, eventdata, handles)
x=[0:0.1:2*pi];
y=[0:0.1:2*pi];
y=sin(x);
plot(handles.zuobiao,x,y)
% --- Executes on button press in sanweiquxian.
function sanweiquxian_Callback(hObject, eventdata, handles)
t=[0:pi/200:10*pi];
x=3*cos(t);
y=2*sin(t);
z=t.^2;
plot3(handles.zuobiao,x,y,z)
set(handles.zuobiao,'color',[0.502,1,0.0]);
% --- Executes on button press in sanweiqumian.
function sanweiqumian_Callback(hObject, eventdata, handles)
[x,y]=meshgrid(-3:0.125:3);
z=peaks(x,y);
surf(handles.zuobiao,x,y,z);
% --- Executes on button press in sanweiwangge.
function sanweiwangge_Callback(hObject, eventdata, handles)
[x,y]=meshgrid(-4:0.25:4);
z=x.^2+y.^2;
mesh(x,y,z);
% --- Executes on button press in zhuxingtu.
function zhuxingtu_Callback(hObject, eventdata, handles)
z=[1 2 3;4 5 6;7 8 9];
bar(handles.zuobiao,z,'stacked');
title(' 函数以stacked参数绘制的A=[1 2 3;4 5 6;7 8 9]的条形图');
% --- Executes on button press in bingtu.
function bingtu_Callback(hObject, eventdata, handles)
x=[1 2 3; 4 5 6 ; 7 8 9];
explode=[1 0 0 1 1 0 0 0 1];
pie(x,explode)
% --------------------------------------------------------------------
function guanbi_Callback(hObject, eventdata, handles)
close;
% --------------------------------------------------------------------
function wenjian_Callback(hObject, eventdata, handles)
完