floor, ceil, modf Abrunden/Aufrunden + Komma anstatt Punkt!^
-
Hi Leute,
ich habe eine Aufgabe die ich lösen soll und komm nicht ganz weiter:
Erstellen Sie ein C-Programm, das eine Gleitpunktzahl in einer Variablen
und eine Anzahl von Nachkommastellen in einer anderen Variablen
definiert.
Das Programm soll nun die erste Zahl auf die angegebenen Anzahl von
Nachkommastellen auf- und abgerundet ausgeben.
Zusätzlich soll dieses Programm auch noch die Zahl auf die angegebenen
Nachkommastellen be- grenzt ausgeben lassen, wobei es die Rundung den
intern vorgegebenen Regeln überlässt.
Am Ende soll dieses Programm für die eingegebene Zahl noch die deutsche
Schreibweise (mit Komma) ausgeben.Mögliche Ausgaben dieses Programms sind:
/*
* Gleitpunktzahl: 12.345678
* Kommastellen runden: 4
*/
Abgerundet: 12.3456
Aufgerundet: 12.3457
Nach Rundungsregeln: 12.3457
In deutscher Schreibweise: 12,3457Hinweis: Fügen Sie #include <math.h> hinzu. Dann können Sie die
Funktionen floor, ceil und modf ver- wenden.
Zu floor und ceil lesen Sie unter
http://de.wikipedia.org/wiki/Abrundungsfunktion_un...
, was die beiden Funktionen für Sie berechnen.
Die Anweisung
nachkomma = modf(zahl,&vorkomma);
zerlegt die Zahl zahl in die Teile vor bzw. nach dem Komma und schreibt
sie in die Variablen vorkomma bzw. nachkomma. (Das ominöse & vor
vorkomma wird später erklärt!)**Jetzt habe ich soweit folgenden Code geschrieben. Ich habe aber noch das Problem mit dem "Komma" ich habe es mit dem Vor & Nachkommateil und zwei Platzhaltern gemacht, aber das funktioniert nur so lange bis die Nullen direkt nach dem Komma folgen... Weiß jemand wie ich das machen kann? Bitte um gute Erklärung, bin erst ganz am Anfang mit C
**int main(int argc, char** argv) { double zahl = 12.3456789,nachkomma, vorkomma,aufgerundet, abgerundet; nachkomma = modf(zahl ,&vorkomma); nachkomma = nachkomma *10000; abgerundet = vorkomma + floor(nachkomma) / 10000; aufgerundet = vorkomma + ceil(nachkomma) / 10000; printf("\nGleitpunktzahl: %lf\n",zahl); printf("\nAbgerundet: %.4lf", abgerundet); printf("\nAufgerundet: %.4lf",aufgerundet); printf("\nNach Rundungsregel: %.4lf", zahl); printf("\nIn deutscher Schreibweise: %.0lf,%.lf\n",vorkomma, nachkomma ); return (EXIT_SUCCESS); }
-
Du könntest statt mit printf die Zahl mit sprintf in einen Buffer im Speicher schreiben. In diesem Buffer ersetzt Du dann den Punkt durch ein Komma und gibst dann den Buffer aus.
-
Damit kann ich leider nichts anfangen, wie gesagt bin sehr Neu in C.
sprintf hatten wir auch noch nicht in der Vorlesung. Gibt es eine andere Möglichkeit?
-
sprintf:
http://www.cplusplus.com/reference/cstdio/sprintf/Beispiel:
... int i; char buffer[100]; //Muss unbedingt groß genug sein, den gewünschten Inhalt aufzunehmen ... sprintf(buffer, "\nGleitpunktzahl: %lf\n",zahl); //Der Text ist jetzt nicht auf der Konsole, sondern im Buffer //Alle . in buffer durch , ersetzen: for(i = 0; buffer[i]; ++i) if(buffer[i] == '.') buffer[i] = ','; printf("%s\n", buffer); //und ausgeben ...
-
Ich bedauere den Schreibfehler im µC-Forum. ( http://www.mikrocontroller.net/topic/332353#new )
Aber nach der Erklärung solltest du ihn finden.
-
Vielen Dank, aber ich glaube das ist zu umfangreich da wir auch noch keine if-Schleife hatten.
Gibt es denn keine einfachere Möglichkeit?
-
Mir fällt keine ein.
Es gibt übrigens keine if-Schleifen!
-
Sonst noch jemand eine Idee???
Habe etwas mit locale.h gelesen aber konnte damit nicht viel anfangen?
-
DjangoG schrieb:
Sonst noch jemand eine Idee???
Ja! Du benutzt die Formatmöglichkeiten von printf:
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { double zahl = 12.345678 ; double nachkomma, vorkomma, aufgerundet, abgerundet, gerundet; double zwischen; zwischen = zahl * 10000; abgerundet = floor (zwischen) / 10000; aufgerundet = ceil (zwischen) / 10000; zwischen = zwischen + 0.5; gerundet = floor (zwischen) / 10000; nachkomma = modf (abgerundet, &vorkomma); nachkomma = nachkomma * 10000; printf ("abgerundet: %.0f,%04.0f\n",vorkomma,nachkomma); nachkomma = modf (aufgerundet, &vorkomma); nachkomma = nachkomma * 10000; printf ("aufgerundet: %.0f,%04.0f\n",vorkomma,nachkomma); nachkomma = modf (gerundet, &vorkomma); nachkomma = nachkomma * 10000; printf ("gerundet: %.0f,%04.0f\n",vorkomma,nachkomma); return (EXIT_SUCCESS); }
-
DjangoG schrieb:
Sonst noch jemand eine Idee???
Habe etwas mit locale.h gelesen aber konnte damit nicht viel anfangen?
Mit locales ist wohl geschummelt...
Mit ein wenig Mathe ist das schon zu schaffen, aber wenn ich schon höre, dass es noch kein "if" gibt in Deinem Wortschatz, wohl doch nicht.Allerdings hält Dich ja niemand davon ab, selber dem Unterricht vorzugreifen z.B. mit einem Buch aus der Bibliothek oder so.
#include <stdio.h> #include <math.h> // pow #include <locale.h> int main(void){ const char* header = "/*\n" "* Gleitpunktzahl: %f\n" "* Kommastellen runden: %d\n" "*/\n"; double zahl = 12.345678; int prec = 4; // Nachkommastellen printf(header, zahl, prec); // Auf- und abrunden auch printf machen lassen // einfacher aber effektiver Trick... printf("Abgerundet: %.*f\n", prec, zahl-.5*pow(10,-prec)); printf("Aufgerundet: %.*f\n", prec, zahl+.5*pow(10,-prec)); printf("Nach Rundungsregeln: %.*f\n", prec, zahl); // locale umschalten und nochmal ausgeben: // "de_DE" ist ein POSIX locale - k.A. ob und wie das // unter Windows funktioniert... const char *oldlocale = setlocale(LC_NUMERIC, "de_DE"); printf("In deutscher Schreibweise: %.*f\n", prec, zahl); setlocale(LC_NUMERIC, oldlocale); }
Wenn man die Dokumentation zu printf() liest ist's zu schaffen. Das mit der Präzision als Argument ausserhalb der Formatstrings ist kein häufig verwendetes Mittel.