Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерные массивы (сдвиг элементов), решение задачки 
V
    Опции темы
posthuman
Дата 29.10.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2009
Где: Люберцы

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) posthuman - 29.10.2009, 22:49
PM MAIL ICQ Skype   Вверх
PashaPash
Дата 30.10.2009, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



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


--------------------
PM MAIL WWW   Вверх
posthuman
Дата 30.10.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2009
Где: Люберцы

Репутация: нет
Всего: нет



PashaPash, чо то я не догнал что и куда.

Это сообщение отредактировал(а) posthuman - 30.10.2009, 14:37
PM MAIL ICQ Skype   Вверх
math64
Дата 30.10.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



Сдвиг на 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();
                 }

PM   Вверх
posthuman
Дата 30.10.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2009
Где: Люберцы

Репутация: нет
Всего: нет



math64 работает. спасибо. а со сдвигом вниз не поможете?

Это сообщение отредактировал(а) posthuman - 30.10.2009, 20:32
PM MAIL ICQ Skype   Вверх
posthuman
Дата 30.10.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2009
Где: Люберцы

Репутация: нет
Всего: нет



Спасибо за помощь. сделал сдвиг вниз. Вот он.
Код

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

PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.