2010-07-24 3 views
0

Я пытаюсь получить IntSetArray в C++, он компилируется отлично, но результат неправильный, первый 300 - это нормально, а другие числа находятся ниже нуля чего-то очень странного числа .e.g -8231313 что-то вроде этого) что не так? это кодВнедрение IntSetArray в C++

#include <iostream> 
using namespace std; 
int quantity=10; 
class Set 
{ 
private : 
    int n,*x; 
public: 
    Set(int maxval){ 
     x=new int[quantity+1]; 
     n=0; 
     x[0]=maxval; 

    } 
    int size(){ return n;} 
    void insert(int t){ 

     for (int i=0;x[i]<t;i++) 
     { 

       if (x[i]==t) 
        return ; 
       for (int j=n;j>=i;j--) 
        x[j+1]=x[j]; 
       x[i]=t; 
     } 

       n++; 




    } 

    void display() 
    { 
      for (int i=0;i<n;i++){ 
       cout<<x[i]<<" "<<"\n"; 
      } 
    } 



}; 

int main(){ 

    Set s(300); 
    s.insert(123); 
    s.insert(45); 
    s.insert(89); 
    s.insert(50); 
    s.insert(13); 
    s.insert(19); 
    s.display(); 

    return 0; 
} 

ответ

1

Продумайте, что происходит при первом попытке вставить что-то. x[0] содержит 300 и t, что вы пытаетесь вставить, 123.

Первое утверждение в методе insert заключается в следующем:

 for (int i=0;x[i]<t;i++) 

Это для приращений цикла i в то время как i й элемент x является менее t. Но 0-й элемент x составляет 300, что составляет не менее 123, поэтому цикл никогда не выполняется вообще. Так как в конструкторе вы только инициализировали первый элемент x, остальные имеют значения мусора, которые никогда не изменяются.

Я думаю, что вы, скорее всего, не хотите, чтобы второй цикл находился внутри первого цикла. Кажется, что вы пытаетесь сделать с внешним контуром, находите первую позицию в x, где значение больше или равно t, а затем внутренний цикл сдвигает все вниз и вставляет t. Тогда то, что вы должны делать это:

void insert(int t){ 

    int i; // Declare this outside the first loop so that it 
      // remains accessible afterwords 

    for (i=0;x[i]<t;i++) 
    { 
     // Do nothing; the whole point is to increment i 
    } 

    // Now i contains the first index of x where x[i] >= t 
    // So now do the shift and insert: 

    if (x[i]==t) 
     return ; 

    for (int j=n;j>=i;j--) 
     x[j+1]=x[j]; 

    x[i]=t; 
    n++; 
} 

Иная, и потенциально легче понять, способ написать это:

 int i; 
    for (i=0;x[i]<t;i++) 
    { 
     // Do nothing; the whole point is to increment i 
    } 

Является ли это:

 int i = 0; 
    while (x[i] < t) ++i; 
0

Почему бы не использовать a std::set<int>?

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