CStrings alphabetisch sortieren



  • hallo, bin gerade dabei mit Strings herumzuspielen.
    Habe die folgende funktion angefangen die einen String übergeben bekommt,
    den sie passend zurechtschneidet und dann datensatzweise in einen array
    speichert:
    user_array[i][0] => Vorname
    user_array[i][1] => Name
    user_array[i][2] => Personal-Nr

    ich will dann die datensätze alphabetisch nach Nachnamen sortieren,
    dann daraus wieder einen String in passendem Format bilden, der
    dann rückgegeben wird

    Hier, was ich bis jetzt getippelt hab:

    CString CNewUser::user_sort(CString userdaten)
    {
    
    	// Datensätze in den Array einlesen ///////////////////////////////////////////////
    	int i=0, pk_position=0, j, stringlaenge;
    	CString bearbeiten = userdaten;
    	CString user_array[1000][3];
    
    	stringlaenge = strlen(userdaten);
    	pk_position = bearbeiten.Find('\n', 0);
    
    	while (pk_position != -1)
    	{
    		for (j=0; j<3; j++)
    		{		
    			user_array[i][j] = bearbeiten.Left(pk_position);
    			bearbeiten = bearbeiten.Mid(pk_position+1, strlen(bearbeiten));	
    			pk_position = bearbeiten.Find('\n', 0);
    		}		
    		i++;
    	}
    
    	/////////////////////////////////////////////////////////////////////////////////
    
    	return bearbeiten; // da wird zum Schluss der sortierte array
    					   // wieder zu einem passenden String zusam-
    					   // mengesetzt und bildet Rückgabewert
    }
    

    Weiss da jemand, ob es da ne gute Funktion für gibt? bubblesort fände ich hier
    viel zu umständlich....



  • ich könnt dir an deinem anatz helfen, aber ehrlich gesagt kein bock.

    denn du willst doch echt nicht in ein 2d array die datensätze speichern?????? das macht glaub keiner so. und dann auch noch vorher fuer 1000*3 speicherplaetze speicher reservieren. ne oder? bekommst du taeglich RAM geschenkt? hehe 😉

    mach doch n struct

    struct
    {
    CString Vorname;
    CString Name;
    CString PersNr;
    }
    
    // dann nicht ein array nehmen sondern vector ( <vector> klasse !! )
    // schau in einem toturial in google wegen vector oder hier im forum.
    // dann musst dir nicht so gedanken machen wegen dynamisch speicher anfordern!!!!
    

    tue dir echt den gefallen. sowas wirst du immer wieder brauchen, glaub mir die "muehe" lohnt sich. dann kannst auch einfach sortieren aufsteigend ect,

    m_meinVector.name.Sort();  // irgendwie so, keine zeit grad nachzuschauen
    

    also checks ab. wenn du dann noch fragen hast, helf ich dir gern weiter, aber so, nene du

    mfg
    fletscher



  • hehe, thx 2 u!!!

    ach ja struct, lange nicht mehr gebraucht, aber ich glaube ich sollte es mir
    mal wieder anschaun. hast ja recht :p
    war nur so zum testen, da ich gerade ne chipkartengesteuerte stempeluhr baue.
    da hat es mich nur interessiert, obs da überhaupt ne funktion zu string-alpha-
    sort gibt.

    also kurz: DANK DIR, UND EIN SCHÖNES WEEKEND!



  • kein thema

    und schau dir struct an und die vector klasse

    dann kannst gleich ein element dranhängen mit pushup

    wenn du spezielle vectoren hast
    eine membervarible die sich merkt wieviel elemente du hast

    dann musst halt rezise verwenden, welches eines grösser ist als die momentane menge

    und dann verwendest du acuh keine arrays mehr und schon gar nicht ein 2D array zum abspeichern von adressdaten ect.

    wenn du dann noch fragen hast, gerne immer zu.



  • Danke, ist lieb von dir.
    ich kann allerdings erst montag mich wieder damit beschäftigen, da ich am we
    durcharbeite 😞



  • hallo, konnte es heute morgen nicht lassen.....
    Ist das für dich jetzt besser so? 😃 😃 😃

    CStempeluhrView* stempeluhrview;	
    	CString user_datenbank_pfad2 = stempeluhrview -> prog_pfad() + "\\system\\usr\\usr.mfk";
    
    	// User-Datei einlesen und in CString strText speichern
    	CFile f2(user_datenbank_pfad2, CFile::modeRead); 
    	char* sz2 = new char[f2.GetLength()+1];
    
    	f2.Read(sz2, f2.GetLength());
    	sz2[f2.GetLength()] = 0;
    	f2.Close();
    	CString strText2;
    	strText2.Format("%s", sz2);
    	delete[] sz2;
    	int i2=0, pk_position2=0, j2, stringlaenge2;
    	CString bearbeiten2 = strText2;
    
    	stringlaenge2 = strlen(strText2);
    	pk_position2 = bearbeiten2.Find('\n', 0);
    
    	struct personaldaten
    	{
    		CString Vorname;
    		CString Name;
    		CString PK;
    	}pos_memory[100];
    
    	while (pk_position2 != -1)
    	{
    		for (j2=0; j2<3; j2++)
    		{			
    			switch(j2)
    			{
    				case 0:
    					pos_memory[i2].Vorname = bearbeiten2.Left(pk_position2);
    					break;
    
    				case 1:
    					pos_memory[i2].Name = bearbeiten2.Left(pk_position2);	
    					break;
    
    				case 2:
    					pos_memory[i2].PK = bearbeiten2.Left(pk_position2);
    					break;
    
    				default: break;
    			}
    
    		bearbeiten2 = bearbeiten2.Mid(pk_position2+1, strlen(bearbeiten2));	
    		pk_position2 = bearbeiten2.Find('\n', 0);
    
    		}	
    
    		//AfxMessageBox(pos_memory[i2].Vorname);
    		//AfxMessageBox(pos_memory[i2].Name);
    		//AfxMessageBox(pos_memory[i2].PK);
    		i2++;
    	}
    

    Jetzt nur noch rausbekommen, wie das sortieren funktioniert.
    Also, CU fletscher!



  • int compare(const void *param1, const void *param2)
    {
    personaldaten *pers1 = (personaldaten *)param1, *pers2 = (personaldaten *)param2;

    return pers1->Name.Compare(pers2->Name);
    }

    qsort(pos_memory, 100, sizeof(personaldaten), compare);

    müsste gehen



  • Geili!!!!!!!!
    Vielen, vielen, vielen, vielen Dank!

    Naja, hat heute abend noch nicht sofort gefunzt.
    Da ich morgen Frühschicht hab muss es leider bis Montag warten.
    Sieht aber für mich Anfänger recht kompliziert aus (auch das Original
    in der MSDN).
    🙄 😮 😕


Log in to reply