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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Как сделать так, чтобы программа понимала русские буквы? http://www.cyberforum.ru/cpp-beginners/thread337779.html
И если знаете как убрать этот огромный массив символов "char mass2" на chr виснет все... Так вот код программы. Мне нужно чтобы она выводила статистику по русским символам правильно... а то выводит не то совсем. Подскажите пожалуйста. #include <iostream> // подключаем библиотеку ввода, вывода #include <conio.h> // для задержки экрана #include <locale.h>
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++ шаблоны
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс. Приведу пример template<typename T> class Class { private: template<typename C> bool func(C const& x, C const& y, int C::*) { return true; }
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 - c2 01 00 00 x bb 02 00 00 (пикселей) - 450 x 699 пикселей В HEX значения взяты из самого файла, а в DEC - из "ПКМ - Свойства". Только вот я не могу понять как переводить, ведь 0xce6b0e00 = 3 463...
C++ Создание SAVE файла. Запись и чтение. Доброго времени суток! Хочу обратиться за мудрым советом к профессионалам. Мне необходимо реализовать в своем приложении создание SAVE файла. Запись и чтение из него. У меня есть массив объектов. Скорее всего, количество объектов не будет больше ста. У каждого объекта есть шесть параметров - числа типа double, один параметр, который может принимать одно из четырех целочисленных значений (1, 3,... подробнее

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

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 минуту
хотя вижу уже есть вариант на таблицах =)
 
Текущее время: 14:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru