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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2010, 21:28   #1
Inna_L
Пользователь
 
Регистрация: 22.06.2010
Сообщений: 13
Вопрос Двумерный динамический массив

Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в
указанную сторону.
Подскажите в чем дело, не понимаю не работает программа.
Код:
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;

int **Add_str(int **mas,int &M,int N, int p, int x)//ф-я сдвига строки
{   int**temp=new int *[M];
	
	if (x==2)//СДВИГ ВНИЗ//не работает сдвиг
	{
	 for(int i=M-1;i>0;i--)
	 temp[i]=mas[(i - (p % M))%M];
	    temp[0]=mas[((M) - (p % M))%M];
	}
	if (x==8)//СДВИГ ВВЕРХ
	{
	 for(int i=0;i<M;i++)
		temp[i]=mas[(i + (p % M))%M];
	}
	return temp;
}

int **Add_stb(int **mas,int M,int &N,int p, int x)//ф-я сдвига столбца
{
	int**temp=new int *[M];
	if (x==4)//сдвиг влево
	{
	 for(int i=0;i<M;i++)
	  {
		temp[i]=new int[N];
		for(int j=0;j<N;j++)
		{
			temp[j]=mas[(j + (p % N))%N];
		}
	  }
	}
	if (x==6)//сдвиг вправо
	{
     for(int i=0;i<M;i++)
	  {
		temp[i]=new int[N];
		for(int j=0;j<N;j++)
		{
			temp[j]=mas[(j - (p % N))%N];
		}
	   }
	}
	return temp;
}

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]<<"\t";
		}
		cout<<endl;
	}
}
void main()
{
setlocale(LC_CTYPE,"Russian");
srand((unsigned) time(NULL));
int M=0, N=0, k=0, p=0, x=0;

cout << "Введите количество строк: ";
cin>>M;
cout << "Введите количество столбцов: ";
cin>>N;
cout << "Введите колличество сдвигов: ";
cin>>p;
cout << "Введите в какую сторону сдвиг: если вправо - 6, если влево - 4, если вверх - 8, если вниз - 2";
cin>>x;

int **mas=new int*[M];
for(int i=0; i<M; i++)
	{
	 mas[i]=new int[N];
       for(int j=0; j<N; j++)
	   {mas[i][j]=rand()%100;}
    }
cout << "Наша матрица: "<<endl;
Show(mas,M,N);
do 
{
	cout<<"1-сдвиг строки\n 2- сдвиг столбца\n 3-сдвиг строки и столбца\n 4-вывести массив\n 5-выход\n";
	cin>>k;


	switch (k)
	{
	case 1:
	mas = Add_str(mas,M,N,p,x);
    cout<<"стpока успешно сдвинута!\n";
    _getch();
	//system("cls");
	break;

	case 2:
	mas = Add_stb(mas,M,N,p,x);
    cout<<"столбец успешно сдвинут!\n";
    _getch();
	//system("cls");
	break;

	case 3:
	/*mas = Add_stb(mas,M,N,p,x);
    cout<<"строка и столбец успешно сдвинуты!\n";
    _getch();*/
	//system("cls");
	break;
	
	case 4:
	Show(mas,M,N);
    _getch();
	//system("cls");
	break;
	}
}
while(k!=5);
}
Inna_L вне форума Ответить с цитированием
Старый 01.10.2010, 22:59   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

тяжело разбирать ваш код, поэтому вот...

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ROWS 5
#define COLS 9

//--------------------------------------------------------------------------------------
int **create_mass()
{
	int i, j;
	int **ret = (int **) malloc(sizeof(int *) * ROWS);
	for (i = 0; i < ROWS; i++)
		ret[i] = (int *) malloc(sizeof(int) * COLS);

	for (i = 0; i < ROWS; i++)
		for (j = 0; j < COLS; j++)
			ret[i][j] = rand() % 100;


	return ret;
}

//--------------------------------------------------------------------------------------
void free_mass(int **mass)
{
	int i;
	for (i = 0; i < ROWS; i++)
		free(mass[i]);
	free(mass);
}

//--------------------------------------------------------------------------------------
void print_mass(int **mass)
{
	int i, j;
	for (i = 0; i < ROWS; i++) {
		for (j = 0; j < COLS; j++)
			printf("%d ", mass[i][j]);
		printf("\n");
	}

	printf("\n");
}

/* val - на сколько сдвинуть, to - куда сдвинуть (1 либо 0) */
//--------------------------------------------------------------------------------------
void shift_rows(int **mass, int val, int to)
{
	int i, *temp;

	if (to) {
		while (val-- > 0) {
			for (i = 0; i < ROWS - 1; i++) {
				temp = mass[i];
				mass[i] = mass[i + 1];
				mass[i + 1] = temp;
			}
		}
	} else {
		while (val-- > 0) {
			for (i = ROWS - 1; i > 0; i--) {
				temp = mass[i];
				mass[i] = mass[i - 1];
				mass[i - 1] = temp;
			}
		}
	}
}

/* val - на сколько сдвинуть, to - куда сдвинуть (1 либо 0) */
//--------------------------------------------------------------------------------------
void shift_cols(int **mass, int val, int to)
{
	int i, j, temp;

	if (to) {
		while (val-- > 0) {
			for (i = 0; i < COLS - 1; i++) {
				for (j = 0; j < ROWS; j++) {
					temp = mass[j][i];
					mass[j][i] = mass[j][i + 1];
					mass[j][i + 1] = temp;
				}
			}
		}
	} else {
		while (val-- > 0) {
			for (i = COLS - 1; i > 0; i--) {
				for (j = ROWS - 1; j >= 0; j--) {
					temp = mass[j][i];
					mass[j][i] = mass[j][i - 1];
					mass[j][i - 1] = temp;
				}
			}
		}
	}
}

//--------------------------------------------------------------------------------------
int main()
{
	int **mass = create_mass();
	print_mass(mass);
	shift_rows(mass, 2, 1);
	print_mass(mass);
	shift_cols(mass, 2, 0);
	print_mass(mass);
	free_mass(mass);
	return (0);
}
ну тут все просто, shift_rows двигает строки, shift_cols - колонки. принимают указатель на массив, на скока двигать, и куда двигать. куда двигать - 1 либо 0. для строк это вверх/вниз, для колонок - лево/право.
можно конечно функции сдвига было оптимизировать, но влом) так же кол во строк и столбцов у меня задается статически в дефайнах. на значения поменять не составит труда.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.10.2010, 23:27   #3
Inna_L
Пользователь
 
Регистрация: 22.06.2010
Сообщений: 13
По умолчанию

Спасибо, впечатляет!
Inna_L вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двумерный динамический массив amandra Общие вопросы Delphi 16 30.07.2013 22:56
Двумерный динамический массив С++ UnknownVirus Помощь студентам 7 20.06.2010 01:48
Динамический двумерный массив кнопок. Вопрос i-cpp Общие вопросы C/C++ 4 25.01.2010 21:39
двумерный динамический массив с запросом к пользователю о кол-ве строк и столбцов? vasyapupkin Общие вопросы C/C++ 2 22.11.2009 17:37
Двумерный динамический массив IceExecutioner Общие вопросы Delphi 1 04.06.2009 08:41