PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C/C++] Übungsaufgabe (atof nachbauen)



blackberry
30.12.2008, 12:08
Worum geht es? Es soll eine "atof"-ähnliche Funktion entstehen (eine Funktion zur Umwandlung eines C-Strings in einen (signed) double)
Was soll damit erreicht werden? Ein besseres Verständnis von C-Strings und deren Bearbeitung, ohne spezielle Hilfsmittel (zB. Funktionen aus der Standardbibliothek).

Ich gebe folgenden Code vor:

#include <stdio.h>


double _atof_(const char *);

int main(void)
{
printf("%lf\n", _atof_("3.141592"));
printf("%lf\n", _atof_("-3.14159"));
printf("%lf\n", _atof_("78"));
printf("%lf\n", _atof_("-78"));
printf("%lf\n", _atof_("3.14159_"));
printf("%lf\n", _atof_("3.141.59"));
printf("%lf\n", _atof_("-3."));
printf("%lf\n", _atof_("-"));
printf("%lf\n", _atof_("-b"));
printf("%lf\n", _atof_("ABCDEFG"));

return 0;
}

#include <stdio.h> steht dort lediglich für printf. Es sollen, wie bereits gesagt, keine Funktionen aus der Laufzeitbibliothek verwendet werden.
Alle zugelassenen Hilfsmittel sind somit auf Variablen, Schleifen, If-Abfragen, Mehrfachauswahlen (switch), usw. beschränkt.

Die Funktion soll dem oben ausgeführten Funktionsprototyp entsprechen;
Name: _atof_ (die Unterstriche sind lediglich dafür da, eine Namenskollision zu vermeiden)
Rückgabetyp: (signed) double
Parameter: Zeiger auf einen const char (const char *)

Das Programm soll folgenden Text ausgeben:

3.141592
-3.141590
78.000000
-78.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

Falls eine Zahl aufgrund ihrer Beschaffenheit nicht in einen double passt, muss kein [+|-] HUGE_VAL zurückgegeben werden (siehe: http://www.cplusplus.com/reference/clibrary/cstdlib/atof.html )


Musterlösung: http://nopaste.free-hack.com/index.php?id=e5968ed60c


Viel Spaß + Erfolg.
mfG. BlackBerry

Leange
30.04.2016, 17:09
Hi

http://pastebin.com/sGmG23CB

Funktioniert! ^^

Lässt sich sicherlich schöner lösen, Musterlösung ist down :(

MfG Leange

P.S. <iostream> nur für cin.get()

Starflow
05.05.2016, 16:15
<iostream> nur für cin.get()

Und C++ nur für iostream? :P

Mainz: https://gist.github.com/starflow/b6387d0dd89a4892fd12585ee5378952

Da bb sich die Freiheit genommen hat falsche Ergebnisse vorzugeben, hab ich mir die Freiheit genommen es richtig zu machen und den Output anzupassen :D

Output:


» make _atof_ && ./_atof_
cc _atof_.c -o _atof_
| Input | Output atof | Output atof_ | Output _atof_
| ABCDEFG | 0.000000 | 0.000000 | 0.000000
| -b | 0.000000 | 0.000000 | 0.000000
| - | 0.000000 | 0.000000 | 0.000000
| -3. | -3.000000 | -3.000000 | 0.000000
| 3.141.59 | 3.141000 | 3.141000 | 0.000000
| 3.14159_ | 3.141590 | 3.141590 | 0.000000
| -78 | -78.000000 | -78.000000 | -78.000000
| 78 | 78.000000 | 78.000000 | 78.000000
| -3.14159 | -3.141590 | -3.141590 | -3.141590
| 3.141592 | 3.141592 | 3.141592 | 3.141592


P.S.:
Ist natürlich nich 100% atof, es fehlt noch:

* die Verarbeitung vom Exponent, wenn vorhanden.
* Lokalisierung (Komma als Dezimaltrennzeichen)
* Verarbeitung von Hexadezimal, Infinity und NAN
* Irgendwas mit Buffđ→ĸøłŋ€®

Leange
05.05.2016, 18:23
Und C++ nur für iostream? :P

C++ nur fürs Visual Studio. Heißt ja Visual C++ und nicht Visual C! ;)

Aber ehrlich ... ich hab gerade so(!) verstanden was Zeiger sind. Wann, warum und wie man sie benutzt. Und du kommst mit sowas:

char** strs

Also les ich mir das hier (http://www.eskimo.com/~scs/cclass/int/sx8.html) durch. Und jetzt hab ich Kopfschmerzen vielen dank auch. xD

MfG Leange

Starflow
06.05.2016, 04:53
Aber ehrlich ... ich hab gerade so(!) verstanden was Zeiger sind.

Das hat bei mir auch erst vor kurzem Click gemacht. Dabei sind die Dinger Todessimpel.



Wann, warum und wie man sie benutzt. Und du kommst mit sowas:

char** strs


Ein Array gefüllt mit char-Arrays, aka C Strings ^^\0
Da Arrays auch nichts weiter als Pointer sind, also ein Zeiger auf den Anfang einer Liste voller Zeiger.



Also les ich mir das hier (http://www.eskimo.com/~scs/cclass/int/sx8.html) durch. Und jetzt hab ich Kopfschmerzen vielen dank auch. xD
Ich weiß ja nicht ob du Beej's Guide to C (http://beej.us/guide/bgc/output/html/singlepage/bgc.html#pt2pt) kennst, aber mir hat der sehr geholfen, besonders beim Verständnis im Umgang mit Pointern :)


So anyway, if we can get on with it and get a drum roll and some forboding music playing for the definition of a pointer, a pointer is the address of some data in memory. Imagine the classical score from 2001: A Space Odessey at this point. Ba bum ba bum ba bum BAAAAH!