Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
14.05.2009, 18:32
Protestallianz



Hi,

ich möchte gerne die Tabelle nach Namen oder Vorname sotieren lassen, dies kann der Uster auswälen in iner Radiogroupbox.

Mein erster Ansatz ist relativ komisch (ich glaube das Punkte Array kann man weg lassen...) aber von dem Grundgedanke richtig.

Mein Prinzip funktioniert auf einem Punktevergabesystem, ich finde nur keine Idee für ein Abfragesystem, da es sehr kompliziert ist, ich hhoffe ihr könnt helfen!
Quellcode://Variablen
char buchstabe_1, buchstabe_2;
String wert1, wert2;
int wahl, durch;

//durch ist die Anzahl der Druchläufe für die Schleifen
durch=StringGrid1->RowCount;
wahl=RadioGroup1->ItemIndex;

//Einfach mal 100 wieviel Einträge die Tablle nachher hat kann manja sehen
int punkte[100];

//Erste Schleife: hier wird von jeder Reihe der Anfangsbuchstabe genommen

for (int l=0; l<durch; l++)
    {
    wert1=StringGrid1->Cells [wahl] [l];
    buchstabe_1=(char) wert1 [1];
        //Schleife zwei: hier wird der Buchstabe der ersten Schleife mit jedem
        //anderen Buchstabe verglichen
        for (int j=0; j<durch; j++)
        {
         wert2=StringGrid1->Cells [wahl] [j];
         buchstabe_2=(char) wert2 [1];
         if (buchstabe_1<=buchstabe_2) {punkte[l]=punkte[l]+1;};
         }

}

--

-GAMING-


Dieser Beitrag wurde am 14.05.2009 um 18:34 von Protestallianz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
15.05.2009, 12:24
J_Hannes



nutzt doch qsort: http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

--

Heut' debug ich morgen brows' ich übermorgen cast' ich die Königin auf int
http://doubledtown.myminicity.com/

zum Seitenanfang zum Seitenende Profil || Suche
002
15.05.2009, 13:38
luckerking



Ich hab qsort bisher nur bei Zahlen benutzt.
Da es hier aber um Buchstaben geht, ist es nicht so einfach umsetztbar.
Für mich sieht der Code, den du geschrieben hast nach BubbleSort aus.

Es wird aber noch nicht vollständig Sortiert, denn du müsstes ja theoretisch den nächsten Buchstaben angucken, wenn buchstabe_1 und buchstabe_2 gleich sind.
Sonst könnte es passieren, dass AB vor AA steht.

Gibt es den in C++ keine ArrayList oder ähnliches, die die schon vorgefertigete Methode sort hat?

--

zum Seitenanfang zum Seitenende Profil || Suche
003
15.05.2009, 13:46
Adrian_Broher
Admin


Zitat:
luckerking postete
Ich hab qsort bisher nur bei Zahlen benutzt.
Da es hier aber um Buchstaben geht, ist es nicht so einfach umsetztbar.
Was fuer ein Quark, Comparator schreiben und gut ist. Siehe auch das qsort example auf der verlinkten Seite.

Zitat:
luckerking postete
Für mich sieht der Code, den du geschrieben hast nach BubbleSort aus.
Eher nach "Reinventing the square wheel".

--

There is nothing wrong with high standards. It's your problem that you don't meet them.
If you think it's simple, then you have misunderstood the problem.
When a customer says "nothing has changed", assume they're lying.

zum Seitenanfang zum Seitenende Profil || Suche
004
15.05.2009, 22:40
Protestallianz



Mhm mit qsort verstehe ich nicht wie ich Strings sotiere und die dann wieder in der Tabelle einfüge!

Ich habe bisher nur ein paar c++ Grundlagen, aber diese Aufgabe ist sehr wichtig, komme aber einfac nicht auf die Lösung... google bringt auch keine brauchbaren Ergebnisse!

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche
005
15.05.2009, 23:55
Bluthund



