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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
01.08.2014, 22:39     Преобразование long double в char #1
Вернемся к обсуждению денежных строк из упражнения 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2014, 22:39     Преобразование long double в char
Посмотрите здесь:

C++ Преобразование long double в string
Преобразование типов (long -> массив char) C++
C++ Конвертирование массива char в long double
Как преобразовать long double в char[]? C++
long double и char C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2014, 23:23     Преобразование long double в char #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;
}
Миниатюры
Преобразование long double в char  
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
02.08.2014, 14:07  [ТС]     Преобразование long double в char #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Pari, вот прямолинейно и просто
честно говоря, плохо понимаю ваше простое решение, особенно с типом bool
я не знаю что такое cin.clear() и cin.sync();
короче, я половины не понимаю из написанного вами.

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

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

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

Не по теме:

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

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

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

Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
03.08.2014, 14:50  [ТС]     Преобразование long double в char #15
-=ЮрА=-, нет, я просто перенесла в проект то что поняла и с этим написала код
странно, в учебнике нашла применение insert и там кажется символы сдвигались..
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
06.08.2014, 11:10     Преобразование long double в char #16
-=ЮрА=- только наверное
C++
1
ipart = long(value);
вместо
C++
1
ipart = long long(value);
, а то у меня компилятор ругается.
-=ЮрА=-
Заблокирован
Автор FAQ
06.08.2014, 14:41     Преобразование long double в char #17
isaak, да это верно,недосмотрел.
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
06.08.2014, 17:27     Преобразование long double в char #18
Цитата Сообщение от Pari Посмотреть сообщение
так надо же заканчивать строку нулевым символом, вроде?..
да, но у тебя последний элемент под индексом 29 а не 30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 09:50     Преобразование long double в char
Еще ссылки по теме:

Преобразование string в long double C++
C++ Преобразование строки в long double
C++ Преобразование массива char в массив long long

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
07.08.2014, 09:50     Преобразование long double в char #19
Цитата Сообщение от isaak Посмотреть сообщение
-=ЮрА=- только наверное
Код C++
1
ipart = long(value);
вместо
Код C++
1
ipart = long long(value);
, а то у меня компилятор ругается.
- так ещё раз
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if( bFlag = true )
* * * * {
* * * * * * ipart = long long(value);
* * * * * * fpart = value - ipart;
* * * * }
isaak, стоп стоп стоп. Мы рассматрвиали long double и тип там правильный long long. Вчера когда я отвечал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
да это верно,недосмотрел.
воспринял втой пост с точностью до наоборот: "подумал что long long не проставил, тогда я писал изначальную чать кода в 6-ке, потом кинул в кодпад и подправил типы". Итак, если преобразовываем long double - нужно предусмотреть для хранения целой части тип который сможет вместить все разряды перед запятой, таким типом является long long(!), в случае использования обычного лонга и достатоно большого значения long double может произойти переполнение!
Yandex
Объявления
07.08.2014, 09:50     Преобразование long double в char
Ответ Создать тему
Опции темы

Текущее время: 23:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru