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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2008, 12:56   #1
Ладушка
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 13
По умолчанию Циклический сдвиг столбцов в массиве С++ Помогите!

Здравствуйте. Помогите, пожалуйста, дорешать задачу. Нужно осуществить (в консоли) циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от введенного режима). n может быть больше количества элементов в строке или столбце. Часть я написала. Получилось, что введенный массив сдвигается сразу весь на заданный сдвиг z. А мне надо, чтобы столбцы (строки) менялись местами. Там должно быть ещё условие, типа если сдвиг больше числа элементов, то... А что дальше, я никак не придумаю. Пожалуйста, помогите! (Это на Visual C++ 6.0).


Код:
#include <iostream.h>
#include <iomanip.h>

int main()
{
	int nrow,ncol,i,j,z;
	cout<<"Vved kolvo ctrok i ctolbcov"<<endl;
	cin>>nrow;
	cin>>ncol; //Ввод размерности массива

char **a=new char *[nrow]; //выделение памяти под массив
for (i=0; i<nrow; i++) a[i]=new char [ncol];
cout<<"Vved elementi massiva"<<endl;
for (i=0; i<nrow; i++)
for (j=0; j<ncol; j++) cin>>a[i][j]; //ввод массива
for (i=0; i<nrow; i++)
{
	for(j=0; j<ncol; j++) cout<<setw(2)<<a[i][j]<<"  ";
	cout<<endl;
}

cout<<"Vvedite sdvig po stolbcam"<<endl;
	cin>>z;

for(i=0;i<nrow;i++)
for(j=0;j<ncol;j++)
{
	for(j=0;j<ncol+z; j++)
//думаю, где-то здесь должно быть условие..?
	cout<<setw(2)<<a[i][j-z]<<"  ";
	cout<<endl;
}
return 0;
}
moderator: Используйте тег <CODE>

Последний раз редактировалось merax; 22.04.2008 в 19:55.
Ладушка вне форума Ответить с цитированием
Старый 22.04.2008, 13:57   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Так а в чём вопрос-то? Если в этом:
Цитата:
Там должно быть ещё условие, типа если сдвиг больше числа элементов, то... А что дальше, я никак не придумаю.
, то, видимо, нужно взять остаток от деления <величина сдвига>%<размер массива>. Или просто ничего не двигать, Вам решать.
B_N вне форума Ответить с цитированием
Старый 23.04.2008, 09:18   #3
Ладушка
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 13
По умолчанию

Ой, извините за код, я забыла про тэг
Мне как раз и надо двигать. Типа этого:
123
456
789
Если сдвинуть на 1 вправо, то будет так:
312
645
978
А как там делить? Если, например, сдвиг=2, а кол-во столбцов=3, то остаток от 2/3 сравнивать с j? И чего потом? Я вот в этом не разберусь. У меня весь массив уезжает, а он должен перестраиваться.

Последний раз редактировалось Ладушка; 23.04.2008 в 09:21.
Ладушка вне форума Ответить с цитированием
Старый 23.04.2008, 13:38   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Ладушка Посмотреть сообщение
А как там делить? Если, например, сдвиг=2, а кол-во столбцов=3, то остаток от 2/3 сравнивать с j? И чего потом? Я вот в этом не разберусь. У меня весь массив уезжает, а он должен перестраиваться.
Индекс "нового" столбца можно получить из индекса "старого" так:
Inew = (Iold + (SHIFT % COUNT)) % COUNT
Inew, Iold - новый и старый индексы, SHIFT - величина сдвига (с учётом знака, вправо - плюс, влево - минус), COUNT - размерность массива в направлении сдвига. Проверьте на всякий случай.
B_N вне форума Ответить с цитированием
Старый 24.04.2008, 19:03   #5
Ладушка
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 13
По умолчанию

спасибо, что откликнулись, но всё-равно у меня ниче не получается.
Здесь что-то не так...
Код:
jnew=(j+(z%ncol))%ncol;
for (i=0; i<nrow; i++)
for (j=jnew; j<ncol-1; j++)
{
	cout<<setw(2)<<a[i][j]<<"  ";
	cout<<endl;
}
Ладушка вне форума Ответить с цитированием
Старый 24.04.2008, 22:25   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Этот тот случай, когда проще показать:
Код:
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

#define N 5

char stripe[] = "-------------------------";

