Ενδεικτική λύση διαγωνίσματος Εξετ. Φεβρουαρίου 2025.
- Δευτέρα, 24 Φεβρουαρίου 2025 - 10:44 μ.μ. -
 
 
#include <random>
#include <iostream>

template <typename PREV, typename NEXT>
class Link
{
protected:
PREV* m_prev;
NEXT* m_next;

public:
Link(PREV* p=0, NEXT* n=0) : m_prev(p), m_next(n) {}
void setPrev(PREV* p) { m_prev = p; }
void setNext(NEXT* n) { m_next = n; }
};

#define ADD 0
#define SUBTRACT 1
#define MULTIPLY 2

class Operator : public Link<long, long>
{
int m_type = ADD;

public:
Operator(int t) : m_type(t) {}
long operator ()() const
{
if (!m_prev)
return 0;
if (!m_next)
return *m_prev;
switch (m_type)
{
case ADD : return *m_prev + *m_next; break;
case SUBTRACT: return *m_prev - *m_next; break;
case MULTIPLY: return *m_prev * *m_next; break;
default: return *m_prev;
}
}

operator std::string() const
{
switch (m_type)
{
case ADD: return " + "; break;
case SUBTRACT: return " - "; break;
case MULTIPLY: return " * "; break;
}
}
};

int main()
{
long student_id = 1000000;
srand(student_id);
int num_operands = 10 + rand() % 10;
long left_operand = rand() % 20 + 1;

for (int i = 0; i < num_operands; i++)

{
long right_operand = rand() % 20 + 1;

Operator* op = new Operator(rand() % 3);

op->setPrev(&left_operand);
op->setNext(&right_operand);

long res = (*op)();

std::cout << left_operand << (std::string)*op << right_operand << " = " << res << "\n";
left_operand = res;

delete op;
}
getchar();
}