Funktion modf()

Hallo zusammen

Bin gerade dabei für eine C-Klausur zu lernen und hab hier eine alte Aufgabe, bei der ich nicht weiterkomme.

Schreiben sie ein Programm, das eine gebrochene Zahl x von der Tastatur einliest und geben Sie den Vorkomma- und Nachkommaanteil auf dem Bildschirm aus. Benutzen sie dabei die Standardfunktion modf. Der Vorkommaanteil ist das Funktionsergebnis, x ist der erste Parameter und der zweite ist der Nachkommaanteil.

Ich kannte die Funktion bis jetzt nicht und ich kann mit der Beschreibung

double modf( double num, double \*i );

nicht wirklich viel anfangen.

Bis jetzt bin ich soweit:

#include 
#include 

int main(void)
{
 double x;

 printf("Geben sie eine gebr. Zahl x ein: x= ");
 scanf("%lf", &x);

 ........

 printf(" "); /\* Ausgabe Vorkomma-, Nachkommaanteil \*/ 
}

Nach dem einlesen muss ja jetzt die Funktion modf kommen, aber ich weiss nicht genau, wie ich das machen muss.
Kann mir das jemand erklären?

Gruß
diemaus

Auch hallo.

Ein kleiner Blick unter http://www.galileocomputing.de/openbook/c_von_a_bis_…
Zitat: „double modf(double1 zahl1, double2 *zahl2)“ & „Zerlegt den Wert von zahl1 in einen gebrochenen und einen ganzzahligen Wert. Der ganzzahlige Wert (Vorkommateil) befindet sich dann in der Adresse von zahl2.“
Muss man also nur noch in den Code einbauen und geeignet aufrufen.

HTH
mfg M.L.

Hallo

Nach dem einlesen muss ja jetzt die Funktion modf kommen, aber
ich weiss nicht genau, wie ich das machen muss.
Kann mir das jemand erklären?

http://www.cplusplus.com/ref/cmath/modf.html

CMБ

Hallo zusammen

Bin gerade dabei für eine C-Klausur zu lernen und hab hier
eine alte Aufgabe, bei der ich nicht weiterkomme.

Schreiben sie ein Programm, das eine gebrochene Zahl x von
der Tastatur einliest und geben Sie den Vorkomma- und
Nachkommaanteil auf dem Bildschirm aus. Benutzen sie dabei die
Standardfunktion modf. Der Vorkommaanteil ist das
Funktionsergebnis, x ist der erste Parameter und der zweite
ist der Nachkommaanteil.

Ich kannte die Funktion bis jetzt nicht und ich kann mit der
Beschreibung

double modf( double num, double *i );

nicht wirklich viel anfangen.

Bis jetzt bin ich soweit:

#include
#include

int main(void)
{
double x;

printf(„Geben sie eine gebr. Zahl x ein: x= „);
scanf(“%lf“, &x);

printf(" "); /* Ausgabe Vorkomma-, Nachkommaanteil
*/
}

Nochmal in Deutsch :
modf - teilt eine Float - Zahl in den ganzzahligen Anteil und den nichtganzzahligen

siehe
http://www.maconlinux.net/linux-man-p

RüCKGABEWERT
Die Funktion liefert den nichtganzzahligen Anteil von x zurück.

double modf(double x, double *iptr);
„Der ganzzahlige Anteil wird in iptr gespeichert.“

ergo

double x;
double nichtganzzahligenAnteil;
double ganzzahligenAnteil;
nichtganzzahligenAnteil = modf(x,&ganzzahligenAnteil);

Hallo diemaus!

Wie dein Problem zu lösen ist, hast du ja bereits erfahren. Ich erlaube mir trotzdem noch ein paar Anmerkungen:

> #include   
> #include   
>   
> int main(void)  
> {  
> double x;  
>   
> printf("Geben sie eine gebr. Zahl x ein: x= ");  
> scanf("%lf", &x);

scanf liefert einen Rückgabewert, den solltest du auch auswerten. Im günstigsten Fall erzeugt nämlich die Weiterverwendung einer fehlerhaften Eingabe einen Programmabsturz, im ungünstigeren Fall hast du gerade eine Sicherheitslücke programmiert. Insbesondere musst du dir bei jeder Benutzereingabe überlegen, was der User da alles verbrechen könnte:
Das reicht von der Eingabe von Text, wo du gerne eine Zahl hättest (und natürlich umgekehrt) über die Eingabe von „nasichernicht“, wenn du mit „j“ oder „n“ gerechnet hattest (Stichwort Buffer Overflow) bis zu [user weiss nicht was er tun soll und drückt mal ENTER].

Die Eingabe sollte also lauten:

 int ok = 0;
 [...]
 ok = scanf("%lf", &x);
 if (1 != ok)
 {
 // deine Fehlerbehandlung
 }

Das bringt mich auch gleich (ungefragt) zum nächsten Steckenpferd von mir. Vergleiche mit Konstanten schreibe ich immer so: " == ". Das hat den Vorteil, dass bei einer Verwechslung von „==“ mit „=“ der Compiler meckert. Das nur so am Rande…

printf(" "); /* Ausgabe Vorkomma-, Nachkommaanteil*/
}

Vermutlich verwendest du einen miesen Compiler; du hattes nämlich oben geschrieben „int main“, schliesst aber nicht mit "return " ab. Abgesehen davon, dass das schlechter Stil ist, ist es auch falsch. Also immer schön brav einen Rückgabewert verwenden, im Ausnahmefall ist zu dokumentieren, warum das an genau dieser Stelle keinen Sinn hat.

Nix für ungut, sollten nur ein paar hilfreiche Hinweise sein.

Liebe Grüße,
Martin

Hi

So weit war ich auch schon gekommen *g*, wusste nur nicht, wie ich das richtig umsetzen muss. Aber die anderen haben ja was dazu geschrieben.

Gruß
diemaus

Hi

http://www.cplusplus.com/ref/cmath/modf.html

Danke, endlich mal ne Erklärung wo auch ein Beispiel angegeben ist.
Unter C++ hätte ich allerdings auch nicht gesucht :smile:

Danke und Gruß

diemaus

Hi

ergo

double x;
double nichtganzzahligenAnteil;
double ganzzahligenAnteil;
nichtganzzahligenAnteil = modf(x,&ganzzahligenAnteil);

Danke für die Erklärung.

Gruß
diemaus

Hi

Wie dein Problem zu lösen ist, hast du ja bereits erfahren.
Ich erlaube mir trotzdem noch ein paar Anmerkungen:

Sicher :smile:

scanf liefert einen Rückgabewert, den solltest du auch
auswerten. Im günstigsten Fall erzeugt nämlich die
Weiterverwendung einer fehlerhaften Eingabe einen
Programmabsturz, im ungünstigeren Fall hast du gerade eine
Sicherheitslücke programmiert. Insbesondere musst du dir bei
jeder Benutzereingabe überlegen, was der User da alles
verbrechen könnte:

Ich weiss, allerdings stellt unser Prof da schon sehr präzise Aufgaben, wenns nicht drinsteht müssen wirs auch nicht machen *g* und wir müssen das ganze nur auf dem Papier lösen.

Vermutlich verwendest du einen miesen Compiler; du hattes
nämlich oben geschrieben „int main“, schliesst aber nicht mit
"return " ab. Abgesehen davon, dass das
schlechter Stil ist, ist es auch falsch. Also immer schön brav
einen Rückgabewert verwenden, im Ausnahmefall ist zu
dokumentieren, warum das an genau dieser Stelle keinen Sinn
hat.

*gg* Ich hatte es schlicht und einfach vergessen zu tippen :smile:

Nix für ungut, sollten nur ein paar hilfreiche Hinweise sein.

Kein Thema, danke und Gruß
diemaus