2

En el siguiente código he encontrado el número menor de cada fila de la matriz, pero necesito restar éste número a toda la fila

#include "iostream"
#include "conio.h"

using namespace std;

int main()
{
    int mas[4][4] = {1, 3, 5, 6,
                     6, 4, 7, 4, 
                     5, 5, 6, 2,
                     4, 0, 4, 1};

    for (int i = 0; i < 4; i++)   {
        int min_row = mas[i][0];
        for (int j = 0; j < 4; j++)  {
            if (mas[i][j] < min_row) {
                min_row = mas[i][j];
            }
        }
        cout << "Mínimo en la fila " << i+1 << ": " << min_row << endl;
    }

    _getch();

}

Gracias de antemano.

Neon
  • 1,063
  • 3
  • 16
  • 30
  • No puedes recorrer el array de nuevo, y restar el valor que ya has obtenido? – Flowen Nov 10 '17 at 10:50
  • No te serviría simplemente haciendo otro bucle `for` a continuación del que recorre los elementos de la fila? Algo asi como `for (int j = 0; j < 4; j++) { mas[i][j]-=min_row;}` – Pikoh Nov 10 '17 at 10:50
  • `conio.h` es una librería de [tag:c] no de [tag:c++], ofrece una serie de utilidades para comunicarse con la consola. `iostream` es la librería de C++ que se usa para comunicarse con la consola (es decir, para lo mismo). Así pues, ambas librerías a la vez es absurdo, elimina `conio.h`. [Tampoco deberías estar usando `_getch()`](https://es.stackoverflow.com/questions/24544/me-falla-un-c%C3%B3digo-completamente-v%C3%A1lido-en-los-punteros-begin-y-end), pues no es portable. – PaperBirdMaster Nov 10 '17 at 12:45

2 Answers2

2

Tienes que recorrer la fila una vez más para restar el valor a cada elemento:

cout << "Mínimo en la fila " << i+1 << ": " << min_row << endl;
for( int j=0; j<4; j++ )
  mas[i][j] -= min_row;
eferion
  • 49,291
  • 5
  • 30
  • 72
0

Viendo que estás usando un arreglo bidimensional de dimensiones conocidas en tiempo de compilación, yo aprovecharía las siguientes utilidades de la librería de algoritmos (<algorithm>) de C++:

  • std::min_element: Busca el menor elemento en el rango [primero, último).
  • std::transform: Aplica la función proporcionada al rango facilitado y almacena el resultado en el otro rango proveído.

Con estas utilidades podrías tener este código:

for (auto &fila : mas)
{
    auto menor = *min_element(begin(fila), end(fila));
    transform(begin(fila), end(fila), begin(fila), [&menor](const auto &valor)
    {
        return valor - menor;
    });
}

El bucle for de rango nos recorre el arreglo fila a fila, buscamos el menor elemento de la fila con std::min_element a la que le pasamos el inicio y el final de la fila (begin(fila) y end(fila))1, como ésta función devuelve un iterador debemos des-referenciarlo para obtener el valor menor.

Acto seguido usamos el valor menor que acabamos de encontrar en std::transform al que le decimos que queremos transformar la fila de principio a final (begin(fila) y end(fila)) y que dicha transformación la guardaremos en la misma fila (begin(fila)); la transformación que aplicamos es una lambda2 que resta el menor valor a todo valor recibido.

Puedes ver el código funcionando en Wandbox 三へ( へ՞ਊ ՞)へ ハッハッ.


1std::begin y std::end.

2Expresión Lambda.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82