2016-04-29 5 views
1
#include <iostream> 
#include <cmath> 
#include <iomanip> 
#include <cstring> 
#include <cstddef> 

class ArrayList 
{ 
    public: 
     ArrayList(); 
     void expand(); 
     void store(std::string x); 
     void display_size(); 
     friend std::ostream& operator<<(std::ostream& os, const ArrayList &arr); 
     void clean(); 
     ArrayList(const ArrayList &arr); 
     ~ArrayList(); 
     void operator=(const ArrayList& arr); 
    private: 
     int size; //total size of your dynamic array 
     int max; //double the size of the array. 
     int free_space; //total size of unused space in your dynamic array 
     char *array; //a pointer used to create a dynamic array 
}; 


ArrayList::ArrayList() 
{ 
    size = 2; 
    free_space = 1; 
    array = new char[2](); 
    array[0] = ' '; 
    array[1] = '\0'; 
    max = size; 

} 

void ArrayList::expand() 
{ 

    max = size + size; 
    char *temp = new char[max]; 
    for(int i = 0; i < max; i++) 
    { 
     array[i] = temp[i]; 
    } 
    free_space = free_space + size; 
    delete [] array; 
    array = temp; 
    size = max; 
} 

void ArrayList::store(std::string x) 
{ 
    int taken = max - free_space; 
    int y = x.size(); 
    free_space = free_space - y; 
    for(int i = 0; i < y; i++) 
    { 
     if(y >= size) 
     { 
      while(y >= size) 
      { 
       expand(); 
      } 
     } 
     else 
     { 
      array[i + taken] = x[i]; 
     }    
    } 
} 

std::ostream& operator<<(std::ostream& os, const ArrayList &arr) 
{ 
    os << arr.array; 
    return os; 
} 

void ArrayList::display_size() 
{ 
    size = max; 
    std::cout << "Array Content: "; 
    std::cout << array; 
    std::cout << std::endl; 
    std::cout << "Remaining size: "; 
    std::cout << free_space; 
    std::cout << std::endl; 
} 

void ArrayList::clean() 
{ 
    int x = 0; 
    for(int i = 0; i < size; i++) 
    { 
     if(array[i] == ' ') 
     { 
      x++; 
     } 
    } 
    size = x; 
} 

ArrayList::ArrayList(const ArrayList &arr) 
{ 
    array = new char[size + 1]; 
    strcpy(array, arr.array); 
} 

ArrayList::~ArrayList() 
{ 
    delete [] array; 
} 

void ArrayList::operator=(const ArrayList& arr) 
{ 
    int new_length = strlen(arr.array); 
    if(new_length > max) 
    { 
     delete [] array; 
     max = new_length; 
     array = new char[max + 1]; 
    } 
    for(int i = 0; i < new_length; i++) 
    { 
     array[i] = arr.array[i]; 
    } 
    array[new_length] = '\0'; 
} 


int main() 
{ 
    ArrayList x; 
    std::string y; 
    char ans; 
    x.display_size(); 
    std::cout << "Please enter your string: "; 
    std::cin >> y; 
    x.store(y); 
    x.display_size();// << std::endl; 
    do 
    { 
     std::cout << "Please enter your string: "; 
     std::cin >> y; 
     x.store(y); 
     x.display_size(); 

     std::cout << "Do you want to enter another string? (y/n) "; 
     std::cin >> ans; 
    }while(ans != 'n'); 
    return 0; 
} 

Meine Frage bezieht sich auf dynamische C++ - Arrays. Ich habe eine Klasse erstellt, die ein dynamisches Array erstellt.Dynamische Array-Klasse wird nicht gedruckt

Ich habe meinen gesamten Code veröffentlicht es sollte lauffähig sein. Das Problem entsteht durch die Verwendung der Funktionen store und expand.

store nimmt eine Zeichenfolge und fügt jedes Zeichen in das Array ein. Wenn nicht genügend Speicherplatz vorhanden ist, wird expand aufgerufen.

expand verdoppelt die Größe des Arrays.

Theoretisch sollte die obige Ausgabe "Hallo" zurückgegeben haben, aber es hat nichts zurückgegeben, trotz der Rückkehr der "h" früher. Ich habe keine Ideen, wie ich das lösen kann.

EDIT:

ich da die Funktionen nach dem Rat geändert haben mir gegeben:

void ArrayList::expand() 
{ 
    max = size + size; 
    char *temp = new char[max]; 
    for(int i = 0; i < max; i++) 
    { 
     temp[i] = array[i]; 
    } 
    free_space = free_space + size; 
    delete [] array; 
    array = temp; 
    size = max; 
} 

void ArrayList::store(std::string x) 
{ 
    int taken = max - free_space; 

    int y = x.size(); 
    free_space = free_space - y; 
    for(int i = 0; i < y; i++) 
    { 
     if(free_space <= 0) 
     { 
      while(free_space <= 0) 
      { 
       expand(); 
      } 
     } 
     else 
     { 
      array[i+taken] = x[i]; //I'm cetain this didn't do anything 
     }    
    } 
} 

ich die negative Zahl Frage in den Kommentaren detailliert gelöst haben. Das einzige Problem ist jetzt das Drucken der Nummer.

+1

:

for(int i = 0; i < max; i++) { array[i] = temp[i]; } 

sollte ersetzt werden. C++ dynamische Arrays heißen 'std :: vector' – user463035818

+0

Versuchen Sie, Ihren Code mit einem Debugger zu durchlaufen, es gibt viele Probleme. –

+0

Hinweis: Mit der Eingabe in der Frage beim zweiten Aufruf von 'ArrayList :: store' wird' free_space' negativ, und das sollte natürlich nicht passieren. –

Antwort

2

Dieses "für" Schleife in "erweitern" Methode: btw c Sie verwenden dynamische Arrays

for(int i = 0; i < size; i++) 
{ 
    temp[i] = array[i]; 
} 
+0

Richtig, aber es gibt mehr Probleme. –

+1

Einverstanden, und der ganze Code sieht unnötig kompliziert aus für das, was er tun soll. – blackmesa

+0

irgendwelche spezifischen Vorschläge für was kann ich tun, damit der Code weniger kompliziert aussieht? – Tim