Код работает не корректно, но ошибок не выдаёт, помогите найти в чём проблема.
Необходимо сформировать из части элементов двумерного массива одномерный и отсортировать по убыванию.
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdlib.h>
using namespace std;
class Matrix
{
private:
int **Item;
int Row;
int Col;
int *Item2;
public:
Matrix();
Matrix(int R, int C, int Low, int Hi);
~Matrix();
void Out();
void final();
void SortUp();
};
void Matrix::Out()
{
cout << endl;
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Col; j++)
{
cout << Item[i][j] << "\t";
}
cout << endl;
}
}
Matrix::Matrix(int R, int C, int Low, int Hi)
{
Row = R;
Col = C;
Item = new int *[Row];
for (int i = 0; i < Row; i++)
Item[i] = new int[Col];
srand(time(0));
for (int i = 0; i < Row; i++)
for (int j = 0; j < Col; j++)
Item[i][j] = Low + rand() % (Hi - Low + 1);
}
// destructor
Matrix::~Matrix()
{
for (int i = 0; i < Row; i++)
delete[] Item[i];
delete[] Item;
}
void Matrix::SortUp()
{
int k = 0;
cout << endl << "Odnomerniyu massive: ";
for (int i = 0; i < (Row / 2); i++)
{
for (int j = (Col / 2); j < Col; j++)
{
int *Item2;
Item2 = new int; // Item2[k];
Item2[k] = Item[i][j];
// cout << Item2[k] << " ";
k++;
for (int i = 0; i < k - 1; i++)
{ // k - длина массива
for (int j = 0; j < k - i - 1; j++)
{
if (Item2[j] < Item2[j + 1])
{
int tmp = Item2[j];
Item2[j] = Item2[j + 1];
Item2[j + 1] = tmp;
for (int i = 0; i < Row / 2; i++)
{
cout << Item2[i] << " "; // выводим элементы массива
}
}
}
}
}
}
}
int main()
{
Matrix X(7, 7, -10, 100);
X.Out();
X.SortUp();
return 0;
}
Для начале, в Вашем классе Matrix есть декларация конструктора без параметров Matrix()
,
но нет его определения, зато есть определение конструктора с параметрами
Matrix::Matrix(int R, int C, int Low, int High)
, хотя в теле класса нет прототипа.
Еще в функции
SortUp()
{
//....
int* Item2;
Item2 = new int; // Item2[k];
Item2[k] = Item[i][j];
Вы закомментировали код, который, вероятно, Вы ожидаете к исполнению.
Вы не описали, какую именно часть двумерного массива нужно представить в виде одномерного, но судя по вашему коду, правую верхнюю четверть.
Тогда размер выделим так
Item2 = new int[(Col/2) * (Row/2 + Row%2)]
В итоге Ваша функция должна выглядеть примерно так:
void Matrix::SortUp()
{
int k = (Row / 2) * (Col / 2 + Col % 2); // k - длина массива
cout << endl << "1 dimensional array: ";
std::cout << std::endl;
int* Item2;
Item2 = new int[k];
int index = 0;
for (int i = 0; i < (Row / 2); i++)
{
for (int j = (Col / 2); j < Col; j++)
{
Item2[index] = Item[i][j];
++index;
}
}
for (int i = 0; i < k; i++)
{
cout << Item2[i] << " "; // выводим элементы массива
}
// cout << Item2[k] << " ";
for (int i = 0; i < k; i++)
{
for (int j = 0; j < k - 1; j++)
{
if (Item2[j] < Item2[j + 1])
{
int tmp = Item2[j];
Item2[j] = Item2[j + 1];
Item2[j + 1] = tmp;
}
}
}
std::cout << std::endl;
std::cout << "Sorted arr : " << std::endl;
for (int i = 0; i < k; i++)
{
cout << Item2[i] << " "; // выводим отсортированные элементы массива
}
}
p.s.
Еще из Вашего класса можно убрать функция final()
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Дана последовательность из n словДля каждого элемента определить, сколько раз это слово встречалось в этой последовательности раньше ( на позициях...