2014-02-10 4 views
0

Я работаю над заданием, и профессор не хочет, чтобы мы использовали какой-либо другой код для вставки значений, отличных от его предоставленного псевдокода.Я неправильно истолковал этот псевдокод?

Краткое объяснение того, что я делаю. Я создаю динамический массив целых чисел, и они должны быть вставлены по порядку (от самого низкого до самого высокого).

Вот псевдокод он обеспечил:

for (i = valueNum - 1; array[i] is the wrong spot for newValue; --i) 
    array[i] = array[i-1] 

где массив [я] является неправильным местом для NEWVALUE:

(i > 0) AND (value at array[i-1] is greater than newValue) 

Он также включил эту информацию:

Вы также должны убедить себя что вышеуказанный псевдокод применим к (то есть, он также охватывает) случай, когда новое значение, подлежащее сохранению, является значением # 1, в котором новое значение, которое должно быть сохранено, больше или равно самому высокому существующему значению и случай, когда новое значение, которое нужно сохранить, меньше или равно самому низкому существующему значению.

Итак, это выглядит довольно прямолинейно. Я дал ему попробовать:

void IntArray::insert(int nInt) 
{ 
    /* check if resize is needed */ 
    if(mySize == capacity) 
    { 
     int newCapacity = capacity * 1.5; 
     if(newCapacity == capacity) 
      newCapacity = capacity + 1; 
     capacity = newCapacity; 
    } 

    /* here is where my mistake was */ 
    int i; 
    mySize++; 

    for(i = mySize -1; i > 0 && data[i-1] > nInt; --i) 
    { 
     data[i] = data[i - 1]; 
    } 
    data[i] = nInt; 
} 

Похоже, что это правильно следует псевдокод, но это не кажется, что это будет когда-нибудь работать, если mySize либо 0, либо 1. Может кто-то мне точку в правильном направлении?

+0

Вы пытались запустить его с mySize в 0 или 1? Что происходит? –

+0

Простое изменение «емкости» без изменения хранилища не очень поможет, не так ли? Вам не нужно что-то выделять? Вы также никогда не сохраняете новое значение. –

+0

@DamienBlack Он просто не входит в цикл, потому что он не соответствует условному утверждению. – Bobbin4Apples

ответ

1

В различных комментариях, я сказал:

Просто изменяя мощность без изменения хранения не собирается помочь очень много, это? Вам не нужно что-то выделять? Вы также никогда не сохраняете новое значение.

и (мягко отредактирован):

Обновление (приуроченная 2014-02-10 19: 19: 10Z) выглядит как то, что я ожидал бы использовать. Он явно работает, когда mySize изначально 0; вы увеличиваете его до 1, затем устанавливаете i = 0 и считаете обратный отсчет (нет-op), заканчивая настройкой data[0] = nInt;. Когда у вас есть одна строка на месте, новая может быть больше, чем существующая, или меньше или равна существующей. Если он больше, i не уменьшается, поэтому новая запись идет в , где вы этого хотите. Если он меньше, i уменьшается, а старое значение перемещается телом цикла, а новое значение вставляется в data[0], где вы этого хотите. Промыть и повторить ...

Смежные вопросы