Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Двумерные массивы (сдвиг элементов)


Автор: posthuman 29.10.2009, 22:49
Условие задачи:
Осуществить циклический сдвиг элементов прямоугольной матрицы на 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();
        }
    }
}

Программа в принципе работает, но наоборот. Вместо сдвига вправо - сдвигает влево. Вместо сдвига вниз - сдвигает вверх. Кто-нибудь может дать совет как исправить это?

Автор: PashaPash 30.10.2009, 01:27
posthuman, наивное предложение - заменить + на -? У тебя i и j - это индексы в массиве результата, а inew, jnew - в исходном массиве.

Автор: posthuman 30.10.2009, 14:36
PashaPash, чо то я не догнал что и куда.

Автор: math64 30.10.2009, 17:33
Сдвиг на n вправо эквивалентен сдвигу на x-n влево.
Замена + на - не сработает, поскольку % для отрицательных чисел выдеёт отрицательные значения.
Код

                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();
                 }

Автор: posthuman 30.10.2009, 20:24
math64 работает. спасибо. а со сдвигом вниз не поможете?

Автор: posthuman 30.10.2009, 20:55
Спасибо за помощь. сделал сдвиг вниз. Вот он.
Код

 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();
                }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)