Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

01.08.2014, 22:39. Просмотров 1722. Ответов 18
Метки нет (Все метки)

Вернемся к обсуждению денежных строк из упражнения 6. Напишите ме- од ldtoms() для преобразования числа типа long double в денежную строку, представляющую это число. Для начала вам нужно проверить, что значе-ние long double не очень большое. Мы предполагаем, что вы не будете пы-таться преобразовать число, больше чем 9 999 999 999 999 990.00. Затем
преобразуем long double в строку (без знака доллара и запятых), храня-щуюся в памяти, используя объект ostrstream, как рассматривалось ранее в этой главе. Получившаяся отформатированная строка может быть поме-щена в буфер, называющийся ustring.
Затем вам нужно будет создать другую строку, начинающуюся со знака доллара, далее копируем цифру за цифрой из строки ustring, начиная сле- ва и вставляя запятые через каждые три цифры. Также вам нужно подав-лять нули в начале строки. Например, вы должны вывести $3 124.95, а не
$0 000 000 000 003 124.95. Не забудьте закончить строку нулевым симво-
лом '\0'.
Напишите функцию main() для тестирования этой функции путем много- кратного ввода пользователем чисел типа long double и вывода результата в виде денежной строки.

Моя программа не расставляет точки и ответ выводит в экспоненциальной форме, что странно, разве char может выводиться в такой форме?.. В общем, объясните мне, темной, почему и что исправить.



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
#include "stdafx.h"
#include<iostream>
#include <string>
#include <sstream>
using namespace std;
class Money
{
private: 
    char strMon [30];
    char strMon1 [30];
    long double summ;
public:
    void ldtoms()
    {
        stringstream conv;
        conv << summ;
        conv >> strMon;
    }
    void getmoney()
    {
        cout << "Enter the amount without decimal point" << endl; 
        cin >> summ;
        if (summ > 9999999999999990.00)
        {
            cout << "\nError. Try Again";
            system ("pause");
            exit(1);
        }
    }
    void string ()
    {
        strMon1 [0] = '$';
        int j = 0;
        for (j; j<strlen(strMon); j++)
        {
            if (strMon[j] % 3)
                strMon1[j+1] = '.';
 
            strMon1 [j+1] = strMon[j];
        }
        strMon1[j+1] = '\0';
    }
    void display()const
    {
        cout << "\n" << strMon1 << endl;
    }
};
 
int main()
{
    Money money;
    money.getmoney();
    money.ldtoms();
    money.string();
    money.display();
    system ("pause");
    return 0;
}
Добавлено через 24 минуты
исправила немного код, но теперь после знака $ выводит иероглифы
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
#include "stdafx.h"
#include<iostream>
#include <string>
#include <sstream>
using namespace std;
class Money
{
private: 
    char strMon [30];
    char strMon1 [30];
    long double summ;
public:
    void ldtoms()
    {
        stringstream conv;
        conv << summ;
        conv >> strMon;
    }
    void getmoney()
    {
        cout << "Enter the amount without decimal point" << endl; 
        cin >> summ;
        if (summ > 9999999999999990.00)
        {
            cout << "\nError. Try Again";
            system ("pause");
            exit(1);
        }
    }
    void string ()
    {
        strMon1 [0] = '$';
        strMon1 [29] = strMon[strlen(strMon)];
        strMon1 [28] = strMon[strlen(strMon-1)];
        strMon1 [30] = '\0';
        int j = 0;
        for (j = strlen(strMon)-3; j<= strlen(strMon)-3; j--)
        {
            if (strMon[j] % 3)
                strMon1[j-1] = ' ';
 
            strMon1 [j-1] = strMon[j];
        }
    }
    void display()const
    {
        cout << "\n" << strMon1 << endl;
    }
};
 
