3.5. Calculator with undo In this question, you wi also write a function that ca
ID: 3794058 • Letter: 3
Question
3.5. Calculator with undo In this question, you wi also write a function that calculates the result of an arithmetic expression between scalars, where the arithmetic expression is given as a character string (e.g., 2*30+5 4'). The operators allowed in the arithmetic expression are +, -, *, /, and , which represent addition, subtraction, multiplication, division, and exponentiation, re- spectively. Additionally, we introduce the undo operator !. The operator ! signifies "cancel the previous operation". Two successive undo operators (!!) signify "cancel the previous two operations", and so on. The operation that the undo operator removes consists of the of the number and the operator that precede the undo operator. For examExplanation / Answer
function my_calculator
figure('Position',[200 200 220 200],'Name','Calculator','NumberTitle','off','MenuBar','None','Resize','off');
txt=uicontrol('Style','Text','Position',[10 165 200 30],'String','0');
global stack value top op tops opstack num1 num2 flag;
flag=0;
x=10;
y=130;
top=1;
tops=1;
name=['7','8','9','/','4','5','6','*','1','2','3','-','0','+','!','='];%k
for k=1:size(name,2)
uicontrol('Style','Pushbutton','Position',[x y 50 30],'String' ,name(k),'Callback',@analyse) ;
x=x+50;
if(mod(k,4)==0)
x=10;y=y-35;
end
end
function analyse(object,~)
num=str2double(get(object,'String'));
if((num>=0)&&(num<=9))
value=num;
accept();
else
op=get(object,'String');
if(op=='C')
top=1;
tops=1;
set(txt,'String','0');
else
solve();
end
end
end
function accept()
stack(top)=value;
if((stack(1)==0)&&(top==2))
stack(1)=stack(top);
top=top-1;
end
str=num2str(stack(1));
for i=2:top
str=strcat(str,num2str(stack(i)));
end
top=top+1;
set(txt,'String',' ');
set(txt,'String',str);
flag=0;
end
function solve()
if((top~=1)||(flag==1))
opstack(tops)=op;
tops=tops+1;
if((tops==2)&&(flag~=1))
str=num2str(stack(1));
for i=2:top-1
str=strcat(str,num2str(stack(i)));
end
num1=str2double(str);
flag=1;
top=1;
elseif(tops>=3)
if(flag==0)
str=num2str(stack(1));
for i=2:top-1
str=strcat(str,num2str(stack(i)));
end
num2=str2double(str);
top=1;
if(opstack(tops-1)=='=')
calculate();
set(txt,'String',' ');
set(txt,'String',num2str(num1));
flag=1;
tops=1;
else
calculate();
set(txt,'String',' ');
set(txt,'String',num2str(num1));
flag=1;
tmp=opstack(tops-1);
opstack(1)=tmp;
tops=tops-1;
end
else
tmp=opstack(tops-1);
opstack(1)=tmp;
tops=tops-1;
end
end
end
end
function calculate()
switch (opstack(1))
case '+'
num1=num1+num2;
case '-'
num1=num1-num2;
case '/'
num1=num1/num2;
case '*'
num1=num1*num2;
end
end
end
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.