Advertisement
teopalmer

Colloquium_4_task_2

May 20th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.19 KB | None | 0 0
  1. typedef char string_t[256];
  2.  
  3. void string_to_double(double *d, const string_t s)
  4. {
  5.     int flag_point = 257;
  6.     int flag_minus = 1;
  7.     int flag_e = 257;
  8.     int i = 0, len = 0;
  9.     long int rank = 1;
  10.  
  11.     if (s[i] == '-')
  12.     {
  13.         flag_minus = -1;
  14.         i++;
  15.     }
  16.  
  17.     while(s[len])
  18.     {
  19.         if (s[len] == 'e' && flag_e == 257)
  20.         {
  21.             flag_e = len;
  22.             rank = pow(10, len-1);
  23.         }
  24.  
  25.         else if (s[len] == 'e' && flag_e != 257)
  26.             return;
  27.  
  28.         else if (s[len] == '.' && flag_point == 257)
  29.         {
  30.             flag_point = len;
  31.             rank = powf(10, len-1);
  32.         }
  33.  
  34.         else if (s[len] == '.' && flag_point != 257)
  35.             return;
  36.  
  37.         else if (s[len] > '9' && s[len < '0'])
  38.             return;
  39.  
  40.         else if (s[len] == '-' && len != 0 && len != flag_e+1)
  41.             return;
  42.         len++;
  43.     }
  44.  
  45.     if (flag_point == 257 && flag_e == 257)
  46.         rank = powf(10, len-1);
  47.  
  48.     if (flag_e != 257)
  49.     {
  50.         int k = 1;
  51.         int first = 0;
  52.         double second = 0;
  53.         int e_minus = 1;
  54.  
  55.         while (s[i])
  56.         {
  57.             if (i < flag_e)
  58.             {
  59.                 first += (s[i] - '0') * rank;
  60.                 rank /= 10;
  61.             }
  62.  
  63.             else if (i == flag_e)
  64.             {
  65.                 rank = 1;
  66.             }
  67.  
  68.             else if (i == flag_e + 1 && s[i] == '-')
  69.             {
  70.                 e_minus = -1;
  71.             }
  72.  
  73.             else if (i > flag_e)
  74.             {
  75.                 second += (double)(s[i] - '0') * rank;
  76.                 rank *= 10;
  77.             }
  78.             i++;
  79.         }
  80.         *d = flag_minus * first * pow(10, e_minus * second);
  81.     }
  82.  
  83.     else
  84.     {
  85.         while (s[i])
  86.         {
  87.             if (i < flag_point)
  88.             {
  89.                 *d += (s[i] - '0') * rank;
  90.                 rank /= 10;
  91.             }
  92.  
  93.             else if (i == flag_point)
  94.                 rank = 10;
  95.  
  96.             else if (i > flag_point)
  97.             {
  98.                 *d += (double)(s[i] - '0') / rank;
  99.                 rank *= 10;
  100.             }
  101.             i++;
  102.         }
  103.         *d *= flag_minus;
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement