blob: a7608ae3e5a96e394832209f8c95b22c92a89585 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
# Arithmetic expression computator
<img src="arithmetic-expression-computator.png" />
## Introduction
Remarkably, this program is written in C without using library features at all.
Assembler modules are used for program entry point and system call wrappers.
This program is based on two algorithms: reverse polish notation (RPN) and
Dijkstra's algorithm.
Any arithmetic expression can be calculated. To do this, the expression needs to
be represented in an RPN, in that operands are written first, then
the operation sign; operands can be any complex expressions.
For example, the expression `(x+y)*(1-z)` in RPN would be written as: x y + 1 z -
\*. All this is calculated using the stack.
To translate an arithmetic expression from traditional infix notation to RPN we
need to use Dijkstra's algorithm.
The stack is also used here, but a new one.
According to this algorithm, the initial expression is viewed from left to
right. The elements are written out either to the RPN stack or to the operation
stack (for Dijkstra's algorithm). While viewing the expression, open brackets
and operation symbols (in some cases) are inserted into the operation stack, and
operands as well as operation symbols (again, in some cases) are inserted into
the RPN stack. The algorithm is described in more detail in the book А.В.
Столяров "Программирование: введение в профессию" (том 1, ДМК Пресс, стр. 644).
## Building and usagea
```
git clone https://git.scratko.xyz/arithmetic-expression-computator
cd arithmetic-expression-computator
make
```
Launch the program `./arith_exp`
After starting, enter an arithmetic expression.
Notes:
- the expression must not contain any space characters
- negative values must be surrounded by brackets
- you can see an example of the expression on the screenshot above.
|