- #include <iostream>
- #include <string>
- #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;
- }