Все строки, содержащие минимальный элемент в двумерном массиве, заменить строкой 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;
}

Вот исправленная версия, и полученный результат в ней: введите сюда описание изображения

→ Ссылка