Parameter, doch welche wo???
-
Richtig wäre:
Deklaration: double Multiplikation(double a, double b);
Implementation: double Multiplikation(double a, double b) { return a*b; }hm, dann hätte ich bei mir ja nur
double Multiplikation(double zahl1, double zahl2) { double ergebnis = zahl1*zahl2; return ergebnis; }oder kann ich dann nur das zurückgeben, wo als Parameter gesetz wurde???
kann ich auch drei Parameter angeben??? sprich:
double Multiplikation(double zahl1, double zahl2, double ergebnis) { double ergebnis = zahl1*zahl2; return ergebnis; }und wie muss ich die Funktion in der main aufrufen, reicht da:
double Multiplikation();oder muss ich da
double Multiplikation(double zahl1, double zahl2)schreiben???
Ich weiß, stell mich ein wenig blöd an, jedoch ist mir dies ein Rätsel.
-
samkirchner schrieb:
double Multiplikation(double zahl1, double zahl2)
{
double ergebnis = zahl1*zahl2;
return ergebnis;
}
[/code]Stimmt so vollkommen. "double Multiplikatio(..)": Das double gibt an, dass die Funktion einen Wert vom typ double zurückgibt. Mit den Parametern fütterst du die Funktion, du gibst an, womit die Funktion rechenn soll. Die Zwischenvariable ergebnis ist übrigens überflüssig, du kannst gleich schreiben: return zahl1*zahl2;
samkirchner schrieb:
oder kann ich dann nur das zurückgeben, wo als Parameter gesetz wurde???
Die Aussage verstehe ich nicht.
samkirchner schrieb:
kann ich auch drei Parameter angeben??? sprich:
double Multiplikation(double zahl1, double zahl2, double ergebnis) { double ergebnis = zahl1*zahl2; return ergebnis; }Natürlich kannst du 3 Parameter übergeben, macht aber in diesem Fall keinen Sinn. Was soll die Funktion mit einem Ergebnis, wenn es dieses doch ausrechnen und zurückgeben soll?
samkirchner schrieb:
und wie muss ich die Funktion in der main aufrufen, reicht da:
double Multiplikation();oder muss ich da
double Multiplikation(double zahl1, double zahl2)schreiben???
Die Funktion erwartet bei dem Aufrufen zwei Parameter, daher wäre das erste unzulässig. Auch dein zweites Beispiel wäre unzulässig, denn du musst nicht den Typen und Bezeichner angeben, sondern eine Variable übergeben (oder eine Konstante).
Beispiel:
double zahl1 = 64.3; double ergebnis = Multiplikation(zahl1, 2.1);Hier übergibst du der Funktion Multiplikation die Variable zahl1 (welche den Wert 64.3 enthält) und die Konstante 2.1. Zurückgegeben wird das Ergebnis dieser Funktion, welches du der Variable ergebnis zuweist.
Mit welchem Buch lernst du denn bitte? Wenn du kein Buch hast, dann solltest du dir dringend eines zulegen.
-
Janjan schrieb:
Mit welchem Buch lernst du denn bitte? Wenn du kein Buch hast, dann solltest du dir dringend eines zulegen.
ich lerne ohne Buch, wir machen das in der Schule allerdings programmiere ich im büro trotz Anwendungsentwickler ausbildung nichts, daher habe ich enorme probleme.
schreibe in 4 wochen ne klassenarbeit und meine kollegen sind schon viel viel weiter als ich, daher habe ich nochmal von vorn mit dem lehrstoff angefangen, doch dieses thema mit der übergabe verstehe ich net so richtig, habe glaub schon alles umgebaut, fast jede konstellation gehabt, ausser die richtige
versuche es nun nochmal mit deiner hilfe!!!danke für die hilfe!!!
-
Dann kauf dir lieber ein gutes Buch oder leih dir eins in der örtlichen Bibliothek.
-
ergänzend zum Buch kannste auch einfach mal dieses tutorial lesen: http://tutorial.schornboeck.net/funktionen2.htm
dort sind nochmal die Grundlagen von Funktionen

