Frage zu "else if" und der Codeformatierung



  • Hi Leute!

    Ich hab diesen Code geschrieben. Er berechnet einem zu unterschiedlichen Anzahlen von CD's den zu bewilligen (fiktiven) Rabatt. Meine Frage ist nun, wie ich die Codeformatierung hier noch besser machen kann?

    int main()
    {
    
        cout << "Anzahl der zu Kaufenden DVD-Rohlinge eingeben: ";
        cin >> anzahl;
    
        if((anzahl >= 0) && (anzahl <= 9))
        {
         cout << "Verkaufspreis der " << anzahl << " DVD's: " << anzahl * 0.8 << endl; 
        }
    
        else if((anzahl >= 10) && (anzahl <= 49))
                {
                 cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 97)/10+5)/10)/100 << endl;
                }
    
        else if((anzahl >= 50) && (anzahl <= 99))
        {
         cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 95)/10+5)/10)/100 << endl;
        }
    
         else if(anzahl >= 100)
         {
          cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 92)/10+5)/10)/100 << endl;
         }
    


  • bandchef schrieb:

    Meine Frage ist nun, wie ich die Codeformatierung hier noch besser machen kann?

    das sieht doch ein blinder mit nem krückstock...


  • Mod

    Sei konsistent, entweder rück den else-Fall immer ein oder nie. IWobei ich ihn einrücken würde, weil dann die logische Struktur des codes besser zum tragen kommt:

    int main()
    {
    
      cout << "Anzahl der zu Kaufenden DVD-Rohlinge eingeben: ";
      cin >> anzahl;
    
      if((anzahl >= 0) && (anzahl <= 9))
        {
          cout << "Verkaufspreis der " << anzahl << " DVD's: " << anzahl * 0.8 << endl;
        }
    
      else
        if((anzahl >= 10) && (anzahl <= 49))
          {
            cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 97)/10+5)/10)/100 << endl;
          }
    
        else
          if((anzahl >= 50) && (anzahl <= 99))
            {
              cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 95)/10+5)/10)/100 << endl;
            }
    
          else
            if(anzahl >= 100)
              {
                cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 92)/10+5)/10)/100 << endl;
              } 
    }
    


  • alter seppj was bringst du für ein beispiel? nicht nur das es total untypisch ist, sondern auch noch den komischen anschein macht als wären die alle verschachtelt..



  • int main()
    {
        cout << "Anzahl der zu Kaufenden DVD-Rohlinge eingeben: ";
        cin >> anzahl;
    
        if (anzahl >= 0 && anzahl <= 9)
        {
            cout << "Verkaufspreis der " << anzahl << " DVD's: " << anzahl * 0.8 << endl; 
        }
        else if (anzahl >= 10 && anzahl <= 49)
        {
            cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 97)/10+5)/10)/100 << endl;
        }
        else if (anzahl >= 50 && anzahl <= 99)
        {
            cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 95)/10+5)/10)/100 << endl;
        }
        else if (anzahl >= 100)
        {
            cout << "Verkaufspreis der " << anzahl << " DVD's: " << (float)(((anzahl * 80 * 92)/10+5)/10)/100 << endl;
        }
    

    So vielleicht. if-else-if-Kaskaden würde ich persönlich niemals einrücken.



  • puh, ich bin erleichtert 🙂



  • Falls ihr mein programm mal ausführen sollet ihr unter umständen mal eine größere anzahl von dvd wie z.b. 99999 eingebt, dann werdet ihr sehen, dass das programm nicht mehr anständig auf 2 stellen rundet. Ich hab die formel zum runden im internet gefunden. wie könnte man das besser machen, dass er mir für jede mögliche anzahl an dvd's richtig rundet?



  • kann kein c++ würds aber mal damit versuchen



  • da die seite gerade nicht geht schau mal hier



  • oh, das war schwachsinn. vergiss das mal ganz schnell wieder 😞



  • hm ok. über antworten freue ich mich immer noch



  • evtl. gehts doch mit std::fixed oder so 😕 weiß schon wieso mich c++ in den wahnsinn treiben würde :p



  • int main()
    {
    	cout << "Anzahl der zu Kaufenden DVD-Rohlinge eingeben: ";
    	unsigned int anzahl;
    	cin >> anzahl;
        if(anzahl < 10)
    	{
    		cout << "Verkaufspreis der " << anzahl << " DVDs: " << anzahl * 0.8 << endl;		// DVDs ohne Deppenapostroph
    	}
    	else
    	{
    		double faktor;		// durch den Typ double kannst du dir später den Cast sparen, der sowieso nicht ganz nach deinem Willen funktioniert hat
    		if(anzahl < 50)
    			faktor = 97.0;
    		else if(anzahl < 100)
    			faktor = 95.0;
    		else
    			faktor = 92.0;
    
    		cout << "Verkaufspreis der " << anzahl << " DVDs: " << (((anzahl * 80 * faktor)/10+5)/10)/100 << endl;
    	}
    }
    


  • Wenn du das cout aus der eigentlichen Berechnung des Wertes rausnimmst und einsiehst, dass sich für die Bestimmung des Faktors keine if-else-Kaskade lohnt, dann landest du bei dieser gleich- bzw. höherwertigen Implementation deines ursprünglichen Programms:

    std::cout<<"Anzahl der zu kaufenden DVD-Rohlinge eingeben: ";
    unsigned anzahl; std::cin>>anzahl;
    std::cout<<"Verkaufspreis der "<<anzahl<<" DVDs: "<<(anzahl<10?anzahl*0.8:.005+anzahl*80*(anzahl<50?97:anzahl<100?95:92)/10000.)<<std::endl;
    


  • karl_klammer schrieb:

    Wenn du das cout aus der eigentlichen Berechnung des Wertes rausnimmst und einsiehst, dass sich für die Bestimmung des Faktors keine if-else-Kaskade lohnt, dann landest du bei dieser gleich- bzw. höherwertigen Implementation deines ursprünglichen Programms:

    ich würde eher sagen du landest über kurz oder lang beim augenarzt 😃



  • @karl_klammer
    Das mit den höherwertig sollte wohl ein Scherz sein? Ich hoffe doch!

    Zwei Codezeilen in eine zu schreiben ist schonmal unschön. Und das du die Eingabe nicht prüfst ist zwar für den Trivialfall in Ordnung, aber zeugt nicht vom höheren Programmierstil. Auch das du den Datentyp nicht vollständig angibst ist keine saubere Sache.
    Was deine Berechnung betrifft, provozierst du durch deinen kompakten Code nur unnötig Fehler. Auch wird ein Anfänger mit deinen bedingen Ausdrücken nicht viel anfangen können.
    Für mich sieht deine Lösung nicht höherwertig aus, sondern eher wie der Versuch möglichst wenig Codezeilen zu produzieren.
    Du solltest beim Programmieren immer nach dem KISS-Prinzip vorgehen. Damit vermeidest du unnötige Fehler. Auch im Nachhinein, weil es einfacher ist, sich in den Code zu lesen.



  • Eigentlich war der ganze Beitrag ein Scherz, bis auf das, dass die entgültige Ausnahme herausgenommen werden sollte.

    unsigned anzahl;
    for (;;) {
      std::cout << "Anzahl der zu kaufenden DVD-Rohlinge eingeben: " << std::flush;
      if (std::cin >> anzahl) break;
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    static std::pair<unsigned,double> preispaare[] = {
      std::pair<unsigned,double>(9,100.),
      std::pair<unsigned,double>(49,97.),
      std::pair<unsigned,double>(99,95.),
      std::pair<unsigned,double>(std::numeric_limits<unsigned>::max(),92.) };
    static std::map<unsigned,double> preise(preispaare+0, preispaare+4);
    double faktor = preise.lower_bound(anzahl)->second;
    double verkaufspreis = anzahl*80*faktor/10000.;
    if (anzahl >= 10) verkaufspreis += 0.005; // warum eigentlich?
    std::cout<<"Verkaufspreis der "<<anzahl<<" DVDs: "<<verkaufspreis<<std::endl;
    

    Das letzte höherwertig sollte man nicht ernst nehmen, das jetzige schon.
    In der Praxis hätte ich es dennoch anders gemacht, etwa die Eingabe ausgelagert und englische Bezeichner genommen.


Log in to reply