PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Wertübergabe ohne Globale Variable



DevilC
06.01.2009, 22:55
Hallo erst mal,
Ich hab mal mit C angefangen Programmieren zu lernen, und mal zu Übungszwecken so nen Schwachsinn wie nen BMI-Rechner programmiert.
Was ich dabei reinbringen wollt war ne Funktion auserhalb der main()-Funktion, die zur Berechnung des BMI's zuständig ist.
Diese Funktion sollte dann den ausgerechneten Wert an die main()-Funktion zurückgeben, und diese den Wert dann ausgeben. Was das Programm aber permanent nicht wollte, ist den Wert zurückzugeben oder gar auszurechnen.



#include <stdio.h>

void rechnung(ge,gr){
float BMI;
BMI = ge/gr/gr;
return BMI;
}


int main(void){
int gewicht;
float groesse;
float BMI;

printf("Bitte Gewicht in KG angeben:");
scanf("%d",&gewicht);
printf("Bitte Groesse in Meter angeben:");
scanf("%f",&groesse);

BMI = rechnung(gewicht,groesse);

printf("%.2f",BMI);

fflush(stdin);
getchar();
return 0;
}


Hier das Listing.
Hab keine Ahnung mehr ob alles noch stimmt, aber das grundgerüst des Programms sollte es wiederspiegeln, hab einfach schon lange rumprobiert =)
Naja die einzige frage die ich jetzt hab ist:"Kann ich den wert zurückgeben ohne ihn an ein Globale Variabel zu übergeben?"

if(Antwort = ja){
printf("PLEASE HELP");
}
else{
printf("OK! Problem gelöst");
}

hehe^^ also haut rein...

eRaSeR!
06.01.2009, 23:01
eine frage... wieso hast bei gewicht int verwendet?

blackberry
06.01.2009, 23:07
void rechnung(ge,gr){
float BMI;
BMI = ge/gr/gr;
return BMI;
}

Es würde mich sehr wundern wenn dein Compiler das so, ohne zu protestieren, hinnimmt!
Eine Funktion mit "Rückgabetyp void" sollte normalerweise nichts zurückgeben (möglich wären "return (void) 0;" oder "return;").

Was du meinst wäre "float rechnung(ge,gr)", da ein float (in diesem Fall der Inhalt der Variablen "BMI") zurückggeben werden soll.

PS: die Funktion "rechnung" sieht meines Erachtens grauenhaft aus!


mfG. BlackBerry

DevilC
06.01.2009, 23:19
Ich weis, da stand vorher auch float^^
nur das hab ich während des rumprobierens geändert, um zu gugen was passiert.
Und ja die Funktion sieht grauenhaft aus^^ das float BMI; sollte weg sollte auch ohne gehen, und und und^^
soll ja nur mal das Grundgerüst wiederspiegeln.
Und Gewicht ist als int deklariert, da es mir eig recht egal ist ob du 50 oder 50,5 da eingibst, könnt man vielleicht auch als float machen falls jemand echt auf die idee kommen sollte da n Kommawert einzugeben^^

EDIT:
Ok hab den Fehler gefunden, auch wenn's ein Kiddyfehler war, der mich fast zur verzweiflung gebracht hat :>


#include <stdio.h>

float rechnung(float ge,float gr){ // float vergessen
float ergebniss = ge/gr/gr; //float vergessen
return ergebniss;
}


int main(void){
int gewicht;
float groesse;
float BMI;

printf("Bitte Gewicht in KG angeben:");
scanf("%d",&gewicht);
printf("Bitte Groesse in Meter angeben:");
scanf("%f",&groesse);

BMI = rechnung(gewicht,groesse);

printf("%.2f",BMI);

fflush(stdin);
getchar();
return 0;
}


also ein BIG THX trotzdem an alle =)

Edit2: @ eRaSeR!
Guck hab dir zu liebe sogar das int in float geändert jetzt kannste dein gewicht sogar in Gramm angeben :D

-[RiDER]-
07.01.2009, 13:34
Hi :D

Die Funktion rechnung() könnteste auf
float rechnung(float ge,float gr)
{
return ge/gr/gr;
} beschränken. ;)
Immerhin eine Variable gespart (die vom Compiler sicherlich eh wegoptimiert wird).


Guck hab dir zu liebe sogar das int in float geändert
Nein, hast Du nicht.
Ich lese da immer noch
[...]
int gewicht;
[...]
printf("Bitte Gewicht in KG angeben:");
scanf("%d",&gewicht);
// ^^
[...]

Und wenns irgendwie geht, ist scanf() zu vermeiden!
Schonmal irgendwas anderes als ne Zahl eingegeben?
Murks kommt dabei raus. Und der lässt sich nicht mal überprüfen... ;)

GreetZ RiDER :D :D :D

