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*


Anmelden zum Antworten