function varargout = jisuanqi4(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @jisuanqi4_OpeningFcn, ...
'gui_OutputFcn', @jisuanqi4_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 jisuanqi4 is made visible.
function jisuanqi4_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
%% 关闭所有警告信息
warning off all;
%% 修改GUI左上角图标
javaFrame = get(hObject, 'JavaFrame');
javaFrame.setFigureIcon(javax.swing.ImageIcon('icon1.jpg'));
%% 初始化参数
reset(hObject, eventdata, handles);
function reset(hObject, ~, handles)
%% 运算表达式是否为fun(a, b);值为false时,运算表达式为a(op)b
setappdata(hObject, 'isFun', false);
%% 指定当前的值是否为小数,只在十进制模式时,值才可能为true
setappdata(hObject, 'isDecimal', false);
%% 指定当前是否继续输入;若值为false时,需要清屏
setappdata(hObject, 'showExpand', false);
%% 表征当前是否按下了2NDF按键
setappdata(hObject, 'isSecFun', false);
%% 表征是否已经输入了运算符;仅当输入运算符时,该值为真
setappdata(hObject, 'hasOperator', false);
%% 表征当前的进制模式
setappdata(hObject, 'base', uint8(10));
%% 创建运算表达式,作为应用数据存入exp域内
setappdata(hObject, 'exp', ' ');
handles.datas = [];
guidata(hObject, handles);
function varargout = jisuanqi4_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function valDec = oct2dec(valOct)
str = num2str(valOct);
val = str - '0';
twos = pow2(length(str)*3-3 : -3 : 0);
valDec = sum(val .* twos);
function number(~, ~, handles, numChar)
%% 获取参数
isDecimal = getappdata(gcf, 'isDecimal');
showExpand = getappdata(gcf, 'showExpand');
base = getappdata(gcf, 'base');
%% 根据输入的字符numChar和参数,设置屏显字符串
str = get(handles.display, 'string');
if ~showExpand || (str(1) == '0' && (~isDecimal)) %若需要清屏
if base == uint8(10) %若当前为十进制
set(handles.display, 'string', [numChar '.']);
else %若当前为其它进制
set(handles.display, 'string', numChar);
end
elseif base == uint8(10) %若当前为十进制
if length(str) < 15 %数的长度小于15
if isDecimal %小数
set(handles.display, 'string', [str numChar])
else
set(handles.display, 'string', [str(1 : end-1) numChar '.']);
end
end
elseif base == uint8(8) && length(str) < 20 %若当前为八进制
set(handles.display, 'string', [str numChar]);
elseif base == uint8(16) && length(str) < 20 %若当前为十六进制
set(handles.display, 'string', [str numChar]);
elseif base == uint8(2) && length(str) < 28 %若当前为二进制
set(handles.display, 'string', [str numChar]);
end
setappdata(gcf, 'hasOperator', false);
setappdata(gcf, 'showExpand', true);
function num7_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '7');
function num8_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '8');
function num9_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '9');
function num4_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '4');
function num5_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '5');
function num6_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '6');
function num2_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '2');
function num3_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '3');
function num0_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '0');
function num1_Callback(hObject, eventdata, handles)
number(hObject, eventdata, handles, '1');
function num_fuhao_Callback(~, ~, handles)
str = get(handles.display, 'string');
if strcmp(str, '0.')
return;
end
%% 获取参数
hasOperator = getappdata(gcf, 'hasOperator'); %是否添加了运算符
%% 对操作数的符号取反
if ~hasOperator %若当前未定义运算符
if str(1) == '-'
set(handles.display, 'string', str(2 : end));
else
set(handles.display, 'string', ['-' str]);
end
else %若在定义了运算符的情况下按了取反按钮,重置计算器状态
setappdata(gcf, 'isFun', false);
setappdata(gcf, 'isDecimal', false);
setappdata(gcf, 'showExpand', false);
setappdata(gcf, 'isSecFun', false);
setappdata(gcf, 'hasOperator', false);
setappdata(gcf, 'base', uint8(10));
setappdata(gcf, 'exp', ' ');
set(handles.display, 'String', '0.');
end
function dot_Callback(~, ~, handles)
%% 获取参数
isDecimal = getappdata(gcf, 'isDecimal'); %是否为小数
showExpand = getappdata(gcf, 'showExpand');
if ~showExpand
set(handles.display, 'string', '0.');
end
%% 若之前不处于小数模式,更新为小数模式,且数据显示为扩展模式
if ~isDecimal
setappdata(gcf, 'isDecimal', true);
setappdata(gcf, 'showExpand', true);
end
function num = str2val(b, base)
if base == uint8(2)
num = bin2dec(b);
elseif base == uint8(16)
num = hex2dec(b);
elseif base == uint8(8)
num = oct2dec(eval(b));
else
num = str2double(b);
end
function equal_Callback(hObject, ~, handles)
%% 获取参数
isFun = getappdata(gcf, 'isFun'); %是否为fun(a, b)
hasOperator = getappdata(gcf, 'hasOperator'); %是否添加了运算符
base = getappdata(gcf, 'base'); %数值的基数
exp = getappdata(gcf, 'exp');
b = get(handles.display, 'string');
num = str2val(b, base);
if ~isFun
if hasOperator
exp(end) = '';
else
exp = [exp sprintf('(%g)', num)];
end
else
exp = [exp sprintf('%g)', floor(num))];
setappdata(gcf, 'isFun', false);
end
try
res = eval(exp);
catch
if base == uint8(10)
set(handles.display, 'string', '0.')
else
set(handles.display, 'string', '0')
end
setappdata(gcf, 'showExpand', false);
setappdata(gcf, 'exp', ' ');
return;
end
c = val2str(res, base);
setappdata(gcf, 'showExpand', false);
set(handles.secndf, 'Visible', 'off');
setappdata(gcf, 'exp', ' ');
set(handles.display, 'string', c);
function xy_Callback(hObject, eventdata, handles)
%% 获取参数
isSecFun = getappdata(gcf, 'isSecFun'); %是否为第二函数
hasOperator = getappdata(gcf, 'hasOperator'); %是否添加了运算符
base = getappdata(gcf, 'base'); %数值的基数
exp = getappdata(gcf, 'exp');
if base == uint8(10)
b = get(handles.display, 'string');
num = str2val(b, base);
if ~isSecFun
if hasOperator
exp(end) = '^';
else
setappdata(gcf, 'hasOperator', true);
exp = [exp num2str(num) '^'];
end
setappdata(gcf, 'showExpand', false);
setappdata(gcf, 'exp', exp);
else
funa_b(hObject, eventdata, handles, 'xyinv(%g,');
end
end
function c = xyinv(a, b)
c = a^(b^(-1));
function c = val2str(res, base)
if base == uint8(10)
c = sprintf('%g', res);
if isempty(find(c == '.', 1))
c = [c '.'];
end
elseif base == uint8(2)
c = dec2bin(abs(res));
elseif base == uint8(16)
c = dec2hex(abs(res));
else
c = dec2base(abs(res), 8);
end
function add_min_mul_div(hObject, eventdata, handles, operator)
%% 获取参数
hasOperator = getappdata(gcf, 'hasOperator'); %是否添加了运算符
base = getappdata(gcf, 'base'); %数值的基数
exp = getappdata(gcf, 'exp');
%% 加号运算
b = get(handles.display, 'string');
num = str2val(b, base);
if hasOperator
exp(end) = operator;
else
exp = [exp num2str(num) operator];
setappdata(gcf, 'hasOperator', true);
end
setappdata(gcf, 'showExpand
科学计算器.zip_Matlab GUI工程_improveace_matlabgui_科学计算 GUI_计算器 GUI
版权申诉
68 浏览量
2022-07-14
18:49:13
上传
评论
收藏 22KB ZIP 举报
小波思基
- 粉丝: 70
- 资源: 1万+
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0