Помогите с кодом, пожалуйста
Найти минимум среди сумм модулей элементов диагоналей параллельных побочной диагонали (функция из интернетов, некоторые моменты не понимаю как работают, тут не работает)
#include <iostream>
#include <cmath>
#include <iomanip>
#include <stdlib.h>
#include <ctime>
#include <math.h>
#include <stdio.h>
void printimas(int** mas, const int n, const int m);
void printdmas(double** mas, const int n, const int m);
void genintmas(int** mas, const int n, const int m);
void gendoubmas(double** mas, const int n, const int m);
void umnmatrdialog(int** mas, int** tmp, int** tmp2, const int n, const int m);
void umnmatr(int** mas, int** tmp, int** tmp2, const int n, const int m, int g);
void bubsort(double** mas, double* mass, const int n, const int m);
void sortchetelstr(double** mas, double* vect2, const int n, const int m);
int minsumparpob(int** mas, const int n, const int m);
void maxpovtvstolb(int** mas, const int n, const int m);
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
srand(time(NULL));
cout << "Введите размерность матрицы" << endl;
int n, m, g;
cin >> n;
cout << "x" << endl;
cin >> m;
cout << endl;
int** a = new int*[n];
int** tmp = new int*[m];
int** tmp2 = new int*[n];
double** arr = new double*[n];
double* vect2 = new double[n];
for (int i = 0; i < n; i++)
{
a[i] = new int[m];
// tmp2[i] = new int[m];
arr[i] = new double[m];
}
genintmas(a, n, m);
printimas(a, n, m);
gendoubmas(arr, n, m);
printdmas(arr, n, m);
umnmatrdialog(a, tmp, tmp2, n, m);
/*sortchetelstr(arr, vect2, n, m); //закомментил чтобы работать с умножением матриц, оно хотя бы запускается
if (minsumparpob(a, n, m) == 1)
cout << endl << "12345" << endl;
if (minsumparpob(a, n, m) == 0)
cout << endl << "Невозможно! Матрица не квадратная" << endl;
maxpovtvstolb(a, n, m);
*/
delete[] a;
delete[] arr;
return 0;
}
void genintmas(int** mas, const int n, const int m)
{ //работает нормально
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
mas[i][j] = rand() % 201 - 100;
}
}
void printimas(int** mas, const int n, const int m)
{ //работает нормально
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << mas[i][j] << "\t";
}
cout << '\n';
}
cout << endl << endl;
}
void gendoubmas(double** mas, const int n, const int m)
{ //работает нормально
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
mas[i][j] = (double)rand() / RAND_MAX * (-101 - 100) + 100;
}
}
void printdmas(double** mas, const int n, const int m)
{ //работает нормально
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << fixed << setw(4) << mas[i][j] << "\t";
}
cout << '\n';
}
cout << endl << endl;
}
void umnmatr(int** mas, int** tmp, int** tmp2, const int n, const int m, int g)
{ // умножение матриц, вроде бы правильно
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
tmp2[i][j] = 0;
for (int k = 0; k < g; k++)
tmp2[i][j] += mas[i][k] * tmp[k][j];
}
}
}
void umnmatrdialog(int** mas, int** tmp, int** tmp2, const int n, const int m) // задание 1
{
cout << endl
<< "\nУмножение матриц\nЧто выберете?\n1. Ввести вторую квадратную матрицу самому\n2. "
"Сгенерировать "
"вторую матрицу из случайных элементов"
<< endl;
int z;
int p = rand() % 10 + 2; //для случайной размерности матрицы
cin >> z;
if (z == 1) //ввод элементов второй матрицы в консоль вручную
{
cout << "Обратите внимание, чтобы количество строк вашей матрицы совпадало с количеством "
"столбцов существующей матрицы"
<< endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
cin >> tmp[i][j];
}
umnmatr(mas, tmp, tmp2, n, m, p);
cout << endl << endl << "Результат" << endl << endl;
printimas(tmp2, n, m);
}
if (z == 2) // генерирование случайной второй матрицы
{
for (int i = 0; i < p; i++)
tmp[i] = new int[p];
for (int i = 0; i < p; i++)
tmp2[i] = new int[n];
genintmas(tmp, p, n);
printimas(tmp, p, n);
umnmatr(mas, tmp, tmp2, n, m, p);
cout << endl << endl << "Результат" << endl << endl;
printimas(tmp2, p, n);
}
else
{
cout << "Ошибка" << endl;
system("pause");
}
}
void sortchetelstr(double** mas, double* vect2, const int n, const int m) // задание 2
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j = j + 2)
{
vect2[i] += mas[i][j];
}
bubsort(mas, vect2, n, m);
printdmas(mas, n, m);
}
}
void bubsort(double** mas, double* mass, const int n, const int m)
{
for (int i = 1; i < n; ++i)
{
for (int r = 0; r < n - i; r++)
{
if (mass[r] < mass[r + 1])
{
// Обмен местами
double temp = mass[r];
mass[r] = mass[r + 1];
mass[r + 1] = temp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++) //пытаюсь сортировать и второй массив тоже
{
double temp2 = mas[i][j];
mas[i][j] = mas[i][j + 1];
mas[i][j + 1] = temp2;
}
}
}
}
}
}
void maxpovtvstolb(int** mas, const int n, const int m) // задание 3
{
int** tmp = new int*[m]; //
for (int i = 0; i < 2; i++)
tmp[i] = new int[m];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < m; j++)
{
tmp[1][j] = mas[1][j];
tmp[2][j] = 1;
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (mas[i][j] == tmp[1][j])
tmp[2][j]++;
}
printimas(tmp, 2, m); //хотя бы просто вывести второй массив чтобы посмотреть правильно посчитал или нет
//останется найти наибольшее число из второй строки и вывести вышестоящее
}
int minsumparpob(int** mas, const int n, const int m) // задание 4
{
int** tmp = new int*[m];
int sum1 = 0, sum2 = 0;
for (int i = 0; i < n; i++)
tmp[i] = new int[m];
if (n != m)
return 0;
else
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m - i; j++)
tmp[i][j] = mas[n - 1 - j][n - 1 - i];
}
for (int j = 0; j < n; j++)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
if (mas[i][j] < 0)
{
sum = 0;
break;
}
else
sum += mas[i][j];
}
cout << " " << sum;
cout << "matrix y:"
<< "\n";
for (int i = 0; i < n; i++)
{
cout << "\n"
<< " ";
for (j = 0; j < n; j++)
{
cout << tmp[i][j] << " ";
}
}
cout << "\n"
<< "\n";
for (n = m; n > 0; n--)
{
for (i = 0; i < m - 1; i++)
{
sum1 += mas[i][m - i - 2];
sum2 += tmp[i][m - i - 2];
m--;
}
}
if (sum1 < sum2)
min = sum1;
else
min = sum2;
cout << "up: " << sum1 << " "
<< "down: " << sum2 << "\n"
<< "\n";
cout << "min sum: " << abs(min);
}
}
}
В задании 3 используйте одномерный массив = столбец, индексом которого будет номер элемента, а значением - количество вхождений этого элемента в другие столбцы. Разумеется, значения при старте будут нулями.
Первым проходом по матрице вы найдете число вхождений каждого элемента и заполните одномерный массив (+1 в значение каждый раз, как находите то же значение, что и номер в одномерном массиве). Вторым проходом вы найдете максимальное значение в полученном одномерном массиве, его индекс - номер элемента первого столбца. Задача решена.
В коде ошибки, вам нужно еще раз внимательно посмотреть на него и обдумать. Используйте листок и карандаш, помогает 100%. 1-2 часа на обдумывание должно хватить.
В 4 задании выбросите функцию из интернета. Потом решите задачу на листочке самостоятельно для случая матрицы 3*3, 4*4 и 6*5. Когда у вас появится понимание - что же нужно сделать, напишите словами по пунктам, а что нужно сделать. После того как будет алгоритм в виде слов - написать код будет на порядок проще. 1-2 часа на решение примеров на листке, 1 час на алгоритм и около 1 часа на написание кода с отладкой.
Удачи.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Функция принимает на вход две части кода кириллицы (2 байта)Нужно преобразовать их в русский текст
Как написать удаление элемента односвязного списка, если этот элемент - это значение переменной другого класса?
При составлении регулярного выражения не получается сохранить каждую часть входного путиВходная строка:
Подскажите пожалуйста, это функция для менюКаждый раз, когда сыграна какая-то из игр, я вызываю функцию чтобы вернуться с меню