Массив: Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз - C#

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

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

Условие задачи: Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от введенного режима). n может быть больше количества элементов в строке или столбце. Вот мой код:
using System;
using System.Collections.Generic;
using System.Text;
 
namespace LabRab6
{
    class Program
    {
        static void Main(string[] args)
        {
            //Массив элементов
            const int z = 4, x = 5;
            int[,] a = new int[z, x] {
                {1, 1, 0, 0, 0},
                {1, 1, 0, 0, 0},
                {0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0}
            };
            Console.WriteLine("Исходный массив: ");
            for (int i = 0; i < z; ++i)
            {
                for (int j = 0; j < x; ++j)
                    Console.Write("\t" + a[i, j]);
                Console.WriteLine();
            }
            //Вводим количество элементов для  сдвига
            Console.Write("Введите количество элементов для  сдвига: ");
            string buf1 = Console.ReadLine();
            int n = int.Parse(buf1);
            //Ввдим режим сдвига
            Console.Write("Выберите режим сдвига( 1 - вправо, 2 - вниз ): ");
            string buf2 = Console.ReadLine();
            int sd = int.Parse(buf2);
            //Осуществляем сдвиги
            int inew = 0, jnew = 0;
            int g = 0;
            if (sd == 1)
            {
                Console.WriteLine("Сдвиг вправо:");
                for (int i = 0; i < z; ++i)
                {
                    for (int j = 0; j < x; ++j)
                    {
                        inew = (i + (g % z)) % z;
                        jnew = (j + (n % x)) % x;
                        Console.Write("\t" + a[inew, jnew]);
                    }
                    Console.WriteLine();
                 }
            }
            else if (sd == 2)
            {
                Console.WriteLine("Сдвиг вниз:");
                for (int i = 0; i < z; i++)
                {
                    for (int j = 0; j < x; j++)
                    {
                        inew = (i + (n % z)) % z;
                        jnew = (j + (g % x)) % x;
                        Console.Write("\t" + a[inew, jnew]);
                    }
                    Console.WriteLine();
                }
            }
            else Console.WriteLine("Ошибка!");
            //Ввыводим массив со сдвигом
            Console.ReadLine();
        }
    }
}
Программа в принципе работает, но наоборот. Вместо сдвига вправо - сдвигает влево. Вместо сдвига вниз - сдвигает вверх. Подскажите пожалуйста, как исправить это. Кто-нибудь может дать совет как исправить это?

Решение задачи: «Массив: Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Text;
 
namespace LabRab6
{
    class Program
    {
        static void Main(string[] args)
        {
            //Массив элементов
            const int z = 4, x = 5;
            int[,] a = new int[z, x] {
                {1, 1, 0, 0, 0},
                {1, 1, 0, 0, 0},
                {0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0}
            };
            Console.WriteLine("Исходный массив: ");
            for (int i = 0; i < z; ++i)
            {
                for (int j = 0; j < x; ++j)
                    Console.Write("\t" + a[i, j]);
                Console.WriteLine();
            }
            //Вводим количество элементов для  сдвига
            Console.Write("Введите количество элементов для  сдвига: ");
            string buf1 = Console.ReadLine();
            int n = int.Parse(buf1);
            //Ввдим режим сдвига
            Console.Write("Выберите режим сдвига( 1 - вправо, 2 - вниз ): ");
            string buf2 = Console.ReadLine();
            int sd = int.Parse(buf2);
            //Осуществляем сдвиги
            int inew = 0, jnew = 0;
            int g = 0;
            if (sd == 1)
            {
                Console.WriteLine("Сдвиг вправо:");
                int nnew = x - n % x; // Выносим повторяющиеся вычисления за пределы цикла
                for (int i = 0; i < z; ++i)
                {
                    inew = i;
                    for (int j = 0; j < x; ++j)
                    {
                        jnew = (j + nnew) % x;
                        Console.Write("\t" + a[inew, jnew]);
                    }
                    Console.WriteLine();
                }
            }
            else if (sd == 2)
            {
                Console.WriteLine("Сдвиг вниз:");
                int nnnew = z - n % z; // Выносим повторяющиеся вычисления за пределы цикла
                for (int i = 0; i < z; ++i)
                {
                    for (int j = 0; j < x; ++j)
                    {
                        jnew = j;
                        inew = (i + nnnew) % z;
                        Console.Write("\t" + a[inew, jnew]);
                    }
                    Console.WriteLine();
                }
            }
            else Console.WriteLine("Ошибка!");
            //Ввыводим массив со сдвигом
            Console.ReadLine();
        }
    }
}

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


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

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

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