根据 C++ 特性重新排列矩阵列
Rearranging the matrix column accordance to characteristics C++
我的任务听起来像:整数矩阵的一列的特征是它的负奇数元素之和。重新排列给定矩阵的列,按照特征的增长排列。
我正在制作两个子阵列。首先,它被称为“nesort”,我看不到数组的排序特征。在另一个称为“选项卡”的地方,我看到根据我的任务进行了排序。然后我按元素比较子数组并生成新的子数组。但问题是当在开始数组中生成时是数字的重播。最终数组会比我们需要的大。你能帮我看看我的代码吗?特别是我的循环。有什么问题?
There is example of my code :
enter code here
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
cout << "Практическая работа по практике Казаков 9903:" << endl;
const int ROWS = 5;
const int COLS = 5;
int arr[ROWS][COLS];
int nesort[COLS];
int tab[COLS];
//Array generating
srand(time(NULL));
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = rand() % 41 - 20;
}
}
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
cout << "Массив построен!" << endl << "\n";
//Counting and output of characteristics
cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;
for (int j = 0; j < COLS; j++)
{
int sum = 0;
for (int i = 0; i < ROWS; i++)
{
if (arr[i][j] < 0 && arr[i][j] & 1)
{
sum = sum + arr[i][j];
}
}
nesort[j] = sum;
tab[j] = sum;
}
for (int s = 0; s < COLS; s++)
{
cout << nesort[s] << "\t";
cout << endl;
}
cout << endl;
//Sorting of columns characteristics
cout << "Отсортированные характеристики столбцов: " << endl;
int n = sizeof(tab) / sizeof(tab[0]);
sort(tab, tab + n);
for (int r = 0; r < COLS; r++)
{
cout << tab[r] << "\t";
cout << endl;
}
cout << endl;
cout << "Отсортированный по хар-кам массив: " << endl;
//Sorting the start array by characteristics
for (int n = 0; n < ROWS; n++)
{
for (int i = 0; i < ROWS; i++)
{
if (tab[n] == nesort[i])
{
for (int j = 0; j < COLS; j++)
{
cout << arr[j][i] << "\n";
}
cout << endl;
}
}
}
}
你在最后一个循环中有一个错误。这可以很容易地修复:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
cout << "Практическая работа по практике Казаков 9903:" << endl;
const int ROWS = 5;
const int COLS = 5;
int arr[ROWS][COLS];
int nesort[COLS];
int tab[COLS];
//Array generating
srand(time(NULL));
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = rand() % 41 - 20;
}
}
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
cout << "Массив построен!" << endl << "\n";
//Counting and output of characteristics
cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;
for (int j = 0; j < COLS; j++)
{
int sum = 0;
for (int i = 0; i < ROWS; i++)
{
if (arr[i][j] < 0 && arr[i][j] & 1)
{
sum = sum + arr[i][j];
}
}
nesort[j] = sum;
tab[j] = sum;
}
for (int s = 0; s < COLS; s++)
{
cout << nesort[s] << "\t";
cout << endl;
}
cout << endl;
//Sorting of columns characteristics
cout << "Отсортированные характеристики столбцов: " << endl;
int n = sizeof(tab) / sizeof(tab[0]);
sort(tab, tab + n);
for (int r = 0; r < COLS; r++)
{
cout << tab[r] << "\t";
cout << endl;
}
cout << endl;
cout << "Отсортированный по хар-кам массив: " << endl;
//Sorting the start array by characteristics
for (int sortedColSumIndex = 0; sortedColSumIndex < COLS; ++sortedColSumIndex) {
for (int colSumIndex = 0; colSumIndex < COLS; ++colSumIndex) {
if (tab[sortedColSumIndex] == nesort[colSumIndex]) {
for (int row = 0; row < ROWS; ++row) {
std::cout << arr[row][colSumIndex] << '\n';
}
std::cout << '\n';
}
}
}
}
但是如果 comums 的总和是两倍或多倍,这将无助于列将出现多次的主要设计问题。
那不是那么容易治愈的。
有必要更改设计。您需要根据 index.
列进行排序
所以,像这样:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
cout << "Практическая работа по практике Казаков 9903:" << endl;
const int ROWS = 5;
const int COLS = 5;
int arr[ROWS][COLS];
int nesort[COLS];
int tab[COLS];
//Array generating
srand(time(NULL));
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = rand() % 41 - 20;
}
}
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
cout << "Массив построен!" << endl << "\n";
//Counting and output of characteristics
cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;
for (int j = 0; j < COLS; j++)
{
int sum = 0;
for (int i = 0; i < ROWS; i++)
{
if (arr[i][j] < 0 && arr[i][j] & 1)
{
sum = sum + arr[i][j];
}
}
nesort[j] = sum;
tab[j] = j;
}
for (int s = 0; s < COLS; s++)
{
cout << nesort[s] << "\t";
cout << endl;
}
cout << endl;
//Sorting of columns characteristics
cout << "Отсортированные характеристики столбцов: " << endl;
int n = sizeof(tab) / sizeof(tab[0]);
sort(tab, tab + n, [&](const int i1, const int i2) {return nesort[i1] < nesort[i2]; });
for (int r = 0; r < COLS; r++)
{
cout << tab[r] << "\t";
cout << endl;
}
cout << endl;
cout << "Отсортированный по хар-кам массив: " << endl;
//Sorting the start array by characteristics
for (int row = 0; row < ROWS; ++row) {
for (int sortedColSumIndex = 0; sortedColSumIndex < COLS; ++sortedColSumIndex) {
std::cout << arr[row][tab[sortedColSumIndex]] << '\t';
}
std::cout << '\n';
}
}
我的任务听起来像:整数矩阵的一列的特征是它的负奇数元素之和。重新排列给定矩阵的列,按照特征的增长排列。
我正在制作两个子阵列。首先,它被称为“nesort”,我看不到数组的排序特征。在另一个称为“选项卡”的地方,我看到根据我的任务进行了排序。然后我按元素比较子数组并生成新的子数组。但问题是当在开始数组中生成时是数字的重播。最终数组会比我们需要的大。你能帮我看看我的代码吗?特别是我的循环。有什么问题?
There is example of my code :
enter code here
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
cout << "Практическая работа по практике Казаков 9903:" << endl;
const int ROWS = 5;
const int COLS = 5;
int arr[ROWS][COLS];
int nesort[COLS];
int tab[COLS];
//Array generating
srand(time(NULL));
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = rand() % 41 - 20;
}
}
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
cout << "Массив построен!" << endl << "\n";
//Counting and output of characteristics
cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;
for (int j = 0; j < COLS; j++)
{
int sum = 0;
for (int i = 0; i < ROWS; i++)
{
if (arr[i][j] < 0 && arr[i][j] & 1)
{
sum = sum + arr[i][j];
}
}
nesort[j] = sum;
tab[j] = sum;
}
for (int s = 0; s < COLS; s++)
{
cout << nesort[s] << "\t";
cout << endl;
}
cout << endl;
//Sorting of columns characteristics
cout << "Отсортированные характеристики столбцов: " << endl;
int n = sizeof(tab) / sizeof(tab[0]);
sort(tab, tab + n);
for (int r = 0; r < COLS; r++)
{
cout << tab[r] << "\t";
cout << endl;
}
cout << endl;
cout << "Отсортированный по хар-кам массив: " << endl;
//Sorting the start array by characteristics
for (int n = 0; n < ROWS; n++)
{
for (int i = 0; i < ROWS; i++)
{
if (tab[n] == nesort[i])
{
for (int j = 0; j < COLS; j++)
{
cout << arr[j][i] << "\n";
}
cout << endl;
}
}
}
}
你在最后一个循环中有一个错误。这可以很容易地修复:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
cout << "Практическая работа по практике Казаков 9903:" << endl;
const int ROWS = 5;
const int COLS = 5;
int arr[ROWS][COLS];
int nesort[COLS];
int tab[COLS];
//Array generating
srand(time(NULL));
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = rand() % 41 - 20;
}
}
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
cout << "Массив построен!" << endl << "\n";
//Counting and output of characteristics
cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;
for (int j = 0; j < COLS; j++)
{
int sum = 0;
for (int i = 0; i < ROWS; i++)
{
if (arr[i][j] < 0 && arr[i][j] & 1)
{
sum = sum + arr[i][j];
}
}
nesort[j] = sum;
tab[j] = sum;
}
for (int s = 0; s < COLS; s++)
{
cout << nesort[s] << "\t";
cout << endl;
}
cout << endl;
//Sorting of columns characteristics
cout << "Отсортированные характеристики столбцов: " << endl;
int n = sizeof(tab) / sizeof(tab[0]);
sort(tab, tab + n);
for (int r = 0; r < COLS; r++)
{
cout << tab[r] << "\t";
cout << endl;
}
cout << endl;
cout << "Отсортированный по хар-кам массив: " << endl;
//Sorting the start array by characteristics
for (int sortedColSumIndex = 0; sortedColSumIndex < COLS; ++sortedColSumIndex) {
for (int colSumIndex = 0; colSumIndex < COLS; ++colSumIndex) {
if (tab[sortedColSumIndex] == nesort[colSumIndex]) {
for (int row = 0; row < ROWS; ++row) {
std::cout << arr[row][colSumIndex] << '\n';
}
std::cout << '\n';
}
}
}
}
但是如果 comums 的总和是两倍或多倍,这将无助于列将出现多次的主要设计问题。
那不是那么容易治愈的。
有必要更改设计。您需要根据 index.
列进行排序所以,像这样:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
cout << "Практическая работа по практике Казаков 9903:" << endl;
const int ROWS = 5;
const int COLS = 5;
int arr[ROWS][COLS];
int nesort[COLS];
int tab[COLS];
//Array generating
srand(time(NULL));
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = rand() % 41 - 20;
}
}
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
cout << "Массив построен!" << endl << "\n";
//Counting and output of characteristics
cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;
for (int j = 0; j < COLS; j++)
{
int sum = 0;
for (int i = 0; i < ROWS; i++)
{
if (arr[i][j] < 0 && arr[i][j] & 1)
{
sum = sum + arr[i][j];
}
}
nesort[j] = sum;
tab[j] = j;
}
for (int s = 0; s < COLS; s++)
{
cout << nesort[s] << "\t";
cout << endl;
}
cout << endl;
//Sorting of columns characteristics
cout << "Отсортированные характеристики столбцов: " << endl;
int n = sizeof(tab) / sizeof(tab[0]);
sort(tab, tab + n, [&](const int i1, const int i2) {return nesort[i1] < nesort[i2]; });
for (int r = 0; r < COLS; r++)
{
cout << tab[r] << "\t";
cout << endl;
}
cout << endl;
cout << "Отсортированный по хар-кам массив: " << endl;
//Sorting the start array by characteristics
for (int row = 0; row < ROWS; ++row) {
for (int sortedColSumIndex = 0; sortedColSumIndex < COLS; ++sortedColSumIndex) {
std::cout << arr[row][tab[sortedColSumIndex]] << '\t';
}
std::cout << '\n';
}
}