[Anfängerproblem] IF / ELSE



  • Moin,

    Hab hier 'ne Aufgabe lösen wollen, nur leider irgendwo 'nen Fehler. Erstmal die Aufgabenstellung:

    Ein Bauartikelhändler gewährt seinen Kunden beim Kauf von Dachziegeln Mengenrabatt.

    Einkaufsmenge | Rabatt
    bis 500 Stück | 2%
    bis 1000 Stück | 5%
    darüber | 10%

    Kunden mit einer GEschäftsbeziehung von mehr als 10 JAhren und einer MEnge von mehr als 1000 Stück erhalten einen zusätzlichen Rabatt von 5%.
    Schreiben Sie ein Programm, das nach Eingabe des Preises/Stück, der Menge und der Dauer der Geschäftsbeziehung den Rabatt ermittelt und diesen ausgibt.

    Meine (fehlerhafte) Lösung:

    #include <iostream>
    using namespace std;
    
    int main()
    
    {
    
    	//Variablendeklaration
    	int anzahl;
    	int dauer;
    	float einzelpreis;
    	float warenwert;
    	float rabatt;
    	float rabattwert;
    	float zusatzrabatt;
    
    	//Eingabe
    	cout<<"Geben Sie die Anzahl ein: ";
    	cin>>anzahl;
    	cout<<"\nGeben Sie den Stueckpreis ein: ";
    	cin>>einzelpreis;
    	cout<<"Geben Sie die Dauer der Geschaeftsbeziehung ein: ";
    	cin>>dauer;
    
    	//Berechnung
    	if(dauer<10 && anzahl>1000)
    	{
    		zusatzrabatt=5;
    	}
    	if(anzahl<500)
    	{
    		rabatt=2;
    	}
    	else if(anzahl<1000)
    	{
    		rabatt=5;
    	}
    	else;
    	{
    		rabatt=10;
    	}
    
    	warenwert=anzahl*einzelpreis;
    	rabattwert=warenwert/100*rabatt;
    
    	//Ausgabe
    	cout<<"\nSie erhalten "<<rabatt<<" % Rabatt.\n\n";
    	cout<<"Der Rabatt betraegt: "<<rabattwert<<" Euro."<<endl;
    
    	return(0);
    }
    

    Irgendetwas in dem Berechnungsteil stimmt nicht.. hope u can help me.. :>



  • Ohne den Code genauer durch zugehen und zu lesen was er machen soll, fällt mir ein Semikolon nach dem else auf.

    Dadurch wird - falls das else zutrifft - einfach nur eine leere Anweisung durchgeführt.

    Der Nachfolgende Block, der eigentlich beim else ausgeführt werden sollte, wird dadurch immer ausgeführt.



  • if(anzahl <= 500)
    	rabatt = 2;
    else if(anzahl > 500 && anzahl <= 1000)
    	rabatt = 5;
    else
    	rabatt = 10;
    
    if(dauer > 10 && anzahl > 1000)
    	rabatt += 5;
    

    Die Variable 'zusatzrabatt' kannst du somit weglassen, du hast sie eh nicht mit einbezogen... Außerdem solltest du die Variablen initialisieren, wenn sie es nicht 100%ig werden, bevor lesend auf sie zugegriffen wird.

    MfG



  • if (anzahl <= 500)
    {
        rabatt=2;
    }
    else if (anzahl <= 1000)
    {
        rabatt = 5;
    }
    else if (anzahl > 1000)
    {
        rabatt = 10;
        if (dauer > 10) zusatzrabattrabatt = 5.0f;
    }
    

    Wenn du bei deiner Variante bleiben willst ...

    int anzahl;
    int dauer;
    float einzelpreis;
    float warenwert;
    float rabatt;
    float rabattwert;
    float zusatzrabatt;
    

    Also die Dauer und die Anzahl werden sicherlich nicht negativ sein. Die Dauer solltest du dir evtl. überlegen auch als Fließkommazahl darzustellen, da du dann nicht erst bei 11 sondern auch bei 10 Jahren und 1 Tag schon Zusatzrabatt bekommst.
    Dann solltest du evtl. auch Zusatzrabatt und Rabatt mit 0 initialisiren, damit du auch wenn der Nutzer noch keinen Rabatt bekommt, kein undifiniertes Verhalten bekommst (eine Variable wird nicht zwingend mit 0 initialisert!).

    unsigned int count(0);
    float time(0.0f);
    float price(0.0f);
    float rabatt(0.0f);
    bool special_rabatt(false):
    

    sollte reichen!

    std::cout << "\nSie erhalten " << rabatt << "% Rabatt!\n\n"
              << "Dadurch sparen Sie " << (count * price) / 100.0f * rabatt) << " Euro." << std::endl;
    
    if (special_rabatt == true)
    {
        std::cout << // ...
    }
    

    ...



  • Ohne den Code genauer durch zugehen und zu lesen was er machen soll, fällt mir ein Semikolon nach dem else auf.

    Ups.. das sollte da garnicht hin. 😉 - thx

    An die anderen 2 'Helfer':
    Vielen Dank für die schönen Codebeispiele und Erklärungen. Funktioniert nun alles wie ich es mir vorgestellt habe. 🙂


Anmelden zum Antworten