LebGeeks

A community for technology geeks in Lebanon.

You are not logged in.

#1 October 13 2010

Joe
Member

Exercise - Polish Calculator

Here's yet another classical problem in programming. This problem is not language specific, although I would strongly advice using C or C++.

Reverse Polish Notation

From Wikipedia:

"The Reverse Polish Notation (RPN) is a mathematical notation wherein ever operator follows all of its operands".

An example is often worth a thousand words. So there goes:

( 5 + ( ( 3 * 13 ) + 1 ) ) / 9

is equivalent to:

5 3 13 * 1 + + 9 /

And here are the steps to resolve this equation:

5 39 1 + + 9 /
5 40 + 9 /
45 9 /
5

Take a look at each step, and you'll understand how this notation works.

Exercise

Develop a RPN Calculator, a program that would take as an input a RPN string and would output the result.
Then use this program to give the result of:

23 76 66 + * 56 8 / - 13 12 * -
31 54 57 + 102 - * 76 12 3 + *
1 34 26 57 + - 49 + /  13 8 - 7 * 5 65 - -

Offline

#2 October 13 2010

mesa177
Member

Re: Exercise - Polish Calculator

rahmu, the last two equations have a missing operator (number of operators = number of entries - 1) and the last equation would give division by zero since 26 + 57 = 83 and 34 - 83 = -49 which would yield:

1 0 / 13 8 - 7 * 5 65 - -
|______ division by zero (1/0)

As for the code and the answer to the first equation:

clear all
clc

fid = fopen('RPN input.txt');     % Open file where input strings of
                                  % arithmetic equation are located
while ~feof(fid)                  % Read input strings until end of file
    numeric = [];
    C = {};
    n = 1;
    tline = fgetl(fid);           % Read current line
    while ~isempty(tline)         % Store data of input line as cell of strings
        k = 0;
        if (k+1 < size(tline,2))
            while ~isequal(tline(k+1),' ') 
                  k = k + 1;
            end
        else
            k = 1;
        end
        C{n} = tline(1:k); 
        n = n + 1;
        if (size(tline,2) > 1)
            tline = tline(k+2:end);
        else
            tline = [];
        end
    end
    for i = 1:size(C,2)           % Perform arithmetic operation
        if ~isnan(str2double(C{i}))
           numeric = horzcat(numeric,str2double(C{i}));
        else
           num1 = numeric(end-1); % First entry for arithmetic operation
           num2 = numeric(end);   % Second entry for arithmetic operation
           switch C{i}
                 case '+'
                      result = num1 + num2;
                 case '-'
                      result = num1 - num2;
                 case '*'
                      result = num1 * num2;
                 case '/'
                      result = num1/num2;
                 otherwise
                      error('Invalid arithmatic operation.')
           end
           numeric = numeric(1:end-1);
           numeric(end) = result;
        end
    end
    disp(strcat('The result of the arithmetic operation is:',num2str(numeric)));
end
status = fclose(fid);             % Close file

Answer: The result of the arithmetic operation is:3103

The second arithmetic operation would give the following result:
The result of the arithmetic operation is:279  1140

Offline

#3 October 13 2010

Joe
Member

Re: Exercise - Polish Calculator

That's the point of the exercise. I am not repeating the same exercise three times. We're not at school

Your program should be able to catch those errors.

Offline

#4 October 13 2010

mesa177
Member

Re: Exercise - Polish Calculator

rahmu wrote:

That's the point of the exercise. I am not repeating the same exercise three times. We're not at school

Your program should be able to catch those errors.

Fine, whatever, my work here is done then cause my program caught them:

The result of the arithmetic operation is:3103
The result of the arithmetic operation is:279  1140
Warning: Divide by zero.
??? Subscript indices must either be real positive integers or logicals.

Next...

Last edited by mesa177 (October 13 2010)

Offline

#5 October 14 2010

Joe
Member

Re: Exercise - Polish Calculator

Your second answer is incorrect: it should've returned "Missing operand".

Your third answer should return a warning more intelligible.

Both operations should exit gracefully.

Offline

#6 October 14 2010

mesa177
Member

Re: Exercise - Polish Calculator

clear all
clc

fid = fopen('RPN input.txt');     % Open file where input strings of
                                  % arithmetic equation are located
while ~feof(fid)                  % Read input strings until end of file
    numeric = [];
    C = {};
    n = 1;
    tline = fgetl(fid);           % Read current line
    while ~isempty(tline)         % Store data of input line as cell of strings
        k = 0;
        if (k+1 < size(tline,2))
            while ~isequal(tline(k+1),' ') 
                  k = k + 1;
            end
        else
            k = 1;
        end
        C{n} = tline(1:k); 
        n = n + 1;
        if (size(tline,2) > 1)
            tline = tline(k+2:end);
        else
            tline = [];
        end
    end
    for i = 1:size(C,2)           % Perform arithmetic operation
        if ~isnan(str2double(C{i}))
           numeric = horzcat(numeric,str2double(C{i}));
        else
           num1 = numeric(end-1); % First entry for arithmetic operation
           num2 = numeric(end);   % Second entry for arithmetic operation
           switch C{i}
                 case '+'
                      result = num1 + num2;
                 case '-'
                      result = num1 - num2;
                 case '*'
                      result = num1 * num2;
                 case '/'
                      if isinf(num1/num2)
                          break;
                      else
                          result = num1/num2;
                      end
                 otherwise
                      error('Invalid arithmatic operation.')
           end
           numeric = numeric(1:end-1);
           numeric(end) = result;
        end
    end
    if (size(numeric,2) == 2)
        disp('Missing 1 operand.');
    elseif (size(numeric,2) > 1)
        disp(strcat('Missing',' ',num2str(size(numeric,2)-1),' operands.'));
    else    
        disp(strcat('The result of the arithmetic operation is:',...
                    num2str(numeric)));
    end
end
status = fclose(fid);             % Close file

Answer:
The result of the arithmetic operation is:3103
Missing 1 operand.
Warning: Divide by zero.
Missing 1 operand.

Offline

Board footer