Wenn du qsort nicht verstehst, hast du zu wenig Grundlagen. Nachholen! qsort() ist eigentlich immer _das_ Beispiel an dem der Nutzen von Funktionspointern erklärt wird.
Als Komparator könntest du strcmp() nutzen, da diese genau den erforderlichen Wertebereich abdeckt <0 für input1<input2, =0 für Gleichheit und >0 für input1>input2.
<edit> Natürlich entsprechend den Vorgaben verpackt, also etwa so:
Quellcode:int strcmp_for_qsort(const void* p1, const void* p2)
{
    return strcmp(*(const char**)p1, *(const char**)p2);
}
</edit>

Dann solltest du erstmal kundtun mit welchem Framework du da rumhantierst (Von welchem Typ ist bspw. StringGrid1? Ist String nen typedef auf std::string?), damit die Leute erstmal wissen mit welcher API man es hier zu tun hat. Evtl bietet diese nämlich schon ein Konzept, um Daten einfach sortieren zu lassen.

Wenn die Aufgabe ist einen Sortieralgorithmus zu implementieren, dann würde ich dir empfehlen mal im Web nach gängigen Verfahren zu suchen. Bubblesort und QuickSort wurden ja bereits genannt (ersteres wäre sicherlich das einfachste für nen Anfänger). Andere Kandidaten wären RadixSort, HeapSort oder MergeSort (Die Wikipedia hat da auch ne nette Liste). Dein Algorithmus taugt nix, da du anscheinend Strings vergleichen willst, das Konstrukt da oben aber nur die Anfangsbuchstaben vergleicht.

Zitat:
luckerking postete
Ich hab qsort bisher nur bei Zahlen benutzt.
Da es hier aber um Buchstaben geht, ist es nicht so einfach umsetztbar.
Das war ein Witz, oder?
ArrayList (ich nehme mal .NET an, da Javas ArrayList laut API-Referenz keine sort-Methode hat) kann btw auch nix tun wenn du deinem Datentyp nix mitgibst womit sich zwei Objekte dieses Typs vergleichen kann (*hint* IComparable) oder einen speziellen Komparator mitlieferst (IComparer).

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 16.05.2009 um 02:14 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
16.05.2009, 11:54
luckerking



