Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] String to double (http://forum.oszone.net/showthread.php?t=280374)

Prof 06-04-2014 00:41 2333688

String to double
 
Доброго времени суток, ув. форумчане! Нужно написать ф-цию которая строку типа 1:0.2:2 разбивает на переменные типа double (float) со значениями 1, 0.2, 2. Вся проблема в том что в десятичном виде отбрасывает дробную часть.
Код:

int input_interval()
{
        string interval, interval_part[3];
        getline(cin, interval, '\n');
        for (int i = 0, j = 0, from = 0; i <= interval.length(); i++)
        if ((interval[i] == ':') || (i == interval.length()))
        {
                interval_part[j] = interval.substr(from, i - from);
                from = i + 1;
                j++;
        }
        x1 = atof(interval_part[0].c_str());
        dx = atof(interval_part[1].c_str());
        x2 = atof(interval_part[2].c_str());
        return 0;
}


Tau_0 06-04-2014 09:11 2333726

В фортране есть функции FRACTION, FLOOR См.
Справочное руководство по языку Fortran 95
Выделение дробной части в Fortran

И там эта проблема решается довольно просто, а вот есть ли такие на Сях мне невеведомо...???... --- Поищите...

Drongo 06-04-2014 15:59 2333852

Так пойдёт?
Код:

...
  String interval = "1:0.2:2"; // Тест-строка

  TStringList *lDigital = new TStringList(); // Сюда будем сохранять разбиваемую строку по знаку ":"
  TSysCharSet chPoint;
  chPoint << ':'; // Объявляем разбиваемый символ, можно например указать несколько << '#' << ':'

  ExtractStrings(chPoint, chPoint, interval.c_str(), lDigital); // разбиваем нашу строку по заданому символу в chPoint и сохраняем все разбивки в массив строк

  double *array = new double[lDigital->Count]; // Создаём динамический массив для double

  for(int i = 0; i < lDigital->Count; i++) // обходим циклом массив строк
      array[i] = lDigital->Strings[i].ToDouble(); // в array наши числа   

  delete lDigital;
  delete array;
...

Написал и перечитал внимательно задание, похоже вам консольный вариант нужен?

Код:

//Строки, использование strtok
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <cstring.h>

int main()
{
  char string[] = "ETO PREDLOGENIE SODERGIT PYAT LEKSEM";
  char *tokenPtr;
  int z;

  cout << "STROKA RAZBIVAETSYA NA LEKSEMI:\n" << string <<"\n\nLEKSEMI:  \n\n";

  tokenPtr = strtok(string, " "); // Разбивка предложения по пробелу

  while(tokenPtr != NULL){
      cout << tokenPtr << '\n'; // Вместо вывода на экран, сохраняйте в массив.
      tokenPtr = strtok(NULL, " ");
      }
  cin >> z;
        return 0;
}
//---------------------------------------------------------------------------

Цитата:

Цитата Prof
Вся проблема в том что в десятичном виде отбрасывает дробную часть. »

Не проверял если честно, попробуйте приведение типов через static_cast

Код:

char str = "2.2";
double number = static_cast<double>(str);


Prof 06-04-2014 21:56 2334020

Разобрался, вся проблема была в форме представления десятичного числа. 0,1 переводит нормально, а в 0.1 отбрасывает дробную часть


Время: 21:24.

Время: 21:24.
© OSzone.net 2001-