Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2021, 20:57   #1
Airy
 
Регистрация: 27.11.2021
Сообщений: 8
По умолчанию сдвиг двумерного массива вверх/вниз

Создать двумерный массив. Заполните его случайными числами и выведите на экран. Пользователь выбирает с помощью меню количество оползней и их направление (слева, справа, вверх, вниз). Выполнить смещение в массиве и вывести на экран полученный результат. Сдвиг циклический.
Например, если есть такой массив (2 строки, 6 столбиков)
1 2 0 4 5 3
4 5 3 9 0 1
и пользователь выбрал сдвиг на 2 разряда вправо, то мы получим такой массив:
5 3 1 2 0 4
0 1 4 5 3 9

вот код к задаче. Проблема состоит в том, что сдвиг работает только на единицу. Когда ввожу 2(например) то предпоследний столбец или строку сдвигает, а последний остаётся где был. А вторая проблема, что каждый следующий кейс сдвигает данные с предыдущего (тоесть напр. изначальный массив 1234, кейс один влево 2341, второй кейс вправо возврашает 1234. Подскажите как довести код до ума?

Код:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
	srand(time(0));
	const int n = 4, m = 4;
	int array[n][m];
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			array[i][j] = rand() % 100;
			cout << array[i][j] << '\t';
		}
		cout << endl;
	}

	int offset, choise, menu;
	cout << "\n1 - Left\n2 - Right\n3 - Up\n4 - Down\n";
	cout << "\n0 - Finish\n";
	int buf;
	do
	{
		cout << "\ninput direction:\t";
		cin >> menu;
		cout << "\ninput the offset size:\t"; cin >> offset;
		cout << endl;
		switch (menu)
		{
		case 1:for (int i = 0; i < m; i++)
		{
			buf = array[i][0];
			for (int j = 0; j < n - offset; j++)
				array[i][j] = array[i][j + offset];
			array[i][n - offset] = buf;
		}
			  for (int i = 0; i < m; i++)
			  {
				  for (int j = 0; j < n; j++)
					  cout << array[i][j] << '\t';
				  cout << endl;
			  }
			  break;

		case 2:for (int i = 0; i < n; i++)
		{
			buf = array[i][m - offset];
			for (int j = m - offset; j > 0; j--)
				array[i][j] = array[i][j - offset];
			array[i][0] = buf;
		}
			  for (int i = 0; i < n; i++)
			  {
				  for (int j = 0; j < m; j++)
					  cout << array[i][j] << '\t';
				  cout << endl;
			  }
			  break;

		case 3: for (int i = 0; i < n; i++)
		{
			buf = array[0][i];
			for (int j = 0; j < n - offset; j++)
				array[j][i] = array[j + offset][i];
			array[n - offset][i] = buf;
		}
			  for (int i = 0; i < m; i++)
			  {
				  for (int j = 0; j < n; j++)
					  cout << array[i][j] << '\t';
				  cout << endl;
			  }
			  break;


		case 4: for (int i = 0; i < m; i++)
		{
			buf = array[n - offset][i];
			for (int j = n - offset; j > 0; j--)
				array[j][i] = array[j - offset][i];
			array[0][i] = buf;
		}
			  for (int i = 0; i < m; i++)
			  {
				  for (int j = 0; j < n; j++)
					  cout << array[i][j] << '\t';
				  cout << endl;
			  }
			  break;
		}
			cout << "\nContinue? (1=yes, 0=no)\t";
			cin >> choise;
		} while (choise != 0);

		cout << "\nBye!\n";
		system("pause");
		return 0;
	}

Последний раз редактировалось Airy; 28.11.2021 в 21:40.
Airy вне форума Ответить с цитированием
Старый 28.11.2021, 22:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Цитата:
Сообщение от Airy Посмотреть сообщение
сдвиг работает только на единицу
Если есть рабочий код сдвига на единицу, то просто засуньте его в цикл и повторите offset раз.
Перепроверьте по всему коду размеры индексов (перепутаны n и m местами кое-где).
Цитата:
Сообщение от Airy Посмотреть сообщение
каждый следующий кейс сдвигает данные с предыдущего
Ну вы меняете один и тот же массив array. А разве задание требует применять сдвиги к исходному массиву? По-моему, логичнее двигать именно предыдущий результат (например, хочу подвинуть массив на 2 вправо и на 3 вверх).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 28.11.2021, 23:20   #3
Airy
 
Регистрация: 27.11.2021
Сообщений: 8
По умолчанию

BDA,
Цитата:
Если есть рабочий код сдвига на единицу, то просто засуньте его в цикл и повторите offset раз.
Перепроверьте по всему коду размеры индексов (перепутаны n и m местами кое-где).
спасибо, попробую. а то что-то эта тема ну совсем не доходит, с горем пополам собрала в кучу то,что имею
Airy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сдвиг строк/столбцов двумерного массива (судоку) Ilyard C# (си шарп) 3 17.01.2014 16:53
сдвиг двумерного массива Вечный_студент Общие вопросы C/C++ 0 14.05.2012 16:24
Прокрутка формы вверх и вниз xRamzeSx Общие вопросы Delphi 1 15.05.2011 11:57
Нажатие клавиш на клавиатуре вверх, вниз Droid Общие вопросы Delphi 16 12.07.2009 18:13
Перемещать строки вверх-вниз, с помощью стрелок. Rio309 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 27.10.2008 21:47