Eigene Funktionen
-
Hallo zusammen!
Ich bin grad dabei mir C selbst beizubringen...wie ich finde bis jetzt mit Erfolg...!!!
Jetzt hab ich aber ein Problem und ich weiß nicht weiter und zwar gehts um Funktionen:
Welche Funktion ist richtig?void Multi_Func(unsigned long zahl1, unsigned long zahl2, unsigned long ergebnis) { ergebnis = zahl1*zahl2; printf("Ergebnis : %lu\n",ergebnis); } void Multi_Func(unsigned long zahl1, unsigned long zahl2, unsigned long ergebnis) { ergebnis = zahl1*zahl2; printf("Ergebnis : %lu\n",ergebnis); return (0); } unsigned long Multi_Func(unsigned long zahl1,unsigned long zahl2) { return zahl1*zahl2; }
Schonmal vielen Dank für eure Hilfe!!!
-
Hallo,
die 3. ist richtig.
Bei der 2., ist das return falsch, wenn überhaupt dann ohne Argument.
Und bei den ersten Beiden ist ergebnis reinzugeben nicht falsch, aber nur in der Funktion gültig und somit unnötig, nimm ergebnis lieber in die Funktion!
-
eine void funktion gibt nichts zurück, man schreibt wenn überhaupt
void f()
{
...return;
}
meistens lässt man das return; weg, das erledigt der compiler.
das ergebnis als parameter zu übergeben bringt nichts, es wird nur eine kopie übergeben.
in deinem fall möchtest du einen wert zurückgeben, da bietet sich die dritte variante an.gruß,
f.
-
multiplicat0r schrieb:
eine void funktion gibt nichts zurück, man schreibt wenn überhaupt
void f()
{
...return;
}
meistens lässt man das return; weg, das erledigt der compiler.ergänzung:
ausser man braucht das 'return' irgendwo mittendrin, z.b. wenn 'ne bedingung erfüllt ist und man dann rausspringen will, oder so.
-
Vieln Dank für eure Hilfe...jetzt hab ich es !!!
unsigned long Multi_Func(unsigned long zahl1,unsigned long zahl2) { return zahl1*zahl2; } unsigned long Add_Func(unsigned long zahl1,unsigned long zahl2) { return zahl1+zahl2; } unsigned long Ergebnis_Func(unsigned long ergebnis, int welche) { if(welche ==1) printf("Produkt : %lu\n",ergebnis); else if(welche ==2) printf("Summe : %lu\n",ergebnis); else printf("Fehler\n"); }
-
So ist es bei dir aber möglich, dass Ergebnis_Func mit dem falschen Wert für 'welche' aufgerufen wird und das Ergebnis einer Addition als Ergebnis einer Multiplikation ausgegeben wird...
Mach es doch z.B. so, dass deiner Ergebnis_Func (Name darf nochmal überdacht werden) sowohl die zwei Operanden als auch die Ziel-Operation übergeben bekommt. Und diese Funktion ruft dann je nachdem die Add- oder die Multi-Funktion auf und gibt das Ergebnis aus.
Deine Variable 'welche' könnte man auch durch z.B. ein enum ersetzen, so dass du dir nicht merken musst, was 1 und was 2 ist. Du kannst dann einfach sowas wie 'addieren' oder so schreiben (google mal nach enum).
-
Hier mal mein komplettes Programm:
#include <stdio.h> #include <stdlib.h> unsigned long Multi_Func(unsigned long zahl1,unsigned long zahl2) { return zahl1*zahl2; } unsigned long Add_Func(unsigned long zahl1,unsigned long zahl2) { return zahl1+zahl2; } unsigned long Ergebnis_Func(unsigned long ergebnis, int welche) { if(welche ==1) printf("Produkt : %lu\n",ergebnis); else if(welche ==2) printf("Summe : %lu\n",ergebnis); else printf("Fehler\n"); } int main() { unsigned long zahl1,zahl2,ergebnis; int zahl; do{ printf("Welche Berechnung wollen Sie durchfuehren?\n\n Waehlen Sie aus:\n\n"); printf(" (1) Multiplizieren von Ganzzahlen\n\n"); printf(" (2) Addieren von Ganzzahlen\n\n"); printf(" (3) Programmende\n\n"); scanf("%d",&zahl); getchar(); switch(zahl) { case 1 : printf("Geben Sie die 1.Zahl ein : "); scanf("%lu",&zahl1); getchar(); printf("Geben Sie die 2. Zahl ein : "); scanf("%lu",&zahl2); getchar(); ergebnis=Multi_Func(zahl1,zahl2); Ergebnis_Func(ergebnis,zahl); break; case 2 : printf("Geben Sie die 1.Zahl ein : "); scanf("%lu",&zahl1); getchar(); printf("Geben Sie die 2.Zahl ein : "); scanf("%lu",&zahl2); getchar(); ergebnis=Add_Func(zahl1,zahl2); Ergebnis_Func(ergebnis,zahl); break; case 3 : printf("PROGRAMMENDE\n"); break; default: printf("Unbekannte Zahl?!\n"); } }while(zahl!=3); system("Pause"); return 0; }
Aber hier kann das nicht passieren, oder steh ich wieder auf dem Schlauch?
-
Also ich würde die Funktion Ergebnis-Func streichen. Die Ausgabe kannst du auch direkt im jeweiligen case-Zweig machen, da sparst du dir eine erneute Unterscheidung mittels 'welche'. Stattdessen könntest du aber dir Eingabe der 2 Zahlen in eine Funktion packen und so Redundanz vermeiden (denn die ist in deinen 2 cases absolut identisch und muss daher nicht zweimal notiert werden). Dazu schreibst du eine Funktion "Eingabe" oder so, der du 2 int-Zeiger übergibst (nämlich auf zahl1 und zahl2, Stichwort call-by-reference).
-
Vielen Dank für die Hilfe, aber die Ergebnis Funktion hab ich bewusst so gemacht zwecks Übung zum Thema Funktionen. Und was das Thema Zeiger betrifft soweit bin ich noch nicht...aber das kommt demnächst dran im Script..dann werd ich das versuchen umzusetzen.
-
Wenn du dich von Zeigern noch fernhalten willst, könntest du ja z.B. eine Eingabefunktion schreiben, die deine Zahlen in eine Struktur einliest und diese zurückgibt. Etwa so:
typedef struct Zahlen { int zahl1; int zahl2; }T_Zahlen; T_Zahlen Eingabe() { T_Zahlen zahlen; printf("Geben Sie die 1.Zahl ein : "); scanf("%lu",&zahlen.zahl1); printf("Geben Sie die 2. Zahl ein : "); scanf("%lu",&zahlen.zahl2); return zahlen; } int main() { T_Zahlen zahlen=Eingabe(); //Zugriff dann mit zahlen.zahl1 usw. }
Nur ein Vorschlag...