Как «печать массива» изменила значения другого массива? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть два массива, я хотел вывести только последний, но в выводе элемент просто получил значение мусора.но если я напечатал первый массив перед ним, то значение мусора во втором массиве больше не выводится (ну, мне пришлось скомпилировать и запустить 3/4 раза, чтобы получить правильное значение один раз, оставшиеся 2/3раз я получаю значение мусора)

(я запускаю свой код, не печатая первый массив на codechef.com/ide, и каждый раз он выдает желаемый результат.)

, поэтому у меня двавопросы.

  1. почему это произошло?

  2. почему это произошло только с моим, а не с oj?

я пытался реализовать сборку кучи, то есть взять массив a , поместить этот массив в другой массив с именем heap таким образом, чтобы куча следует за свойством двоичная минимальная куча .наконец, выведите элементы heap .когда я компилировал и запускал его, он выводил значение мусора вместо значения определенного элемента каждый раз.затем, чтобы отладить его, я взял цикл перед печатью heap , чтобы напечатать массив a , чтобы проверить, правильно ли он принимает входные данные.на этот раз массив heap был напечатан правильно!но когда я снова скомпилировал и запустил его, он дал мне то же самое значение мусора вместо значения элемента, как раньше.я только начал компилировать и запускать код несколько раз.я заметил, что в каждой 3/4 компиляции он давал правильный ответ только один раз.

позже я отправлял свой код в ide codechef, на этот раз я каждый раз получал правильный вывод без печати дополнительного массива а .

#include <bits/stdc++.h>

using namespace std;

int main(void)
{ 
    int a[10];

    for (int i = 0; i < 6; i++)
    {
        cin >> a[i];
    }

    int heap[10];

    for (int i = 0, h = 1; i < 6; i++, h++)
    {
        if(h == 1) heap[h] = a[i];
        else{
            heap[h] = a[i];
            int k = h;
            //checking if the new heap element violates the heap property
            //if it does then swap with it's parent , and repeat
            while(k){
                if(heap[k] < heap[k/2]) swap(heap[k], heap[k/2]);
                k /= 2;
            }
        }
    }
    /* if this part is executed then the heap printing
    // part prints the correct heap array atleast one time
    // in every 3 or more than 3 "build & run" without any garbage value

    //if not executed, then the heap printing part prints a 
    //garbage value each and every time 
    */

    // weird start
    //prints the main array
    // for (int i = 0; i <= 5; ++i)
    // {
    //  cout << a[i] <<' ';
    // }
    // cout << endl;
    //weird end

    //heap printing part
    for (int i = 1; i <= 6; ++i)
    {
        cout << heap[i] << ' ';
    }
    cout << endl;
    return 0;
}

для ввода: 6 5 1 4 2 3

я ожидал: 1 2 3 6 4 5

я получил: 2 4 3 6 5 4199040

(редактор: возвышенный текст и кодовые блоки и компилятор: minGW)

обновление: замена while(k) на while(k/2) выполнила работу по выводу ответа без какой-либо помощи при печати другого массива. но как код сгенерировал два разных вывода в нескольких операциях build & run на моем устройстве?и он каждый раз выводил правильный ответ в онлайн-идее, но не в моем. ( это был главный вопрос на самом деле )

...