commit fdb76019cfb05a1392c76442be012c655bd76392 Author: Aelita4 Date: Mon Nov 9 12:53:27 2020 +0100 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..419ed82 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,42 @@ +{ + "files.associations": { + "atomic": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "cwchar": "cpp", + "exception": "cpp", + "initializer_list": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "memory": "cpp", + "new": "cpp", + "ostream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "utility": "cpp", + "xfacet": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocinfo": "cpp", + "xlocnum": "cpp", + "xmemory": "cpp", + "xstddef": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xutility": "cpp" + } +} \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..a3f3074 --- /dev/null +++ b/main.cpp @@ -0,0 +1,770 @@ +#include +#include +#include + +//COLORS +#define BLACK 0 +#define BLUE 1 +#define GREEN 2 +#define AQUA 3 +#define RED 4 +#define PURPLE 5 +#define YELLOW 6 +#define WHITE 7 +#define GRAY 8 +#define LIGHT_BLUE 9 +#define LIGHT_GREEN 10 +#define LIGHT_AQUA 11 +#define LIGHT_RED 12 +#define LIGHT_PURPLE 13 +#define LIGHT_YELLOW 14 +#define BRIGHT_WHITE 15 + +//FIND TYPES +#define ALL 0 +#define NUMS 1 +#define CHARS 2 +#define EMPTY 3 + +HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + +void color(int foreground, int background) +{ + int color = (background * 16) + foreground; + SetConsoleTextAttribute(hConsole, color); +} + +void gotoxy(int x, int y) +{ + COORD c; + c.X = x; + c.Y = y; + SetConsoleCursorPosition(hConsole, c); +} + +char getCursorChar() +{ + char c = '\0'; + CONSOLE_SCREEN_BUFFER_INFO con; + if (hConsole != INVALID_HANDLE_VALUE && + GetConsoleScreenBufferInfo(hConsole, &con)) + { + DWORD read = 0; + if (!ReadConsoleOutputCharacterA(hConsole, &c, 1, + con.dwCursorPosition, &read) || read != 1 + ) + c = '\0'; + } + return c; +} + +char readChar(int x, int y) +{ + gotoxy(x, y); + char c = getCursorChar(); + return c; +} + +void vanishCursor() +{ + CONSOLE_CURSOR_INFO info; + info.dwSize = 100; + info.bVisible = FALSE; + SetConsoleCursorInfo(hConsole, &info); +} + +int priority(char c) +{ + switch (c) + { + case '+': + case '-': + return 1; + case '*': + case '/': + return 2; + } + + return 0; +} + +bool checkChar(char c, int type) +{ + char chars[] = {'+', '-', '*', '/', '(', ')', '='}; + int nums[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; + + switch(type) + { + case ALL: + for(int i = 0; i < 7; i++) + { + if(c == chars[i]) return true; + } + for(int i = 0; i < 10; i++) + { + if(c - '0' == nums[i]) return true; + } + break; + case NUMS: + for(int i = 0; i < 7; i++) + { + if(c == chars[i]) return true; + } + break; + case CHARS: + for(int i = 0; i < 10; i++) + { + if(c - '0' == nums[i]) return true; + } + break; + case EMPTY: + if(c == ' ' || c == '\0') return true; + break; + default: + return false; + break; + } + + return false; +} + +void heapPointer(int y) +{ + gotoxy(0, 0); + std::cout << y; + char t = '\0'; + + if(y > 0) + { + color(GREEN, GREEN); + gotoxy(1, 3 + y); + std::cout << " "; + gotoxy(13, 3 + y); + std::cout << " "; + color(RED, BLACK); + gotoxy(2, 3 + y); + for(int i = 0; i <= 10; i++) + { + if(checkChar(readChar(2 + i, 3 + y), EMPTY)) + { + t = readChar(2 + i, 3 + y); + std::cout << t; + } + else std::cout << " "; + } + } + + if(y < 27) + { + color(GREEN, GREEN); + gotoxy(1, 5 + y); + std::cout << " "; + gotoxy(13, 5 + y); + std::cout << " "; + color(RED, BLACK); + gotoxy(2, 5 + y); + for(int i = 0; i <= 10; i++) + { + if(checkChar(readChar(2 + i, 5 + y), EMPTY)) + { + t = readChar(2 + i, 5 + y); + std::cout << t; + } + else std::cout << " "; + } + } + + color(RED, PURPLE); + gotoxy(1, 4 + y); + std::cout << ">"; + gotoxy(13, 4 + y); + std::cout << "<"; + + color(YELLOW, LIGHT_PURPLE); + gotoxy(2, 4 + y); + for(int i = 0; i <= 10; i++) std::cout << " "; +} + +std::string stringToONP(std::string s, int speed = 500) +{ + heapPointer(0); + std::string out = ""; + int len = s.length(); + char tmp; + + char heap[100] {}; + for (int i = 0; i < 100; i++) heap[i] = '\0'; + int counter = 0; + + for (int i = 0; i < len; i++) + { + color(WHITE, BLACK); + gotoxy(50 + i, 2); + std::cout << " ^"; + tmp = s.c_str()[i]; + switch (tmp) + { + case '=': + for (; counter > 0; counter--) + { + out += heap[counter - 1]; + /*gotoxy(3 + (2 * (counter - 1)), 2); + color(RED, BLACK); + std::cout << " ";*/ + gotoxy(2, 3 + counter); + color(YELLOW, LIGHT_PURPLE); + std::cout << " "; + heapPointer(counter); + } + Sleep(500); + color(RED, BLACK); + gotoxy(50 + len, 2); + std::cout << " "; + color(WHITE, BLACK); + gotoxy(42, 3); + std::cout << out; + heapPointer(counter); + Sleep(1000); + return out; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + out += tmp; + break; + case '+': + case '-': + case '*': + case '/': + while (counter) + { + if (priority(tmp) > priority(heap[counter - 1])) break; + out += heap[--counter]; + heapPointer(counter); + heap[counter] = '\0'; + /*gotoxy(3 + (2 * counter), 2); + color(RED, BLACK); + std::cout << " "; + color(WHITE, BLACK);*/ + gotoxy(2, 3 + counter); + color(YELLOW, LIGHT_PURPLE); + if(counter != 0) std::cout << " "; + color(WHITE, BLACK); + } + heap[counter] = tmp; + /*gotoxy(3 + (2 * counter), 2); + color(RED, BLACK); + std::cout << tmp; + color(WHITE, BLACK);*/ + heapPointer(counter + 1); + gotoxy(2, 4 + counter); + color(YELLOW, LIGHT_PURPLE); + std::cout << tmp; + counter++; + color(WHITE, BLACK); + break; + case '(': + heap[counter] = tmp; + /*gotoxy(3 + (2 * counter), 2); + color(RED, BLACK); + std::cout << tmp; + color(WHITE, BLACK);*/ + heapPointer(counter + 1); + gotoxy(2, 4 + counter); + color(YELLOW, LIGHT_PURPLE); + std::cout << tmp; + counter++; + color(WHITE, BLACK); + break; + case ')': + + for (; heap[counter] != '('; counter--) + { + heapPointer(counter); + if (priority(heap[counter]) > priority(heap[counter - 1])) + { + out += heap[counter]; + heap[counter] = '\0'; + //gotoxy(3 + (2 * counter), 2); + gotoxy(2, 4 + counter); + color(YELLOW, LIGHT_PURPLE); + std::cout << " "; + } + color(WHITE, BLACK); + } + + heap[counter] = '\0'; + /*gotoxy(3 + (2 * counter), 2); + color(RED, BLACK); + std::cout << " "; + color(WHITE, BLACK);*/ + heapPointer(counter + 1); + gotoxy(2, 4 + counter); + color(YELLOW, LIGHT_PURPLE); + std::cout << " "; + color(WHITE, BLACK); + break; + case ' ': + break; + } + gotoxy(42, 3); + std::cout << out; + Sleep(speed); + } + + return out; +} + +int calculateONP(std::string s, int speed = 500) +{ + heapPointer(0); + int out = 0; + int len = s.length(); + char tmp; + int counter = 0; + int calculate = 0; + + int heap[100]{}; + for (int i = 0; i < 100; i++) heap[i] = 0; + + for (int i = 0; i < len; i++) + { + //gotoxy(1 + i, 8); + gotoxy(41 + i, 4); + std::cout << " ^"; + tmp = s.c_str()[i]; + switch (tmp) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + heap[counter] = tmp - '0'; + //gotoxy(3 + (2 * counter), 2); + gotoxy(2, 4 + counter); + color(YELLOW, LIGHT_PURPLE); + std::cout << tmp; + gotoxy(42 + i, 3); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(41 + i, 4); + std::cout << " ^"; + color(WHITE, BLACK); + counter++; + heapPointer(counter); + break; + case '+': + calculate = heap[counter - 2] + heap[counter - 1]; + heap[counter - 2] = 0; + heap[counter - 1] = 0; + //(((2+2)+2)+2)+2= + //gotoxy(3 + (2 * (counter - 2)), 2); + gotoxy(2, 4 + counter - 2); + color(YELLOW, LIGHT_PURPLE); + std::cout << " "; + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << " "; + counter -= 2; + heapPointer(counter); + heap[counter++] = calculate; + heapPointer(counter); + color(YELLOW, LIGHT_PURPLE); + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << calculate; + gotoxy(42 + i, 3); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(41 + i, 4); + std::cout << " ^"; + color(WHITE, BLACK); + break; + case '-': + calculate = heap[counter - 2] - heap[counter - 1]; + heap[counter - 2] = 0; + heap[counter - 1] = 0; + //gotoxy(3 + (2 * (counter - 2)), 2); + gotoxy(2, 4 + counter - 2); + color(YELLOW, LIGHT_PURPLE); + std::cout << " "; + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << " "; + counter -= 2; + heapPointer(counter); + heap[counter++] = calculate; + heapPointer(counter); + color(YELLOW, LIGHT_PURPLE); + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << calculate; + gotoxy(42 + i, 3); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(41 + i, 4); + std::cout << " ^"; + color(WHITE, BLACK); + break; + case '*': + calculate = heap[counter - 2] * heap[counter - 1]; + heap[counter - 2] = 0; + heap[counter - 1] = 0; + //gotoxy(3 + (2 * (counter - 2)), 2); + gotoxy(2, 4 + counter - 2); + color(YELLOW, LIGHT_PURPLE); + std::cout << " "; + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << " "; + counter -= 2; + heapPointer(counter); + heap[counter++] = calculate; + heapPointer(counter); + color(YELLOW, LIGHT_PURPLE); + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << calculate; + gotoxy(42 + i, 3); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(41 + i, 4); + std::cout << " ^"; + color(WHITE, BLACK); + break; + case '/': + if (heap[counter - 1] == 0) + { + color(RED, BLACK); + gotoxy(43 + len, 3); + std::cout << "(failure)"; + color(LIGHT_RED, BLACK); + gotoxy(42 + i, 3); + std::cout << tmp; + gotoxy(41 + i, 4); + std::cout << " ^"; + gotoxy(15, 5); + color(RED, BLACK); + std::cout << "Invalid operation at position "; + color(LIGHT_RED, BLACK); + std::cout << i + 1; + color(RED, BLACK); + std::cout << " (division by zero)"; + /*gotoxy(2, 11); + std::cout << "DIV_ZERO_ERROR";*/ + color(WHITE, BLACK); + return 0; + } + calculate = heap[counter - 2] / heap[counter - 1]; + heap[counter - 2] = 0; + heap[counter - 1] = 0; + //gotoxy(3 + (2 * (counter - 2)), 2); + gotoxy(2, 4 + counter - 2); + color(YELLOW, LIGHT_PURPLE); + std::cout << " "; + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << " "; + counter -= 2; + heapPointer(counter); + heap[counter++] = calculate; + heapPointer(counter); + color(YELLOW, LIGHT_PURPLE); + //gotoxy(3 + (2 * (counter - 1)), 2); + gotoxy(2, 4 + counter - 1); + std::cout << calculate; + gotoxy(42 + i, 3); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(41 + i, 4); + std::cout << " ^"; + color(WHITE, BLACK); + break; + } + + Sleep(speed); + } + gotoxy(15, 5); + std::cout << "RESULT: " << heap[counter - 1]; + return heap[counter - 1]; +} + +bool validate(std::string s, int speed = 250) +{ + int len = s.length(); + + if(len < 2) + { + gotoxy(51, 1); + color(LIGHT_RED, BLACK); + std::cout << s; + gotoxy(52 + len, 1); + color(RED, BLACK); + std::cout << "(failure) "; + gotoxy(15, 3); + color(RED, BLACK); + std::cout << "Invalid formula (too short)"; + color(WHITE, BLACK); + return false; + } + + char tmp; + int brackets = 0; + + for (int i = 0; i < len; i++) + { + tmp = s.c_str()[i]; + switch (tmp) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '=': + gotoxy(51 + i, 1); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(50 + i, 2); + std::cout << " ^"; + break; + case '+': + case '-': + case '*': + case '/': + if(s.c_str()[i - 1] == '+' || + s.c_str()[i - 1] == '-' || + s.c_str()[i - 1] == '*' || + s.c_str()[i - 1] == '/') + { + gotoxy(52 + len, 1); + color(RED, BLACK); + std::cout << "(failure) "; + gotoxy(50 + i, 2); + color(LIGHT_RED, BLACK); + std::cout << " ^"; + gotoxy(51 + i, 1); + std::cout << tmp; + gotoxy(15, 3); + color(RED, BLACK); + std::cout << "Invalid character '"; + color(LIGHT_RED, BLACK); + std::cout << tmp; + color(RED, BLACK); + std::cout << "' at position "; + color(LIGHT_RED, BLACK); + std::cout << i + 1; + color(RED, BLACK); + std::cout << " (cannot use operator as element)"; + color(WHITE, BLACK); + return false; + } + gotoxy(51 + i, 1); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(50 + i, 2); + std::cout << " ^"; + break; + case '(': + gotoxy(51 + i, 1); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(50 + i, 2); + std::cout << " ^"; + brackets++; + break; + case ')': + gotoxy(51 + i, 1); + color(LIGHT_GREEN, BLACK); + std::cout << tmp; + gotoxy(50 + i, 2); + std::cout << " ^"; + brackets--; + if(brackets < 0) + { + gotoxy(52 + len, 1); + color(RED, BLACK); + std::cout << "(failure) "; + gotoxy(50 + i, 2); + color(LIGHT_RED, BLACK); + std::cout << " ^"; + gotoxy(51 + i, 1); + std::cout << tmp; + gotoxy(15, 3); + color(RED, BLACK); + std::cout << "Invalid character '"; + color(LIGHT_RED, BLACK); + std::cout << tmp; + color(RED, BLACK); + std::cout << "' at position "; + color(LIGHT_RED, BLACK); + std::cout << i + 1; + color(RED, BLACK); + std::cout << " (brackets do not match)"; + color(WHITE, BLACK); + return false; + } + break; + default: + gotoxy(52 + len, 1); + color(RED, BLACK); + std::cout << "(failure) "; + gotoxy(50 + i, 2); + color(LIGHT_RED, BLACK); + std::cout << " ^"; + gotoxy(51 + i, 1); + std::cout << tmp; + gotoxy(15, 3); + color(RED, BLACK); + std::cout << "Invalid character '"; + color(LIGHT_RED, BLACK); + std::cout << tmp; + color(RED, BLACK); + std::cout << "' at position "; + color(LIGHT_RED, BLACK); + std::cout << i + 1; + color(RED, BLACK); + std::cout << " (not present in charset)"; + color(WHITE, BLACK); + return false; + } + Sleep(speed); + } + + if(s.c_str()[len - 1] != '=') + { + gotoxy(52 + len, 1); + color(RED, BLACK); + std::cout << "(failure) "; + gotoxy(49 + len, 2); + color(LIGHT_RED, BLACK); + std::cout << " ^"; + gotoxy(50 + len, 1); + std::cout << s.c_str()[len - 1]; + gotoxy(15, 3); + color(RED, BLACK); + std::cout << "Invalid character '"; + color(LIGHT_RED, BLACK); + std::cout << s.c_str()[len - 1]; + color(RED, BLACK); + std::cout << "' at position "; + color(LIGHT_RED, BLACK); + std::cout << len; + color(RED, BLACK); + std::cout << " (missing equation mark '=')"; + color(WHITE, BLACK); + return false; + } + + return true; +} +/** + * @param argv[1] equation + * @param argv[2] check speed in ms + * @param argv[3] convert speed in ms + * @param argv[4] calculation speed in ms + */ +int main(int argc, char *argv[]) +{ + /*std::cout << argc << std::endl; + for(int i = 0; i < argc; i++) std::cout << argv[i] << std::endl; + system("pause"); + return 0;*/ + //std::string equation = "((7+3)/5*4*(4-2))/2="; + //std::string equation = "4;/0="; + + std::stringstream tmp1, tmp2, tmp3; + int sp1, sp2, sp3; + tmp1 << argv[2]; + tmp2 << argv[3]; + tmp3 << argv[4]; + tmp1 >> sp1; + tmp2 >> sp2; + tmp3 >> sp3; + + system("cls"); + system("pause > NUL"); + + color(GREEN, GREEN); + for(int i = 1; i <= 28; i++) + { + gotoxy(1, i); + std::cout << "#"; + gotoxy(13, i); + std::cout << "#"; + } + + for(int i = 2; i <= 12; i++) + { + gotoxy(i, 1); + std::cout << "#"; + gotoxy(i, 3); + std::cout << "#"; + gotoxy(i, 28); + std::cout << "#"; + } + + color(RED, GREEN); + gotoxy(2, 3); + std::cout << "MEMORY HEAP"; + gotoxy(2, 1); + std::cout << "NUM BUILDER"; + + color(WHITE, BLACK); + + gotoxy(15, 1); + std::cout << "EQUATION PROVIDED IN STANDARD FORM: "; + + std::string equation = ""; + if(argv[1]) + { + equation = argv[1]; + std::cout << equation; + } + else std::cin >> equation; + vanishCursor(); + int len = equation.length(); + + gotoxy(52 + len, 1); + std::cout << "(checking...)"; + + if(!validate(equation, sp1)) + { + system("pause > NUL"); + return 0; + } + + gotoxy(50 + len, 2); + std::cout << " "; + gotoxy(52 + len, 1); + color(GREEN, BLACK); + std::cout << "(success) "; + Sleep(1000); + + color(WHITE, BLACK); + gotoxy(15, 3); + std::cout << "EQUATION CONVERTED TO ONP: "; + + std::string a = stringToONP(equation, sp2); + int b = calculateONP(a, sp3); + + system("pause > NUL"); + return 0; +} \ No newline at end of file diff --git a/main.exe b/main.exe new file mode 100644 index 0000000..0abc1a8 Binary files /dev/null and b/main.exe differ diff --git a/tempCodeRunnerFile.cpp b/tempCodeRunnerFile.cpp new file mode 100644 index 0000000..3854683 --- /dev/null +++ b/tempCodeRunnerFile.cpp @@ -0,0 +1 @@ +"((7+3)/5*4*(4-2))/2=" \ No newline at end of file