Zitat:
Bluthund postete
Das war ein Witz, oder?
Leider nein :(.
Wobei ich doch recht hatte, dass es so (einfach) nicht umzusetzten zu ist, man braucht einen Komparator.
Wobei ich von sowas zum Ersten mal höre (gut zu wissen).

Zitat:
Bluthund postete
ArrayList (ich nehme mal .NET an, da Javas ArrayList laut API-Referenz keine sort-Methode hat) kann btw auch nix tun wenn du deinem Datentyp nix mitgibst womit sich zwei Objekte dieses Typs vergleichen kann (*hint* IComparable) oder einen speziellen Komparator mitlieferst (IComparer).
Du hast recht, aber es gibt auch die methode sort() die keinen IComparer verlangt und an die hatte ich gedacht.

Ich glaub ich sollte mich bei dem Thema C++ einfach raushalten :D.

--

zum Seitenanfang zum Seitenende Profil || Suche
007
16.05.2009, 15:05
Bluthund



Zitat:
luckerking postete
Du hast recht, aber es gibt auch die methode sort() die keinen IComparer verlangt und an die hatte ich gedacht.
Wer lesen kann ist klar im Vorteil
Zitat:
http://msdn.microsoft.com/en-us/library/aa317786(VS.71).aspx
ArrayList.Sort Method ()
Sorts the elements in the entire ArrayList using the IComparable implementation of each element.
Kein implementiertes IComparable-Interface -> Kein Sort()
OOP ist kein Voodoo-Automagic-Foo.

Zusatz zum Komparator-Beispiel oben in #005:
Das Beispiel war natürlich jetzt nur für C-Strings (war schon spät). Entsprechend müsste man für deine Stringklasse die Eingabewerte der Funktion auf Pointer auf Stringklasse casten und dann die mitgelieferte Vergleichsfunktion rufen (zB compare(const std::string&) const für std::string). Oder du baust temporär C-Style Strings draus und nutzt dann wie oben strcmp (wovon ich dringend abrate).
Aber wie schon gesagt wäre es gut zu wissen um welches Framework es sich hier handelt, da du ja versuchst zwei Arrays gleichzeitig zu sortieren (die beide in der zweiten Ebene deines Cells-Arrays stecken) und dabei nur eines der beiden als Quelle für die Sortierschlüssel zu nutzen.
Das geht natürlich auch mit qsort() (indem du im Komparator nicht das String-Array sondern das Cells-Array übernimmst) aber da wird bestimmt irgendwas passendes mitgeliefert (ich denke da bspw. an sortByColumn() in Qt)

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
008
16.05.2009, 16:11
luckerking



Zitat:
Bluthund postete
Kein implementiertes IComparable-Interface -> Kein Sort()
OOP ist kein Voodoo-Automagic-Foo.
Ich habe auch nichts anderes behauptet, vielleicht habe ich mich etwas falsch ausgedrückt.
Ich meinte, dass du selbst nicht den Komparator angeben musst, sondern das .Net Framework den von der Klasse String nimmt, die das Interface IComparable implementiert.

--

zum Seitenanfang zum Seitenende Profil || Suche
009
17.05.2009, 22:34
Protestallianz



Soooo habe es jetzt auch ohne eine Sort Funktion:

Eigentlich ganz einfach (ja es ist komplizieter aber ich verstehe es und da ich unter Zeitdruck stehe musste ich es so machen hole aber die Sort Funktion nach)

Hier mal der Code:
(Ich muss nioch ne If Abfrage machen, damit der bei Gleichheit der 2.Buchstabe kontrolliert wird usw.)

Quellcode:char buchstabe_1, buchstabe_2;
String wert1, wert2;
int wahl, durch;

durch=StringGrid1->RowCount;
wahl=RadioGroup1->ItemIndex;
for (int l=1; l<durch; l++)
    {
    wert1=StringGrid1->Cells [wahl] [l];
    buchstabe_1=(char) wert1 [1];
     for (int j=1; j<durch; j++)
        {
         wert2=StringGrid1->Cells [wahl] [j];
         buchstabe_2=(char) wert2 [1];
         if (buchstabe_1<=buchstabe_2)
          {String tmp = StringGrid1->Rows[l]->CommaText;
        StringGrid1->Rows[l]->CommaText = StringGrid1->Rows[j]->CommaText;
        StringGrid1->Rows[j]->CommaText = tmp; };
         }

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche
010
18.05.2009, 11:16
caedes



nutz strcmp() anstatt da selbst buchstaben zu vergleichen

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.

zum Seitenanfang zum Seitenende Profil || Suche
011
18.05.2009, 19:16
Bluthund



Arrays der Größe n laufen in C/C++ von 0 bis n-1, ergo greifst du mit deinem Code immer am ersten Element vorbei.
Noch dazu sortiert der Algorithmus nicht richtig (Wenn man mal davon absieht, dass der erste Wert nie angetastet wird und du unsinnigerweise gleiche Werte vertauschst).

Zitat:
Beispiel
Eingabevektor = { v, s, q, f, p }
Ausgabevektor = { v, f, q, p, s }
Link zu den Zwischenschritten
Grund: Du nimmst für den Vergleich buchstabe_1 her, der aber nur im äußeren Loop gesetzt wird. Durch die Verschiebe-Operationen kann der Wert in der Reihe mit Index l bereits ein anderer sein. Das passiert im verlinkten Beispiel bei l=3. Da ist rows[l] = 'f' und wird schon im ersten Schritt (j=1) mit rows[j] = 'q' getauscht. Für j=4 wird der Fehler offensichtlich, da an der Stelle dann 's' mit 'p' vertauscht obwohl ganz offensichtlich 's' nicht kleiner oder gleich 'p' ist buchstabe_1 aber sehr wohl.

Und hör auf Buchstaben zu vergleichen wenn du Strings vergleichen willst, dafür gibts Funktionen/Methoden und die haben Leute geschrieben, die wissen was sie tun.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche