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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2010, 19:09   #1
5298996
 
Регистрация: 15.11.2010
Сообщений: 6
По умолчанию Программирование с использованием динамических двумерных массивов

В матрице MxN переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.
Как написать программу для visual C++?
5298996 вне форума Ответить с цитированием
Старый 15.11.2010, 22:30   #2
Anton
Пользователь
 
Регистрация: 06.08.2007
Сообщений: 43
По умолчанию

Реально не хочу забивать кому-то голову, но алгоритм я вывел таков (если необходимо будет объясню) :

Код:
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::setw;
using std::cin;

int main()
{
	int max = 0,m1 = -1, m2 = -1, res = 0, numi = 0, numj = 0, first = 0, second = 0;
	cout << "1" << endl;
	cin >> first;
	cout << "2" << endl;
	cin >> second;
	int** p = new int*[first];
	for(int k = 0; k < first;k++) 
	{
		p[k] = new int[second];
	}
    for(int i = 0; i < first; i++)
	{
		m1 +=1;
		m2 +=1;
		for(int j=0; j < second; j++)
		{
              p[i][j] = rand();
			if (max < p[i][j])
			{
				   max = p[i][j];
				   numi = i;
				   numj = j;
			}
			
		}
				 res  =  p[m1][m2];
				 p[m1][m2] = max;
				p[numi][numj] = res;

		for(int j=0; j < second; j++)
		{               

				 cout << setw(6) << p[i][j] << "        ";			   
		  
		}
		max = 0;

    cout << endl;
	}
	for (int k = 0; k < second; k++) delete[]p[k];
	delete [] p;
	return 0;
}

Последний раз редактировалось MaTBeu; 16.11.2010 в 16:57.
Anton вне форума Ответить с цитированием
Старый 16.11.2010, 18:11   #3
5298996
 
Регистрация: 15.11.2010
Сообщений: 6
По умолчанию

спасибо. но как то она не так работает у меня.
?
5298996 вне форума Ответить с цитированием
Старый 16.11.2010, 20:00   #4
Anton
Пользователь
 
Регистрация: 06.08.2007
Сообщений: 43
По умолчанию

Что именно у тебя не так работает? Вставляй этот код в Visual C++ (у меня 2008) и получаешь динамически созданные массивы размерностью MxN и заполнение их случайными данными, после чего на главной диагонали нашей матрицы (если конечно M=N) будут наибольшие по величине числа.

Код:
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::setw;
using std::cin;

int main()
{
	int max = 0,m1 = -1, m2 = -1, res = 0, numi = 0, numj = 0, first = 0, second = 0;
	cout << "Write M" << endl; // вводиш размер M
	cin >> first;
	cout << "Write N" << endl; // вводиш размер N и получаеш динамически свою матрицу MxN
	cin >> second;
	int** p = new int*[first];
	for(int k = 0; k < first;k++) 
	{
		p[k] = new int[second];
	}
    for(int i = 0; i < first; i++)
	{
		m1 +=1;
		m2 +=1;
		for(int j=0; j < second; j++)
		{
              p[i][j] = rand(); // здесь используется случайное число заполнение массива
			if (max < p[i][j])
			{
				   max = p[i][j];
				   numi = i;
				   numj = j;
			}
			
		}
				 res  =  p[m1][m2];
				 p[m1][m2] = max;
				p[numi][numj] = res;

		for(int j=0; j < second; j++)
		{               

				 cout << setw(6) << p[i][j] << "        ";			   
		  
		}
		max = 0;

    cout << endl;
	}
	for (int k = 0; k < second; k++) delete[]p[k];
	delete [] p;
	return 0;
}
Anton вне форума Ответить с цитированием
Старый 16.11.2010, 21:10   #5
5298996
 
Регистрация: 15.11.2010
Сообщений: 6
По умолчанию

нужно чтобы вводить матрицу вручную.
а результат получить матрицу измененую
5298996 вне форума Ответить с цитированием
Старый 17.11.2010, 17:30   #6
Anton
Пользователь
 
Регистрация: 06.08.2007
Сообщений: 43
По умолчанию

