Вывод второго отрицательного элемента в столбце

int main(int argc, char** argv) {

    int i, j, n = 5, m = 6, k, i2;
    srand(233);
    int W[n][m];

    for(i = 0;i < n;i++){
        for(j = 0;j < m;j++){
            W[i][j] = rand()%100-50;
            printf("%3d", W[i][j]);
    }
    cout <<endl;
}
cout << endl;


    for(j = 0; j < n; j++) {
        k = 0;
        i2 = 0;
        for(i = 0; i < m; i++) {
            if(W[i][j] < 0)  {
               k++;
         }
          if(k == 2 && i2 == 0) {
            cout << W[i][j] << endl;
        }
    }
}
//cout << i2;
}

На выходе я иногда получаю еще и полследующий символ, в чем может быть проблема?


Ответы (1 шт):

Автор решения: Smoliarick
  • переменные i и j лучше объявлять в цикле for, чтобы они были локальными
  • в цикле, где вы выводите 2 элемент перепутаны значения n и m, что иногда приводит к выводу неинициализированной переменной
  • в условии k == 2 лучше сделать выход из цикла с помощью break

Пример исправления:

P.S. Я новичок, поэтому возможно что-то получилось в результате не так, как вы хотели

#include <iostream>

int main(int argc, char** argv) {

    const int n = 5, m = 6;
    srand(233);
    int W[n][m];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            W[i][j] = rand() % 100 - 50;
            printf("%3d", W[i][j]);
        }
        std::cout << std::endl;
    }
   std::cout << std::endl;


    for (int j = 0; j < m; j++) {
        for (int i = 0, k=0; i < n; i++) {
            if (W[i][j] < 0) k++;
            if (k == 2) {
                std::cout << W[i][j] << std::endl;
                break;
            }
        }
    }
}
→ Ссылка