atof verändern
-
Hier habe ich gerade eine harte Nuss, weil ich nicht genau weiß, wie ich das angehen soll
Die Aufgabe besteht darin:
Erweitern Sie atof so, dass Werte der Form 123.45e-6 akzeptiert werden, bei denen einem Gleitpunktwert optional der Buchstabe e oder E und ein Exponent, wieder optional mit Vorzeichen, folgen kann.Die gegeben atof-Funktion:
#include <ctype.h> double atof(char s[]) { double val, power; int i, sign; for (i = 0; isspace(s[i]); i++) ; sign = (s[i] == '-') ? -1: 1; if (s[i] == '+' || s[i] == '-') i++; for (val = 0.0; isdigit(s[i]); i++); val = 10.0 * val + (s[i] - '0'); if (s[i] )) '.') i++; for (power = 1.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - '0'); power *= 10.0; } return sign * val / power; }
}
-
Behandle es hald ähnlich wie den Punkt. Schau nach ob da ein 'e' oder 'E' steht (am besten wohl mit tolower() oder toupper() ;)) und wenn dies der Fall ist, lies die Zahl dahinter ein. Mit dieser Zahl, wenn angegeben, musst du dann hald noch rechnen.
-
Ich hab jetzt mal ein wenig weiter an dem Ding gebastelt:
//--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused #include <stdio.h> #include <ctype.h> #define MAXLINE 1000 double atof(char s[]); int main(int argc, char* argv[]) { double sum, atof(char []); char line[MAXLINE]; int getline(char line[], int max); sum = 0; while (getline(line, MAXLINE) > 0) printf("\t%g\n", sum += atof(line)); return 0; } int getline(char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c = getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } double atof(char s[]) { double val, power; int i, exp, sign; for (i = 0; isspace(s[i]); i++) ; sign = (s[i] == '-') ? -1: 1; if (s[i] == '+' || s[i] == '-') i++; for (val = 0.0; isdigit(s[i]); i++); val = 10.0 * val + (s[i] - '0'); if (s[i] == '.') i++; for (power = 1.0; isdigit(s[i]); i++) { val = 10.0 * val + (s[i] - '0'); power *= 10.0; } val = sign * val / power; if (s[i] == 'e' || s[i] == 'E') { sign = (s[++i] == '-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') i++; for (exp = 0; isdigit(s[i]); i++); exp = 10 * exp + (s[i] - '0'); if (sign == 1) while (exp-- > 0) val *= 10; else while (exp-- > 0) val /= 10; } return val; } //---------------------------------------------------------------------------
-
die leserlichkeit deines codes erreicht fast stl niveau, nur deine variablen haben noch zu gute namen
*kleiner joke*