Значит, смотри, переноси код себе, смотри если что-то в комментариях не понятно тебя, либо вообще ничего не понятно, могу объяснить и в том числе как работает алгоритм. Ничего сложного нет. Вводи свои данные и тебе будет выведена исходная (не измененная матрица), а затем измененная.

Код:
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::setw;
using std::cin;

int main()
{
	int max = 0,m1 = -1, m2 = -1, res = 0, numi = 0, numj = 0, M = 0, N = 0;
	cout << "Write M = "; 
	cin >> M; // вводиш размер M
	cout << "Write N = "; 
	cin >> N; // вводиш размер N 
	cout << "Matrix =  " << M <<"x" << N << endl; // вывод размера матрицы MxN

	int** p = new int*[M];   // блок кода, где выделяется память для двумерного динамического массива
	for(int k = 0; k < M;k++) 
	{
		p[k] = new int[N];
	}   // ---------------------------------------------------------------
	  for(int i = 0; i < M; i++) // цикл для ввода данных в массив
	  {
           for(int j=0; j < N; j++)
		   {     
			  cout << "p [" <<i<< "] [" << j << "] = ";
			  cin >> p[i][j];
		   }
	  } // ----------------------------------------------------------------

	cout << "Current matrix :" << endl;

	for(int i = 0; i < M; i++) // цикл для отображения текущей не измененной матрицы 
	{
       for(int j=0; j < N; j++)
		  {               
				 cout << setw(6) << p[i][j] << "        ";			   
		  }
	   cout << endl;
	} // -----------------------------------------------------------------
	
	cout << endl;  // переход на новую строку

      for(int i = 0; i < M; i++) // собственно цикл сравнения и изменения матрицы (перемещение необходимых элементов)
	 {
		m1 +=1;
		m2 +=1;
		for(int j=0; j < N; j++)
		{     
   			if (max < p[i][j])
			  {	   
				   max = p[i][j];
				   numi = i;
				   numj = j;
			  }
			
		}
				 res  =  p[m1][m2];
				 p[m1][m2] = max;
				p[numi][numj] = res;
		max = 0;
	 } // --------------------------------------------------------------------

	  cout << "Changed matrix :" << endl;
		  
	for(int i = 0; i < M; i++) // цикл для отображения измененной матрицы
	{
       for(int j=0; j < N; j++)
		  {               
				 cout << setw(6) << p[i][j] << "        ";			   
		  } // ---------------------------------------------------------------
	   cout << endl; // переход на новую строку
	}
	for (int k = 0; k < N; k++) delete[]p[k]; // блок кода, для освобождения занятой массивами памяти
	delete [] p; // -----------------------------------------------------------

	return 0;
}
Anton вне форума Ответить с цитированием
Старый 19.11.2010, 00:22   #7
5298996
 
Регистрация: 15.11.2010
Сообщений: 6
По умолчанию

оно сортирует например
1 2 3
3 2 1
1 3 2

3 2 1
2 3 1
1 2 3

если я правильно понял нужно переставлять строки не изменяя их например:

1 2 3
3 2 1
1 3 2

3 2 1
1 3 2
1 2 3
5298996 вне форума Ответить с цитированием
Старый 20.11.2010, 17:09   #8
Anton
Пользователь
 
Регистрация: 06.08.2007
Сообщений: 43
По умолчанию

В принципе да. В алгоритме, я нахожу наибольшее значение текущей строки, после этого запоминаю ее место в массиве и меняю значения местами, соответствующее главной диагонали.
Anton вне форума Ответить с цитированием
Старый 20.11.2010, 18:50   #9
5298996
 
Регистрация: 15.11.2010
Сообщений: 6
По умолчанию

а как написать чтобы строки не изменялись не знаешь?
5298996 вне форума Ответить с цитированием
Старый 20.11.2010, 19:01   #10
Vikenty
Заслуженный флудер
Участник клуба
 
Аватар для Vikenty
 
Регистрация: 31.03.2010
Сообщений: 1,473
По умолчанию

Цитата:
5298996
зачем такие ники делать?
Vikenty вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование с использованием массивов (Pascal) F_U_C_K Помощь студентам 2 14.11.2010 16:19
программирование с использованием массивов Takada_sony Помощь студентам 0 16.05.2010 18:20
Программирование операций обработки двумерных массивов Дима82 Помощь студентам 16 12.05.2008 21:33