Форум программистов, компьютерный форум 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,... подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 16:46     Преобразование строки в double
Gepar, чтобы такие задачи щелкать, изучи конечные автоматы.
Вот тебе реализация:

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
Листинг 5.5. Реализация конечного преобразователя для перевода дробных чисел
// автомат-преобразователь для дробных констант
// функция вычисления цифры
const int notDigit = -1;            // не цифра
int digit(char ch)
{ string digits = "0123456789";
  int d;
  for(d = 0; d < 10; ++d)
    if(ch == digits[d]) return d;
  return notDigit;              // символ - не цифра
}
// функция вычисления класса символа
enum Symbol { D, P, E, S, O, Class };
Symbol type(char ch)
{ if(isdigit(ch)) return D;
  if(ch =='.')    return P;
  if((ch =='e')||(ch=='E')) return E; 
  if((ch =='-')||(ch=='+')) return S;
  return O;
}
// состояния
enum State { start, s1, s2, s3, s4, s5, s6, s7, finish, error }; 
// обработка состояния ошибки
State Error(const char &ch, Number &D) 
{ Error.set();      // установка флага ошибки 
  return error; 
}
// завершение обработки
State Other(const char &ch, Number &D)
{ return finish; }
// в состоянии start – обработка знака
State startS(const char &ch, Number &D)
{ if (ch == '-') D.signN = -1; 
  return s1;    // первая цифра
}
// в состоянии start и s1 – обработка первой цифры
State startD(const char &ch, Number &D) 
{ D.N = digit(ch);
  return s2;    // целая часть
}
// в состоянии s2 – обработка цифр целой части
State intD(const char &ch, Number &D)
{ D.N = D.N * 10 + digit(ch);
  return s2;    // целая часть
}
// в состоянии s2 – обработка точки
State Point(const char &ch, Number &D)
{ return s3; }  // после точки
 
// в состоянии s2 – обработка E
State Exp(const char &ch, Number &D)
{ return s5; }  // после E
// в состоянии s3 – обработка первой цифры после точки
State float1D(const char &ch, Number &D)
{ D.FP = 0.1;  D.F = digit(ch) * D.FP;
  return s4;    // дробная часть
}
// в состоянии s4 – обработка цифр дробной части
State floatD(const char &ch, Number &D) 
{ D.FP/=10; D.F = D.F + digit(ch) * D.FP;
  return s4;    // дробная часть
}
// в состоянии s5 и s6 – обработка первой цифры порядка
State exp1D(const char &ch, Number &D) 
{ D.P = digit(ch);
  return s7;    // порядок     
}
// в состоянии s6 – обработка знака порядка
State expS(const char &ch, Number &D) 
{ if(ch == '-') D.signP = false;
  return s7;    // порядок 
}
// в состоянии s7 – обработка цифр порядка
State expD(const char &ch, Number &D) 
{ D.P = D.P * 10 + digit(ch);
  return s7;    // порядок
}
typedef State (*Action)(const char &ch, Number &D); 
double Double(const string &str)
{ Action matrix[Class][states] =
//start   s1      s2     s3       s4      s5     s6     s7
//перед   после   целая  после    дроб.   после  после  порядок
//числом  знака   часть  точки    часть   Е      знака Е
{{startD, startD, intD,  float1D, floatD, exp1D, exp1D, expD },// цифра 
 {Error,  Error,  Point, Error,   Error,  Error, Error, Error},// точка
 {Error,  Error,  Exp,   Error,   Exp,    Error, Error, Error},// порядок
 {startS, Error,  Error, Error,   Error,  expS,  Error, Error},// знак
 {Error,  Error,  Other, Error,   Other,  Error, Error, Other} // другой 
};
  Number D;
  double result;            // возвращаемый результат
  size_t n = 0;         // индекс символа в строке
  State s = start;          // начальное состояние
  while((s != finish)&&(s != error)&&(n < str.size()))
  { Symbol t = type(str[n]);        // получили класс символа
    s = matrix[t][s](str[n], D);    // вызов функции
    ++n;                // след символ
  }
// проверка состояния при выходе  
  if ((s==s2)||(s==s4)||(s==s7)||   // финишные состояния
      (s==finish))
  { result = D.N+D.F;
    if(!D.signP) D.P = -D.P;
    result = D.signN * result * pow(10.0, D.P);
  }
  else result = 0;
  return result;
}
Для получения цифры преобразователь использует функцию digit(), аналогичную описанной в листинге 5.3.
Обратите внимание на то, что функции Point() и Exp(), обрабатывающие символы точки и экспоненты, фактически не делают ничего, кроме перехода в новое состояние. Это довольно частое явление при разработке конечных преобразователей. Функция отражает некоторое состояние. «Пустые» состояния необходимы для отслеживания правильной последовательности символов во входной строке.

Функция digit()
C++
1
2
3
4
5
6
7
const int noDigit = -1;
int digit(char ch, byte B = 10)
{ string digits = "0123456789";
  int d;                // возвращаемая цифра 
  for(d = 0; d < B; ++d)
    if(ch == digits[d]) return d;
  return noDiget;
 
Текущее время: 00:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru