1

Тема: Компілювання в C++ Shell та CodeBlocks

Доброго вечора!

Дано завдання:знайти максимальний елемент першого рядка масиву. Вивести на екран вихідний масив і новий, в якому всі додатні елементи помножено на знайдене число.
Мова програмування С++

Є код який працює коректно в онлай компіляторі C++ Shell, але коли його вставляєш в CodeBlocks на компі, то множення на максимальний елемент не відбувається. Чи може хтось пояснити в чому проблема?

#include <iostream>
#include <ctime> // в ній функція time
#include <stdlib.h>

using namespace std;

int main ()
{
    srand (time (NULL)); 
    int n, m, i, j;
    cout<<"Enter the number of rows ";
    cin >> n;
    cout<<"Enter the number of columns ";
    cin >> m; 
    int ** a = new int * [n]; 
    for (int i = 0; i <n; i ++)
    {
        a [i] = new int [n]; 
    }
 
    for (int i = 0; i <n; i ++)
    {
        for (int j = 0; j <m; j ++)
        {
            a [i] [j] = rand ()% 20; 
            cout << a [i] [j] <<"\t"; 
        } cout << endl;}
      
    int max_j=0, max_i=0  ;
    for (int i = 0; i <n; ++i)
     {for (int j = 0; j <m; ++j)
        if (a[0][j] > a[0][max_j])
        {max_i=i;
        max_j=j;
        }}
      int x;
        cout << "max = " <<a[max_i] [max_j]<< endl;
     x=a[max_i] [max_j];
     while(i<n)
    {
        while(j<m)
        {
            if (a[i][j]>=0)
                a[i][j]*=x;
            j++;
        }
        j=0;
        i++;
    }

    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
            cout<<a[i][j]<<"\t";
        cout<<"\n";}

     for (int i = 0; i <n; i ++)
    {
        delete [] a [i]; 
    }
    delete [] a; 
    return 0;}

2

Re: Компілювання в C++ Shell та CodeBlocks

polina написав:

знайти максимальний елемент першого рядка масиву

Масив - це суцільний рядок :)

polina написав:

Є код який працює коректно в онлай компіляторі C++ Shell, але коли його вставляєш в CodeBlocks на компі, то множення на максимальний елемент не відбувається. Чи може хтось пояснити в чому проблема?

Впевнений, що хтось таки зможе пояснити в чому проблема, проте, це не важливо.. що дійсно важливо, то це те, що ви не можете пояснити в чому проблема..
Чому? Це ж ваш код? Ви самі його писали?
1. Форматування. Схоже ви й самі плутаєтесь у власному коді, що й казати про інших людей, яким ви пропонуєте його читати;
2. Коментарі. Якщо вам важко і ви все ще не розумієте, що робить той чи інший кусочок вашого коду, напишіть собі коментарі, прям біля кожної інструкції;
3. Дебагер. Цей чарівний інструмент допоможе вам, як ніхто інший в пошуку багів у вашому коді і ви маєте вміти (навчитися) ним користуватись.

Подякували: koala1

3

Re: Компілювання в C++ Shell та CodeBlocks

Я розумію як працює код. Проблема в тому що обидва компілятори не видають помилку, але в результаті програма працює по різному.
На мою думку проблема в частині коду(де присвоюється значення х, або де відбувається множення), але не знаю що змінити щоб вона працювала не лише в C++Shell а й в CodeBlocks

     x=a[max_i] [max_j]; 
     while(i<n)
    {
        while(j<m)
        {
            if (a[i][j]>=0)
                a[i][j]*=x;
            j++;
        }
        j=0;
        i++;
    } 

4

Re: Компілювання в C++ Shell та CodeBlocks

Одразу порада: не описуйте, що НЕ працює - кажіть, що бачите і чим це відрізняється від очікуваного. Якщо ви точно певні, що не працює саме щось конкретне - то пишіть, чому ви в цьому певні.
Ну і будьте обережні з термінологією: в умові у вас, схоже, двовимірний масив (хоча це прямо не заявлене), але в C++ не існує двовимірних масивів, замість них використовуються масиви вказівників на масиви (і ще купа інших варіантів). Ви про це нічого не написали - а помилка ж може бути і тут; наприклад, схоже, що двовимірний масив має бути m x n, а ви виділяєте n вказівників на масиви по n елементів, тобто n x n.

polina написав:

програма працює по різному

Це може бути тому, що ви заповнюєте масив випадковими числами.

Вам треба знайти максимальний елемент нульового рядка? Рядок - штука одновимірна, а ви шукаєте його в подвійному циклі по обох координатах. Це дивно. Ще дивніше те, ЯК ви його шукаєте:

for (int i = 0; i <n; ++i)
{
  for (int j = 0; j <m; ++j)
    if (a[0][j] > a[0][max_j])
    {
      max_i=i;
      max_j=j;
    }
}

(наступного разу код самі вирівнюйте)
Отже, якщо a[0][j] > a[0][max_j] (тобто якщо j-й елемент 0-го рядка більший за max_j-й), то max_j замінюється на j (що зрозуміло), а max_i замінюється на i - що не зрозуміло взагалі ніяк. Який стосунок i та max_i мають до найбільшого елемента рядка з номером 0? І яким чином a[max_i] [max_j] буде найбільшим у першому рядку? (насправді, схоже, буде, але досить випадково).
Будь ласка, не ставтеся до коду як до магії. Розбирайте дії по кроках; дослухайтеся до поради wander і пройдіться по коду дебагером.