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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2013, 21:14   #1
Rokky
Новичок
Джуниор
 
Регистрация: 28.10.2013
Сообщений: 3
По умолчанию Матрица

Есть матрица (N+15)x(N+15). Нужно отсортировать главную диагональ, числа генерировать случайно в интервале [-N-15; N+15]. В приложенном скрине видим, что матрица не 19х19 (как требуется при n=4, т.к. matrix_size=n+15), а непонятно какая. Доходит до сортировки и начинает ругаться. Что тут можно исправить?


Вот код:
Код:
// matrix2.h - файл с прототипами функций
int**create (int coll, int row);
int sort (int**matr, int coll, int row);
void show (int**matr, int coll, int row);

// matrix2.cpp - файл реализации функций
#include <iostream>
#include "matrix2.h"
using namespace std;
int **create (int coll, int row)
{
	// row - строки
	// coll - столбцы

	int **matrix;
	matrix = new int *[row];
	int n=0;
	
	
      for (int i=0; i<row; i++)
	  {
         matrix[i] = new int [coll]; 
	  }

		for (int i=0; i<row; i++)
			{
				for (int j=0; j<coll; j++)
				{
					matrix[i][j] = rand()%(n+15);

						if(rand()%2==0)
							{
								matrix[i][j]=matrix[i][j]*(-1);
							}  
				}
	
			}

	return matrix;
}


int sort (int**matr, int coll, int row)
{
	int matrix_size;
	int n =0;
	int per;
	matrix_size = n+15;

	 for(int i=0; i<matrix_size-1; i++)
                {
					for(int j=0; j<matrix_size-1; j++)
					{
	                    if(matr[row][coll]>matr[row+1][coll])
                    {
                        per = matr[row][coll];
                        matr[row][coll] = matr[row+1][coll];
                        matr[row+1][coll] = per;
                    }
					}
                }
	 return per;
}
	
void show (int **matrix, int coll, int row)

{
	for (int i=0; i<row; i++)
	{
		for (int j=0; j<coll; j++)
		{
			cout<<matrix[i][j]<<'\t';
		}
		cout<<'\n';
	}
}

// lab2.cpp - главный файл
#include <iostream>
#include "matrix2.h"
using namespace std;
int main ()
{
	int row, coll, n, s, **matr;


		cout<<"Vvedite luboe chislo N  :";
		cin>>n;
		row = n + 15;			
		coll = n + 15;
		matr = create (coll, row);	
		cout << "Ishodnaja matrica  :"<<'\n';
		show (matr, coll, row);
		cout << "Sortirovka matricu  :"<<'\n';
		s = sort (matr, coll, row);
	system ("pause");
	return 0;
}
Изображения
Тип файла: jpg otkl3.JPG (98.2 Кб, 125 просмотров)
Тип файла: jpg otkl4.JPG (101.2 Кб, 125 просмотров)
Rokky вне форума Ответить с цитированием
Старый 28.10.2013, 22:40   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Вышли за пределы массива.

Здесь
Код:
if(matr[row][coll]>matr[row+1][coll])

Последний раз редактировалось Stilet; 28.10.2013 в 22:52.
Igor95 вне форума Ответить с цитированием
Старый 28.10.2013, 22:51   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Сортировка:
Код:
void sort (int**matr, int coll, int row)
{
	int per;

	 for(int i=0; i<row-1; i++)
                {
					for(int j=0; j<coll-1; j++)
					{
	                    if(matr[i][i]>matr[j][j])
                    {
                        per = matr[i][i];
                        matr[i][i] = matr[j][j];
                        matr[j][j] = per;
                    }
					}
                }
	 return;
}
И майн:
Код:
int main()
{
int row, coll, n, s, **matr;


		cout<<"Vvedite luboe chislo N  :";
		cin>>n;
		row = n + 5;
		coll = n + 5;
		matr = create (coll, row);
		cout << "Ishodnaja matrica  :"<<'\n';
		show (matr, coll, row);
		cout << "Sortirovka matricu  :"<<'\n';
		sort (matr, coll, row);
		show (matr, coll, row);
	system ("pause");
	return 0;
}
Если я правильно понял условие.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.10.2013, 01:03   #4
Rokky
Новичок
Джуниор
 
Регистрация: 28.10.2013
Сообщений: 3
По умолчанию

Спасибо огромнейшее! Все работает!
Только один вопрос, чисто для себя уяснить: почему в отсортированной матрице последний столбец не меняется? я имею ввиду последнюю сточку последнего столбца. Вот тут на скрине по главной диагонали идет 12 9 5 2 -8 -12 и 0 (?)
Изображения
Тип файла: jpg matr.JPG (105.7 Кб, 144 просмотров)
Rokky вне форума Ответить с цитированием
Старый 29.10.2013, 01:19   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

А так?
Код:
void
sort(int **matr, int col, int row)
{
    int per;
    int p = min(col, row);
    for (int i = 0; i < p - 1; ++i)
        for (int j = i + 1; j < p; ++j)
            if(matr[i][i] > matr[j][j]) {
                per = matr[i][i];
                matr[i][i] = matr[j][j];
                matr[j][j] = per;
            }
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.10.2013, 01:33   #6
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Тут любой алгоритм сортировки подойдет, главное правильно работать с индексами
Igor95 вне форума Ответить с цитированием
Старый 29.10.2013, 06:31   #7
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
// сортировка Шелла, только для квадратных матриц
void shell_msort(int** mat, int N) {
       int j, nmin;
       for(int m = N / 2; m > 0; m /= 2) {
               for(int k = 0; k < m; k++) {

                       for(int i = m + k; i < N; i += m) {
                                nmin = mat[i][i];
                                 j     = k;
                                while((j < i) && (mat[j][j] < nmin))
                                          j += m;

                                for(int p = i - m; p >= j; p -= m)
                                         mat[p + m][p + m] = mat[p][p];
                                mat[j][j] = nmin;
                       }
              }
      }
}
Nuklon вне форума Ответить с цитированием
Старый 29.10.2013, 20:16   #8
Rokky
Новичок
Джуниор
 
Регистрация: 28.10.2013
Сообщений: 3
По умолчанию

BDA, извините, не могли бы вы обьяснить эту сортировку словесно?
Rokky вне форума Ответить с цитированием
Старый 30.10.2013, 21:08   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Берется i элемент и сравнивается со всеми, идущими за ним. Если нужно, то меняется местами с j-ым. Все элементы до i-того отсортированы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Матрица NxN -> текстовый файл -> Матрица NxN - найти max по диагоналям -> типизированный файл Лунатик13 Помощь студентам 1 20.02.2012 15:54
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
матрица Gerberka Помощь студентам 2 27.05.2010 19:30
TurboPascal: граф, матрица смежности и матрица инцидентности. ulala Помощь студентам 0 02.12.2009 10:11
Матрица Sweto4ka Общие вопросы C/C++ 1 17.10.2009 18:19