elemente in mehrdim.array tauschen



  • hallo,

    schreibe gerade mein erstes c++ prog und schon probleme...
    habe über google leider nix gefunden.

    also ich habe ein zweidimensionales char array mit unterschiedlichen zeichenketten

    Bsp.:

    mein_array[0]="abc";
    mein_array[1]="accba";
    mein_array[3]="accb";
    mein_array[4]="abcabcabc";

    mein ziel ist es die ketten zu sortieren mittels bubblesort, dafür nutze ich eine funktion vergleich() mit einem vorgegebenes alphabet, außerdem ist die länge der ZK (bzw. der 2.dimension) entscheident.

    wie kann ich nun, nachdem ich festgestellt habe das z.B. mein_array[1] und mein_array[2] vertauscht werden müssen, die beiden auch tatsächlich und möglichst einfach vertauschen?
    mein größtes problem ist halt das die 2.ten dimensionen unterschiedliche längen haben...

    danke für die hilfe 🙂



  • Hi...

    Also wenn es nicht unbedingt ein Array sein soll, würde
    ich das ganze mit einer list oder einem vector und strings machen.
    Ist viel einfacher und auch eher C++, arrays und chars sind eher C.

    Mit einer list würde das dann so aussehen:

    #include <list>
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main(){
    	//Liste und Iterator erstellen
    	list<string> mylist;
    	list<string>::iterator it;;
    
    	//Liste füllen
    	mylist.push_back("abc");
    	mylist.push_back("accba");
    	mylist.push_back("accb");
    	mylist.push_back("abcabcabc");
    
    	//Liste sortieren
    	mylist.sort();
    
    	//Liste anzeigen
    	for(it = mylist.begin();it!=mylist.end();it++){
    		cout<<(*it)<<endl;
    	}
    }
    
    Ausgabe vor sotierung:
    
    abc
    accba
    accb
    abcabcabc
    
    Ausgabe nach der sortierung:
    
    abc
    abcabcabc
    accb
    accba
    

    Und für die list kannst du dir auch eigene Sortierverfahren schreiben
    mehr infos findest hier: http://www.cplusplus.com/reference/stl/list/sort.html

    mfg smilingman



  • Du machst es dir umständlich dadurch, dass du nicht die Klasse std::string nutzt ... (dann wäre std::swap für ein einfaches tauschen der Inhalte ausreichend ...)
    Weiß nicht ob es ausreicht einfach die Zeiger umzubiegen ... sonst kopier einfach:

    void swap_cstring(char*& first, char*& second)
    {
        char* tmp(new char[std::strlen(first) + 1]); // copy first to tmp
        std::strcpy(tmp, first);
        delete [] first; // copy second to first
        first = new char[std::strlen(second) + 1]);
        std::strcpy(first, second);
        delete [] second; // set tmp to second
        second = tmp;
    }
    

    .

    char* array[2] = {"string_01", "string_02" };
    std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl;
    swap_cstring(array[0], array[1]);
    std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl;
    

    ...



  • danke für die hilfe bisher.

    @smilingman: ja leider muss es ein array sein 😞

    @(D)Evil: okay ich glaube das kommt hin, werd es heut mal ausprobieren



  • paddel schrieb:

    ...
    also ich habe ein zweidimensionales char array mit unterschiedlichen zeichenketten

    Bsp.:

    mein_array[0]="abc";
    mein_array[1]="accba";
    mein_array[3]="accb";
    mein_array[4]="abcabcabc";

    mein ziel ist es die ketten zu sortieren mittels bubblesort ...

    Man kann z.B. schreiben :

    char mein_array[4] = {"abc", "accba", "accb", "abcabcabc"};
    

    Das ergibt ein eindimensionales Array aus Zeigern auf nullterminierte Zeichenketten verschiedenener Länge.
    Man kann nach alphanumerischem Vergleich diese Zeiger sortieren.

    mfg



  • Glaubst du daran, dass das geht?



  • Sorry

    char* mein_array[4] = {"abc", "accba", "accb", "abcabcabc"};
    

    🕶



  • (D)Evil schrieb:

    Glaubst du daran, dass das geht?

    @(D)evil
    char array[2] = {"string_01", "string_02" };**
    das geht mit Sicherheit nicht!
    😉



  • (D)Evil schrieb:

    sonst kopier einfach:

    void swap_cstring(char*& first, char*& second)
    {
        char* tmp(new char[std::strlen(first) + 1]); // copy first to tmp
        std::strcpy(tmp, first);
        delete [] first; // copy second to first
        first = new char[std::strlen(second) + 1]);
        std::strcpy(first, second);
        delete [] second; // set tmp to second
        second = tmp;
    }
    

    .

    char** array[2] = {"string_01", "string_02" };
    std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl;
    swap_cstring(array[0], array[1]);
    std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl;
    

    ...

    habe das grad mal so übernommen, funktioniert aber nicht so ganz:

    Fehler	3	error C2440: 'Initialisierung': 'const char [10]' kann nicht in 'char **' konvertiert werden	c:\dokumente und einstellungen\*****\array.cpp	21
    Fehler	4	error C2440: 'Initialisierung': 'const char [10]' kann nicht in 'char **' konvertiert werden	c:\dokumente und einstellungen\*****\array.cpp	21	
    Fehler	5
    error C2664: 'swap_cstring': Konvertierung des Parameters 1 von 'char **' in 'char *&' nicht möglich	c:\dokumente und einstellungen\*****\array.cpp	23
    


  • Jap sorry stimmt. Eine Dimension außer acht gelassen ...



  • paddel schrieb:

    ... mein ziel ist es die ketten zu sortieren mittels bubblesort ...

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    
    void bubble(char** , int); 
    
    int main()
    {
       char* mein_array[4] = {"abc", "accba", "accb", "abcabcabc"};
    
       int N = sizeof(mein_array)/sizeof(char*);
    
       bubble(mein_array, N);
    
       for(int i = 0; i < N; i++)
       {
    	   std::cout << mein_array[i] << std::endl;
       }
    
    }
    
    void bubble(char** array, int elemente) 
    {
       char* temp;
       while(elemente--)
          for(int i = 1; i <= elemente; i++)
             if(strcmp(array[i-1], array[i]) > 0)   // < 0  ==absteigend sortieren 
    		 {
                temp = array[i];
                array[i] = array[i-1];
                array[i-1] = temp;
             }
    }
    

    💡
    mfg



  • dankeschön

    eine frage noch,
    und zwar wird die anzahl der zeichenketten (VAR_ANZ) sowie deren MAX_LAENGE erst während der laufzeit festgelegt.

    ist es richtig wenn ich das array so definiere:

    char **mein_array = new char[VAR_ANZ][MAX_LAENGE];
    

    und wie übergebe ich dann dieses dynamische zweidimensionale array an die funktion bubble(); ?



  • paddel schrieb:

    dankeschön

    eine frage noch,
    und zwar wird die anzahl der zeichenketten (VAR_ANZ) sowie deren MAX_LAENGE erst während der laufzeit festgelegt.

    ist es richtig wenn ich das array so definiere:

    char **mein_array = new char[VAR_ANZ][MAX_LAENGE];
    

    und wie übergebe ich dann dieses dynamische zweidimensionale array an die funktion bubble(); ?

    void bubble(char** , int); 
    
    int main()
    {
    
       int VAR_ANZ = 4;
       int MAX_LAENGE = 10;
    
       char**  mein_array   = new char*[VAR_ANZ];
       for (int	i = 0; i < VAR_ANZ; i++)
    	   mein_array[i] = new char[MAX_LAENGE];
    
       //z.B.:
       mein_array[0] = "abca";
       mein_array[2] = "abcc"; 
       strcpy(mein_array[1], "abc");
       strcpy(mein_array[3], mein_array[2]);
    
       bubble(mein_array, VAR_ANZ);
    
       for(int i = 0; i < VAR_ANZ; i++)
       {
    	   std::cout << mein_array[i] << std::endl;
       }
    }  
    
    void bubble(char** array, int elemente) 
    {
       char* temp;
       while(elemente--)
          for(int i = 1; i <= elemente; i++)
             if(strcmp(array[i-1], array[i]) > 0)   // < 0  ==absteigend sortieren 
    		 {
                temp = array[i];
                array[i] = array[i-1];
                array[i-1] = temp;
             }
    }
    

    mfg


Anmelden zum Antworten