Попытка вывести объект массива в С++

Я пишу программу для представления массива с большим количеством элементов, большинство из которых равны нулю, а не более 20 не равны нулю. Теоретически массив может иметь триллион элементов, но два отдельных массива будут представлять индексы массивов и значения двух ненулевых элементов. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не могу вывести массив значений для целей отладки. Когда я пытаюсь вывести массив значений, все, что я получаю, это нули, но когда я вывожу общее количество, я получаю 820. Кроме того, это домашнее задание, и я не могу изменить ни одно из объявлений открытого класса, кроме функция вывода, когда я пишу самостоятельно для отладки. Спасибо за помощь.

class SparseArray{
public:
    SparseArray();  //  construct an SparseArray with no nonzero elements
    unsigned get( unsigned long long index );   //  return an element from the      array
    SparseArray & set( unsigned long long index, unsigned value );  //  set array     element to value
    SparseArray & output ();
private:
    unsigned long long indexArray[21];
    unsigned valueArray[21];
    unsigned nonzero;


};  //  SparseArray


int main(int argc, const char * argv[])
{

    SparseArray a;
    unsigned long long index = 1;
    for(  unsigned i = 0;  i <= 20;  i++, index *= 4  )
        a.set( index, i );
        a.output();

    unsigned total = 0;
    index = 1;
    for(  unsigned i = 0;  i <= 40;  i++, index *= 2 ){
        total += a.get(index);
        a.output();
    }
    cout <<total;

    return 0;
}

SparseArray::SparseArray():
indexArray(),valueArray()
{
    for (int i = 0; i < 20; i++) {
        indexArray[i] = 0;
        valueArray[i] = 0;
    }

}
unsigned SparseArray::get( unsigned long long index ){

    unsigned object;

    for (unsigned i = 0; i < 20; i++) {
        if (indexArray[i] == index) {
            object = valueArray[i];
        }
    }

    return object;
}
SparseArray & SparseArray::set( unsigned long long index, unsigned value ){

   for (int i = 0; i < 20; i++) {
        if (indexArray[i] == 0 && valueArray == 0) {
            indexArray[i] = index;
            valueArray[i] = value;
           break;
         }
    }

    return *this;


    }

SparseArray & SparseArray::output (){
    for (int k = 0; k < 21; k++) {
        cout << valueArray[k] << "," << endl;
    }

    return *this;
}

person user1681673    schedule 09.04.2013    source источник
comment
Почему все ваши циклы фиксируются на 20 или 21 итерации? Если есть только одно ненулевое значение, ваши циклы действуют так, как если бы было 20 ненулевых значений. Вам нужно иметь переменную для количества ненулевых элементов.   -  person Thomas Matthews    schedule 10.04.2013
comment
Ваша функция вывода не отображает индексы ненулевых элементов.   -  person Thomas Matthews    schedule 10.04.2013
comment
@ThomasMatthews Готов поспорить, именно для этого должна была использоваться переменная nonzero, но она еще не была реализована.   -  person Xymostech    schedule 10.04.2013
comment
Чего вы пытаетесь добиться с помощью этого выражения: valueArray == 0?   -  person Thomas Matthews    schedule 10.04.2013
comment
Да, дело в том, что я не могу изменить прототипы функций и передать ненулевую переменную, поэтому я просто прохожу цикл 20 раз, потому что это максимальная длина.   -  person user1681673    schedule 10.04.2013
comment
@ThomasMatthews Это была проблема.   -  person user1681673    schedule 10.04.2013
comment
Во втором цикле for в main() вы хотите, чтобы SparseArray печаталось 40 раз?   -  person Thomas Matthews    schedule 10.04.2013
comment
Профессор написал эти два цикла, чтобы мы могли проверить, правильно ли работают наши программы. Я понятия не имею, почему он поставил 40 там.   -  person user1681673    schedule 10.04.2013


Ответы (2)


Также измените эту строку, чтобы инициализировать массив, valueArray нуждается в индексе.

if (indexArray[i] == 0 && valueArray == 0) {

to

if (indexArray[i] == 0 && valueArray[i] == 0) {
person suspectus    schedule 09.04.2013
comment
А! Это сделало это. Спасибо за помощь! - person user1681673; 10.04.2013

Этот цикл повторяется 21 раз.

for (int k = 0; k < 21; k++)

И именно поэтому ваш вывод возвращает 820.

unsigned object; // This can be returned uninitialized data!  Set it to 0!

for (unsigned i = 0; i < 20; i++) {
    if (indexArray[i] == index) {
        object = valueArray[i];
    }
}

return object;
person Drew Dormann    schedule 09.04.2013
comment
Я думаю, я должен был уточнить больше. Я имел в виду, когда вызывается a.output(), я получаю нули. Кроме того, программа должна выводить 210, а не 820. - person user1681673; 10.04.2013
comment
@user1681673 user1681673 Выводятся нули, потому что массив заполнен нулями. Причина, по которой вы получаете 820, заключается в том, что вы никогда не инициализируете свою переменную object. (этот ответ не пытается объяснить, почему ваш массив заполнен нулями) - person Xymostech; 10.04.2013
comment
@user1681673 user1681673 Я воздержусь от добавления причины, по которой вы получаете все 0, потому что я думаю, что подозреваемый поймал это. - person Drew Dormann; 10.04.2013
comment
Да, он сделал. Хотя спасибо за помощь! - person user1681673; 10.04.2013
comment
@user1681673 user1681673 Ошибка, отсутствующая в моем ответе, вызывает вашу проблему, потому что ваш set предпринимает необычный шаг проверки массивов индексов и значений. - person Drew Dormann; 10.04.2013