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

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

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

Beitrag von ProgBeginner » Mo Nov 03, 2014 7:31 pm

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;
}
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Mo Nov 03, 2014 8:29 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

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

Beitrag von ProgBeginner » Mo Nov 03, 2014 8:57 pm

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 ?
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

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

Beitrag von oenone » Mo Nov 03, 2014 9:15 pm

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Mo Nov 03, 2014 9:18 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

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

Beitrag von ProgBeginner » Mo Nov 03, 2014 9:30 pm

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
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Mo Nov 03, 2014 9:35 pm

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
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten