Problem mit Strings



  • Hallo ihr,

    ich soll ein Programm schreiben, das zwei Unterprogramme elem_rek und elem_it verwendet. Es geht darum, dass in einem Vektor, von einem User eingegebene, Elemente gespeichert werden und danach zuerst überprüft wird, ob der Vektor sortiert ist. Falls dies der Fall ist, soll der Benutzer ein gesuchtes Element eingeben um zu prüfen, ob dieses Element in diesem Vektor enthalten ist.

    Dazu werden diese beiden Unterprogramme elem_rek und elem_it verwendet (welche sich bei mir in der Header-Datei befinden).

    Ausgegeben wird dann "ja" falls dieses gesuchte Element in dem Vektor vorhanden ist und "nein" falls nicht.

    Hier erst mal die beiden Programme:

    #include<iostream>
    #include<vector>
    #include<string>
    #include"aufgabe2.h"
    using namespace std;
    
    int main(int argc, char** argv)
    {
        vector<string> eingabe;
        string wert;
    
        cout << "Geben Sie Elemente ein. Geben Sie \' a \' zum abbrechen ein." << endl;
        cin >> wert;
        while(wert!="a")
        {
    
              eingabe.push_back(wert);
              cin >> wert;
        }
    
        //Falls direkt 'a' eingegeben wurde, soll das Programm direkt terminieren.
        if(eingabe.empty()) 
        {
         return 0;
        }
    
        //Test auf Sortiertheit
        bool sortiert=true;
    
        for(unsigned int k=0;k<eingabe.size()-1;k++)
        {
    
               if(eingabe[k] > eingabe[k+1]) sortiert=false;
    
        }
    
        if(sortiert == true) cout << "Die Eingabe ist sortiert" << endl;
        if(sortiert == false) return 0;
    
        //Definition und Deklaration des gesuchten Elementes m
        string m;
        cout << "Welche Zahl soll in der eben eingegenen Folge gesucht werden?";
        cin >> m;
        if(elem_it(eingabe,0,eingabe.size()-1,m) && elem_rek(eingabe,0,eingabe.size()-1,m))
        cout << "ja" << endl;
        else cout << "nein" << endl;
    
    system("Pause");
     return 0;  
    }
    
    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    
    //iterative Suche nach m in einem Vektor a mit den Grenzen i und j
    bool elem_it(vector<string> A, int i, int j, string m)
    {
        bool vergleich = false;
        for(int k=i;k<=j;k++)
        {   
            if(vergleich = true) break;
            if(A[k]==m) vergleich = true;
            if(A[(j-1)/2] == m) vergleich = true;
            if(A[(j-i)/2] < m)
            {
                k = i + (j-i)/2;
            }
            if(A[(j-i)/2] > m) j = i + (j-i)/2;
        }
    
        if(vergleich==true) return true;
        else return false;
    }
    
    //rekursive Suche nach m (sonstige Variablen vgl. iterative Suche)
    bool elem_rek(vector<string> A, int i, int j, string m)
    { 
        //Bestimmen der Hälfte der angegeben Grenzen i und j
        int haelfte = (j - i)/2;
        if(j-i>1)
        {
            if(A[i+haelfte] < m) return elem_rek(A, i+haelfte, j, m);
    	    if(A[i+haelfte] > m) return elem_rek(A, i, i+haelfte, m);
    	    if(A[i+haelfte] == m) return true;  
        }
    
        //Wenn obere und untere Grenze genau nebeneinander liegen
        if(j-i==1) 
        {
            if(A[i] == m||A[j] == m) return true;
        }
    
        //Wenn obere und untere Grenze genau gleich sind.
        if(j-i==0)
        {
            if(A[i]==m) return true;
        }
    
        /*Falls alle bisherigen Fälle nicht zutreffen, dann ist m nicht
        in dem Vektor enthalten.*/
        return false;
    }
    

    Mein Problem ist nun folgender Teil des Quellcodes:

    for(unsigned int k=0;k<eingabe.size()-1;k++)
        {
    
               if(eingabe[k] > eingabe[k+1]) sortiert=false;
    
        }
    

    Leider kommt es bei der Eingabe: 1 2 3 4 5 6 7 8 9 10 11 a (a ist Abbruchkriterium) dazu, dass das Programm diese Liste als nicht sortiert erkennt, was ja nicht stimmt 😞 . Wie kann ich Strings vergleichen? Gibt es diese Möglichkeit überhaupt?

    Gibt es Möglichkeiten dies irgendwie anderst zu umgehen?

    MfG Andi 🙂

    PS: Im Voraus besten Dank!



  • Zuerstmal, ich hab mir dein Programm nicht genauer angesehen. Folgendes
    Problem ist mit aber ins Auge gesprungen. 😉

    Durch speicherst deine Eingaben als strings ab. Du erwartest ab offentsichtlich
    die Eingabe von Zahlen, die du anschliessend auf Sortierung prüfen willst.
    Dir ist hoffentlich klar das der Vergleich von Strings was anderes tut als der
    Vergleich von Zahlen

    (9 < 10) != ("9" < "10")

    Wenns dir wirklich ausschliesslich um Zahlen geht, würde ich dir empfehlen,
    nur Zahlen in dem vector zu speichern. Da du für ein ordnungsgemässes Programm
    sowieso die Eingaben des Benutzers vor dem Eintragen prüfen musst, ist damit
    auch kein zusätzlicher Aufwand verbunden.


Anmelden zum Antworten