Нужно найти минимальное значение массива 4×2, игнорируя диагональ

#c #arrays #minimum

Вопрос:

Мне нужно найти наименьшее значение в массиве, который не находится в главной диагонали, я написал некоторый код, но, похоже, он выбирает только второе или последнее значение (в зависимости от того, какое из них самое низкое).

вот мой код:

 #include<iostream>
using namespace std;
int main()
{
    int arr[4][2];
    int Min,i,j;
    cout<<"Type 8 numbers";
    for (i=0;i<4;i  )
    {
        for (j=0;j<2;j  )
        {
            cin>>arr[i][j];
            Min=arr[0][1];
            if(i!=j and Min > arr[i][j])
            {
                Min=arr[i][j];
            }
        }
    }
    cout<<"The values of the array are: n";
    for (i=0;i<4;i  )
    {
        cout<<"n";
        for (j=0;j<2;j  )
        {
            cout<<arr[i][j]<<"t";
        }
    }
    cout<<"The lowest value is: "<<Min;
}
 

Если я наберу 1-8, возвращаемое значение равно 2, если я наберу 8-1, возвращаемое значение равно 1, в обоих этих случаях код работает так, как я предполагал, но если я наберу что-то вроде 8,6,4,1,2,3,4,5, самое низкое значение возвращается как 5, я очень новичок в кодировании и был бы признателен за любую помощь.

Комментарии:

1. Min=arr[0][1]; это следует сделать только один раз…

2. Массив размером четыре на два не имеет «главной диагонали», поэтому не очень понятно, чего вы пытаетесь достичь.

Ответ №1:

Линия

 Min=arr[0][1];
 

это плохо, потому что

  • Он читается неинициализированным arr[0][1] , когда i = 0, j = 0 .
  • Он записывает arr[0][1] Min безоговорочно, даже если ток Min меньше этого.

Вместо этого:

 Min=arr[0][1];
if(i!=j and Min > arr[i][j])
{
    Min=arr[i][j];
}
 

Это будет работать, например:

 if(i!=j and ((i==0 and j==1) or Min > arr[i][j]))
{
    Min=arr[i][j];
}
 

Ответ №2:

Ваша Min=arr[0][1] строка находится внутри обоих циклов, что означает , что каждый раз, когда вы пытаетесь сравнить Min и текущий элемент arr[i][j] , вы просто отбрасываете любое наименьшее значение, хранящееся в Min нем, и заменяете его arr[0][1] .

Следовательно , код, как вы написали, возвращает либо последнее число, либо arr[0][1] , в зависимости от того, что меньше.

Вы действительно должны инициализировать это только Min один раз, прежде чем начнутся ваши циклы. т. Е.

 Min = arr[0][1]
for(i = 0; i < 4;i  )
{
    for(j = 0; j < 2; j  )
    {
     // Compare Min and arr[i][j] and reassign the smaller one to Min if i != j
    }
}