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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
#1

Преобразование string в long double - C++

25.07.2014, 03:16. Просмотров 1473. Ответов 14
Метки нет (Все метки)

Одним из недостатков C++ является отсутствие для бизнес-программ
встроенного типа для денежных значений, такого, как $173 698 001,32.
Такой денежный тип должен иметь возможность для хранения числа с
фиксированной десятичной точкой точностью около 17 знаков, которого
было бы достаточно для хранения национального долга в долларах и цен-
тах. К счастью, встроенный тип C++ long double имеет точность 19 цифр,
поэтому мы можем использовать его как базисный для класса money, даже
используя плавающую точку. Однако нам нужно будет добавить возмож-
ность ввода и вывода денежных значений с предшествующим им знаком
доллара и разделенными запятыми группы по три числа: так проще читать
большие числа. Первым делом при разработке такого класса напишем ме-
тод mstold(), который принимает денежную строку, то есть строку, пред-
ставляющую собой некоторое количество денег типа
"$1,234,567,890,123.99"
в качестве аргумента и возвращает эквивалентное ее значению число типа
long double.
Вам нужно будет обработать денежную строку как массив символов и,
просматривая ее символ за символом, скопировать из нее только цифры
(0-9) и десятичную точку в другую строку. Игнорируется все остальное,
включая знак доллара и запятые. Затем вы можете использовать биб-
лиотечную функцию _atold() (заметим, что здесь название функции на-
чинается с символа подчеркивания — заголовочные файлы STDLIB.H или
MATH.H) для преобразования новой строки к числу типа long double. Пред-
полагаем, что денежное значение не может быть отрицательным. Напи-
шите функцию main() для проверки метода mstold(), которая несколько
раз получает денежную строку от пользователя и выводит соответству-
ющее число типа long double.


программа сделана, но запустить не могу, не работает функция _atold преобразующая string > long 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
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign"; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != ('.'||'$'))
                strMon[j] = number[n++];
        long double summ =_atold(number);    
    }
    void display()const
    {
        cout << "\n" << summ << endl;
    }
};
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1875 / 1273 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
25.07.2014, 04:55     Преобразование string в long double #2
программа сделана, но запустить не могу, не работает функция _atold преобразующая string > long double
И не будет работать. Может atold и было в C который учил ваш преподаватель, но его нет в C++ которому он учит вас. А нужно вам stold (C++11) и другого преподавателя.
Такой денежный тип должен иметь возможность для хранения числа с
фиксированной десятичной точкой точностью около 17 знаков, которого
было бы достаточно для хранения национального долга в долларах и цен-
тах.
Такой денежный тип должен иметь возможность выполнения вычислений без ошибки округления. double автоматически дает ошибку округления, как только в него пихают дробь отличную от A/2^B (например, 0.3). А национальный долг храните в 64 битовых центах и не выпендривайтесь.
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 05:16  [ТС]     Преобразование string в long double #3
Цитата Сообщение от Renji Посмотреть сообщение
Такой денежный тип должен иметь возможность выполнения вычислений без ошибки округления. double автоматически дает ошибку округления, как только в него пихают дробь отличную от A/2^B (например, 0.3). А национальный долг храните в 64 битовых центах и не выпендривайтесь.
спокойствие) это всего ишь Лафоре ООП и да, он любит повыпендриваться в своей книге, я уже заметила. увы, других учителей нет, даже в универе толковых не водится, так что сама жую гранит науки)
а можете конкретно подправить строку кода, как правильно использовать эту функцию?
и какая библиотека нужна?

