2010-07-24 8 views
0

J'ai essayé d'intégrer IntSetArray en C++ il compile bien mais le résultat est faux 300 est ok et d'autres nombres sont en dessous de zéro quelque chose de nombres très étranges .e.g -8231313 quelque chose comme ça) quel est le problème? c'est le codeImplémentation d'IntSetArray en 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; 
} 

Répondre

1

Pensez à ce qui se passe la première fois que vous essayez d'insérer quelque chose. x[0] contient 300 et t, ce que vous essayez d'insérer, est 123.

La première instruction de la méthode insert est la suivante:

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

Ceci pour boucle incrémente i tandis que l'élément i e de x est inférieur à t. Mais le 0e élément de x est 300, ce qui n'est pas moins de 123, donc la boucle ne s'exécute jamais du tout. Puisque dans le constructeur vous avez seulement initialisé le premier élément de x, le reste a des valeurs de garbage qui ne sont jamais changées.

Je pense que vous ne voulez probablement pas que la deuxième boucle soit dans la première boucle de toute façon. Ce que vous essayez de faire avec la boucle externe est de trouver la première position dans x où la valeur est supérieure ou égale à t, puis la boucle interne décale tout et insère t. Alors ce que vous devez faire est la suivante:

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++; 
} 

Un autre, et peut-être plus facile à comprendre, façon d'écrire ceci:

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

Est-ce:

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

Pourquoi ne pas utiliser un std::set<int>?