#include #include #include "C:\Users\sakub\Desktop\Lista1\interface.h" void mvec(int _length, int _standard_value, int &length, int &amount, int &arrays_size, int &standard_value, int **offsets, int **values); void def(int index, int value, int length, int &amount, int &arrays_size, int **offsets, int **values); void len(int new_length, int &length, int &amount, int &arrays_size, int **offsets, int **values); void print(int length, int amount, int standard_value, int *offsets, int *values); void del(int &standard_value, int &length, int &amount, int &arrays_size, int *offsets, int *values); int find(int value, int size, int *arr); int read_value(int index, int end, int standard_value, int *offsets, int *values); int *change_size(int *source, int new_size, int amount); std::string to_string(int length, int standard_value, int amount, int *offsets, int *values); int main() { int standard_value = 0; //podstawowa wartosc vectora int length = 0; //dlugosc wektora int amount = 0; //ilosc elementow roznych od podst. wartosci wektora int arrays_size = 0; //wielkosc tablic przechowujacych wartosci wektora int *offsets = nullptr; //indexy poszczegolnych wartosci int *values = nullptr; //poszczegolne wartosci std::string command; //obsluga menu while (true) { int p1, p2; int **ptr_offsets = &offsets; int **ptr_values = &values; std::cin >> command; if (interface(command, "mvec", p1, p2)) { mvec(p1, p2, length, amount, arrays_size, standard_value, ptr_offsets, ptr_values); } else if (interface(command, "def", p1, p2)) { def(p1, p2, length, amount, arrays_size, ptr_offsets, ptr_values); } else if (interface(command, "len", p1)) { len(p1, length, amount, arrays_size, ptr_offsets, ptr_values); } else if (interface(command, "print")) { print(length, amount, standard_value, offsets, values); } else if (interface(command, "del")) { del(standard_value, length, amount, arrays_size, offsets, values); } else { std::cout << "Error\n"; } } } void mvec(int _length, int _standard_value, int &length, int &amount, int &arrays_size, int &standard_value, int **offsets, int **values) { length = _length, standard_value = _standard_value; amount = 0; arrays_size = 0; if (*offsets == nullptr && *values == nullptr) { delete[] * offsets; delete[] * values; offsets = nullptr; values = nullptr; } } void def(int index, int value, int length, int &amount, int &arrays_size, int **offsets, int **values) { if (index >= 0 && index < length) { if (*offsets != nullptr && *values != nullptr) { if (arrays_size == amount) { *offsets = change_size(*offsets, arrays_size * 2, amount); *values = change_size(*values, arrays_size * 2, amount); arrays_size *= 2; } if (find(index, amount, *offsets) != -1) { (*values)[find(index, amount, *offsets)] = value; } else { (*offsets)[amount] = index; (*values)[amount] = value; amount++; } } else { *offsets = new int[1]; *values = new int[1]; (*offsets)[0] = index; (*values)[0] = value; amount = 1; arrays_size = 1; } } else { std::cout << "Errorn"; } } void len(int new_length, int &length, int &amount, int &arrays_size, int **offsets, int **values) { if (new_length < length && (*offsets != nullptr || *offsets != nullptr)) { int new_amount = 0; while ((*offsets)[new_amount] < new_length) { new_amount++; } *offsets = change_size(*offsets, new_amount, new_amount); *values = change_size(*values, new_amount, new_amount); arrays_size = new_amount; amount = new_amount; } length = new_length; } void print(int length, int amount, int standard_value, int *offsets, int *values) { std::cout << to_string(length, amount, standard_value, offsets, values) << '\n'; } void del(int &standard_value, int &length, int &amount, int &arrays_size, int *offsets, int *values) { standard_value = 0; length = 0; amount = 0; arrays_size = 0; if (offsets == nullptr && values == nullptr) { delete[] offsets; delete[] values; offsets = nullptr; values = nullptr; } } /******************************************* * ZWRACA POZYCJE SZUKANEGO ELEMNTU LUB -1 * *******************************************/ int find(int value, int size, int *arr) { int i = 0; while (i < size && arr[i] != value) { i++; } return i < size ? i : -1; } /*************************************** * ODCZYTUJE WARTOSC Z DANEGO ELEMENTU * ***************************************/ int read_value(int index, int end, int standard_value, int *offsets, int *values) { int i = 0; while (i < end && offsets[i] != index) { i++; } return i < end ? values[i] : standard_value; } /*************************************************************** * TWORZY NOWA TABLICE I KOPIUJE DO NIEJ ZAWARTOSC POPRZEDNIEJ * ***************************************************************/ int *change_size(int *source, int new_size, int amount) { int *arr = new int[new_size]; for (int i = 0; i < amount; i++) { arr[i] = source[i]; } delete source; return arr; } /*************************************** * ZWRACA STRING REPREZENTUJACY WEKTOR * ***************************************/ std::string to_string(int length, int amount, int standard_value, int *offsets, int *values) { std::string result = "len: " + std::to_string(length) + " values: "; if (offsets == nullptr || values == nullptr) { for (int i = 0; i < length; i++) { result += std::to_string(standard_value) + ','; } } else { for (int i = 0; i < length; i++) { result += std::to_string(read_value(i, amount, standard_value, offsets, values)) + ','; } } result.pop_back(); return result; }