mfg,
andi01.
-
welches ist leicht zu verstehen???
nun habe ich das Problem das zu viele Initialisierungen in der If-Anweisung sein sollen???
zwar ist es eine schöne Lösung
double ergebnis=Multiplikation(zahl1, zahl2);zu schreiben, jedoch ändert es nichts an meinem mangelnden Verständnis, wann ich wo welche Parameter oder Variablen wem übergeben soll.
also ich habe nun folgendes:
in der main.cpp:
double Multiplikation(zahl1, zahl2, ergebnis);in der Mathe.h
double Multiplikation (double zahl1, double zahl2, double ergebnis);und in der Mathe.cpp
double Multiplikation (double zahl1, double zahl2, double ergebnis) { ergebnis= zahl1 * zahl2; return ergebnis; }stimmt es nun???
ich weiß ja nicht ob ich mich nun irre, jedoch hatten wir in der schule eine klammer leer, oder???
-
stimmt es nun???
nein. -.-
damit es stimmt muss es etwa so aussehen wenn du es nur in eine .cpp-datei schreiben willst:
double multiplikation(double zahl1, double zahl2) { return zahl1*zahl2; } int main() { cout<<"geben Sie 2 Zahlen ein!\n"; int a, b; cin>>a; cin>>b; double ergebnis=multiplikation(a, b); }edit: wenn du das ganze schon unbedingt aufteielen musst dann so:
mathe.h:
double multiplikation(double zahl 1, double zahl2);mathe.cpp:
#ifndef MATHE_H #include"mathe.h" #endif double multiplikation(double zahl 1, double zahl2) { return zahl1*zahl2; }main.cpp:
#ifndef MATHE_H #include"mathe.h" #endif int main() { cout<<"geben Sie 2 Zahlen ein!\n"; int a; int b; cin>>a; cin>>b; double ergebnis=multiplikation(a, b); cout<<"Ergebnis: "<<ergebnis<<endl; }hier nochmal absolute Grundlagen zu Funktionen:
grundsätzlich sieht eine Funktion so aus:
rückgabetyp funktionsname (parameter1, parameter2) { //auszuführender Code beim Funktionsaufruf }genau wie oben:
double multiplikation(double zahl1, double zahl2)double ist der Rückgabetyp, multiplikation der Funktionsname, zahl1 ist der erste zu übergebende Parameter, zahl2 ist der 2. zu übergebende Parameter.
das heißt bei jedem Funktionsaufruf musst du der Funktion 2 Zahlen die multipliziert werden sollen (parameter 1 und 2) übergeben:
zB multiplikation(2, 3); liefert 6 als Ergebnis weil die beiden übergebenen Zahlen multipliziert werden und das Ergebnis zurückgegeben wird:
double ergebnis=multiplikation(2, 3);ergebnis hat jetzt den Wert 6;
edit:
ich weiß ja nicht ob ich mich nun irre, jedoch hatten wir in der schule eine klammer leer, oder???
eine leere runde Klammer hast du nur dann wenn deine Funktion keine Eingabeparameter hat, also zB so:
void hello_world_ausgeben()//<------ da sind deine leeren Klammern! { cout<<"Hello World!\n"; //hier wird auch kein return-statement benötigt! } int main()/* <----- auch da sind leere Klammern weil main hier keine eingabeparameter hat*/ { hello_world_ausgeben();/* <------- auch hier sind leere Klammern weil keine Eingabeparameter benötigt werden um diese Funktion aufzurufen*/ }[Funktionstyp void heißt übrigens es werden keine Werte zurückgegeben.]
ansonsten einfach mal das Tutorial lesen das erklärt die Grundlagen auch nochmal recht gut: http://tutorial.schornboeck.net/funktionen2.htm
mfg,
andi01.
-
andi01 schrieb:
edit: wenn du das ganze schon unbedingt aufteielen musst dann so:
mathe.h:
double multiplikation(double zahl 1, double zahl2);Und BITTE unbedingt an Include Guards denken.
#ifndef MY_MATHE_HEADER_001 #define MY_MATHE_HEADER_001 double multiplikation(double zahl 1, double zahl2); #endifandi01 schrieb:
mathe.cpp:
#include<mathe.h> double multiplikation(double zahl 1, double zahl2) { return zahl1*zahl2; }Der Include wird schief gehen.
In eckige Klammern werden includes nur in angegebenen Include-Directories gesucht. Wenn "./" nicht dabei ist, hast du ein Problem. Um auch direkt von der Datei weg zu suchen, nimmt man Gänsefüschen:#include "mathe.h"andi01 schrieb:
main.cpp:
#include<mathe.cpp> int main() { ...Und das ist jetzt ein Witz, oder?
Wenn wir schon eine .h haben dann includieren wir die auch. Eine .cpp kompiliert man, die wird nicht includiert!!!
Das machst du nur, weil du in dem Header keine Include Guards stehen hast...
-
du hast natürlich Recht dass man keine .cpp inkludiert, ich bessere das gleich mal aus^^
und mit den Includeguards haste eigentlich auch Recht, ich wollte es nur nicht so kompliziert machen da er selbst Schwierigkeiten hat Grundlagen der Funktionen zu verstehen.
gerade dann wäre es viel einfacher alles in die main.cpp zu packen:
double multiplikation(double zahl1, double zahl2) { return zahl1*zahl2; } int main() { cout<<"geben Sie 2 Zahlen ein!\n"; int a, b; cin>>a; cin>>b; double ergebnis=multiplikation(a, b); }mfg,
andi01.
-
Super, vielen vielen Dank, diese Erklärung sowie der Link sind genial, so komme ich doch voran, wer hätts gedacht

lg euer verplanter samkirchner

-
Sodale, nun habe ich meine Funktionen
dank eurer Hilfe, jedoch hat mein Prog ein Fehler, der für mich persönlich nicht nachvollziehbar ist:Der Taschenrechner läuft nun, allerdings habe ich ne endlos, wenn ich bei zahl 1 b eingeben, wieso das??? Gibt es in c++ nicht so was wie prüfe eingabe auf nummerischer wert??? hier mal mein Kunstwerk.
die main:
#include <iostream> #include "Mathe.h" using namespace std; void ausgabe (double ergebnis, double z1, double z2, char auswahl) { cout<<"Das Ergebnis von "<<z1<<" "<<auswahl<<" "<<z2<<" ist: "<<ergebnis<<"\n\a"<<endl; } int main() { char auswahl; do { cout<<"Zahl 1:"<<endl; double z1; cin>>z1; cout<<"Zahl 2:"<<endl; double z2; cin>>z2; cout<<"Bitte geben Sie die Rechenart ein +, -, *, / \"oder b zum beenden\""<<endl; cin>>auswahl; while (z2==0 && auswahl=='/') { cout<<"Bitte Zahl 2 erneut eingeben, da durch Null teilen immer 0 ist!"<<endl; cin>>z2; } double ergebnis; switch (auswahl) { case '+':ergebnis=Addition(z1,z2); ausgabe(ergebnis, z1, z2, auswahl); break; case '-':ergebnis= Subtraktion(z1,z2); ausgabe(ergebnis, z1, z2, auswahl); break; case '*':ergebnis= Multiplikation(z1,z2); ausgabe(ergebnis,z1,z2, auswahl); break; case '/':ergebnis =Division(z1,z2); ausgabe(ergebnis, z1, z2, auswahl); break; default : { cout<<"Falsche Eingabe"<<endl; } } }while(auswahl != 'b'); system("PAUSE"); return 0; }hier die Mathe.cpp
#include <iostream> #include "Mathe.h" using namespace std; double Division(double z1, double z2) { return z1/z2; } double Multiplikation(double z1, double z2) { return z1*z2; } double Subtraktion(double z1, double z2) { return z1-z2; } double Addition(double z1, double z2) { return z1+z2; }und die Mathe.h
#ifndef MATHE_H #define MATHE_H double Division(double z1, double z2); double Multiplikation(double z1, double z2); double Addition(double z1, double z2); double Subtraktion(double z1, double z2); #endifebenso habe ich mich gefragt, ob ich nicht das ganze Programm die ESC taste für beenden reservieren kann, sprich egal wann ich die ESC taste drücke sollte das Programm beendet werden, wäre das mom zu viel für einen Anfänger???
Ich gestehe habe noch nicht gegoogelt, da ich hier sowieso für andere das Ergebnis posten wollte.
-
samkirchner schrieb:
Gibt es in c++ nicht so was wie prüfe eingabe auf nummerischer wert???
Doch, gibt es!!! (Du benutzt gerne vielfache Satzzeichen, also werd ich es auch tun!!!)
Wenn du mit einem Stream (wie cin!!!) einen Wert in eine Ganzzahl-Variable (wie int!!!) einliest, und dies misfällt, so wird ein error-Wert im Stream gesetzt!!! Diesen kannst du mit der Member-Funktion fail() überprüfen!!!
-
oh, sry ein blöder Tick mit den drei Fragezeichen

danke für deine Antwort, mit fail() ging es, schaut nun so aus!
cout<<"Zahl 1:"<<endl; double z1; cin>>z1; if (cin.fail()) { cout<<"Bitte nur Zahlen eingeben!"<<endl; auswahl = 'b'; }werde dies jedoch noch in ne Funktion packen, sodass ich nicht immer ne if machen muss, danke vielmals.
-
samkirchner schrieb:
werde dies jedoch noch in ne Funktion packen
naja das mit der funktion für cin.fail() is ja nicht schwer:
bool cin_fehlerfrei() { if(cin.fail()) { return false; } else { return true; } }samkirchner schrieb:
sodass ich nicht immer ne if machen muss
ob das mit der Funktion aber so einen großen Vorteil bringt ist aber fraglich, denn so musst du halt immer das schreiben:
int a; cin>>a; if(cin_fehlerfrei()==true)//da kamm main gleich cin.fail() schreiben { //... }BTW: [Z.25 main]
samkirchner schrieb:
cout<<"[...] da durch Null teilen immer 0 ist!"<<endl;rofl

mfg,
andi01.
-
Warum nicht
bool cin_fail() { return cin.fail(); }statt
bool cin_fail() { if(cin.fail()) { return false; } else { return true; } }Oder warum nicht
cin.fail()statt
cin_fail()
-
Nexus schrieb:
Warum nicht
bool cin_fail() { return cin.fail(); }ok das ist natürlich kürzer

das ändert aber auch nichts an der tatsache dass er wieder mit einer if-abfrage nach jeder Eingabe den Rückgabewert der Funktion (egal wie man sie nun nennt) prüfen muss!
also kann er ja gleich
int a; cin>>a; if(cin.fail()) { //... }schreiben statt
int a; cin>>a; if(cin_fail()==true) { //... }vom Schreibaufwand her ist da eigentlich kein Unterschied weil er ohnehin nach jeder Eingabe eine if-Bedingung verwenden muss^^
edit: und es war ja das Ziel keine if-Bedingung nach cin zu verwenden^^
samkirchner schrieb:
sodass ich nicht immer ne if machen muss
mfg,
andi01.
-
andi01 schrieb:
naja das mit der funktion für cin.fail() is ja nicht schwer:
bool cin_fail() { if(cin.fail()) { return false; } else { return true; } }LOL! Ganz ehrlich, schon lange nicht mehr SO einen scheiß gesehen. Davon abgesehen, dass die Funktion absolut überflüssig ist, ist sie auch noch falsch.
-
andi01 schrieb:
vom Schreibaufwand her ist da eigentlich kein Unterschied weil er ohnehin nach jeder Eingabe eine if-Bedingung verwenden muss^^
Doch, es ist schon ein Unterschied. Wenn du
cin.fail()schreibst, sparst du dir etliche Zeilen für eine sinnlose Funktion. Das wollte ich eigentlich mit meinem Post sagen.
Übrigens ist das
== trueauch unnötig. Boolsche Werte musst du nicht explizit auftrueprüfen.andi01 schrieb:
edit: und es war ja das Ziel keine if-Bedingung nach cin zu verwenden^^
Ja, aber mit deiner Funktion muss man das genauso. Und die If-Abfrage brauchst du für eine bedingte Ausführung. Wenn schon, packt man mehr als nur die Prüfung auf
cin.fail()in eine separate Funktion.
-
Janjan schrieb:
Davon abgesehen, dass die Funktion absolut überflüssig ist
ich weiß, deswegen schrieb ich ja extra im vorigen post "also kann er ja gleich if(cin.fail()) verwenden"

Janjan schrieb:
[...]ist sie auch noch falsch
upps, da habe ich den falschen Funktionsmamen genommen^^ ich bessere das mal schnell aus;
-
andi01 schrieb:
ich weiß, deswegen schrieb ich ja extra im vorigen post "also kann er ja gleich if(cin.fail()) verwenden"

Wenn du es weisst, dann poste doch solchen Code nicht. Das verunsichert Anfänger nur und bringt sie auf dumme Ideen.
