Переделать функцию сдвига столбцов матрицы вправо под одинарный указатель

Помогите переделать функцию сдвига столбцов матрицы вправо на К позиций под одинарный указатель (сколько бьюсь не могу никак её закончить)

void move(int** matrix, int n, int m, int k) {

	int buf = 0;
	for (int i = 0; i < n; i++)
	{
		for (int t = 0; t < k % n; t++) {
			buf = matrix[i][n - 1];
			for (int j = n - 1; j > 0; j--) {
				matrix[i][j] = matrix[i][j - 1];
			}
			matrix[i][0] = buf;

		}

	}

}

К элементам массива обращаюсь так : *(X + i * m + j),

память выделяю так:

    Matr(int n1, int m1)
    {
        n = n1; m = m1; X = new int[n * m];
        FormMatr(X, n, m);
        cout << "Конструктор параметров сработал" << endl;
    }

Указатель на матрицу использую такой:

void FormMatr(int* X, int n, int m) 
{
    for (int i = 0; i < n; i++)

    {
        for (int j = 0; j < m; j++)
        {
            *(X + i * m + j) = 160 * (float)rand() / RAND_MAX - 80;
        }
    }
}

Я сейчас пробую переделать функцию, она сдвигает столбцы вправо, но те столбцы которые должны циклически сдвигаться в начало матрицы оно неккоретно выводит:

void move(int* X, int n, int m, int K) 
{
    for (int i = 0; i < n; i++)
    {
        for (int t = 0; t < K % m; t++)
        {
            int buf = *(X + i * m * n - 1);    

            for (int j = n - 1; j > 0; --j)

                *(X + i * m + j) = *(X + i * m + j - 1);

            *(X + i * m ) = buf;
        }
    }
}

Так если

то и тут надо так же обращаться, а не через

Вообще лучше сделать функции типа

int GetValue(row, col);
void SetValue(row, col, val);

Тогда, кроме упрощения кода (не надо везде копипастить это вычисление координат, проще читать/понимать), заодно можно будет и например менять внутреннее представление матрицы на что угодно. :wink:

У меня в этом и возникла проблема, я не могу переделать из matrix[i][j] в *(X + i * m + j)

Так а в чем проблема?
Если тут работает

то переместите эти вычисления в функции Get/SetValue и вызывайте их с i, j.

Передавайте свои объекты классa Matr, а не указатели, иначе зачем он.
В классе сделайте GetValue, SetValue и всё остальное нужное (GetRowCount, GetColCount, …) для работы с матрицей.
Ну и move тоже можно в этом классе поместить.

Я имею ввиду то, что я что-то в функции не то написал, может где-то не правильно обращаюсь к элементам, и поэтому оно не выводит сдвинутые элементы

Так сделайте сначала норм абстракцию с GetValue , SetValue, убедитесь что эти две функции сами по себе правильно работают, и тогда будет легко и сдвиг переписать
Например если было

matrix[i][j] = matrix[i + 1][j] + 42;

то станет что-нибудь типа

matrix.SetValue(i, j, matrix.GetValue(i + 1, j) + 42);

Я бы с радостью сделал, но преподу надо как всегда не так, как делают нормальные люди. Я сейчас переделал функцию, вроде бы работает, можете проверить её по оформлению?

void move(int* X, int n, int m, int K) 
{
    for (int i = 0; i < n; i++)
    {
        for (int t = 0; t < K % m; t++)
        {
            int buf = *(X + i * m + (n - 1));  

            for (int j = n - 1; j > 0; --j)

                *(X + i * m + j) = *(X + i * m + (j - 1));   

            *(X + i * m + 0 ) = buf; 
        }
    }
}

Так а что именно он сказал?)

Кстати

это конструктор класса Matr или там пропущен void?)

В любом случае что с классом, что без, вряд ли препод будет против создания функций GetValue/SetValue где-нибудь.
Без класса просто передавать еще одним параметром матрицу, и тогда в примере выше будет

SetValue(matrix, i, j, GetValue(matrix, i + 1, j) + 42);

Непонятно по какому принципу выбирается регистр символов в именах :dadparrot:. Ну и я бы делал более понятные длинные имена. matrix, rowCount, …

Если что, полезные статьи:

1 лайк

n это строки m это столбцы, я добавил функции геты сеты, но какой от них толк то, если я их нигде не использую

    int Getn()
    {
        return n; 
    }
    int Get_m() 
    {
        return m;
    }

    int Get_X_i_j(int i, int j) 
    {
        return *(X + i * m + j);
    }

То был конструктор с параметрами ). Щас весь код кину, для полноты картины

#include <string>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <array>
#include <ctime>

using namespace std;

