Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: user1681673Ответов: 2

Я пишу программу для представления массива с большим количеством элементов, большинство из которых равны нулю, а не более 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;
}
  • Почему все ваши циклы фиксируются на 20 или 21 итерации? Если есть только одно ненулевое значение, ваши циклы действуют так, как если бы было 20 ненулевых значений. Вам нужно иметь переменную для количества ненулевых элементов. Thomas Matthews 10.04.2013
  • Ваша функция вывода не отображает индексы ненулевых элементов. Thomas Matthews 10.04.2013
  • @ThomasMatthews Готов поспорить, именно для этого должна была использоваться переменная nonzero, но она еще не была реализована. Xymostech 10.04.2013
  • Чего вы пытаетесь добиться с помощью этого выражения: valueArray == 0? Thomas Matthews 10.04.2013
  • Да, дело в том, что я не могу изменить прототипы функций и передать ненулевую переменную, поэтому я просто прохожу цикл 20 раз, потому что это максимальная длина. user1681673 10.04.2013
  • @ThomasMatthews Это была проблема. user1681673 10.04.2013

c++classoutput

Ответы

Ответ 1 · рейтинг 3 · suspectus

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

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

to

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

Ответ 2 · рейтинг 3 · Drew Dormann

Этот цикл повторяется 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;

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы