Seite 1 von 1

Programm in C++ ( Spannung nach dem Ohmschen Gesetz )

Verfasst: Mo Nov 03, 2014 7:31 pm
von ProgBeginner
Hallo ;)

Ich habe gerade in C++ ein Programm geschrieben, welches mir einfach gemäss Eingabe Widerstand und Eingabe Stromstärke die Spannung nach dem Ohmschen Gesetz ausspuckt.
Das Einzige, was ich dafür nachgucken musste, war, wie genau das mit dem std::cin nochmal ging - ich habe davon irgendwo beiläufig mal was gelesen.

Da ich ausser der Syntax für cin keine weiteren Seiten offen hatte, die mir bei dem Programmchen hätten helfen können ( und das Programm nun keine ernsten Probleme löst, sondern mein persönliches Hello World ist, nur in 2. Schwirerigkeitslevel ), hätte ich gerne konstruktive Kritik, ob man an dem Quellcode noch was besser machen kann/könnte ;-) Wie gesagt, ich wills ja auch lernen :)

Code: Alles auswählen

#include <iostream>
using std::cin;

int widerstand;
int stromstaerke;
int spannung;

int main()
{
  std::cout<<"Bitte geben Sie den Widerstandswert ein: ";
  cin>>widerstand;
  std::cout<<"Bitte geben Sie die Stromstärke ein: ";
  cin>>stromstaerke;
  int spannung = widerstand * stromstaerke;
  std::cout<<"Die Spannung beträgt ";
  std::cout<<spannung;
  std::cout<<" Volt\n";
  return 0;
}

Re: Programm in C++ ( Spannung nach dem Ohmschen Gesetz )

Verfasst: Mo Nov 03, 2014 8:29 pm
von cloidnerux
hätte ich gerne konstruktive Kritik, ob man an dem Quellcode noch was besser machen kann/könnte ;-)
Dann fangen wir mal an:

Code: Alles auswählen

int widerstand;
int stromstaerke;
int spannung;

int main()
Globale Variablen sind Pfui und sollten nur unter sehr bestimmten Bedingungen eingesetzt werden.
In deinem Fall gehören die in die main-Funktion:

Code: Alles auswählen

int main()
{
    int widerstand;
    int stromstaerke;
    int spannung;
Ansonsten ist Syntaktisch nicht so viel mehr, was man falsch machen kann.
Du kannst mehrere Ausgaben von cout in eine Zeile schreiben:

Code: Alles auswählen

cout << "Hallo" << " Welt " << "Ich bin eine Nummer: " << widerstand << endl;
Das spart code-Zeilen, macht zusammenhängendes etwas sichtbarer, macht aber sonst keinen großen Unterschied.

Du kannst bei solch kleinen Programmen auch statt

Code: Alles auswählen

using std::cin;
auch einfach

Code: Alles auswählen

using namespace std;
schreiben, so sparst du dir die std:: vor cout und endl.

Re: Programm in C++ ( Spannung nach dem Ohmschen Gesetz )

Verfasst: Mo Nov 03, 2014 8:57 pm
von ProgBeginner
Globale Variablen sind Pfui ... nehm ich erstmal so hin, auch wenn ich da ein Contra-Argument habe.

Jetzt stell dir nur mal vor, ich würde in die main() - Funktion nur ein Hauptmenü einbauen wollen, wo ich den Benutzer frage, was er machen möchte :

1.) Spannung berechnen
2.) Widerstand berechnen
3.) Stromstärke berechnen
4.) Beenden

Ich persönlich würde jetzt hergehen und folgendes machen ( Da da Divisionen bei sind, ist int auch fehl am Platz, ich nutze jetzt stattdessen float )

Code: Alles auswählen

#include <iostream>
using namespace std;

float spannung;
float stromstaerke;
float widerstand; 

float berechne_stromstaerke(spannung, widerstand)
{
  stromstaerke = spannung / widerstand;
  return stromstaerke;
}

float berechne_widerstand(spannung, stromstaerke)
{
  widerstand = spannung / stromstaerke;
  return widerstand;
}

float berechne_spannung(widerstand, stromstaerke)
{
  spannung = widerstand * stromstaerke;
  return spannung;
}

