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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2011, 16:28   #1
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию Циклический сдвиг строк в многомерном массиве.

Здравствуйте!

Подскажите пожалуйста, как решить ,следующие, задачу: в массиве (4х4) произвести циклический сдвиг каждой строки (кроме первой) . Из исходного массива -

1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

Получить массив -
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

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

using namespace std;

int main ()
{
    int massiv [4][4] = {{1,2,3,4},
                         {1,2,3,4},
                         {1,2,3,4},
                         {1,2,3,4}};
    
    cout << "massiv do: \n";
    for (int i=0; i<4; i++){
        for (int j=0; j<4; j++){
            cout << massiv [i][j]<< " ";
            }
            cout << endl;
            }
        
    cout << endl << endl;
            
    getch ();
    return 0;
}

/* 
1234
2341
3412
4123 */
Может, кто то с реализацией похожей задачи сталкивался, подскажите, как её решить. Буду благодарен за помощь.

PS: Видел на форумах код циклического сдвига для одномерного массива. Но там происходить просто замена столбцов. Можно ли таким же способом реализовать мою задачу?

Код:
#include<iostream>
using namespace std;
int main() {
        int mas[7]={1,2,3,4,5,6,7};
        cout << "Mas DO \n";
        for (int i=0; i<7; i++){
            cout << mas [i] << " ";
            }
            cout << endl << endl;
        int tmp[7];
        int size=sizeof(mas)/sizeof(int)-1;
        int sdvig=2;
        for(int i=0;i<sdvig-1;i++) {
                int tmp=mas[i];
                mas[i]=mas[sdvig];
                mas[sdvig]=tmp;
        }
         for(int i=size,j=sdvig+1;i>size-sdvig;i--,j++) {
                 int tmp=mas[i];
                 mas[i]=mas[j];
                 mas[j]=tmp;
         }
         for(int i=0,j=size;i<size/2;i++,j--) {
       int tmp=mas[i];
                 mas[i]=mas[j];
                 mas[j]=tmp;
         }
        
        cout << "Mas \n";
        for (int i=0; i<7; i++){
            cout << mas [i] << " ";
            }
        
        cin.get();
        return 0;
}
Corvette вне форума Ответить с цитированием
Старый 27.08.2011, 17:10   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Если чтобы понятно:
Код:
#include <iostream>

using namespace std;


const int size = 4;


void print_array(int massiv[size][size]);
void rotate_left_array(int massiv[size], int pos);


int main()
{
	int massiv[size][size] =
		{{1,2,3,4},
         {1,2,3,4},
         {1,2,3,4},
         {1,2,3,4}};

	cout << "Array before:" << endl;
	print_array(massiv);
	cout << endl;

	for(int i = 0; i < size; i++)
		rotate_left_array(massiv[i], i);

	cout << "Array after:" << endl;
	print_array(massiv);
	cout << endl;

	return 0;
}


void print_array(int massiv[size][size])
{
	for(int i = 0; i < size; i++)
	{
		for(int j = 0; j < size; j++)
			cout << massiv[i][j] << " ";
		cout << endl;
	}
}

void rotate_left_array(int massiv[size], int pos)
{
	int temp_arr[size];
	for(int i = 0; i < pos; i++)
		temp_arr[size - pos + i] = massiv[i];
	for(int i = pos; i < size; i++)
		temp_arr[i - pos] = massiv[i];

	for(int i = 0; i < size; i++)
		massiv[i] = temp_arr[i];
}
Если чтобы компактно:
Код:
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;


const int size = 4;


