Programm zum berechnen von Widerständen.(Programmierstil)



  • Hallo könnt ihr mal über mein Quelltext schauen ob ihr das auch so programmieren würdet. Übrigens ich bin absoluter Anfänger und habe erst vor ein paar Tagen mit dem Prorammieren begonnen. Vielen Dank!!!

    #include <iostream>
    using namespace std;

    double reihenschaltung2(double r1, double r2)
    {
    double erstatzwiderstand;
    erstatzwiderstand = (r1 + r2);

    return erstatzwiderstand;
    

    }

    double reihenschaltung3(double r1, double r2, double r3)
    {
    double ersatzwiderstand;
    ersatzwiderstand = (r1 + r2 + r3);

    	return ersatzwiderstand;
    

    }

    double reihenschaltung3(double r1, double r2, double r3, double r4)
    {
    double ersatzwiderstand;
    ersatzwiderstand = (r1 + r2 + r3 + r4);

    return ersatzwiderstand;
    

    }

    int main()
    {

    int befehl = -1;
    
    while (befehl != 0)
    {
    	cout << "Programm zum Berechnen von Elektrischen Schaltungen!" << endl;
    	cout << "----------------------------------------------------" << endl;
    	cout << endl;
    	cout << "Reihenschaltung		 <1>" << endl;
    	cout << "Parallelschaltung	 <2>" << endl;
    	cout << endl;
    	cout << "Eingabe:";
    	cin >> befehl;
    
    	switch (befehl)
    	{
    		case 0:
    			cout << endl;
    			cout << "Programm beenden" << endl;
    			break;
    		
    		case 1:
    			int eingabe;
    			cout << endl;
    			cout << "Wie viele Widerstaende sollen berechnet werden?(Min. 1 - Max.5 Widerstaende)" << endl;
    			cout << endl;
    			cout << "Eingabe:";
    			cin >> eingabe;
    				
    			if (eingabe >= 4)
    			{
    				cout << endl;
    				cout << "Ungeueltig, bitte bis Maximal 4 Widerstaend!!" << endl;
    				cout << endl;
    			}
    			
    			if (eingabe == 1)
    			{
    				cout << endl;
    				cout << "Ungueltig, bitte Min. 2 Wiederstaende eingeben!!" << endl;
    			}
    			
    			if (eingabe == 2)
    			{
    				double r1, r2;
    				
    					cout << "Bitte Wiederstaende eingeben!" << endl;
    					cout << endl;
    					cout << "R1:";
    					cin >> r1;
    					cout << endl;
    					cout << "R2:";
    					cin >> r2;
    					cout << endl;
    					cout << reihenschaltung2(r1, r2);
    			}
    			
    			if (eingabe == 3)
    			{
    				double r1, r2, r3;
    
    				cout << "Bitte Wiederstaende eingeben!" << endl;
    				cout << endl;
    				cout << "R1:";
    				cin >> r1;
    				cout << endl;
    				cout << "R2:";
    				cin >> r2;
    				cout << endl;
    				cout << "R3";
    				cin >> r3;
    				cout << endl;
    				cout << reihenschaltung3(r1, r2, r3);
    
    			}
    
    			if (eingabe == 4)
    			{
    				double r1, r2, r3, r4;
    
    				cout << "Bitte Wiederstaende eingeben!" << endl;
    				cout << endl;
    				cout << "R1:";
    				cin >> r1;
    				cout << endl;
    				cout << "R2:";
    				cin >> r2;
    				cout << endl;
    				cout << "R3:";
    				cin >> r3;
    				cout << endl;
    				cout << "R4:";
    				cin >> r4;
    				cout << endl;
    				cout << reihenschaltung3(r1, r2, r3, r4);
    
    			}
    
    			cout << endl;
    							
    			return 0;
    						
    			case 2:
    
    								   					 
    		default: 
    			cout << endl;
    			cout << "Ungueltige Eingabe!" << endl;
    			cout << endl;
    			cout << endl;
    			break;
    	}//Ende von switch
    
    	//Warten bis Anwender die return-Taste drückt
    	fflush(stdin);
    	getchar();
    }//Ende von while


  • Schreibe bitte in eine Zeile vor deinen Code jeweils ``` und in eine Zeile danach ```. Alternativ kannst Du deine Codeteile auch markieren und in der Symbolleiste über dem Eingabefenster auf </> klicken.
    Du kannst Deine Beiträge auch nachträglich bearbeiten: Den Menüpunkt "Bearbeiten" findest Du im "Drei-Punkte-Menü" rechts unter Deinem Beitrag.



  • @realiTy8 sagte in Programm zum berechnen von Widerständen.(Programmierstil):

    ob ihr das auch so programmieren würdet.

    Nee, garantiert nicht.
    Mehr wolltest ja eh nicht wissen.



  • Findest du nicht, dass insbesondere dein Code für die Eingabe doch sehr viele Wiederholungen enthält? Was macht du, wenn du bis zu 1000 Widerstände in Reihe schalten willst? Willst du wirklich für jede einzelne Zahl von 1 bis 1000 eine Funktion reihe1, reihe2, reihe3, ... sowie all die couts fest im Code haben? Eher nein, oder?

    Wenn du außerdem so früh schon einen switch einbaust nach Reihen- und Parallelschaltung, willst du dann bei case 2 nochmal den gesamten Code für die Eingabe wiederholen?

    Vermutlich nicht.

    Daher würde ich vorschlagen, du liest die Widerstände einfach in einen std::vector ein (wenn dir unbekannt, dann unbedingt als nächstes anschauen!). Dann kannst du eine Funktion schreiben, die für alle Elemente aus dem vector eine den Wert für die Reihenschaltung berechnet. Mach das zuerst mit einer for-Schleife und schau dir danach std::accumulate an (ok, accumulate vielleicht auch später).

    Dann baust du die Parallelschaltung ein. Versuche dabei aber, Code-Duplizierung zu vermeiden.

    Und hier am besten konkretere Fragen stellen als "würdet ihr das so machen"! Darauf ist die Antwort nämlich "nein" - und das hilft dir nicht weiter.

    Noch ein allgemeiner Ratschlag, da ich das oft in Anfängercode sehe:
    Gehe sparsam mit switch um (Ich nutze switch sehr selten. Gut, man kann switch hier benutzen.). Wenn du switch nutzt, dann halte den Code in den einzelnen case-Abschnitten kurz. Wobei ich wohl besser krz hätte schreiben sollen, das ist kürzer. Mit "kurz" meine ich maximal 2-3 Zeilen. Auf keinen Fall mehr. Wenn du mehr machen willst, muss das unbedingt in eine Funktion. Ansonsten wird dein Code zu unübersichtlich. Kurze Funktionen sind gut.

    Edit: oder nimm die Lösung von @Swordfish im nachfolgenden Post: die ist klug, weil du die Widerstände überhaupt nicht speicherst, sondern gleich die Berechnung durchführst. Wenn du dich allerdings später noch an die einzelnen Widerstände erinnern willst, dann musst du die, wie beschrieben, in einem vector speichern.



  • #include <cstdlib>
    #include <limits>
    #include <iostream>
    
    int main()
    {
    	for (;;) {
    		std::cout << "Resistors:\n[1]  Serial\n[2]  Parallel\n[0]  Exit\n\n";
    		unsigned choice;
    		if (!(std::cin >> choice) || choice > 2) {
    			std::cerr << "Input Error.\n\n";
    			std::cin.clear();
    			std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    			continue;
    		}
    
    		if (!choice) {
    			std::cout << "Bye.\n\n";
    			return EXIT_SUCCESS;
    		}
    
    		double sum {};
    		std::cout << "Please enter values, quit with zero:\n";
    		for (double resistor; (std::cin >> resistor) && resistor; sum += choice == 1 ? resistor : 1. / resistor);
    
    		if (!std::cin) {
    			std::cin.clear();
    			std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    		}
    
    		std::cout << "Total resistance: " << (choice == 1 ? sum : 1. / sum) << "\n\n";
    	}
    }
    

    .

    Siehe auch Zero One Infinity.



  • @Swordfish Warum (unsigned) long long als Resistortyp? Milliohm, Kiloohm etc. gibt es alle, daher würde ich doch double vorschlagen.



  • @wob ich würde eher eine Eingabe mit Präfix vorschlagen und eine Klasse dafür schreiben. Aber das war mir für ein simples Beispiel dann doch zu blöd.

    Milliohm

    1:0 für Dich. Geändert.



  • Wow, erstmal vielen Dank für die vielen Antworten. Wie gesagt ich bin noch ziemlich neu auf dem Gebiet. Ok ich werde mir das mit dem Vector mal etwas genauer anschauen und eine neue Lösung suchen. Danke für die Hilfe.



  • @realiTy8 sagte in Programm zum berechnen von Widerständen.(Programmierstil):

    Ok ich werde mir das mit dem Vector mal etwas genauer anschauen und eine neue Lösung suchen.

    Du brauchst dafür keinen std::vector<>. Du brauchst bloß bei jeder Eingabe Rn bzw. 1/Rn zusammenzählen.



  • @realiTy8 sagte in Programm zum berechnen von Widerständen.(Programmierstil):

    Wow, erstmal vielen Dank für die vielen Antworten. Wie gesagt ich bin noch ziemlich neu auf dem Gebiet. Ok ich werde mir das mit dem Vector mal etwas genauer anschauen und eine neue Lösung suchen. Danke für die Hilfe.

    Wie gesagt, @Swordfish s Lösung ist schöner, wenn du die einzelnen Widerstandswerte schon bei der Berechnung vergessen darfst. Zum Lernen mach doch einfach beides und überlege dir und überlege dir, ob du noch eine schöne Ausgabe wie "Die Widerstände 3 Ohm, 4 Ohm und 5 Ohm in Reihe ergeben einen Ersatzwiderstand von 12 Ohm." einbauen kannst.

    Oder erweitere dein Programm so, dass es immer sowohl den Wert für Reihen- als auch den für Parallelschaltung berechnen kann.

    Bonus: Schreibe ein Programm für die Reihen- und Parallelschaltung von Kondensatoren und Spulen. (Wechsel- oder Gleichstrom, ach, was solls... 😉 )



  • Btw,

    @realiTy8 sagte in Programm zum berechnen von Widerständen.(Programmierstil):

    fflush(stdin);
    

    ist grober Unfug. Das Verhalten von fflush() auf input streams ist undefiniert.


Log in to reply