int main()
{
    Money money;
    money.getmoney();
    money.ldtoms();
    money.string();
    money.display();
    system ("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2014, 22:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Преобразование long double в char (C++):

Преобразование массива char в массив long long - C++
Имеется большой массив char, в котором содержатся числа. Нужно максимально быстро извлечь их и записать в массив чисел long long. ...

long double и char - C++
Товарищи, помогите чайнику разобраться в данном теоретическом вопросе: long double* m=95; m--; m=? char* t=2; t-=4; t=?

Конвертирование массива char в long double - C++
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;cstring&gt; using namespace std; class money { private: static const int...

Как преобразовать long double в char[]? - C++
Приветствую. Подскажите пожалуйста, как преобразовать long double в в тип char? До указателей по книге еще не дошел, в интернете пытался...

Преобразование строки в long double - C++
Друзья, в Лафоре есть задача номер 7 в главе 7. Её суть: пользователь вводит строку, программа должна считывать только цифры и символ...

Преобразование long double в string - C++
Здравствуйте уважаемые форум чане! Будьте так добры, подскажите выход из сложившейся ситуации!Как преобразовать числовое значение допустим...

18
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2014, 23:23 #2
Pari, вот прямолинейно и просто
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
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
 
 
class Money
{
protected: 
    long double value;
    long long   ipart;
    long double fpart;
    string result;
public:
    Money() {
        value = 0;
        ipart = 0;
        fpart = 0;
    }
    bool getmoney()
    {
        bool bFlag = false;
        cout << "Enter the amount without decimal point" << endl; 
        if ( !(cin >> value) || cin.get() != '\n' )
            cout<<"Input error"<<endl;
        else
        if( bFlag = true )
        {
            ipart = long long(value);
            fpart = value - ipart;
        }
        cin.clear();
        cin.sync();
        return bFlag;
    }
    string ldtoms()
    {
        int i, j;
        string ibuffer;
        string fbuffer;
        stringstream is;
        stringstream fs;
        result = "error";
        if( is<<fixed<<ipart )
        if( is>>ibuffer )
        if( fs<<fixed<<fpart )
        if( fs>>fbuffer )
        {
            result = "";
            reverse(ibuffer.begin(), ibuffer.end());
            for( i = 0; i < ibuffer.size(); i += 3 )
            {
                for( j = 0; j < 3 && i + j < ibuffer.size(); j++ )
                    result += ibuffer[i + j];
                result += " ";
            }
            reverse(result.begin(), result.end());
            result  = "$" + result + ".";
            fbuffer.erase(0, 1);
            fbuffer.erase(0, 1);
            result += fbuffer;
 
        }
        return result;
    }
};
 
int main()
{
    Money money;
    while( true )
    {
        money.getmoney();
        cout<<"ldoms : "<<money.ldtoms()<<endl;
        system ("pause");
    }
    return 0;
}
1
Миниатюры
Преобразование long double в char  
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
02.08.2014, 14:07  [ТС] #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Pari, вот прямолинейно и просто
честно говоря, плохо понимаю ваше простое решение, особенно с типом bool
я не знаю что такое cin.clear() и cin.sync();
короче, я половины не понимаю из написанного вами.

Добавлено через 11 часов 21 минуту
у меня ограничены знания, сильно ограничены, выше головы не прыгну, потому помогите пожалуйста опираясь на эти знания создать программу

Добавлено через 1 час 54 минуты
ну помогите кто-нибудь
0
dr.curse
392 / 348 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
02.08.2014, 14:12 #4
Цитата Сообщение от Pari Посмотреть сообщение
strMon1 [30] = '\0';
Цитата Сообщение от Pari Посмотреть сообщение
char strMon1 [30];
нестыковочка
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 14:15 #5
Pari, а если нагуглить что означают те методы и что означает базовый тип bool.Может вы не выше головы прыгнуть,а просто побороть лень боитесь?Ваше остаток от целочисленного деления неверно,поэтому соберитесь духом выбросите ваш код в урну и попробуйте проанализировать код выше.Ну или тогда не вопите о хелпе.
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
02.08.2014, 14:21  [ТС] #6
Цитата Сообщение от dr.curse Посмотреть сообщение
нестыковочка
так надо же заканчивать строку нулевым символом, вроде?..

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Pari, а если нагуглить что означают те методы и что означает базовый тип bool.Может вы не выше головы прыгнуть,а просто побороть лень боитесь?Ваше остаток от целочисленного деления неверно,поэтому соберитесь духом выбросите ваш код в урну и попробуйте проанализировать код выше.Ну или тогда не вопите о хелпе.
я его всегда успею выбросить в урну, мне надо переработать все-лишь функцию вставления пробелов, я исхожу из того задания, что написано в книге, и делаю так как там описано.
0
-=ЮрА=-
02.08.2014, 14:31
  #7

Не по теме:

Цитата Сообщение от Pari Посмотреть сообщение
я его всегда успею выбросить в урну, мне надо переработать все-лишь функцию вставления пробелов, я исхожу из того задания, что написано в книге, и делаю так как там описано.
- ясно, тогда мучайтесь дальше раз не хотите прислушиватсья

0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
02.08.2014, 14:43  [ТС] #8
я искала информацию, но там слишком много незнакомых мне методов, я путаюсь и ничего не понятно по прежнему. я знаю как работает bool, кстати.

Добавлено через 2 минуты
я не смогла понять как работает stringstream и
reverse(ibuffer.begin(), ibuffer.end());
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 14:51 #9
Цитата Сообщение от Pari Посмотреть сообщение
reverse(ibuffer.begin(), ibuffer.end());
- это реверс строки. Далее string это тот же массив чаров, только а) безразмерный, б) на много более удобный(например посмотрите как происходит конкатенация частей строк). Вернёмся к reverse - это универсальный алгоритм для реверса сожержимого контейнеров(хотите простыми словами контейнер - это массивов типов или классов)
Касательно cin.clear() cin.sync() в любом случае что означают эти методы вы видели в справке, теперь пара слов зачем они. Напомню вам ваше же задание
Цитата Сообщение от Pari Посмотреть сообщение
Напишите функцию main() для тестирования этой функции путем много- кратного ввода пользователем чисел типа long double и вывода результата в виде денежной строки.
Неужели вы и правда думаете что после ввода в буффере ничего не остаётся и cin>>value в цикле будет работать также как и однократный ввод?Нет - в буффере после нажатия Enter будет оставаться \n который будет коробит все последующие итерации - т.е после каждго ввода как минимум надо очистить буффер - для этого cin.sync.
Зачем clear - представьте если вы вбруг вмето дабла случайно нажмёте на клавиатуре пару букв, как вы думаете флаг ошибки в потоке ввода появится или нет?Наверное да. Наверное логично всегда сбрасывать флаг ошибки - если вы ввели корректное число ничего плохого не будет, а если некорректное то появившийся флаг ошибки будет сброшен.
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
02.08.2014, 14:59  [ТС] #10
хорошо, более-менее понятно, но что насчет stringstream и откуда взялся fixed?
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 15:16 #11
Цитата Сообщение от Pari Посмотреть сообщение
Моя программа не расставляет точки и ответ выводит в экспоненциальной форме, что странно, разве char может выводиться в такой форме?.
Цитата Сообщение от Pari Посмотреть сообщение
stringstream и откуда взялся fixed?
- и правда зачем я его использовал, наверное просто чтобы понепонятней было...Справка зачем существует?!
http://www.cplusplus.com/reference/ios/fixed/
0
dr.curse
392 / 348 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
02.08.2014, 15:33 #12
Цитата Сообщение от Pari Посмотреть сообщение
так надо же заканчивать строку нулевым символом, вроде?..
я не про '\0' говорю я говорю про [30]
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
03.08.2014, 01:23  [ТС] #13
переделала таким образом, но по прежнему не работает

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
#include "stdafx.h"
#include<iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
class Money
{
private: 
    string strMon;
    string strMon1;
    long double summ;
public:
    void ldtoms()
    {
        stringstream conv;
        conv << summ;
        conv >> strMon;
    }
    void getmoney()
    {
        cout << "Enter the amount" << endl; 
        cin >> summ;
        if (summ > 9999999999999990.00)
        {
            cout << "\nError. Try Again";
            system ("pause");
            exit(1);
        }
    }
    void strings ()
    {
        string doll ("$");
        strMon1 = strMon;
        strMon1 = doll+strMon1;
        int x = strMon1.find ('.');
        strMon1.erase (x, 1);
        reverse(strMon1.begin(), strMon1.end());
        strMon1.insert (5, " ");
        strMon1.insert (8, " ");
        strMon1.insert (11, " ");
        strMon1.insert (14, " ");
        strMon1.insert (17, " ");
        strMon1.insert (2, ".");
        reverse(strMon1.begin(), strMon1.end());
    }
    void display()const
    {
        cout << setiosflads (ios :: fixed) << "\n" << strMon1 << endl;
    }
};
 
int main()
{
    Money money;
    money.getmoney();
    money.ldtoms();
    money.strings();
    money.display();
    system ("pause");
    return 0;
}
0
-=ЮрА=-
03.08.2014, 01:31
  #14

Не по теме:

Цитата Сообщение от Pari Посмотреть сообщение
переделала таким образом, но по прежнему не работает
потому что неверно написано
Цитата Сообщение от Pari Посмотреть сообщение
strMon1.insert (5, " ");
* * * * strMon1.insert (8, " ");
* * * * strMon1.insert (11, " ");
* * * * strMon1.insert (14, " ");
* * * * strMon1.insert (17, " ");
* * * * strMon1.insert (2, ".");
- а строка, когда в неё вставляются пробелы в своей длинне не изменяется и символы после вставленной позиции остаются на прежних местах...
Я вот никак не могу взять в толк есть рабочий код, зачем эти танцы с бубном?
Притом что добрая половина вещей уже и так перенеслась в проект. Чисто из желания абы не так как там?

0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
03.08.2014, 14:50  [ТС] #15
-=ЮрА=-, нет, я просто перенесла в проект то что поняла и с этим написала код
странно, в учебнике нашла применение insert и там кажется символы сдвигались..
0
03.08.2014, 14:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2014, 14:50
Привет! Вот еще темы с ответами:

Преобразование string в long double - C++
Одним из недостатков C++ является отсутствие для бизнес-программ встроенного типа для денежных значений, такого, как $173 698 001,32. ...

Преобразование типов (long -> массив char) - C++
Здравствуйте! имеется функция void sendchar(unsigned char data);не могу ее использовать т.к. не знаю как преобразовать long в...

Размер для данных (int, char, long, double, short, unsigned, float) - C++
Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию (о...

Как написать такое явное преобразование из double в unsigned long int - C++
как написать такое явное преобразование из double в unsigned long int??? спасибо всем кто поможет...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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