Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Как реализовать замкнутый массив на C++?

#математика #массивы #cpp


Необходимо реализовать на C++ такой массив, например размерности 4 (с индексами 0
1 2 3), чтобы в дальнейшем при обращении к несуществующему элементу 4 программа выдавала
значение с индексом 0.

Как это реализовать с условием ясно — нужно выразить доступ к элементам с помощью
формулы.

Возможно некорректно поставлен вопрос, но в итоге нужна заготовка программы, которая
должна создать двумерный массив, замкнутый по всем концам (как в фигуре Тор), для того,
чтобы в дальнейшем реализовать определение покрытий для карты Карно.
    


Ответы

Ответ 1



Для неотрицательных значений: const int SIZE = 4; int a[SIZE]; for(int i=0;i<15;i++) cout << a[i%SIZE] << " "; % — остаток от деления, значения 0,1,2,3,0,1,2,3,0,... Для отрицательных значений: ряд чисел которые мы должны преобразовать: -5,-4,-3,-2,-1,0,1,2,3,4,5... Что мы должны получить (для SIZE=4): 3,0,1,2,3,0,1,2,3,0,1... Вышеуказанный способ нам выдаст следующие значения: -1,0,-3,-2,-1,0,1,2,3,0,1... Мы можем ко всем этим значениям прибавить SIZE, и тогда у нас все значения будут положительными, и вторично берем по модулю: for(int i=-5;i<=5;i++) { j=( (i%SIZE) + SIZE )%SIZE; cout << a[j] << " "; } Для упрощения понимания кода: чтобы в коде часто не встречались непонятные формулы, используйте функцию (или макрос), которая будет преобразовывать индексы. Например макрос: #define GetIndex(_index,_size) ( ( (_index%_size) + _size )%_size ) Для двумерного случая: const int X_SIZE = 4; const int Y_SIZE = 10; int a[X_SIZE][Y_SIZE]; cin >> x >> y; cout << a[GetIndex(x,X_SIZE)][GetIndex(y,Y_SIZE)];

Ответ 2



Согласен, наследование от std::vector не самая лучшая идея и CyclicArray нужно использовать с осторожностью. #include #include #include template class CyclicArray : public std::vector { public: typedef typename std::vector::size_type UnsignedIndex; typedef typename std::make_signed::type SignedIndex; using std::vector::vector; T& operator[](SignedIndex index) { return GetElement(index); } const T& operator[](SignedIndex index) const { return GetElement(index); } private: T& GetElement(SignedIndex index) { return std::vector::operator[](NormalizeIndex(index)); } const T& GetElement(SignedIndex index) const { return std::vector::operator[](NormalizeIndex(index)); } UnsignedIndex NormalizeIndex(SignedIndex index) { auto size = std::vector::size(); SignedIndex res = (index % size); if (res < 0) { res += size; } return static_cast(res); } }; int main() { CyclicArray a{1, 2, 3, 4}; for (int i = -8; i < 9; ++i) { std::cout << i << ": " << a[i] << std::endl; } // 2-Dimensional CyclicArray> b{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}; for (int i = -4; i < 4; ++i) { for (int j = -4; j < 4; ++j) { std::cout << i << ", " << j << ": " << b[i][j] << std::endl; } } }

Комментариев нет:

Отправить комментарий