Все строки, содержащие минимальный элемент в двумерном массиве, заменить строкой X. Использовать шаблоны функции
Не понимаю, как так получается, но в результате заменяются столбцы, а по заданию надо заменять строки
#include<iostream>
using namespace std;
template<typename T>
T* createprintX(int rows, T c)
{
T* X = new T[rows];
for (int i = 0; i < rows; ++i) // Ввод и вывод строки X
cin >> X[i];
return X;
}
template<typename T>
T** create(int rows, int cols, T c)
{
T** a = new T * [rows];
for (int i = 0; i < rows; ++i)
a[i] = new T[cols];
// Ввод двумерного массива
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
{
cout << "[ " << i << " ][ " << j << " ] = ";
cin >> a[i][j];
}
return a;
}
template<typename T>
void print(int rows, int cols, T** a)
{
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j) // Вывод двумерного массива
cout << a[i][j] << '\t';
cout << endl;
}
}
template<typename T>
T** change(int rows, int cols, T** a, T* X)
{
T min = a[0][0];
int k;
for (int i = 0; i < rows; ++i) // Поиск min
for (int j = 0; j < cols; ++j)
if (a[i][j] < min)
min = a[i][j];
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j) // Замена строки
if (a[i][j] == min) {
for (int i = 0; i < rows; ++i)
a[i][j] = X[i];
}
}
return a;
}
int main() {
setlocale(LC_ALL, "rus");
cout << "Введите количество строк в двумерном массиве n = "; int rows; cin >> rows;
cout << "Введите количество стобцов в двумерном массике m = "; int cols; cin >> cols;
int type;
cout << "\nДвумерный массив содержит :\n";
cout << "1 - целые числа\n";
cout << "2 - вещественные числа double\n";
cout << "3 - вещественные числа float\n";
cout << "Введите номер той строчки, которая нужны вам : ";
cin >> type;
cout << endl << endl;
switch (type)
{
case(1): { //int
int c = 1;
cout << "int\n";
int** a = create(rows, cols, c);
cout << "\n\n=======================================\n\n";
print(rows, cols, a);
cout << "\n\n=======================================\n\n";
cout << "\nВведите строку X:\n";
int* X = createprintX(rows, c);
cout << "\n\n=======================================\n\n";
a = change(rows, cols, a, X);
print(rows, cols, a);
break;
}
case(2): { //double
double c = 1;
cout << "int\n";
double** a = create(rows, cols, c);
cout << "\n\n=======================================\n\n";
print(rows, cols, a);
cout << "\n\n=======================================\n\n";
cout << "\nВведите строку X:\n";
double* X = createprintX(rows, c);
cout << "\n\n=======================================\n\n";
a = change(rows, cols, a, X);
print(rows, cols, a);
break;
}
case(3): { //float
float c = 1;
cout << "int\n";
float** a = create(rows, cols, c);
cout << "\n\n=======================================\n\n";
print(rows, cols, a);
cout << "\n\n=======================================\n\n";
cout << "\nВведите строку X:\n";
float* X = createprintX(rows, c);
cout << "\n\n=======================================\n\n";
a = change(rows, cols, a, X);
print(rows, cols, a);
break;
}
}
cout << endl << endl;
system("pause");
return 0;
}
Ответы (1 шт):
Автор решения: SelfishCrawler
→ Ссылка
Ошибка содержалась в методе change. Найдя минимальный элемент в массиве, вы приступаете к поиску строк с этим минимальным элементом. Для этого вы используете вложенные циклы со счетчиками i и j. Найдя такую строку, вы создаете еще один вложенный цикл со счетчиком i, который уже есть в данной области видимости.
template<typename T>
T** change(int rows, int cols, T** a, T* X)
{
T min = a[0][0];
int k;
for (int i = 0; i < rows; ++i) // Поиск min
for (int j = 0; j < cols; ++j)
if (a[i][j] < min)
min = a[i][j];
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j) // Замена строки
if (a[i][j] == min)
{
for (int k = 0; k < rows; ++k)
a[i][k] = X[k];
break;
}
}
return a;
}
