2017-01-26 5 views
1

K & R ex。 4.2では指数(123e6や456e-7など)を扱うための指数ハンドリングメカニズムがない、与えられた(非標準の)atof関数を変更するように頼みます。私は、正しく入力され、スペースフリーの1桁指数を扱うために最小限の変更を加えました。それが動作していたかどうかを調べるために、サンプル入力データとprintf関数をmainに追加しました。戻り値はすべてオフです(一部はゼロ、符号や小数点はありません)。誰かがこれを改善するのに役立つことができる?コード:at exercise(K&Rセクション4.2、エクササイズ4.2)

#include <ctype.h> 

double antof(char[]); /* name changed to protect the innocent 
         and avoid references to stdlib functions */ 

int main() 
{ 
    char putin1[] = "12345"; 
    char putin2[] = "987.65"; 
    char putin3[] = " -2468"; 
    char putin4[] = "12e2"; 
    char putin5[] = " -34E-3"; 
    printf ("%s \t %s \t %s \t %s \t %s \n\n", putin1, putin2, putin3, putin4, putin5); 

    double converted1 = antof(putin1); 
    double converted2 = antof(putin2); 
    double converted3 = antof(putin3); 
    double converted4 = antof(putin4); 
    double converted5 = antof(putin5); 
    printf ("%d \t %d \t %d \t %d \t %d", converted1, converted2, converted3, converted4, converted5); 

    return 0; 
} 

/* atof: convert string s to double */ 
double antof(char s[]) 

{ 
    double val, power; 
    int i, sign; 

    for (i = 0; isspace(s[i]); i++) /* skip white space */ 
     ; 
    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++) { /*tracks right side of decimal, keeps adding to val */ 
     val = 10.0 * val + (s[i] - '0');  /* but keeps multiplying power by 10 to keep track of decimal place */ 
     power *= 10; 
    } 

    /* added from here to handle scientific notation */ 
    int exponenty; 
    int exponentysign; 

    if (s[i] == "e" || s[i] == "E") 
     i++; 

    if (s[i] == '-') 
     exponentysign == -1; 
     i++; 

    exponenty = (s[i] - '0'); 
     /* full functionality would require storing data like val and power 
     but here I assume single digit exponent as given in the example */ 

    if (exponentysign == -1) 
     exponenty = (1/exponenty); 

    return (sign * val/power) * (10^exponenty); 
} 

いつものようにありがとう。

+0

私たちはコードレビューではありません。コードが正しく動作している場合は、そのコードを試してみてください。問題があれば、[ask]を読んで助言に従ってください。また、コードを適切にフォーマットします。 – Olaf

+2

@Olaf OPはコードが正しく動作していないと言っていますが、これはコードレビューで話題にならないでしょう。 – Phrancis

答えて

0

修正機能:antof

double antof(char s[]) 
{ 
    double val = 0.0, power = 1; 
    int i, sign; 

    /* skip white space */ 
    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 = 10.0; isdigit(s[i]); i++) { /*tracks right side of decimal, keeps adding to val */ 
      val = 10.0 * val + (s[i] - '0');  /* but keeps multiplying power by 10 to keep track of decimal place */ 
      power *= 10; 
     } 
    } 

    /* added from here to handle scientific notation */ 
    double exponenty = 0; 
    int exponentysign = 1; 

    if (s[i] == 'e' || s[i] == 'E') 
    { 
     i++; 

     if (s[i] == '-') 
     { 
      exponentysign = -1; 
      i++; 
     } 

     exponenty = (s[i] - '0'); 
     /* full functionality would require storing data like val and power 
     but here I assume single digit exponent as given in the example */ 

     exponenty *= exponentysign; 
    } 

    return (sign * val/power) * pow(10.0, exponenty); 
} 

また、あなたは^bitwise xorなくpowerを実行していることに注意することはしました。 powmath.hから使用する必要があります(または、powを使用しない場合は、繰り返しの乗算または除算を実行する必要があります)。

+0

助けてくれてありがとう、特に私がすでに忘れていた^に関する訂正はビット単位であった。 – themagicbean

+0

私の答えが役に立ったら、答えとして受け入れてください。 – mac