Указатель: Сдвинуть числа в матрице заданного размер n * n на k позиций вправо - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужно сдвигать числа в матрице заданного размер n*n на k единиц направо Сделать это нужно через функцию,я это сделал,но нужно использовать указатели вместо индексации. Помогите исправить индексацию на указатели!!!Пожалуйста.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int z, i, j, functs;
int *p;
 
void matrix_shift_right(int mat[][N], int n, int k) {
 
    for (functs = 1; functs <= k; functs++) {
        for (i = 0; i < n; i++) {
            for (j = 1; j < n; j++) {
                z = mat[i][j];
                mat[i][j] = mat[i][0];
                mat[i][0] = z;
            }
        }
    }
}
int main(void) {
    int mat[N][N], i, j, k, n;
    printf("Enter size of matrix ");
    scanf("%d", &n);
    printf("\n");
    srand(time(NULL));
    for (i = 0; i<n; ++i) {
        for (j = 0; j<n; ++j)
        {
            mat[i][j] = 0 + rand() %100;
            printf("%d\t", mat[i][j]);
        }
        printf("\n");
    }
 
    printf("Enter nuber of stift ");
    scanf("%d", &k);
    matrix_shift_right(mat, n, k);
    printf("\n");
 
    for (i = 0; i<n; ++i)
    {
        for (j = 0; j<n; ++j)
            printf("%d\t", mat[i][j]);
 
        printf("\n");
    }
    return 0;
}

Решение задачи: «Указатель: Сдвинуть числа в матрице заданного размер n * n на k позиций вправо»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
 
void matrix_shift_right(int *mat, int n, int k) {
 
    int z, i, j, functs;
    for (functs = 1; functs <= k; functs++)
    for (i = 0; i < n; i++)
    for (j = 1; j < n; j++)
    {
        z = *(mat + i*n + j);
        *(mat + i*n + j) = *(mat + i*n);
        *(mat + i*n) = z;
    }
 
}
int main(void) {
    int i, j, k, n;
    int *mat = (int*)malloc(N*N*sizeof(int));
    printf("Enter size of matrix ");
    scanf("%d", &n);
    printf("\n");
    srand(time(NULL));
    for (i = 0; i<n; ++i) {
        for (j = 0; j<n; ++j)
        {
            mat[i*n + j] = rand() % 100;
            printf("%d\t", mat[i*n + j]);
        }
        printf("\n");
    }
 
    printf("Enter number of shift ");
    scanf("%d", &k);
    matrix_shift_right(mat, n, k);
    printf("\n");
 
    for (i = 0; i<n; ++i)
    {
        for (j = 0; j<n; ++j)
            printf("%d\t", mat[i*n + j]);
 
        printf("\n");
    }
    free(mat);
    return 0;
}

Объяснение кода листинга программы

В данном коде реализована функция matrix_shift_right(), которая сдвигает элементы матрицы на k позиций вправо. Алгоритм сдвига элементов матрицы реализован с помощью трёх вложенных циклов. Внешний цикл выполняется k раз, благодаря чему обеспечивается сдвиг элементов на указанное количество позиций. Два внутренних цикла необходимы для работы с элементами матрицы. В ходе работы алгоритма используется временная переменная z, которая хранит значение элемента, с которым осуществляется сдвиг. В процессе сдвига элемента на одну позицию вправо, элемент, стоящий на этой позиции, перемещается влево, а элемент, стоящий на позиции, которая была последней, перемещается на первую позицию. В функции main() сначала пользователю предлагается ввести размер матрицы, затем на экране выводится исходная матрица, после чего пользователю предлагается ввести число сдвига. Затем вызывается функция matrix_shift_right(), которая сдвигает элементы матрицы на указанное количество позиций вправо. После сдвига на экране выводится изменённая матрица.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5
Похожие ответы