Моя пузырьковая сортировка вводит значения ‘0’ в массив

#c #arrays #multidimensional-array

#c #массивы #многомерный массив

Вопрос:

Я использовал ‘пузырьковую сортировку’ для моей программы на C , но она вводит случайные значения ‘0’ в массив в дробно-жадной программе

 int sorteaza()
{
    int aux,schimb,i;
    do
    {
        schimb=0;
        for (i=0;i<=n;  i)
            if (G[i][3]<G[i 1][3])
            {
            swap(G[i], G[i 1]);
            }
    }
    while (schimb);
}
  

Это весь мой код:

 #include<iostream>
using namespace std;

int n; // Numarul de elemente
float G[100][3]; // Obiecte   detalii masa profit potenta
int masa = 0;

int read_data()
{
cout << "Greutatea Rucsac" << endl;
cin >> masa;
cout << "Obiecte: " << endl;
cin >> n;
for(int i = 1; i<=n;i  )
{
    for(int j = 1; j<=2;j  )
    {
        cin >> G[i][j];
        if(G[i][1] != 0 amp;amp; G[i][2] != 0)
        {
         G[i][3] = G[i][2] / G[i][1];
        }

    }
}
}
// 2 500
// 4 500

int sorteaza()
{
    int aux,schimb,i;
    do
    {
        schimb=0;
        for (i=0;i<=n;  i)
            if (G[i][3]<G[i 1][3])
            {
            swap(G[i], G[i 1]);
            }
    }
    while (schimb);
}
int verify()
{
for(int i = 1; i<=n;i  )
{
    for(int j = 1; j<=3;j  )
    {
        cout << G[i][j];
        cout << endl;
        //G[i][3] = G[i][1] / G[i][2];
    }
}
}

int greedy()
{

    float profit = 0;
    int i = 1;
    int aux;
    while(i<=n amp;amp; masa>=0)
    {
        //cout << "G[i][1]: " << G[i][1] << endl;
        if(masa>=G[i][1]) {
        //cout << "Am ajuns aici";
        profit=profit G[i][2];
        masa=masa-G[i][1];
        }
        else {
                        //cout << "Am ajuns dincolo";
                aux= (masa*100)/G[i][1];
                profit = profit   (aux * G[i][2])/100;
                break;
                        }
    i  ;
   }
cout << profit;
    }










int main()
{
    read_data();
    sorteaza();
    verify();
   // greedy();

}
  

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

1. Вы выполняли отладку, чтобы выяснить, что происходит?

2. Если G[i] это массив из трех элементов, то какой у G[i] него верхний индекс?

3. Отладка бесполезна?! Это никогда не окажется на футболке.

4. Кроме того, вы уверены, что это i 1 будет допустимый индекс G самого себя? И я не вижу, чтобы вы инициализировали G[0] . Подводя итог, более внимательно посмотрите на все индексы вашего массива.

5. xkcd.com/163

Ответ №1:

Научитесь индексировать все свои массивы с нуля.

 float G[100][3];
  

Допустимые индексы от 0 до 99 и от 0 до 2. Итак, этот код должен быть

 for (int i = 0; i < n; i  )
{
    for (int j = 0; j < 2; j  )
    {
        cin >> G[i][j];
    }
    if (G[i][0] != 0 amp;amp; G[i][1] != 0)
    {
        G[i][2] = G[i][1] / G[i][0];
    }
}
  

и этот код должен быть

         if (G[i][2] < G[i 1][2])
        {
            swap(G[i], G[i 1]);
        }
  

Все ваши массивы начинаются с нуля. Я уверен, что вам это говорили, но вы должны начать применять это на практике.

В общем, напишите свои циклы for следующим образом

 for (int i = 0; i < N;   i)
  

Это правильный цикл для массива такого размера N .

Ответ №2:

Вероятно, вам нужно <n вместо ≤n (вот откуда берется неинициализированное значение, т.е. 0). И вы пропускаете один цикл в сортировке пузырьков. Прямо сейчас вы помещаете только самый маленький элемент в конец списка.

Также понятия не имею, что вы делаете с этим schimb и условием while.

Кроме того, вы определяете G как, float[100][3] поэтому вы не можете использовать G[i][3] , только G[i][2] .

 int sorteaza()
{
    int i,j;
    for (i=0; i<n; i  )
    {
        for (j=i 1; j<n; j  )
        {
            if (G[i][2] < G[j][2])
            {
                swap(G[i], G[j]);
            }
        }
    }
}