void FormMatr(int* X, int n, int m) 
{
    for (int i = 0; i < n; i++)

    {
        for (int j = 0; j < m; j++)
        {
            *(X + i * m + j) = 160 * (float)rand() / RAND_MAX - 80;
        }
    }
}
void PrintMatr(int* X, int n, int m) 
{
    cout.width(10);
    for (int i = 0; i < n; i++)
    {
        cout << endl;
        for (int j = 0; j < m; j++)
        {
            cout.width(6);
            cout << *(X + i * m + j) << " ";
        }
    }
}
int GetMax(int* X, int n, int m) 
{
    int i, j; int max = -500;
    cout << "Матрица";
    for (i = 0; i < n; i++)
    {
        cout << "\n";
        for (j = 0; j < m; j++)
        {
            if (max <= *(X + i * m + j))
            {
                max = *(X + i * m + j);
            }
            cout << *(X + i * m + j) << "\t";
        }
    }
    cout << endl;
    cout << "Наибольшый элемент матрицы:" << max << endl;
    cout << endl;
    return max;
}
int GetSum(int* X, int n, int m) 
{
    int i, j; int Sum = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            Sum += *(X + i * m + j);
        }
    }
    cout << "Сумма матрицы С = " << Sum << endl;
    
    return Sum;
}
void Copy(int* X, int n, int m, int* X1)
{

    int i, j;

    for (i = 0; i < n; i++)

        for (j = 0; j < m; j++) {

            *(X + i * m + j) = *(X1 + i * m + j);

        }

}
void move(int* X, int n, int m, int K) 
{
    for (int i = 0; i < n; i++)
    {
        for (int t = 0; t < K % m; t++)
        {
            int buf = *(X + i * m + (n - 1));  

            for (int j = n - 1; j > 0; --j)

                *(X + i * m + j) = *(X + i * m + (j - 1));   

            *(X + i * m + 0 ) = buf; 
        }
    }
}

class Matr {
private:
    int n, m;  int* X; 
public:
    Matr()
    {
        n = 0; m = 0;
        X = nullptr;
    }

    Matr(int n1, int m1)
    {
        n = n1; m = m1; X = new int[n * m];
        FormMatr(X, n, m);
        cout << "Конструктор параметров сработал" << endl;
    }
    Matr(const Matr& obj)
    {
        n = obj.n; m = obj.m; X = new int[n * m];
        Copy(X, n, m, obj.X);
        cout << "Конструктор копии сработал" << endl;
    }
    ~Matr()
    {
        delete[] X;
        cout << "\nСработал деструктор" << endl;
    }

    int Getn()
    {
        return n; 
    }
    int Get_m() 
    {
        return m;
    }

    int Get_X_i_j(int i, int j) 
    {
        return *(X + i * m + j);
    }

    friend void FormMatr(int*, int, int); 

    friend void PrintMatr(int*, int, int);

    friend int GetMax(int*, int, int);

    friend int GetSum(int*, int, int);

    friend void Copy(int*, int, int, const int*);

    friend void move(int*, int, int, int);

    void PrintAll() 
    {
        cout << "Размерность матрицы:" << endl; cout << "n= " << n << " m= " << m << endl; PrintMatr(X, n, m);
    }
    Matr& operator =(const Matr& obj) 
    {
        if (this == &obj)
            return *this;
        cout << "Сработал оператор присваивания" << endl;
        n = obj.n;
        m = obj.m;
        delete[] X;
        X = new int[n * m];
        Copy(X, n, m, obj.X);
        return *this;
    }
    int operator ~()
    {
        cout << "Операция ~ " << endl;
        int Sum = 0;
        Sum = GetSum(X, n, m);
        return ~Sum;
    }
    int operator > (Matr& obj) 
    {
        cout << "\nОперация >" << endl;
        int Max1, Max2;
        int Min_Max;
        Max1 = GetMax(this->X, this->n, this->m);
        Max2 = GetMax(obj.X, obj.n, obj.m);
        if (Max1 < Max2)
        {
            Min_Max = Max1;
        }
        else   Min_Max = Max2;
        return Min_Max;
    }
    Matr operator >> (int K) const 
    {
        Matr res(*this);
        cout << "Операция >> \n" << endl;
        move(res.X, res.n, res.m, K);
        return res;
    }
};
void main()
{
    srand(time(NULL));
    setlocale(LC_ALL, "Russian");
    Matr A(5, 5), B(5, 5), C(5, 5);
    Matr A1, A2;
    int K;
    cout << "Матрица А" << endl;
    A.PrintAll();
    cout << endl;
    cout << "Матрица В" << endl;
    B.PrintAll();
    cout << endl;
    cout << "Матрица С" << endl;
    C.PrintAll();
    cout << endl;
    K = ~C;
    cout << "Побитово инвертированное значение суммы матрицы С = " << K << endl << endl;
    cout << "Сдвиг матрицы А на К значений " << endl;
    if (K > 0)
    {
        A1 = A >> K;
        A1.PrintAll(); 
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
   K = A > B;
    cout << "Минимальный элемент из двух максимальных элементов матриц = " << K << endl;
    cout << "Сдвиг матрицы А1 на К значений\n" << endl;
    if (K > 0)
    {
        A2 = A1 >> K;
        A2.PrintAll(); 
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
    system("pause");

А кто мешает использовать?)

1 лайк

И что куда передавать то?

void move(Matr& matrix, ..
1 лайк

Понял, спасибо большое, приму к сведению, а пока попробую показать преподу этот вариант