int main()
{
	int massiv[size][size] =
		{{1,2,3,4},
         {1,2,3,4},
         {1,2,3,4},
         {1,2,3,4}};

	cout << "Array before:" << endl;
	for(int i = 0; i < size; cout << endl, i++)
		copy(massiv[i], massiv[i] + size, ostream_iterator<int>(cout, " "));
	cout << endl;

	for(int i = 0; i < size; i++)
		rotate(massiv[i], massiv[i] + i, massiv[i] + size);

	cout << "Array after:" << endl;
	for(int i = 0; i < size; cout << endl, i++)
		copy(massiv[i], massiv[i] + size, ostream_iterator<int>(cout, " "));
	cout << endl;

	return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 27.08.2011, 17:44   #3
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Спасибо большое!!!!!!!!!!!!!!!!!!!!
Corvette вне форума Ответить с цитированием
Старый 27.08.2011, 17:45   #4
CodeNOT
Форумчанин
 
Аватар для CodeNOT
 
Регистрация: 08.11.2010
Сообщений: 593
По умолчанию

можно еще один "хм-хм" вариант )))))(ему место на говнокод.ру))
Код:
#include "stdafx.h"
#include "iostream"
using namespace std;
void _matrixInit(int matrix[10][10])
{
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			matrix[i][j]=0;
		}
	}
}
void _matrixInserts(int matrix[10][10],int n,int m)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cout<<"\n matrix["<<i<<"]["<<j<<"]= ";
			cin>>matrix[i][j];
		}
	}
}
void _printMatrix(int matrix[10][10],int n,int m)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cout<<matrix[i][j]<<" ";
		}
		cout<<"\n";
	}
}
void _shift(int mas[10][10],int n,int m)
{
	int shift=1;
		for(int i=1;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				mas[i][j]=mas[i-1][j];
			}
			for(int j=0;j<m-1;j++)
			{
				int tmp=mas[i][j];
				mas[i][j]=mas[i][j+1];
				mas[i][j+1]=tmp;
			}
		}
}
int _tmain(int argc, _TCHAR* argv[])
{
int mas[10][10];
int rows=0,cols=0;
	cout<<"\n insert rows= ";cin>>rows;
	cout<<"\n insert cols= ";cin>>cols;
	_matrixInit(mas);
	_matrixInserts(mas,rows,cols);
	_printMatrix(mas,rows,cols);
	_shift(mas,rows,cols);
	cout<<"\n after \n";
	_printMatrix(mas,rows,cols);
	system("pause >> void");
        return 0;
}
CodeNOT вне форума Ответить с цитированием
Старый 27.08.2011, 23:15   #5
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Спасибо!!!
Corvette вне форума Ответить с цитированием
Старый 29.08.2011, 20:58   #6
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Попытался усложнить задачу, сделать сдвиг для 3-х мерного массива (инициализировал две матрицы). Но выдает ошибку при компиляции. Скажите пожалуйста, что я делаю не правильно.

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


using namespace std;


const int size = 4;
const int kol = 2;


void print_array(int massiv[kol][size][size]);
void rotate_left_array(int massiv[kol][size], int pos);


int main()
{
	int massiv[kol][size][size] = {
         {{1,2,3,4},
         {1,2,3,4},
         {1,2,3,4},
         {1,2,3,4}},
         {{5,6,7,8},
         {5,6,7,8},
         {5,6,7,8},
         {5,6,7,8}}
         };

	cout << "Array before:" << endl;
	print_array(massiv);
	cout << endl;

	for (int y=0; y<kol; y++){
    for(int i=0; i<size; i++){
		rotate_left_array(massiv [y][i], i);
    }
    }

	cout << "Array after:" << endl;
	//print_array(massiv);
	cout << endl;

    getch ();
	return 0;
}


void print_array(int massiv[kol][size][size])
{
    for (int y=0; y<kol; y++){
    cout << "Massiv  " << y << endl << endl;
    for(int i = 0; i < size; i++)
	{
		for(int j = 0; j < size; j++)
			cout << massiv[y][i][j] << " ";
		cout << endl;
	}
    }
}

void rotate_left_array(int massiv[kol][size], int pos)
{
    for (int y=0; y<kol; y++){
    int temp_arr[y][4];
	for(int i = 0; i < 1; i++)
		temp_arr[y][4 - 1 + i] = massiv[y][i];
	for(int i = 1; i < 4; i++)
		temp_arr[y][i - 1] = massiv[y][i];

	for(int i = 0; i < 4; i++)
		massiv[y][i] = temp_arr[y][i];
    }
}
Corvette вне форума Ответить с цитированием
Старый 29.08.2011, 21:11   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Скажите пожалуйста, что я делаю не правильно.
Вы не пишете, какая ошибка компиляции.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 29.08.2011, 21:14   #8
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Компилятор (Dev –C++)
Выделяет строку rotate_left_array(massiv [y][i], i); и пишет: 35 cannot convert `int*' to `int (*)[4]' for argument `1' to `void rotate_left_array(int (*)[4], int)'
Corvette вне форума Ответить с цитированием
Старый 29.08.2011, 21:16   #9
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

1. В строке 35 вы передаете одномерный массив, где нужно двумерный.
2. В функции rotate_left_array вы создаете массив размерности переменной, не являющейся константой времени компиляции, чего в стандарте, которому следует ваш компилятор (и мой тоже) делать нельзя.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 29.08.2011, 21:17   #10
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
сдвиг для 3-х мерного массива
Объясните, как вы себе это представляете. (можно интерпретировать по-разному)
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический сдвиг Санеk Паскаль, Turbo Pascal, PascalABC.NET 17 26.12.2015 01:31
Как отсортировать ключи и значения в многомерном массиве? akokin PHP 8 10.01.2010 12:32
Циклический сдвиг Mish92(21-09) Помощь студентам 0 07.11.2009 21:59
сортировка в многомерном массиве LeoN PHP 8 03.06.2008 15:39
Циклический сдвиг столбцов в массиве С++ Помогите! Ладушка Общие вопросы C/C++ 10 01.05.2008 23:17