Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
1

Моя реализация функции перевода STRING в DOUBLE

22.12.2012, 11:35. Показов 3107. Ответов 21

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
#include <string>
 
using namespace std;
 
double str_to_double(string a);
 
int main() {
    string s = "7.86456456";
    cout << str_to_double(s);
}
 
double str_to_double(string a) {
    int s = 0;
 
    for(int i = 0; i < a.size(); ++i) {
        if(a[i] == '.') {++s;}
        if(s > 1 || a[0] == '.') {return 0;}
    }
 
    double num = 0;
    int tmp;
    bool anti = false;
 
    int dob = 0;
 
    for(int i = a.size() - 1; i >= 0 && a[i] != '.'; --i) {++dob;}
 
    double l = 1;
 
    if(s == 0) {l = 1;}
    else {for(int i = 0; i < dob; ++i, l /= 10);}
 
    for(int i = a.size() - 1; i >= 0; --i, l *= 10) {
        if(a[i] == '0') {tmp = 0;}
 
        else if(i == 0 && a[i] == '-') {anti = true; break;}
 
        else if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';}
        else if(a[i] == '.') {l /= 10; continue;}
 
        else {
                return 0;
        }
 
        num += (tmp * l);
    }
 
    if(anti == true) {return -num;}
    else {return num;}
}
Самостоятельно написал функцию перевода string в double
P.S. Пишите предложения по улучшению этой функции

Добавлено через 5 минут
Вверх

Добавлено через 7 минут
Вверх
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2012, 11:35
Ответы с готовыми решениями:

Моя реализация функции перевода string в int
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int str_to_int(string a); int...

