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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2011, 00:57   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию циклический сдвиг

Всем добрый вечер, помогите найти ошибку, и немножко помочь по возможности.
Собственно вот задание
Дана матрица порядка MxN (M строк, N столбцов).
Необходимо заполнить ее значениями и написать функцию,
осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.
первую строчку он влево крутит нормально
а вот с остальными какой то баг непонятно что творит..
и подскажите как сделать чтоб он двигал указанное кол-во раз?
код:
Код:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
int ** create(int,int);
void fill(int**,int,int);
void show(int**,int,int);
void rev(int**,int,int,int);
int main()
{
int** mas;
int m,n;


cout<<"Kolichestvo strok dvumernogo massiva: ";
cin>>m;
cout<<"Kolichestvo stolbcov dvumernogo massiva: ";
cin>>n;

mas=create(m,n);
fill(mas,m,n);
cout<<endl;
show(mas,m,n);
cout<<"Vvedite K: ";
int k;
do{
cin>>k;
rev(mas,m,n,k);
show(mas,m,n);

}while(k!=-1);
return 0;
}
//создание массива
int** create(int r,int c)
{
	int**a=new int*[r];
	for(int i=0;i<r;i++)
		{
			a[i]=new int[c];
		
		}
	return a;
}
//заполнение
void fill(int** p,int r,int c)
{
	for(int i=0;i<r;i++)
	{
		for(int k=0;k<c;k++)
		{
			p[i][k]=rand()%9+1;
		}
	}

}
//отображение
void show(int**mas,int m,int n)
{
	for(int i=0;i<m;i++)
{
    
     for(int j=0;j<n;j++)
     {
          cout<<mas[i][j]<<"   ";
      }
	 cout<<endl;
}
}
//прокрутка
void rev(int**mas,int m,int n,int k)
{
	int *tmpm=new int[k];

for(int i=0;i<k;i++)
{
    for(int j=0;j<m-k;j++)
    {
        tmpm[j]=mas[i][j];
        mas[i][j]=mas[i][j+k];
    }
    for(int j=m-k;j<n;j++)
    {
        mas[i][j]=tmpm[j-(m-k)];
    }
}
}
revaldo666 вне форума Ответить с цитированием
Старый 29.03.2011, 09:26   #2
GroZa
Freelancer
Пользователь
 
Аватар для GroZa
 
Регистрация: 29.01.2011
Сообщений: 33
По умолчанию

Что-то ты замудрил.

Код:
void RollArrayRows( int **a, int r, int c ); // прокрутка строк массива 'a' размером 'r' строк на 'c' строк
{
	int *l; // последний элемент

	while ( c-- ) // делаем c сдвигов
	{
		l = a[r-1];

		for ( int i = 0; i < r - 1; i++ ) // делаем 1 сдвиг
		{
			a[i+1] = a[i];
		}

		a[0] = l;
	}
}
Сделать для столбцов - твоё задание
falax species rerum
GroZa вне форума Ответить с цитированием
Старый 29.03.2011, 14:54   #3
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

что то ту неверно
он меняет местами первую и последнюю строку.
может я вызываю не правильно...я прям незнаю.

Код:
do{
cin>>k;
RollArrayRows(mas,m,k);
show(mas,m,n);
}while(true);
revaldo666 вне форума Ответить с цитированием
Старый 29.03.2011, 16:29   #4
GroZa
Freelancer
Пользователь
 
Аватар для GroZa
 
Регистрация: 29.01.2011
Сообщений: 33
По умолчанию

Да уж, тот код полный бред.
Код:
void RollArrayRows( int **a, int r, int c ) // прокрутка строк массива 'a' размером 'r' строк на 'c' строк
{
	if ( r < 2 ) return; // смысл 1 строку прокручивать :)

	int *buf;

	while ( c-- ) // делаем c сдвигов
	{
		buf = a[r-1];
		memcpy( a + 1, a, ( r - 1 ) * sizeof( int* ) );
		a[0] = buf;
	}
}
Можно впринципе вообще без цикла обойтись.
falax species rerum

Последний раз редактировалось GroZa; 29.03.2011 в 16:32.
GroZa вне форума Ответить с цитированием
Старый 29.03.2011, 17:34   #5
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

всё работает...
а можеш подсказать как сделать чтоб двигалась только указанная строка, и не вверх вниз, а в стороны (в какую именно по указанию пользователя сделаю сам)
revaldo666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический сдвиг в С rand8154 Общие вопросы C/C++ 1 14.11.2009 01:49
Циклический сдвиг Mish92(21-09) Помощь студентам 0 07.11.2009 21:59
циклический сдвиг массива goacher Общие вопросы C/C++ 4 28.05.2008 20:11
циклический сдвиг массива goacher Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2008 22:26