long main()
{
	long i, j, k;
	long shift;
	long tmp;

	long matrix[N][N];
	
	for(i = 0; i < N * N; ((long*)matrix)[i++] = rand() % 100);

	srand(time(NULL));
	for(;;){
		printf("Величина сдвига:"); scanf("%d", &shift);
		if(!shift) break;

		printf("\nСтарый массив:\n%s\n", stripe);
		for(i = 0; i < N; i++){
			for(j = 0; j < N; j++){
				printf(" %2d |", matrix[i][j]);
			}
			puts("");
		}
		puts(stripe);
			
		shift %= N;
		shift = shift < 0 ? N + shift : shift;
		
		for(i = 0; i < N; i ++){
			for(k = 0; k < shift; k++){
				tmp = matrix[i][N - 1];
				for(j = N - 1; j > 0; j--) matrix[i][j] = matrix[i][j - 1];
				matrix[i][0] = tmp;
			}
		}

		printf("\nНовый массив (сдвиг на %d позиций):\n%s\n", shift, stripe);
		for(i = 0; i < N; i++){
			for(j = 0; j < N; j++){
				printf(" %2d |", matrix[i][j]);
			}
			puts("");
		}
		puts(stripe);
	}

	return 0;
}
Оптимизировать сдвиг и добавить "вертикальный" предоставляю Вам.
B_N вне форума Ответить с цитированием
Старый 24.04.2008, 22:48   #7
Ладушка
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 13
По умолчанию

Ого! Спасибо большое. Буду разбираться и в Вашем коде, но я тут доделала свои наработки. Весь вечер сижу Столбцы и строки теперь двигаются, благодаря Вашей формуле, но новый массив выводится в виде одного столбца. Все элементы подряд. А если выписать по строкам, то как раз то что надо. Вопрос: как представить масси в нормальном наглядном виде?
Код:
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
int main()
{
	int nrow,ncol,i,j,z,w,jnew,inew;
	cout<<"Vvedite kolvo ctrok i ctolbcov"<<endl;
	cin>>nrow;
	cin>>ncol; //Ввод размерности массива

char **a=new char *[nrow]; //выделение памяти под массив
for (i=0; i<nrow; i++) a[i]=new char [ncol];
cout<<"Vved elementi massiva"<<endl;
for (i=0; i<nrow; i++)
for (j=0; j<ncol; j++) cin>>a[i][j]; //ввод массива
for (i=0; i<nrow; i++)
{
	for(j=0; j<ncol; j++) cout<<setw(2)<<a[i][j]<<"  ";
	cout<<endl;
}

cout<<"--------------------------------------------------------------------------------"<<endl;
cout<<"Vvedite sdvig po stolbcam"<<endl;
	cin>>z;

cout<<"Vvedite sdvig po strocam"<<endl;
	cin>>w;

for(i=0;i<nrow;i++)
	for(j=0;j<ncol;j++)
	{
		inew=(i + (w % nrow))%nrow;
		jnew=(j + (z % ncol))%ncol;
		cout<<setw(2)<<a[inew][jnew]<<"  ";
		cout<<endl;
	}

return 0;
}

Последний раз редактировалось Ладушка; 25.04.2008 в 18:04.
Ладушка вне форума Ответить с цитированием
Старый 01.05.2008, 12:34   #8
Ладушка
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 13
Вопрос

Ну помогите... я уже не могу с этими циклами! Куда я их только не запихивала. Он в один столбик всю матрицу выдаёт! Что я не так делаю?
Ладушка вне форума Ответить с цитированием
Старый 01.05.2008, 14:46   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Ладушка Посмотреть сообщение
Ну помогите... я уже не могу с этими циклами! Куда я их только не запихивала. Он в один столбик всю матрицу выдаёт! Что я не так делаю?
А я думал Вы всё уже сделали давно.....
Код:
  for(i=0;i<nrow;i++)
  {
       for(j=0;j<ncol;j++)  
       { 
             inew=(i + (w % nrow))%nrow; 
             jnew=(j + (z % ncol))%ncol; 
             cout<<setw(2)<<a[inew][jnew]<<"  "; 
       }
       cout<<endl; 
  }
Только сдвигает, кажется, неправильно...
B_N вне форума Ответить с цитированием
Старый 01.05.2008, 21:00   #10
Ладушка
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 13
По умолчанию

Вот и я про то же. Ниче не понимаю! Вроде элементарная задачка, а я туплю. Никогда так долго лабу не делала. Всегда одной ночи хватало
Ладушка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сдвиг данных в dbgrid'e на 1 вверх kate158 БД в Delphi 5 22.08.2008 22:20
циклический сдвиг массива goacher Общие вопросы C/C++ 4 28.05.2008 20:11
циклический сдвиг массива goacher Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2008 22:26
Сдвиг файла OrdJONY Общие вопросы Delphi 13 21.12.2007 22:22