void berechne(option)
{
  /* Wenn option = 1, berechne_widerstand()
   * Wenn option = 2, berechne_stromstaerke()
   * Wenn option = 3, berechne_spannung()
   * Wenn option = 4, Beenden
}

int main()
{
  int option;
  cout<<"1. Widerstand berechnen\n";
  cout<<"2. Stromstärke berechnen\n";
  cout<<"3. Spannung berechnen\n";
  cout<<"4. Ende";
  cout<<"Bitte gewünschte Option eingeben: "
  cin>>option;
  berechne(option);
}


So oder so ähnlich - hab mir über den Aufbau der einzelnen Funktionen jetzt keine Gedanken weiter gemacht - aber spätestens bei DEM groben Aufbau wären globale Variablen doch sogar nötig ... oder ?

Re: Programm in C++ ( Spannung nach dem Ohmschen Gesetz )

Verfasst: Mo Nov 03, 2014 9:15 pm
von oenone
ProgBeginner hat geschrieben:

Code: Alles auswählen

#include <iostream>
using namespace std;

float spannung;
float stromstaerke;
float widerstand; 

float berechne_stromstaerke(spannung, widerstand)
{
  stromstaerke = spannung / widerstand;
  return stromstaerke;
}
Das ist syntaktisch falsch. zum Einen fehlen die Typen der Parameter, zum anderen werden die globalen Variablen davon überdeckt, du brauchst sie also gar nicht. Entweder du entfernst die globalen Variablen oder die Parameter.

Re: Programm in C++ ( Spannung nach dem Ohmschen Gesetz )

Verfasst: Mo Nov 03, 2014 9:18 pm
von cloidnerux
So oder so ähnlich - hab mir über den Aufbau der einzelnen Funktionen jetzt keine Gedanken weiter gemacht - aber spätestens bei DEM groben Aufbau wären globale Variablen doch sogar nötig ... oder ?
Du nutzt sie doch selber nicht?

Code: Alles auswählen

float berechne_stromstaerke(spannung, widerstand)
{
  stromstaerke = spannung / widerstand;
  return stromstaerke;
}
Du übergibst die Variablen als Funktionsargumente und gibst einen Wert zurück, warum brauchst du noch Globale Variablen?
Die Gründe warum man Globale Variablen vermeiden sollte sind, dass du zum einen Variablen Namen verbaust, du darfst im ganzen restlichen Code keine weitere Variable "spannung", "stromstaerke" oder "widerstand" anlegen.
Desweiteren wird es unübersichtlicher. Du kannst an jedem Punkt in deinem Programm die Variablen verändern. Es gibt keinerlei Möglichkeit zu Kontrollieren, an welcher Stelle was mit diesen Variablen passiert.

Sinnvoll sind Globale Variablen z.B in eingebetetten Systemen, wo man vlt nur 1kb an Programmspeicher hat und man unnötigen overhead bei Funktionsaufrufen sparen möchte.

Re: Programm in C++ ( Spannung nach dem Ohmschen Gesetz )

Verfasst: Mo Nov 03, 2014 9:30 pm
von ProgBeginner
Du nutzt sie doch selber nicht?


Den Code, den ich in dem vorigen Posting eingegeben habe, hab ich nicht mal selber kompiliert ... das Einzige, was mein Kompilat kann, ist das aus dem Eröffnungspost.

Ich wollte mit meinem "extended Beispiel" nur ein Beispiel vorbringen, nach dem mit meinem bisherigen Verständnis globale Variablen entschuldigt gewesen wären ... ;)

Das war also eine Quick&Dirty ( und wahrscheinlich nicht mal funktionsfähige ) Lösung, das Ganze in einem Menü unterzubringen - wie gesagt, ich hätte gedacht, für sowas wären globale Variablen nötig gewesen. Ich habe solch eine Lösung auch noch nicht, weil dafür If-Abfragen notwendig gewesen wären - ich wollte mich erstmal nur auf cin und cout beschränken und dann ganz langsam weiter. ;)

Rom wurde auch nicht an einem Tag gebaut. :D

Re: Programm in C++ ( Spannung nach dem Ohmschen Gesetz )

Verfasst: Mo Nov 03, 2014 9:35 pm
von cloidnerux
Den Code, den ich in dem vorigen Posting eingegeben habe, hab ich nicht mal selber kompiliert ... das Einzige, was mein Kompilat kann, ist das aus dem Eröffnungspost.

Ich wollte mit meinem "extended Beispiel" nur ein Beispiel vorbringen, nach dem mit meinem bisherigen Verständnis globale Variablen entschuldigt gewesen wären ... ;)
Ich möchte eher darauf hinweisen, dass du unterbewusst schon auf Globale Variablen verzichtet hast, weil sie auch in einem solchen Beispiel keinen Sinn ergeben:

Code: Alles auswählen

float berechne_stromstaerke(spannung, widerstand)
{
  stromstaerke = spannung / widerstand;
  return stromstaerke;
}

float berechne_widerstand(spannung, stromstaerke)
{
  widerstand = spannung / stromstaerke;
  return widerstand;
}

float berechne_spannung(widerstand, stromstaerke)
{
  spannung = widerstand * stromstaerke;
  return spannung;
}
All diese Funktionen, wenn auch in Pseudocode, haben egt keine Abhängigkeit von den externen Variablen.
Der einzige Grund warum du globalen Variablen einführen wolltest ist, dass du übersiehst das du die Werte sowieso in deiner "berechne"-Funktion eingeben müsstest:

Code: Alles auswählen

void berechne(option)
{
  /* Wenn option = 1, berechne_widerstand()
   * Wenn option = 2, berechne_stromstaerke()
   * Wenn option = 3, berechne_spannung()
   * Wenn option = 4, Beenden
}