Моя реализация алгоритма перевода числа в пропись (русский язык)
Добрый день.Недавно передо мной стояла задача сделать REST сервис перевода числа в пропись(на...

Как исправить ошибку перевода string в double?
Ошибка заключается непонятно в чем, using System; using System.Collections.Generic; using...

Какая-нибудь реализация функции void Fun (double in, double *out)
Подскажите, пожалуйста, какую-нибудь любую реализацию прототипа функции: void Fun (double in,...

21
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
22.12.2012, 11:48 2
-3.4423e+452 переваривает? Денормализованные числа? Точность представления?
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
22.12.2012, 11:51  [ТС] 3
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
-3.4423e+452 переваривает? Денормализованные числа? Точность представления?
Все работает
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.12.2012, 12:03 4
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Все работает
Да ладно?
C++
1
2
3
4
5
6
int main() {
    std::string s = "-10e2";
    double n = -10e2;
    cout << n << " " << str_to_double(s) << endl;
    return 0;
}
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
22.12.2012, 12:19  [ТС] 5
Цитата Сообщение от 0x10 Посмотреть сообщение
int main() {
* * std::string s = "-10e2";
* * double n = -10e2;
* * cout << n << " " << str_to_double(s) << endl;
* * return 0;
}
Так нет

Добавлено через 8 минут
Вверх
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
22.12.2012, 12:27 6
sovaz1997, кто Вас научил так форматировать код? Да и комментариев добавте. Тогда люди почитают.
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
22.12.2012, 12:29  [ТС] 7
Цитата Сообщение от go Посмотреть сообщение
sovaz1997, кто Вас научил так форматировать код?
В смысле?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.12.2012, 13:32 8
Цитата Сообщение от sovaz1997 Посмотреть сообщение
В смысле?
C++
1
2
3
if(a[i] == '0') {tmp = 0;}
 
else if(i == 0 && a[i] == '-') {anti = true; break;}
=>
C++
1
2
3
4
5
6
if (a[i] == '0') {
    tmp = 0;
} else if (i == 0 && a[i] == '-') {
    anti = true;
    break;
}
Хотя бы так. Про расположение открывающей фигурной скобки уж не буду холиварить.
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
22.12.2012, 13:34  [ТС] 9
0x10, когда 1 строчка, так лучше писать - меньше места и читабельно
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
22.12.2012, 14:06 10
Цитата Сообщение от sovaz1997 Посмотреть сообщение
0x10, когда 1 строчка, так лучше писать - меньше места и читабельно
кому это читабельно может быть?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.12.2012, 14:11 11
Цитата Сообщение от Nixy Посмотреть сообщение
кому это читабельно может быть?
Кому-то, возможно, и читабельно. Но потом к проекту подключается второй программист, который привык к другому оформлению и начинает писать по-своему. И хотя разработчиков всего двое, в коде уже начинается бардак.

Короче, мораль для ТС: выбрать какие-нибудь стандарты кодирования и педантично придерживаться их.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.12.2012, 14:13 12
Цитата Сообщение от sovaz1997 Посмотреть сообщение
0x10, когда 1 строчка, так лучше писать - меньше места и читабельно
Согласен
C++
1
2
3
#include <iostream>
#include <string>
using namespace std; double str_to_double(string a); int main() { string s = "7.86456456"; cout << str_to_double(s); } double str_to_double(string a) { int s = 0; for(int i = 0; i < a.size(); ++i) { if(a[i] == '.') {++s;} if(s > 1 || a[0] == '.') {return 0;} } double num = 0; int tmp; bool anti = false; int dob = 0; for(int i = a.size() - 1; i >= 0 && a[i] != '.'; --i) {++dob;} double l = 1; if(s == 0) {l = 1;} else {for(int i = 0; i < dob; ++i, l /= 10);} for(int i = a.size() - 1; i >= 0; --i, l *= 10) { if(a[i] == '0') {tmp = 0;} else if(i == 0 && a[i] == '-') {anti = true; break;} else if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';} else if(a[i] == '.') {l /= 10; continue;} else { return 0; } num += (tmp * l); } if(anti == true) {return -num;} else {return num;} }
1
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
22.12.2012, 14:15  [ТС] 13
Цитата Сообщение от soon Посмотреть сообщение
Согласен
А говорю дело, а он тут оффтопит...
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
22.12.2012, 14:45 14
Цитата Сообщение от sovaz1997 Посмотреть сообщение
А говорю дело, а он тут оффтопит...
какое дело? есть стандарт, его следует придерживатся, а не делать как левой ноге удобно

Добавлено через 4 минуты
Неуверен что оффициальный но вполне доходчивый стандарт
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
22.12.2012, 14:45 15

Не по теме:

Цитата Сообщение от soon Посмотреть сообщение
Согласен
C++
1
2
3
#include <iostream>
#include <string>
using namespace std; double str_to_double(string a); int main() { string s = "7.86456456"; cout << str_to_double(s); } double str_to_double(string a) { int s = 0; for(int i = 0; i < a.size(); ++i) { if(a[i] == '.') {++s;} if(s > 1 || a[0] == '.') {return 0;} } double num = 0; int tmp; bool anti = false; int dob = 0; for(int i = a.size() - 1; i >= 0 && a[i] != '.'; --i) {++dob;} double l = 1; if(s == 0) {l = 1;} else {for(int i = 0; i < dob; ++i, l /= 10);} for(int i = a.size() - 1; i >= 0; --i, l *= 10) { if(a[i] == '0') {tmp = 0;} else if(i == 0 && a[i] == '-') {anti = true; break;} else if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';} else if(a[i] == '.') {l /= 10; continue;} else { return 0; } num += (tmp * l); } if(anti == true) {return -num;} else {return num;} }
Ну что вы, по-моему, так ещё более читабельно.
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
# include  <iostream>
#   include <string>
#    define str string
#  define dbl double
# define cnt continue
double f(std::str
  a);int main(){std
   ::str s="7.864"
    "56456";std::cout
    <<f(s);}dbl f(
     std::str a){int s
   =0;for (int i=0;i<a.
   size(); ++i){if(a[i]
  =='.'){++s;}if(s>1||
 a[0]=='.'){return 0;
 }}double nm=0;int t;
  bool anti=false; int
   d=0;for(int i=a.size
    ()-1;i>=0&&a[i]!='.'
     ;--i){++d;}dbl l=
     1;if(s==0){l=1;}else
    {for(int i=0;i<d;++i
   ,l/=10);}for(int i=a
     .size()-1;i>=0;--i,l
      *=10){if(a[i]=='0'){
       t=0;}else if(i==0&&
         a[i]=='-'){anti=true
           ;break;}else if(a[i] 
          >='0'&&a[i]<='9'){t=
        a[i]-'0';}else if(a[
        i]=='.'){l/=10;cnt;}
       else{return 0;}nm+=(
      t*l);}if(anti==true)
{return -nm;}else{return nm;}}



Если серьёзно, то у подобного однострочного стиля главный недостаток: его приходится исправлять, если внезапно надо написать больше одной строки. То же касается необорачивания простых выражений в фигурные скобки.
1
0x10
22.12.2012, 14:47
  #16

Не по теме:

~OhMyGodSoLong~, Давайте уже сразу так) http://www.perlmonks.org/?node_id=45213

0
OhMyGodSoLong
22.12.2012, 14:56
  #17

Не по теме:

Давайте!

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
#define                       q [v+a]
#define                      c b[1]
#define                     O 1 q
#define                    o 0 q
#define                   r(v,a\
)v<0&&(                  v*=-1,         a*=-1);
#define                 p(v,m,      s,w)*c==*#v?2 q\
<m?(c++                ,d=1,3      q=0,5      q=m,main\
(a+3,b)               ,o=o*s     q,O=O*          w q):0:
static               d,v[99     ];main            (int a,
char**b             ){d=7;     if(*c?!            (p(+,3
,4 q+O*            3,4)p(                          -,(o?3
:(O=1,6           )),4 q                          -O*3,4)
p(*,4,3          ,4)p(/                           ,5,4,3)
p((),d,         0+3,0+                           04)*c==
')'?2 q        <02?(c                           ++,0):0
:(o=012       *o+*c-                          '0',c++
,O=1)):      2 q?3-                        2:printf(
"%d/%d"     "\n",o                     ,O))return
1;d=a,r    (o,d)r                    (O,d)3 q
=o<O?(4   q=o,O)                   :(4 q=O,
         o);r(d,                 o)a+=3;O?
                                 1:(O=1,2
                                q=1);while
                                (2 q=o%1 q)a++;v[d]/=O;d[
                                v+1]/=O;return main(d,b);}

4
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
22.12.2012, 15:03 18
Цитата Сообщение от 0x10 Посмотреть сообщение
Хотя бы так. Про расположение открывающей фигурной скобки уж не буду холиварить.
Ну это как в джаве. В С/С++/СШарп так не принято. ~OhMyGodSoLong~, Вот это супер.
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
22.12.2012, 15:06  [ТС] 19
Из-за какой-то ерунды форумчане разошлись... Я в шоке
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
22.12.2012, 15:08 20
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Из-за какой-то ерунды форумчане разошлись... Я в шоке
от маленького камешка может сойти лавина, не стоит недооценивать мощь оформления кода
0
22.12.2012, 15:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2012, 15:08
Помогаю со студенческими работами здесь

Вывести long double число без перевода в double
Надо вывести long double число без перевода в double. Пишу: printf(&quot;%Lf&quot;,S); и выводится неверно....

Есть ли какие то стандартные функции преобразования double в string?
В проекте необходимы функции, для преобразование double в string и наоборот. Первое получилось...

Не проходит тест функции Double to String. Где ошибка?
не пойму почему не проходит тест к этому методу? Подскажите как правильно кто знает. Код: public...

Ваша идея, моя реализация
Хочется попрактиковаться в написании программ с использованием wxWidgets. Если проще - речь идет о...

Моя реализация акторной модели
Моя реализация акторной модели в рамках Хаскеля. {-# Language GADTs, LambdaCase, ...

Реализация интерфейса IEqualityComparer для HashSet<Dictionary<string, string>>
Код выдает &quot;2&quot;, что, логично, а хотелось бы, чтобы выдавал &quot;1&quot;, так как содержание словарей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru