基于MATLAB科学计算器
目录
计算器的效果图 ......................................................................... 错误!未定义书签。
一、GUI设计界面: (3)
1.打开GUI (3)
2.添加按钮 (3)
3.根据按钮的作用及视觉效果做一定的修改: (4)
4.保存、添加功能函数 (4)
(1)数字键编写 (4)
(2)符号键的编写 (4)
(3)运算符“=”的编写 (5)
(4)按键“←back”的编写 (5)
(5)按键“清空”的编写 (5)
(6)按键“退出”的编写 (5)
(7)按键“二进制数转十进制数”的编写 (5)
(8)按键“十进制数转二进制数”的编写 (5)
二、计算器的使用 (6)
除法运算(÷) (6)
平方运算(^2) (6)
函数cos (∏/3)的计算 (7)
函数arctan (∏/3)的计算 (7)
以2为底的对数的计算(log 2) (8)
十进制数转二进制数的计算(调用dec2bin函数) (8)
二进制数转十进制数的计算(调用bin2dec函数) (9)
三、附各按键的程序源代码 (10)
四、问题和解决方法 (15)
五、心得体会 (15)
参考文献 (15)
计算器的效果图:
一、GUI设计界面:
1.打开GUI
输入Guide 回车或者在工具栏上点击图标打开Guide 窗口:
2.添加按钮
3.根据按钮的作用及视觉效果做一定的修改:
双击按钮(Puch Button)进入按键属性修改显示字符串大小、字体和颜色,然后对按钮的位置进行排布,尽量使按钮集中在静态文本框下面。
4.保存、添加功能函数
把做好的按钮及静态文本框保存后自动弹出Editor的M文本,对然后对相应的pushbutton添加功能函数。以下是相应按钮的功能函数。
(1)数字键编写
在function pushbutton1_Callback(hObject, eventdata, handles)下输入:textString = get(handles.text1,'String');
textString =strcat(textString,'0');
set(handles.text1,'String',textString)
这是使用句柄handles指向对象text1,并以字符串形式来存储数据文本框text1的内容,并存储数个“0”,
然后由set(handles.text1,'String','textString'在text1中输出。
同理,分别在function pushbutton2~10_Callback(hObject, eventdata, handles)下给1~9数字按键下编写此类程序。
(2)符号键的编写
function pushbutton12_Callback(hObject, eventdata, handles)
textString = get(handles.text1,'String');
textString =strcat(textString,'÷');
set(handles.text1,'String',textString)
strcat的作用是将两个字符串连接起来,就是在已输入的存储数据textString 后添加“÷”进行运算。
然后执行set(handles.text1,'String',textString)。符号键‘-’、‘*’、‘/’与‘÷’的运算函数类似。“平方运算”,主要是由“^2”功能实现。
(3)运算符“=”的编写
textString = get(handles.text1,'String');
ans =eval(textString);
“eval”的作用是将符号表达式转换成数值表达式。
再由set(handles.text1,'String',ans)输出。
(4)按键“←back”的编写
textString=get(handles.text1, 'String')
w=length(textString)
t=char(textString)
textString=t(1:w-1) %将w个字符串转成w-1个,即删除了末位字符set(handles.text1,'String',textString)
(5)按键“清空”的编写
set(handles.text1,'String','')
(6)按键“退出”的编写
close(gcf);
(7)按键“二进制数转十进制数”的编写
textString=get(handles.text1,'String')
e = bin2dec(textString);
set(handles.text1,'String',e);
(8)按键“十进制数转二进制数”的编写
textString = get(handles.text1,'String');
textString = strcat(textString,'dec2bin(');
set(handles.text1,'String',textString)
二、计算器的使用除法运算(÷)
平方运算(^2)
函数cos (∏/3)的计算
函数arctan (∏/3)的计算
以2为底的对数的计算(log 2)
十进制数转二进制数的计算(调用dec2bin函数)
二进制数转十进制数的计算(调用bin2dec函数)
经过计算,这些结果均与实际结果相吻合,计算器的功能实现的完好且能实现较大数值的运算,计算结果用科学技术法表示。
三、附各按键的程序源代码
按键“0-9、+、-、×、÷、.、= 、x^2 ”(通过get函数获得输入的字符,函数strcat 获得相应字符,并用set函数进行显示输出):
function pushbutton1_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'0')
set(handles.text1,'String',textString)
function pushbutton2_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'1')
set(handles.text1,'String',textString)
function pushbutton3_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'2')
set(handles.text1,'String',textString)
function pushbutton4_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'3')
set(handles.text1,'String',textString)
function pushbutton5_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'4')
set(handles.text1,'String',textString)
function pushbutton6_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'5')
set(handles.text1,'String',textString)
function pushbutton7_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'6')
set(handles.text1,'String',textString)
function pushbutton8_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'7')
set(handles.text1,'String',textString)
function pushbutton9_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'8')
set(handles.text1,'String',textString)
function pushbutton10_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'9')
set(handles.text1,'String',textString)
function pushbutton11_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'+')
set(handles.text1,'String',textString)
function pushbutton12_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'-')
set(handles.text1,'String',textString)
function pushbutton13_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'*')
set(handles.text1,'String',textString)
function pushbutton14_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'/')
set(handles.text1,'String',textString)
function pushbutton15_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'.')
set(handles.text1,'String',textString)
按键“=”:
function pushbutton16_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
s=eval(textString)
set(handles.text1,'String',s)
按键“x^2”:
function pushbutton17_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
textString=strcat(textString,'^2')
set(handles.text1,'String',textString)
退位键“←back”:
function pushbutton18_Callback(hObject, eventdata, handles) textString=get(handles.text1,'String')
w=length(textString)
t=char(textString)
textString=t(1:w-1)
set(handles.text1,'String',textString)
清空键:
function pushbutton19_Callback(hObject, eventdata, handles)
set(handles.text1,'String','')
退出键:
function pushbutton20_Callback(hObject, eventdata, handles) close(gcf);
% hObject handle to pushbutton20 (see GCBO)
% handles structure with handles and user data (see GUIDATA)
科学计算函数:
按键“√”:通过get函数获得输入的字符,函数strread获得输入字符,并用sqrt函数计算结果,set函数进行显示输出
textString = get(handles.text1,'String');
if(strcmp(textString,'0')==1)
set(handles.text1,'String','0') ;
else
a = strread(textString, '%f');
a=sqrt(a);
set(handles.text1,'String',a)
end
按键“sin”(通过get函数获得输入的字符,函数strread获得输入字符,并用sin函数计算结果,set函数进行显示输出):
textString = get(handles.text1,'String');
textString = strcat(textString,'sin(');
set(handles.text1,'String',textString)
按键“cos”:
textString = get(handles.text1,'String');
textString = strcat(textString,'(');
set(handles.text1,'String',textString)
按键“tan”:
textString = get(handles.text1,'String');
if((strcmp(textString,'1.57')==1)||(strcmp(textString,'-1.57')==1)) set(handles.edit1,'String','inf');
else
textString = strcat(textString,'tan(');
set(handles.text1,'String',textString)
end
按键“arcsin”:
textString = get(handles.text1,'String');
textString = strcat(textString,'asin(');
set(handles.text1,'String',textString)
按键“arccos”:
textString = get(handles.text1,'String');
textString = strcat(textString,'acos(');
set(handles.text1,'String',textString)
按键“arctan”:
textString = get(handles.text1,'String'); textString = strcat(textString,'atan('); set(handles.text1,'String',textString)
按键“log2”:
textString = get(handles.text1,'String'); if(strcmp(textString,'0')==1)
set(handles.text1,'String','error') ; else
a = strread(textString, '%f');
a=log2(a);
set(handles.text1,'String',a)
end
按键“(”:
textString = get(handles.text1,'String'); textString = strcat(textString,' (');
set(handles.text1,'String',textString)
按键“)”:
textString = get(handles.text1,'String'); textString = strcat(textString,')');
set(handles.text1,'String',textString)
按键“二进制数转十进制数”:
textString=get(handles.text1,'String')
e = bin2dec(textString);
set(handles.text1,'String',e);
按键“十进制数转二进制数”:
textString = get(handles.text1,'String'); textString = strcat(textString,'dec2bin('); set(handles.text1,'String',textString)
四、问题和解决方法
1.本次课程设计中开始时遇到的问题是数据进行清零后,再输入其他的数据,清零后的字符‘0’仍会保留,会影响其他数据,解决办法是将数据用空格替换掉就实现了清空: set(handles.text1,'String','')
2.在定义正弦余弦等函数的时候,需要注意其定义域,值域的问题。
3.开始时我的“sin”函数编程如下:
textString = get(handles.text1,'String');
a = strread(textString, '%f');
a=sin(a);
set(handles.text1,'String',a)
%这样只能在输入完数据后按“sin”键实现运算,很不直观。
修改后可以实现按下sin键后显示“sin(”再输入要运算的数据之后加上“)”按下“=”键后就可以运算出结果了,这样相对更直观明了。
textString = get(handles.text1,'String');
textString = strcat(textString,'sin(');
set(handles.text1,'String',textString)
4.在编写十进制数转二进制数时,计算的结果总是会在前面多出“110”,使得转换结果错误,后来通过精简改进程序,直接调用des2bin函数计算,所得的测试结果都是正确的。
五、心得体会
本次课程设计用MATLAB的GUI接口设计一个简单的计算器,主要对数字及运算“0-9、+、-、×、÷、.、= 、x^2 、√、sin、arcsin、log2”等的代码程序的了解,在设计的过程中也遇到不少的问题,通过和同学的讨论,和老师的交流,让我知道了自己的错误和不足,最终顺利地解决了这些问题。这次课程设计,使我进一步加深了对课本知识的了解和掌握,巩固了所学的基本知识,更加体会到了MATLAB功能的丰富,更加深刻的认识了MATLAB,熟练了编程设计。
其中对计算器按键的颜色、大小和排版,使我的思维更加的缜密,让我在以后的工作生活中,得到了思维的锻炼。在以后学习中,我会更加刻苦,以锻炼自己的能力。
参考文献
(1)刘卫国.《MATLAB程序设计与应用》.北京:高等教育出版
(2)郑阿奇.《MATLAB实用教程》.北京:电子工业出版社
(3)罗华飞.《MA TLAB GUI设计学习手记》.北京:北京航空航天大学出版社
( 4 ) 张威.《MATLAB基础与编程入门》.西安:西安电子科技大学出版社
(5)孙屹.《MATLAB通信仿真开发手册》.北京:国防工业出版社