logischer fehler!! Weshalb??



  • int main()
    {
      // testet auf Minimum dreier Ganzzahlen:
      int n1, n2, n3;
      cout << "Bitte geben Sie drei Ganzzahlen ein ";
      cin >> n1 >> n2 >> n3;  // z.B. 0 0 1
    
      if (n1 >= n2 >= n3)  //Ganzzahlen abgebildet!
        cout << "max = " << n1;  // 
    
      return 0;
    }
    

    Eingabe 0
    0
    1
    Ausgabe: max=0

    Weshalb 0 und nicht 1 ????

    Laut Vorlesung trifft folgendes zu!:""Boolesche Ausdrücke besitzen
    numerische Werte
    (FALSE -> 0, TRUE -> 1).
    Die Auswertung zusammengesetzter Ausdrücke kann daher "verzwickt"
    sein."" Aber weshalb? Hab hier ja kein bool definiert sondern int!



  • Jumper schrieb:

    if (n1 >= n2 >= n3)  //Ganzzahlen abgebildet!
    

    Das geht nicht, du vergleichst damit einen boolschen Wert (Ergebnis eines Vergleichs) mit einem int-Wert...

    Eher so:

    int main() 
    { 
    	// testet auf Minimum dreier Ganzzahlen: 
    	int n1, n2, n3; 
    	cout << "Bitte geben Sie drei Ganzzahlen ein "; 
    	cin >> n1 >> n2 >> n3;  // z.B. 0 0 1 
    
    	int minimum=std::min(std::min(n1,n2),n3);
    	int maximum=std::max(std::max(n1,n2),n3);
    	cout << "max = " << maximum << endl << "min = " << minimum;  // 
    
    	return 0; 
    }
    


  • _matze schrieb:

    Jumper schrieb:

    if (n1 >= n2 >= n3)  //Ganzzahlen abgebildet!
    
    int main() 
    { 
    	// testet auf Minimum dreier Ganzzahlen: 
    	int n1, n2, n3; 
    	cout << "Bitte geben Sie drei Ganzzahlen ein "; 
    	cin >> n1 >> n2 >> n3;  // z.B. 0 0 1 
    
    	int minimum=std::min(std::min(n1,n2),n3);
    	int maximum=std::max(std::max(n1,n2),n3);
    	cout << "max = " << maximum << endl << "min = " << minimum;  // 
    
    	return 0; 
    }
    

    Ist ja geil, wusste gar nicht, dass die Standardlib sowas anbietet x)

    Dein Fehler liegt wie gesagt hier:

    if (n1 >= n2 >= n3)  //Ganzzahlen abgebildet!
    

    Du müsstest es so machen:

    if(n1 >= n2 && n1 >= n3) {
    //Do that Shit...
    else if( n2 >= n1 && n2 >= n3)
    //Do that other shit...
    else if 
    else if...
    }
    

    Aber diese Methode ist halt ziemlich aufwendig. Da empfiehlt es sich gleich die Funktion von _matze zu nehmen.

    Lg Mentras



  • Ist dieses Standard Hilfstemplates aber nur immer auf 2 zahlen anwendbar!?

    Gibt es eine einfache Möglichkeit min und max aus z.B 100 zahlen zu ermitteln?



  • Jumper schrieb:

    Ist dieses Standard Hilfstemplates aber nur immer auf 2 zahlen anwendbar!?

    Gibt es eine einfache Möglichkeit min und max aus z.B 100 zahlen zu ermitteln?

    Dafür gibt's std::vector und std::max_element() & std::min_element():

    #include <vector>
    #include <algorithm>
    
    int main() 
    { 
       std::vector<int> n; 
       std::cout << "Bitte geben Sie Ganzzahlen ein "; 
    
       int tmp;
       while(std::cin >> tmp) n.push_back(tmp); // Einlesen beliebig vieler Zahlen
    
       int minimum=std::min_element(n.begin(), n.end());
       int maximum=std::max_element(n.begin(), n.end());
       std::cout << "max = " << maximum << "\nmin = " << minimum << '\n';
       return 0; 
    }
    

    Das Einlesen sollte man noch auf

    #include <iterator>
    ...
       std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(n));
    

    eindampfen können, aber ob das tatsächlich die Lesbarkeit erhöht, ist nicht unumstritten. 😉

    Alternativ kann man natürlich - solange es wirklich nur um Maximium-/Minimumsfindung geht, diese auch direkt beim Einlesen erledigen.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Jumper schrieb:

    Ist dieses Standard Hilfstemplates aber nur immer auf 2 zahlen anwendbar!?

    Gibt es eine einfache Möglichkeit min und max aus z.B 100 zahlen zu ermitteln?

    Dafür gibt's std::vector und std::max_element() & std::min_element():

    #include <vector>
    #include <algorithm>
    
    int main() 
    { 
       std::vector<int> n; 
       std::cout << "Bitte geben Sie Ganzzahlen ein "; 
    
       int tmp;
       while(std::cin >> tmp) n.push_back(tmp); // Einlesen beliebig vieler Zahlen
    
       int minimum=std::min_element(n.begin(), n.end());
       int maximum=std::max_element(n.begin(), n.end());
       std::cout << "max = " << maximum << "\nmin = " << minimum << '\n';
       return 0; 
    }
    

    Das Einlesen sollte man noch auf

    #include <iterator>
    ...
       std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(n));
    

    eindampfen können, aber ob das tatsächlich die Lesbarkeit erhöht, ist nicht unumstritten. 😉

    Alternativ kann man natürlich - solange es wirklich nur um Maximium-/Minimumsfindung geht, diese auch direkt beim Einlesen erledigen.

    Gruß,

    Simon2.

    Jaja --> http://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html 😉



  • 😉

    Wobei ich max_element() schon sehr hilfreich finde ... einfach weil es beim Lesen wirklich (IMHO) klarer, eindeutiger und weniger fehleranfällig ist als eine handgemachte Schleife.

    Gruß,

    Simon2.


Anmelden zum Antworten