DevilC
08.01.2009, 18:05
WTF XD
Nachts nimmer programmieren da kopiert man n scheiß zusammen hier:

#include <stdio.h>

float rechnung(float ge,float gr){

return ge/gr/gr;
}


int main(void){
float gewicht;
float groesse;
float BMI;

printf("Bitte Gewicht in KG angeben:");
scanf("%f",&gewicht);
printf("Bitte Groesse in Meter angeben:");
scanf("%f",&groesse);

BMI = rechnung(gewicht,groesse);

printf("%.2f",BMI);

fflush(stdin);
getchar();
return 0;
}



Und was murks? hab da noch nie was gemerkt, bin allerdings ja erst n paar tage im Programmieren aktiv also wird noch ;)
Und zu return ge/gr/gr... Thx wusst ich nich dass das so auch geht ;)
wieder was gelernt...

-[RiDER]-
08.01.2009, 22:12
Hi :D

[scanf() macht Murks]

Und was murks? hab da noch nie was gemerkt, bin allerdings ja erst n paar tage im Programmieren aktiv also wird noch ;).


$ ./bmi
Bitte Gewicht in KG angeben:foo
Bitte Groesse in Meter angeben:0.00$
Nach Eingabe von foo macht das Programm nur noch undefinierten "Murks".
Praktischer Weise gibt scanf() null zurück, wenn es zu einem "matching failure" kommt. Aber bis Du eine sinnvolle Methode gefunden hast, diesen Fehler zu behandeln, hast Du schon drei Möglichkeiten gefunden, die ohne scanf() auskommen.

Eine einigermaßen verträgliche Lösung mit scanf() wäre vielleicht
[...]
printf("Bitte Gewicht in KG angeben:");
if(!scanf("%f",&gewicht))
{
puts("matching failure");
exit(EXIT_FAILURE);
}
printf("Bitte Groesse in Meter angeben:");
if(!scanf("%f",&groesse))
{
puts("matching failure");
exit(EXIT_FAILURE);
}
[...]

Wenns an Strings geht ist das nicht mehr so einfach.
Weil ich faul bin, nur ein http://www.dclc-faq.de/kap11.htm#11.9 ;)

Grundsätzlich ist scanf() so heikel, dass man besser dran ist, wenn man fgets() verwendet und den String selbst parst.

GreetZ RiDER :D :D :D

blackberry
09.01.2009, 01:09
Nachts nimmer programmieren da kopiert man n scheiß zusammen hier:

Ich glaube die Moral sollte eher lauten: "Nachts nimmer kopieren", da Programmieren keines Falls (nur) aus Kopieren bestehen "sollte" ;)


mfG. BlackBerry

eRaSeR!
09.01.2009, 01:30
devilc hat in einem satz die wörter "programmieren" UND "KOPIEREN" verwendet..... TÖTET IHN :D

ne joke aber blackberry hat recht :P

DevilC
09.01.2009, 12:40
Ja is richtig "Nimmer Kopieren" hab den quellcode ja selbst geschrieben, und dann hier rein kopiert.^^
Und programmieren sollt eig nur zum kleinsten teil aus kopieren bestehen oder gleich gar nicht Oo

EDIT: Naja programmieren sollt man auch nimmer :) hab das ja nachts programmiert deshalb steht da son scheiß wie void function(void) drin :>
obwohl das durchs rumprobieren war, vorher stand da float function(iwas, iwas);

-[RiDER]-
09.01.2009, 15:08
Hi :D

hab das ja nachts programmiert deshalb steht da son scheiß wie void function(void) drin :>
Warum Scheiß? Es ist doch keine Sünde.


vorher stand da float function(iwas, iwas);
Das ist eine Sünde.
Zweimal gleicher Variablenname, dafür beide ohne Typ... :shock:

Dann doch lieber nachts programmieren... ;)

GreetZ RiDER :D

blackberry
09.01.2009, 18:55
-]
vorher stand da float function(iwas, iwas);
Das ist eine Sünde.

Könnte ja so weit ich weiß ja noch K&R-"Standard" sein ;)


float lol(a, b);
float a, b;
{
/* [...] */
}

... oder so ähnlich :)


mfG. BlackBerry

M$A!
09.01.2009, 21:21
if(Antwort == ja){
printf("PLEASE HELP");
}
else{
printf("OK! Problem gelöst");
}

Added after 32 seconds:


if(Antwort == ja){
printf("PLEASE HELP");
}
else{
printf("OK! Problem gelöst");
}


^^

DevilC
24.01.2009, 19:21
@Rider: das iwas,iwas soll nich heißen dass ich da 2 gleiche namen hatte sondern dass ich keinen plan mehr hatte was da drin stand natürlich waren das 2 unterschiedliche Variabeln, das würd ja wahrscheinlich kein Compiler hinnehmen wenns 2 gleiche wären.

@M$A: Oops^^