Добавлено через 6 минут
программа заработала но не делает того что нужно. выдает ошибку.
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
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign" << endl; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n=0;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != ('.'||'$'))
                strMon[j] = number[n++];
        long double summ =stold(number);    
        return summ;
    }
    void display()const
    {
        cout << "\n" << summ << endl;
    }
};
 
 
 
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    return 0;
}
Renji
1875 / 1273 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
25.07.2014, 05:27     Преобразование string в long double #4
программа заработала но не делает того что нужно. выдает ошибку.
strMon[j] = number[n++]; заменить на number.push_back(strMon[j]); Массивы C++ не расширяются сами собой. И вообще, вы в strMon вместо number писали.
long double summ =stold(number); заменить на summ =stold(number); иначе результат уходит не в класс, а в локальную переменную.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 1
25.07.2014, 08:53     Преобразование string в long double #5
Я бы сделал так
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
#include <iostream>
#include <strstream> 
using namespace std;
class Money
{
private:
    char str[100]; // Рабочая переменная 
    long summ; // Здесь храним сумму  в центах
    void str2summ()
    {
        char *pos;
        if(str[0]=='$')
            str[0]=' '; // если $ в начале строки
        else if( (pos=strchr(str,'$'))!=NULL )
            *pos=0; // заменяем '$' на нуль(конец строки)
        if( (pos=strchr(str,'.'))!=NULL ) // имеется точка 
        {
            pos[0]=pos[1];// убираем току
            pos[1]=pos[2];
            pos[2]=0;
        }else
        {
            int L=strlen(str);
            str[L]='0'; // переводим в центы добавляя две буквы '0'
            str[L+1]='0';
            str[L+2]=0;
        }
        istrstream ss(str);
        ss>>summ;
    }
 public:
    Money():summ(0){}
    Money(long s):summ(s){}
    Money(char* str){str2summ();}
    void Input()
    {
        cout << "Enter the amount in dollars with point. End with a dollar sign:" << endl; 
        cin.getline(str,64);
        str2summ();
    }
    void display()
    {
        ostrstream ss(str,100);
        ss<<summ;
        int L=strlen(str);
        str[L+2]=0;
        str[L+1]='$'; // вставляем точку и знак доллара
        str[L]=str[L-1];
        str[L-1]=str[L-2];
        str[L-2]='.';
        cout << str << endl;
    }
};
int main()
{
    Money money;
    money.Input();
    money.display();
    system("pause");
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2014, 09:18     Преобразование string в long double #6
Pari, используй возможности С++ в области форматируемого вывода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>
using namespace std;
 
long double ConvStrToLDouble(string str){
    long double val = 0;
    stringstream ss(str);
    ss>>val;
    return val;
}
 
int main(){
    string str = "123456789.12345678901234567";
    cout.precision(str.size());
    long double val = ConvStrToLDouble(str);
    cout<<fixed<<val <<endl;
    cin.get();
    return 0;
}
http://codepad.org/PWNL9HOz
Output:
123456789.123456789013289380818605423
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 13:08  [ТС]     Преобразование string в long double #7
Цитата Сообщение от Renji Посмотреть сообщение
strMon[j] = number[n++]; заменить на number.push_back(strMon[j]); Массивы C++ не расширяются сами собой. И вообще, вы в strMon вместо number писали.
long double summ =stold(number); заменить на summ =stold(number); иначе результат уходит не в класс, а в локальную переменную.
по выполнению всех этих инструкций все равно работает неверно.

Добавлено через 5 минут
в задании сказано сделать функцию другим способом но спасибо. и я не знаю что значит эта строка, а точнее знак *
Цитата Сообщение от zss Посмотреть сообщение
char *pos;
Добавлено через 22 секунды
я все же хочу довести свой вариант до ума

Добавлено через 20 минут
укажите на ошибку, или что добавить

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
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign" << endl; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n=0;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != (','||'$'))
                number.push_back(strMon[j]); ;
        summ = stold(number);    
        return summ;
    }
    void display()const
    {
        cout << "\n" << summ << endl;
    }
};
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    system ("pause");
    return 0;
}
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 1
25.07.2014, 13:29     Преобразование string в long double #8
Цитата Сообщение от Pari Посмотреть сообщение
char *pos;
pos - указатель на char.
Функция strchr возвращает указатель на найденный символ
и NULL если он не найден.
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 14:43  [ТС]     Преобразование string в long double #9
пожалуйста, помогите кто-нибудь доделать мою версию программы!
Renji
1875 / 1273 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
25.07.2014, 15:29     Преобразование string в long double #10
укажите на ошибку, или что добавить
if (strMon[j] != (','||'$')) - так тоже делать нельзя (','||'$' равно true, сравнение символа с true бессмысленно). Сравнивайте strMon[j] отдельно с запятой, отдельно со знаком доллара.
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 15:45  [ТС]     Преобразование string в long double #11
Цитата Сообщение от Renji Посмотреть сообщение
if (strMon[j] != (','||'$')) - так тоже делать нельзя (','||'$' равно true, сравнение символа с true бессмысленно). Сравнивайте strMon[j] отдельно с запятой, отдельно со знаком доллара.
как их правильно сравнивать отдельно? напишите пожалуйста выражение.
Renji
1875 / 1273 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
25.07.2014, 15:46     Преобразование string в long double #12
strMon[j] != ',' && strMon[j] != '$'
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 16:00  [ТС]     Преобразование string в long double #13
Цитата Сообщение от Renji Посмотреть сообщение
strMon[j] != ',' && strMon[j] != '$'
если такое написать, то выводит:
вводим к примеру: 1,232,232,232.33$ а выдает: 1.232323е+009.
Renji
1875 / 1273 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
25.07.2014, 16:12     Преобразование string в long double #14
если такое написать, то выводит:
вводим к примеру: 1,232,232,232.33$ а выдает: 1.232323е+009.
Правильно выдает, просто в экспоненциальной записи. Пользуйтесь 64 битовым целым или попробуйте поиграться с cout.precision(сколько вам надо знаков). Может, поможет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 16:48     Преобразование string в long double
Еще ссылки по теме:
Преобразование из string в double C++
C++ Преобразование Double в string
C++ Преобразование типов string->double c заданной точностью*?
Почему перестает работать программа при замене double на long double? C++
C++ long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей

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

Или воспользуйтесь поиском по форуму:
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 16:48  [ТС]     Преобразование string в long double #15
нашла в учебнике как правильно сделать нормальный вывод, теперь программа работает полностью правильно:

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
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign" << endl; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n=0;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != ',' && strMon[j] != '$')
                number.push_back(strMon[j]); ;
        summ = stold(number);    
        return summ;
    }
    void display()const
    {
        cout << setiosflags (ios::fixed) 
            << setiosflags (ios::showpoint)
            <<setprecision(2)
            << "\n" << summ << endl;
    }
};
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    system ("pause");
    return 0;
}
Yandex
Объявления
25.07.2014, 16:48     Преобразование string в long double
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru