Sätze sortieren mittels Bubblesort



  • Hey Leute,

    ich habe folgendes Problem, ein Kumpel von mir soll mittels c++ und bubblesort einen Satz nach ASCII sortieren und dabei aber auch auf die Leerzeichen achten. Und da hapert es bei mir. Wie gebe ich den sortierten Satz wieder mit leerzeichen aus?

    hier mal der code:

    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        char satz[99]="hallo wie gehtS";
        char temp;
        int a,b;
    
        cout<<satz;                    
        for(a=0; a<=99; a++)
        {
           for(b=0; b<=99; b++)
           {              
                      if(satz[b] > satz[b+1])
                      {
                           temp = satz[b];
                           satz[b]= satz[b+1];
                           satz[b+1]=temp;                              
                      }
           } 
    
        }
    
         for(b=0; b<=99; b++)
         {
          cout<<satz[b];         
         } 
             getch();
    }
    

    Ist wichtig er brauch das zu morgen. Wäre dankbar für eure Hilfe.

    Gruß

    iLLu444



  • Nachdenken ...

    Du machst ne for Schleife for(a=0; a<=99; a++), aber der String hat nur 16 Zeichen. Da kann doch nur Mist passieren.



  • Ja gut, eigentlich sollte ein satz mittels cin eingegeben werden der max. 99 Zeichen lang sein.

    Wie läuft das dort?



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Bist du sicher dass die Zeichen sortiert werden sollen, nicht die Wörter?



  • Japp die Zeichen sollen sortiert werden also jeder einzelne Buchstabe nach ASCII-Code.



  • illu444 schrieb:

    Ja gut, eigentlich sollte ein satz mittels cin eingegeben werden der max. 99 Zeichen lang sein.

    Wie läuft das dort?

    char Titel[100];
    cin.getline(Titel, 100, '\n');

    ausgabe:

    cout << Titel;



  • #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        char satz[98];
        char temp;
        int a=0,b=0;
        cout<<"Geben Sie einen Satz ein: ";
        cin.getline(satz, 100, '\n');  
    
        for(a=0; a<=99; a++)
        {
           for(b=0; b<=99; b++)
           {    
    
                      if(satz[b] > satz[b+1])
                      {
                           if (satz[b]==' ')
                           {
                           temp = satz[b];
                           satz[b]= satz[b+1];
                           satz[b+1]=temp;               
                           /*}  
                           temp = satz[b];
                           satz[b]= satz[b+1];
                           satz[b+1]=temp;  */     
    
           }       
    }
    }
    }
    for(int b=0;b<=99;b++)
    cout<<satz[b];        
    
    getch();
    }
    

    so sieht mein prog im mom aus, aber funktionieren tuts net.



  • char satz[98];
    -> Satz ist 98 Zeichen lang (ergo gehyen die Indexe von 0 bis 97)

    for(b=0; b<=99; b++)
    -> b wird am Ende 98, resp. 99

    satz[b]
    -> Zugriff auf das 99. Element, wo es nur 98 gibt
    -> BUMM
    (btw nimmt getline vorher noch 100 Zeichern, da sollte es auch schon krachen)

    if (satz[b]==' ')
    Warum? Jetzt machst du nur was, wenn du an nem Leerzeichen angekommen bist.
    Was genau meinst du mit auf Leerzeichen achten? Sollen die ignoriert werden? Wenn ja, dann nimm sie doch vorher raus und mach dann deinen bubble sort.

    Wenn schon bekannt: nutze std::string statt char array.



  • @Shinja: String statt char Feld ist keine Lösung seines Problems. Kann ja sein das dies eine Vorgabe ist, die eingehalten werden soll. Also ich versuch immer nur mit den mitteln zu arbeiten, die der Threadersteller mir gibt.

    Ich hab mich mal rangesetzte, nur das mit den vielen chars im Main gefällt mir noch nicht so.

    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    using namespace std;
    
    char *eingabe() {
         char satz[100] = "";
         cout<<"Bitte geben sie einen Satz ein (alles klein schreiben): "<<endl;
         cin.getline(satz, 100, '\n');
         return satz;
    }
    
    bool gueltigesSortierZeichen(char buchstabe1, char buchstabe2) 
    {
         // Wenn der 1. Buchstabe ein Leerzeichen oder Zeilenumbruchzeichen ist
         // wird false zurückgegeben
         if(buchstabe1 == ' ' || buchstabe1 == '\n') {
              return false;
         }
         // Wenn der 2. Buchstabe ein Leerzeichen oder Zeilenumbruchzeichen ist
         // wird false zurückgegeben
         if(buchstabe2 == ' ' || buchstabe2 == '\n') {
              return  false;
         }
         // Wenn der 2. Buchstabe keine Zeichen ist
         if((int) buchstabe2 == 0) {
              return  false;
         }
    
         return true;
    }
    
    char *sortieren(char satz[100]) {
         bool marke;
         char temp;
    
         do
         {
            marke=0;
            for(int a=0;a<=100 && satz[a] != '\n' && (int) satz[a] != 0;a++)
            {
               if(satz[a] > satz[a+1] && gueltigesSortierZeichen(satz[a], satz[a+1]))
               {
                 temp = satz[a];
                 satz[a] = satz[a+1];
                 satz[a+1]=temp;
                 marke=1; 
               }                  
            }
        }
        while(marke == 1);
        return satz;
    }
    
    void ausgabe(char ausgabe[100]) {
         cout<<endl<<"Nach Buchstaben sortiert wuerde folgendes rauskommen: "<<endl<<ausgabe<<endl;
    }
    
    int main(int argc, char *argv[])
    {
        char satz[100] = "";
    
        char *eingabewert = eingabe();
        for(int i =0; i < 99;i++) { satz[i] = eingabewert[i]; } 
    
        char *sortierwert = sortieren(satz);
        for(int i =0; i < 99;i++) { satz[i] = sortierwert[i]; } 
    
        ausgabe(satz);
    
        getch();
    }
    


  • Hi,
    mir ist immer noch nicht kar, wie denn eigentlich sortiert werden soll

    Gegeben:
    "hallo wie gehtS"
    so sortiert:
    "Saeeg hhi llotw"
    oder so sortiert:
    "_Saeeghhillotw"
    (
    steht für blank)

    Wenn entsprechend "__Saeeghhillotw" sortiert werden soll, dann könnte der folgende Code zur Lösung des Problems beitragen:

    #include <iostream>
    void bubble ( string& s )
    { char c;
      for (int i = 0; i < s.length(); i++)
        for ( int j = i; j < s.length(); j++)
           if (s[j] < s[i]) { c = s[i]; s[i] = s[j]; s[j] = c; }
    }
    . . .
    string satz = "hallo wie gehtS";
    bubble ( satz );
    cout << satz << endl;  // out: __Saeeghhillotw
    . . .
    

    viele Grüsse tesu
    (auf Nachtwache:)


Anmelden zum Antworten