Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Преобразование строки в double - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как сделать так, чтобы программа понимала русские буквы? http://www.cyberforum.ru/cpp-beginners/thread337779.html
И если знаете как убрать этот огромный массив символов "char mass2" на chr виснет все... Так вот код программы. Мне нужно чтобы она выводила статистику по русским символам правильно... а то...
C++ Интернет и С++ Здраствуйте. Посоветуйте книги, статьи по сетевому программированию на С++, хочу понять саму систему, как там все должно быть устроено, т. е. что бы обьяснялся не сам инструментарий. Спасибо. http://www.cyberforum.ru/cpp-beginners/thread337748.html
C++ Вывод информации о *.bmp на чистом C++
Собственно вот: #include <iostream> #include <fstream> #include <cmath> using namespace std; int main(int argc, char *argv) { char ch;
C++ шаблоны
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс. Приведу пример ...
C++ [BMP] HEX (из HEX-редактора) в DEC http://www.cyberforum.ru/cpp-beginners/thread337689.html
Имеется файл *.bmp (который нельзя вложить в сообщение). В самом файле есть его свойства (размер и т.д.). Как их перевести из HEX в DEC? Размер - ce 6b 0e 00 (байт) - 922 КБ (945,102 байт) X x Y...
C++ Создание SAVE файла. Запись и чтение. Доброго времени суток! Хочу обратиться за мудрым советом к профессионалам. Мне необходимо реализовать в своем приложении создание SAVE файла. Запись и чтение из него. У меня есть массив объектов.... подробнее

Показать сообщение отдельно
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
31.07.2011, 17:47
видов записей вещественных чисел много, вот набрасал вариант на основе конечных автоматов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <cstdlib>
#include <iostream>
#include <cassert>
 
#define DEBUG
 
void add_digit( unsigned& value, unsigned digit )
{
   value = value * 10 + digit;
}
 
double _atof( const char* str )
{
  enum { 
        START, 
        WAIT_NUM_POINT_OR_END,
        WAIT_NUM_AFTER_POINT,
        WAIT_NOT_NUM,
        FINISH,
        ERROR
       } state;   
   
   enum {
        NUMBER,
        POINT,
        NOT_NUMBER
        } value;     
   
   char c;
   size_t pos = 0;
   unsigned number = 0;
   unsigned up = 0, down = 0, degree = 1;  
         
   state = START; 
  
   while ( state != FINISH && state != ERROR )
   {
      c = str[pos];
      if( c >= '0' && c<='9' )
      {
         number = c - '0';
         value = NUMBER; 
         // std::cout << "NUMBER " << number << std::endl; 
      }   
      else
      {
         value = ( c == '.' ? POINT : NOT_NUMBER );
         // std::cout << ( value == POINT ?
         //             "POINT" : "NOT_POINT" )
         //           << std::endl; 
      }    
      // std::cout << '(' << state << ')' << std::endl;
      switch( state )
      {
         case START:
           if( value == NUMBER )
           {
              state = WAIT_NUM_POINT_OR_END;
              add_digit( up, number ); 
           }
           else if( value == POINT )
           {
              state = WAIT_NUM_AFTER_POINT;
           }       
           else
           {
              state = ERROR;
           }    
           break;
         case WAIT_NUM_POINT_OR_END:
           if( value == NUMBER )
           {
              state = WAIT_NUM_POINT_OR_END;  
              add_digit( up, number ); 
           }
           else if( value == POINT )
           { 
              state = WAIT_NOT_NUM; 
           }          
           else
           {
              state = FINISH;
           }   
           break; 
         case WAIT_NUM_AFTER_POINT:
           if( value == NUMBER )
           {
              state = WAIT_NOT_NUM;
              add_digit( down, number ); 
              degree *= 10; 
           }
           else
           {
              state = ERROR;
           }
           break;   
         case WAIT_NOT_NUM:
           if( value != NUMBER )
           {
              // std::cout << "FINISH" << std::endl; 
              state = FINISH;
           } 
           else
           {
              add_digit( down, number ); 
              degree *= 10; 
           }              
           break;
         default:
           assert( 0 );  
      }   
      
      ++pos; 
   }    
   
   if( state == FINISH )
   {
      // std::cout << up << '.' << down << std::endl;
      return static_cast<double>(up) +
             static_cast<double>(down) / degree;   
   }
#ifdef DEBUG      
   else
   {
      std::cout << "error" << std::endl;
   }  
#endif
   return 0;
}
 
int main()
{
  const char* szTest[] = { 
                          "123.12",
                          "123", 
                          "0.234",
                          ".34",
                          "sdf",
                          ".23d",
                          ".sd",
                          "1."    
                          };
                         
  for( size_t i=0;i<sizeof( szTest )/sizeof( szTest[0] );++i )
  {
     std::cout << _atof( szTest[i] ) << std::endl;
  }    
       
}
Bash
1
2
3
4
5
6
7
8
9
10
123.12
123
0.234
0.34
error
0
0.23
error
0
1
http://liveworkspace.org/code/0c939a...1efcb707d6ec77

Добавлено через 1 минуту
хотя вижу уже есть вариант на таблицах =)
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru