Mein Bußgeldrechner funktioniert nicht so wie er soll



  • Deine Formatierung ist grauenvoll. Niemand kann so sehen, was wie zusammenhängt - insbesondere du nicht. Benutze die Formatierungsfunktion deiner IDE.

    Diese Codeschnipsel sind sinnlos. Wie soll man denn da wissen, wie das Programm aussieht?

    Zu einem while finde ich kein do.



  • entschuldige bitte ich gebe mir größtmögliche mühe das übersichtlicher zu machen

    habe mich jetzt erstmal von do und while verabschiedet, da es mir selber zuviele proble bereitet und prüfe ob es dafür eine einfachere lösung im nachhinein gibt.

    wichtig wäre erstmal ein funktionierender durchlauf.

    das problem ist jetzt das er mir nicht mehr das richtige ergebnis gibt. sondern jetzt dauerhaft als ergebnis sagt:

    herzlichen glueckwunsch 🙂 kein bussgeld20

    parameter die dafür eingegeben worden sind waren

    gefahrene kmh = 70
    erlaubgte kmh = 50

    auswahl innerorts sowie ausserorts.

    das ganze sieht jetzt so aus und hoffe das die formatierung so übersichtlicher ist.

    #include <iostream>
    
    using namespace std;
    
    int main() {
    
    	int er_geschw, ei_geschw, ergebnis_io,ergebnis_ao, auswahl;
    
    		cout << "Willkommen beim Bussgeldrechner\n\n"
    			 << endl;
    
    		cout << "Bitte beantworte die Fragen\n\n"
    			 <<endl;
    
    		cout << "Wie schnell warst du?\n\n"
    			 << endl;
    		cin  >> ei_geschw;
    
    		cout << "\n\nWas war die erlaubte Geschwindigkeit?\n\n"
    			 <<endl;
    		cin  >> er_geschw;
    
    		cout << "\n\n 1. Ausserhalb geschlossener Ortschaften?\n\n"
    			 << "\n\n 2. Innerhalb geschlossener Ortschaften?\n\n"
    			 << endl;
    
    		cin	 >> auswahl;
    
    		switch (auswahl){
    
    			case 1: ergebnis_ao=ei_geschw - er_geschw;
    
    		if ( ergebnis_ao >= 9 ) {
    			cout << "Glueckwunsch :) Kein Bussgeld";
    }		
    		else if ( (ergebnis_ao >= 11) && (ergebnis_ao <= 15) ) {
    			cout << "20 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=16) && (ergebnis_ao <=20) ) {
    			cout << "30 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=21) && (ergebnis_ao <=25) ) {
    			cout << "1 Punkt und 70 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=26) && (ergebnis_ao <=30) ) {
    			cout << "1 Punkt und 80 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=31) && (ergebnis_ao <=40) ) {
    			cout << "2 Punkt und 120 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=41) && (ergebnis_ao <=50) ) {
    			cout << "2 Punkte 160 Euro Bussgeld sowie 1 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_ao >=51) && (ergebnis_ao <=60) ) {
    			cout << "2 Punkte 240 Euro Bussgeld sowie 2 Monat Fahrverbot!\n\n";
    }
    		else if ( (ergebnis_ao >=61) && (ergebnis_ao <=70) ) {
    			cout << "2 Punkte 480 Euro Bussgeld sowie 3 Monate Fahrverbot!\n\n";	
    }
    			cout << ergebnis_ao << endl;
    
    			break;
    
    			case 2: ergebnis_io=ei_geschw - er_geschw;
    
    		if ( ergebnis_io >= 9 ) {
    			cout << "Glueckwunsch :) Kein Bussgeld";
    }		
    		else if ( (ergebnis_io >= 11) && (ergebnis_io <= 15) ) {
    			cout << "25 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=16) && (ergebnis_io <=20) ) {
    			cout << "35 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=21) && (ergebnis_io <=25) ) {
    			cout << "1 Punkt und 80 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=26) && (ergebnis_io <=30) ) {
    			cout << "1 Punkt und 100 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=31) && (ergebnis_io <=40) ) {
    			cout << "2 Punkt und 160 Euro Bussgeld sowie 1 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_io >=41) && (ergebnis_io <=50) ) {
    			cout << "2 Punkte 200 Euro Bussgeld sowie 1 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_io >=51) && (ergebnis_io <=60) ) {
    			cout << "2 Punkte 280 Euro Bussgeld sowie 2 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_io >=61) && (ergebnis_io <=70) ) {
    			cout << "2 Punkte 480 Euro Bussgeld sowie 3 Monate Fahrverbot\n\n";
    }
    
    		cout << ergebnis_io << endl;
    		break;
    }
    
    	cin.sync();
    	cin.get(); 
    
    	return 0;
    }
    

  • Mod

    sayless schrieb:

    das ganze sieht jetzt so aus und hoffe das die formatierung so übersichtlicher ist.

    Nicht wirklich, daher gucke ich es mir auch nicht an. Warum wird von Zeile 7 auf 9 die Einrückung erhöht? Warum sind Klammern nicht eingerückt? Warum geht die Tiefe in Zeile 119 plötzlich wieder zurück? Ich könnte bestimmt noch viel mehr aufschreiben, wenn ich genauer gucken wollte.

    Trenne logische Blöcke durch Leerzeilen. Lass die Einrückung hingegen die Programmstruktur wiederspiegeln. Letzteres musst (und solltest!) auch gar nicht einmal du selbst machen, das macht jeder bessere Texteditor automatisch für dich.



  • Schau mal jeweils deinen ersten Vergleich an. Wenn man schneller als 9 km/h war, dann kein Busgeld?



  • Mach dir vielleicht mal klar, dass die Differenz zwischen erlaubter und tatsächlich gefahrener Geschwindigkeit unabhängig vom Ort ist.

    Ob du nun

    ergebnis_ao=ei_geschw - er_geschw;
    

    oder

    ergebnis_io=ei_geschw - er_geschw;
    

    berechnest, wird dasselbe rauskommen.

    Wenn ich außerorts bei erlaubten 60 80 fahre, dann war ich 20 zu schnell.
    Wenn ich innerorts bei erlaubten 60 80 fahre, dann war ich ebenfalls 20 zu schnell.

    Also:

    auto delta = eigene_geschwindigkeit - erlaubte_geschwindigkeit;
    

    Die Fallunterscheidung, wo gefahren wurde, brauchst du erst danach. Dazu könntest du z.B. Funktionen nutzen:

    if (auswahl == 1) std::cout << getBussgeldInnerorts(delta);
    else if (auswahl == 2) std::cout << getBussgeldAusserorts(delta);
    else std::cout << "Wo genau soll das gewesen sein?!";
    std::cout << '\n';
    

    und die Funktionen können so aussehen:

    std::string getBussgeldInnerorts(int ueberschreitung) {
      if (ueberschreitung <= 0) return "Glückwunsch :) Kein Bußgeld";
      if (ueberschreitung <= 10) return "15 Euro Bußgeld";
      // ...
      if (ueberschreitung <= 70) return "480 Euro, 2 Punkte und 3 Monate";
      return "680 Euro, 2 Punkte und 3 Monate";
    }
    

    Wenn du der Überschreiungshöhe nach sortierst, brauchst du auch immer nur eine Bedingung im if zu testen.



  • sayless schrieb:

    eine für innerorts und eine für außerorts deswegen auch die zwei untersxchiedlichen berechnung

    case 1: ergebnis_ao=ei_geschw - er_geschw;break;
    case 2: ergebnis_io=ei_geschw - er_geschw;break;
    

    Getrennte Berechnung ist eine überflüssige Wiederholung. Die Rechnung ist in beiden Fällen identisch und wird nur einer anderen Ergebnisvariablen zugewiesen.

    Dies wäre vollkommen ausreichend:

    ergebnis=ei_geschw - er_geschw;
    

    Genau betrachtet sind sogar die Vergleiche der Grenzwerte eine unnötige Wiederholung:

    else if ( (ergebnis_ao >= 11) && (ergebnis_ao <= 15) ) {
    
    //und später
    
    else if ( (ergebnis_io >= 11) && (ergebnis_io <= 15) ) {
    

    Der einzige Unterschied zwischen "innerorts" und "außerorts" liegt im "Strafmaß".

    Edit: wob war schneller 🙂



  • SeppJ schrieb:

    sayless schrieb:

    das ganze sieht jetzt so aus und hoffe das die formatierung so übersichtlicher ist.

    Nicht wirklich, daher gucke ich es mir auch nicht an. Warum wird von Zeile 7 auf 9 die Einrückung erhöht? Warum sind Klammern nicht eingerückt? Warum geht die Tiefe in Zeile 119 plötzlich wieder zurück? Ich könnte bestimmt noch viel mehr aufschreiben, wenn ich genauer gucken wollte.

    Trenne logische Blöcke durch Leerzeilen. Lass die Einrückung hingegen die Programmstruktur wiederspiegeln. Letzteres musst (und solltest!) auch gar nicht einmal du selbst machen, das macht jeder bessere Texteditor automatisch für dich.

    Ich gestehe das ich erst seit 2 wochen den unterricht für c++ genieße und daher nur grundlagen theoretisch unterrichtet werden. da diese grundlagen zu langsam laufen beschäftige ich mich halt schon mit dem schreiben.

    danke für deine kritik werde mir das zu herzen nehmen 🙂

    temi schrieb:

    Schau mal jeweils deinen ersten Vergleich an. Wenn man schneller als 9 km/h war, dann kein Busgeld?

    das ist mir jetzt auch aufgefallen und der fehler wurde beseitigt.

    @wob

    danke für deine hilfe leider muss ich hier eingestehen das wir mit string und auto delta noch nicht gearbeitet haben dazu muss ich mich erstmal belesen um zu verstehen was genau diese befehle bewirken bevor ich mit weiteren fragen euch löcher.

    erstmal setzt ich eure vorschläge um und melde mich danach ob und wie es funktioniert

    vielen lieben dank nochmal für eure erste hilfe

    lg


  • Mod

    delta ist der Name der Variablen. delta wird in den Naturwissenschaften traditionell für Differenzen benutzt, besonders bei Geschwindigkeiten. Da könnte aber auch eben so gut "ballaballapingpong" stehen, das Programm wäre dann aber schwerer zu lesen.

    auto ist "wähl selber den passenden Typen". Denn es interessiert dich doch ehrlich gesagt nicht wirklich, was für einen Typen die Variable delta genau hat, Hauptsache sie kann die Differenz der beiden Geschwindigkeiten aufnehmen.



  • Vielleicht hätte ich deltaV schreiben sollen, denn

    Δv=vgefahrenverlaubt\Delta v = v_\text{gefahren} - v_\text{erlaubt}

    geht ja nicht direkt im Quellcode.

    Oder vielleicht sogar ueberschreitung_in_kmh ?
    Oder differenz ?

    Egal, ich brauchte einen Variablennamen.

    Jedenfalls: gutes Naming ist nicht immer leicht, aber doch recht wichtig. Zum Beispiel fand ich dein "ei_geschw" nicht besonders eingängig. Ohne das entsprechende cout wäre mit nicht klar gewesen, was "ei" bedeutet. Schreib sowas ruhig aus. Auf Englisch wirds meist kürzer. Vielleicht wären sogar "gefahren" und "erlaubt" als Variablennamen ausreichend (ohne "geschw"). Wichtig nur: denk drüber nach, wie du etwas so benennst, dass richtig klar ist, was der Inhalt der Variablen ist und du das auch noch 1 Monat später leicht erkennen kannst. Nutze nur gängige Abkürzungen, "ei" finde ich nicht gut, denn hier sind keine Hennen im Spiel 😉



  • so nach vielem ausprobieren und dem hinweis meines dozenten, den fehler zu finden, ohne auto und string zu benutzen, da das seinem unterricht vorgreifen würde, habe ich mein problem behoben.

    mir blieb also nix anderes übrig nur mit switch case sowie if else zu arbeiten

    ich habe die case getrennt und seperat mit if else bestückt.

    das hauptsächliche problem war ja das ich immer beide ergebnisse ausgespuckt bekommen habe...

    wenn man das break an der falschen stelle setzt ist das natürlich nicht verwunderlich. des weiteren löschte ich die beiden cout für das ergebnis

    um euren augenkrebs zu schüren und den thread zu schließen hier nochmal die lösung die einwandfrei funktioniert.

    vielen dank für die ausführliche hilfe und bis zum nächsten mal

    sayless

    #include <iostream>
    
    using namespace std;
    
    int main() {
    
    	int er_geschw, ei_geschw, ergebnis_io,ergebnis_ao, auswahl;
    	do {	
    		cout << "\n\nWillkommen beim Bussgeldrechner\n\n"
    			 << endl;
    
    		cout << "Bitte beantworte die Fragen\n\n"
    			 <<endl;
    
    		cout << "Wie schnell warst du?\n\n"
    			 << endl;
    		cin  >> ei_geschw;
    
    		cout << "\n\nWas war die erlaubte Geschwindigkeit?\n\n"
    			 <<endl;
    		cin  >> er_geschw;
    
    		cout << "\n\n1. Ausserhalb geschlossener Ortschaften?"
    			 << "\n\n2. Innerhalb geschlossener Ortschaften?\n\n"
    			 << endl;
    
    		cin	 >> auswahl;
    
    		switch (auswahl){
    			case 1: ergebnis_ao=ei_geschw - er_geschw;
    
    		if ( ergebnis_ao <= 9 ) {
    			cout << "Glueckwunsch :) Kein Bussgeld";
    }		
    		else if ( (ergebnis_ao >= 10) && (ergebnis_ao <= 15) ) {
    			cout << "20 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=16) && (ergebnis_ao <=20) ) {
    			cout << "30 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=21) && (ergebnis_ao <=25) ) {
    			cout << "1 Punkt und 70 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=26) && (ergebnis_ao <=30) ) {
    			cout << "1 Punkt und 80 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=31) && (ergebnis_ao <=40) ) {
    			cout << "2 Punkte und 120 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_ao >=41) && (ergebnis_ao <=50) ) {
    			cout << "2 Punkte 160 Euro Bussgeld sowie 1 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_ao >=51) && (ergebnis_ao <=60) ) {
    			cout << "2 Punkte 240 Euro Bussgeld sowie 2 Monat Fahrverbot!\n\n";
    }
    		else if ( (ergebnis_ao >=61) && (ergebnis_ao <=70) ) {
    			cout << "2 Punkte 480 Euro Bussgeld sowie 3 Monate Fahrverbot!\n\n";	
    	}
    break;		
    
    			case 2: ergebnis_io=ei_geschw - er_geschw;
    
    		if ( ergebnis_io <= 9 ) {
    			cout << "Glueckwunsch :) Kein Bussgeld";
    }		
    		else if ( (ergebnis_io >= 10) && (ergebnis_io <= 15) ) {
    			cout << "25 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=16) && (ergebnis_io <=20) ) {
    			cout << "35 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=21) && (ergebnis_io <=25) ) {
    			cout << "1 Punkt und 80 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=26) && (ergebnis_io <=30) ) {
    			cout << "1 Punkt und 100 Euro Bussgeld\n\n";
    }
    
    		else if ( (ergebnis_io >=31) && (ergebnis_io <=40) ) {
    			cout << "2 Punkte und 160 Euro Bussgeld sowie 1 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_io >=41) && (ergebnis_io <=50) ) {
    			cout << "2 Punkte 200 Euro Bussgeld sowie 1 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_io >=51) && (ergebnis_io <=60) ) {
    			cout << "2 Punkte 280 Euro Bussgeld sowie 2 Monat Fahrverbot!\n\n";
    }
    
    		else if ( (ergebnis_io >=61) && (ergebnis_io <=70) ) {
    			cout << "2 Punkte 480 Euro Bussgeld sowie 3 Monate Fahrverbot\n\n";
    }
    
    break;
    }
    }while (ergebnis_io >= 9);
    
    	cin.sync();
    	cin.get(); 
    
    	return 0;
    }
    


  • Hast du die Antworten bzgl. zweier Variablen für inner- und ausserorts überhaupt gelesen?

    Verstanden hast du sie nicht.

    Es gab aber noch andere hilfreiche Hinweise.



  • gelesen schon jedoch konnte ich es nicht umsetzten

    mir war es lediglich erlaubt das zu nutzen was wir in den ersten zwei wochen von c++ programmierung theoretisch gelernt haben um mein ziel zu erreichen.

    wie ich mir selbst zu erklären versucht habe ist dass wenn ich ein case mit break beende das neue case auch eine berechnung brauch um das darauffolge if else auszuführen.

    jegliche hinweise habe ich mir auch aufgeschrieben für mein selbststudium um das auf stube weiter zu verfolgen und zu verfeinern.

    also habe nix ignoriert oder überlesen 🙂



  • manni66 schrieb:

    Deine Formatierung ist grauenvoll. Niemand kann so sehen, was wie zusammenhängt - insbesondere du nicht. Benutze die Formatierungsfunktion deiner IDE.

    sayless schrieb:

    also habe nix ignoriert oder überlesen 🙂

    ?



  • sayless schrieb:

    mir war es lediglich erlaubt das zu nutzen was wir in den ersten zwei wochen von c++ programmierung theoretisch gelernt haben um mein ziel zu erreichen.

    ich dachte du arbeitest selbstständig voraus? 😕
    wenn du voraus arbeiten möchtest, solltest du es gleich richtig machen und dir nicht erst falsch angewöhnen 🙄

    sayless schrieb:

    also habe nix ignoriert oder überlesen 🙂

    die frage ist eher was du nicht überlesen hast?



  • sayless schrieb:

    mir war es lediglich erlaubt das zu nutzen was wir in den ersten zwei wochen von c++ programmierung theoretisch gelernt haben um mein ziel zu erreichen.

    Das wiederspricht deiner Aussage, dass du dich selbstständig in die Programmierung einarbeitest. Dem Prof kann doch egal sein, auf welchem Wissensstand du deine privaten Spielereien aufbaust?


Anmelden zum Antworten