Problem bei if-Abfrage



  • Ich nehme an, es ist nicht all zu schwer...

    for (i=0; i<=n; i++){
    if ( wert1[i]-wert2[i] < vergleichswert ){
    ....
    }
    

    So frag ich lediglich ab, ob jeder einzelne Wert (0 bis n)kleiner ist.
    Ich möchte aber wenn alle n Werte kleiner sind weitermachen

    Es muss ja irgendwie

    if ( wert1[0]-wert2[0] < vergleichswert && wert[1]-wert[1] < vergleichswert && .........)
    

    heissen, aber das kann ich ja nicht im Vorfeld schon schreiben, wenn n noch nicht bekannt ist...

    Versteht ihr mein Problem, was kann man da machen?



  • Gibt sicher noch ne bessere lösung, aber mal irgendwas:

    bool myLess(const vector& first, const vector& second)
    {
    for (i=0; i<=n; i++){
    if (!(wert1[i]-wert2[i] < vergleichswert)){
      return false;
    }
    return true;
    }
    
    if(myLess(wert1, wert2)) 
    {
    ...
    }
    


  • wert1/wert2 in der funktion natürlich durch first/second ersetzen.



  • Die Lösung ist, wie schon vom kleinen Troll gesagt, sehr einfach. Du nimmst einen Boolean, setzt ihn true, fragst anschließend alle Werte ab. Widerspricht ein Wert der gewünschten Eigenschaft, kann der Boolean auf false gesetzt werden. Anschließend (nachdem die Schleife beendet worden ist), kann geprüft werden, ob der Boolean immer noch true ist (oder einfach gleich dem Anfangswert). Dann kann man ja weiter machen was man will.

    AFAIK gibt es dafür noch einen STL-Algorythmus (-><algorithm>), der alle Elemente eines Iterator-Bereichspaares auf eine Instanz von Predicate prüft - muss aber noch mal nachgucken.



  • Hacker schrieb:

    AFAIK gibt es dafür noch einen STL-Algorythmus (-><algorithm>), der alle Elemente eines Iterator-Bereichspaares auf eine Instanz von Predicate prüft - muss aber noch mal nachgucken.

    Mir fällt da auf Anhieb nur find_if() ein.



  • std::all_of() in C++11



  • Mach (z.b. bei std::vector) einfach '=='..

    oder (@CStoll, die funktion die ich meinte): std::find_end()



  • Ja, ich hab das jetzt mit dem boolschen Ausdruck gemacht..
    Hab das evtl. arg kompliziert gemacht hab, aber es läuft, und genügt mir auch.
    Danke



  • Nein!
    Du darfst nie sagen: "Hurra es funktioniert, lass ich's mal so stehen wie es ist damit ich's nicht kaputt mache".
    Poste mal deinen Code, den kann man bestimmt verbessern.



  • Du hast doch hoffentlich nicht alle Elemente aufgelistet? Falls doch, viel Spass wenn sich n mal ändert. Im Bezug auf Lesbarkeit und Fehleranfälligkeit hast du damit auch verloren.

    Machs wie der kleine Troll. Statt !(x < y) kannst du auch x >= y schreiben.



  • Also gut, hier der code. (bisschen verkürzt was die variablen angeht)
    Ich meinte nur, dass es wohl eleganter gehen könnte, weil ich noch nicht so viel Erfahrung habe...

    bool vgl1 = true, vgl2 = true, vgl3 = true, vgl4 = true, vgl5 = true;
    	int res;
    
    // Wenn ein Element > Vergleichswert, dann "false"
    	for (i=0; i<n-1; i++){
    		if ( wert1[i]-wert0[i] > verglsll ){
    			vgl1 = false;
    		}
    	}
    	for (i=0; i<n-1; i++){
    		if ( wert2[i]-wert0[i] > verglsll ){
    			vgl2 = false;
    		}
    	}
    	for (i=0; i<n-1; i++){
    		if ( wert3[i]-wert0[i] > verglsll ){
    			vgl3 = false;
    		}
    	}
    	for (i=0; i<n-1; i++){
    		if ( wert4[i]-wert0[i] > verglsll ){
    			vgl4 = false;
    		}
    	}
    	for (i=0; i<n-1; i++){
    		if ( wert5[i]-wert0[i] > verglsll ){
    			vgl5 = false;
    		}
    	}
    
    	// Szenarien durchgehen
    	if ( vgl1 == true ){
    		for (i=0; i<n-1; i++){
    		res = 1;
    	}
    	if ( vgl1 == false && vgl2 == true ){
    		for (i=0; i<n-1; i++){
    		res = 2;
    	}
    	if ( vgl1 == false && vgl2 == false && vgl3 == true ){
    		for (i=0; i<n-1; i++){
    		res = 3;
    	}
    	if ( vgl1 == false && vgl2 == false && vgl3 == false && vgl4 == true ){
    		for (i=0; i<n-1; i++){
    		res = 4;
    	}
    	if ( vgl1 == false && vgl2 == false && vgl3 == false && vgl4 == false && vgl5 == true ){
    		for (i=0; i<n-1; i++){
    		res = 5;
    	}
    	if ( vgl1 == false && vgl2 == false && vgl3 == false && vgl4 == false && vgl5 == false ){
    		cout << "Abruch.....";
                    [...]
    	}
    


  • AUTSCH. Kann mir garnicht vorstellen wie das funktionieren soll. Aber gut...

    bool res(false);
    //oder
    int res(-1);
    
    for(int a=0; a != wert1.size(); ++a)
        if(wert1.at(a) - wert0.at(a) > verglsll)
            res=true;
            // oder
        {
            res=a;
            break;
        }
    
    if(res){
    //...
    }
    //oder
    if(res > -1){
    //...
    }
    

    So stellte ich mir das vor. Kannst ja dann was mit res anfangen ...
    Ich glaub ich hab den Zweck des Codes nicht richtig verstanden...

    P.S.: Statt

    irgwas == false
    

    kannst du auch einfach

    !irgwas
    

    und statt

    irgwas == true
    
    irgwas
    

    schreiben.



  • Ziemlich ineffizient. Was hast du an dem Beispiel des kleinen Trolls nicht verstanden. Fällt dir auf, dass du eine und die selbe Schleife mehrmals verwendest? Wenn du wirklich jeden dieser "wert"-Werte überprüfen willst, dann pack sie alle in einen Vektor und schieß durch eine einzige Schleife. Jetzt beim Schreiben habe ich festgestellt, dass du selbst nicht ganz verstehst, was du geschrieben hast oder zumindest was es macht. Was bezweckst du mit den for-Schleifen in der zweiten Hälfte? Da hast du außerdem geschweifte Klammern vergessen. Die ganze zweite Häfte hättest du dir sparen können, wenn du etwas vernünftiges aus der STL benutzen würdest (auch res-Werte könntest du geschickt speichern).



  • Im ersten Teil geh ich alle n's durch. Sobald eins aus der Reihe fällt, wird aus true false...
    Der zweite teil ist dazu da, dass ich Ergebnisse (zum Beispiel) der dritten Iteration benutze. Hier kann auch vorkommen das die 3. und 5. true ergeben, aber dann will ich die "jüngste" Iterationswerte...
    Steh etwas unter Zeitdruck und deswegen, werd ich das mal so stehen lassen und nicht noch weiter an besseren Lösungen doktorn, solang ich "eine" Lösung hab 🙂



  • Dennoch besten Dank für die Hilfe, auch wenn ich sie nicht richtig nutze, mich hats weitergebracht 😉



  • Eine Lösung die wie Brechreizcode aussieht. Nach deinem Motto wirst du nicht richtig etwas dazu lernen. Du sagst du stehst unter Zeitdruck, daher geh ich davon aus, dass es für die Schule ist. Aber wenn du dir lieber 5 Minuten sparen willst, den Code ab zu ändern, kannst du dir wohl eine 5 in deinem Fach entbeeren.


Log in to reply