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

Не определяется функция _atold - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
22.08.2010, 17:00     Не определяется функция _atold #1
Почитал про данный метод. На сколько я понял, он может привести массив char к типу double.
Так же, указано, что он принадлежит к stdlib.h или к math.h
Только вот в моем случае, при подключении данных библиотек, метод _atold() подчеркивается красным цветом, т.е. не определяется. Может я что-то не так делаю?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
22.08.2010, 23:09  [ТС]     Не определяется функция _atold #21
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну тогда вы не находите разницу между вашими ожиданиями и тем, что собственно делают эти функции?
Если это утверждение, то возможно. Я не думаю, что Вы в начале пути изучения данного языка, полностью понимали что делают те или иные функции. Бравирование своими сегодняшними знаниями, не вспоминая о том, что когда -то были в такой же ситуации, мягко говоря, некрасиво.

Если это вопрос, то в принципе, ответ тот же самый.

Добавлено через 1 минуту
В данный момент есть проблема:
Цитата Сообщение от half-node Посмотреть сообщение
Добавлено через 2 минуты
C++
1
d_money  = strtod (t_money,NULL);
Выдает только первую цифру. t_money - char массив, d_money - double
Если есть чем помочь, буду очень благодарен, если нет, то хотя бы по существу помогите, либо по существу промолчите ). Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.08.2010, 23:29     Не определяется функция _atold #22
half-node, покажите содержимое t_money при котором получается неверный результат.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
22.08.2010, 23:40  [ТС]     Не определяется функция _atold #23
С вашего позволения, повторю код.
Повторюсь, топорно... но как есть)
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cstring>
using namespace std;
 
class money
{
private:
    char t_money[25];
    long double d_money;
public:
    money():d_money(0.0)
    {};
 
    void get_d_money(char sum[], int k)
    {
        int n,len,len2=0;
        len = strlen(sum);
        for(int i=0;i<25;i++)
            t_money[i]=' ';
        for (n=0; n<len;n++)
        {
            if (isdigit(sum[n]) || sum[n] == '.')
                t_money[len2] = sum[n];
                len2++;
        }
        //double atof(t_money[len2]);
        //cout << "Number: " << t_money;
 
        d_money  = strtod (t_money,NULL);
        cout << d_money;
        //d_money = strtod(t_money);
    }
 
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    money mm;
    int i=0;
    char inp[25];
    cout << "Enter money: ";
    cin >> inp;
    mm.get_d_money(inp,25);
    
    getch();
    return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.08.2010, 23:43     Не определяется функция _atold #24
half-node, еще раз: приведите пример строки, которую вы передаете в strtod.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
22.08.2010, 23:48  [ТС]     Не определяется функция _atold #25
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
half-node, еще раз: приведите пример строки, которую вы передаете в strtod.
Передается почему-то такая
>>здесь<<
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
22.08.2010, 23:57     Не определяется функция _atold #26
C++
1
2
3
4
{
  t_money[len2] = sum[n];
  len2++;
}
или даже

C++
1
2
if( ... )
  t_money[len2++] = sum[n];
Добавлено через 4 минуты
И ещё.
Используйте
C++
1
cin.getline( buf, BUF_SIZE )
вместо
C++
1
cin >> buf
Почему ? Второй вариант читает до пробела/табуляции.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
23.08.2010, 00:02  [ТС]     Не определяется функция _atold #27
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
Используйте
C++
1
cin.getline( buf, BUF_SIZE )
вместо
C++
1
cin >> buf
Почему ? Второй вариант читает до пробела/табуляции.
Да, спасибо. Я знаю о данной функции. Но здесь нет пробелов. А вообще да, Вы полностью правы.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.08.2010, 00:31     Не определяется функция _atold #28
half-node, Вы можете написать руками строку, которая при передаче в функцию приводит к неверным результатам?! Просто напишите сюда строку которая передается, без всяких скриншотов, кодов и т.д. и т.п., в третий раз Вас прошу.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
23.08.2010, 00:32     Не определяется функция _atold #29
CyBOSSeR
"$1,434,453.34"
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.08.2010, 00:38     Не определяется функция _atold #30
half-node, Вы хотите, чтобы функция strtod преобразовала строку "$1,434,453.34" в число?! Не получится. Вот так можно "1434453.34". Сначала приведите строку к виду воспринимаемому strtod, а уж потом передавайте.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
23.08.2010, 01:00  [ТС]     Не определяется функция _atold #31
Нет, я конечно же перевожу строку к виду "1434453.34"
вот:
C++
1
2
3
4
5
6
for (n=0; n<len;n++)
                {
                        if (isdigit(sum[n]) || sum[n] == '.')
                                t_money[len2] = sum[n];
                                len2++;
                }
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.08.2010, 01:16     Не определяется функция _atold #32
half-node, ну правильно, вы зачем-то len2 увеличиваете на каждой итерации цикла, вместо того, чтобы делать это только при необходимости... Короче, фигурные скобки для if кто писать будет?
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
23.08.2010, 01:37  [ТС]     Не определяется функция _atold #33
блин. там все правильно было..это я зачем-то вынес, не пойми зачем.
Было так:
C++
1
2
3
4
5
for (n=0; n<len;n++)
   {
      if (isdigit(sum[n]) || sum[n] == '.')
      t_money[len2++] = sum[n];
   }
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.08.2010, 01:47     Не определяется функция _atold #34
half-node,
И тем не менее не работает?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.08.2010, 01:57     Не определяется функция _atold #35
half-node, вообще странная затея хранить в классе одно и то же значение сразу в виде числа и символьного массива. При изменении одного поля нужно сразу и второе корректировать. Да и память зря расходуется. Храните в классе количество денег в переменной типа double и определите в нём помимо прочего два метода, один из которых возвращает представление суммы в виде строки, а второй наоборот из строки получает значение и сохраняет его в переменной...
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
23.08.2010, 10:03  [ТС]     Не определяется функция _atold #36
В общем, дабы не ходить из стороны в сторону предоставлю текст задания:
Одним из недостатков С++ является отсутствие для бизнес-программ встроенного типа для денежных значений, такого, как $173 698 001,32.
Такой денежный тип должен иметь возможность для хранения числа с фиксированной десятичной точкой точность около 17 знаков, которого было бы достаточно для хранения национального долга в долларах и центах. К счастью, встроенный тип С++ 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.
Это задание 7 из 12и. Они растут по сложности. В оправдание себе хочу сказать, что все остальные 11 я уже решил. А с этим какой-то злой рок.

п.с. Указатели мы с Лафоре еще не проходили

Добавлено через 6 часов 57 минут
Поднимись ка чуть повыше...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2010, 14:41     Не определяется функция _atold #37
half-node, я тоже занимаюсь по Лафоре, и тоже решал эту задачу, и у меня тоже не работала функция _atold() ( atold() ), в конце концов я решил эту задачу через стандартный string.
stold() - конвертит объекты класса string в long double, кода к сожалениею не сохранилось.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
23.08.2010, 14:46  [ТС]     Не определяется функция _atold #38
Спасибо. Я так и понял, что здесь какой-то косяк. Может быть такое, например, что Лафоре писал свою книгу еще во времена VS6, а сегодня уже, вон, VS2008-2010
_Medved
3 / 3 / 1
Регистрация: 21.03.2011
Сообщений: 3
21.03.2011, 17:38     Не определяется функция _atold #39
Тоже занимаюсь по Лафоре. И тоже столкнулся с этим заданием. Вот, что получилось у меня, на основе, изученных мною, предыдущих глав. Может кому-то пригодится.

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 <cstring>
#include <stdlib.h>
#include <iomanip>
 
using namespace std;
 
class money
{
    private:
    string s1;
    long double dmoney;
    public:
    void mstold();
};
 
void money::mstold()
{
    string s2;
    char chmoney[19];
 
    cout << "Enter the sum of money: ";
    getline(cin, s1);
 
    int num = s1.find_first_of("0123456789.");
    while( num != -1 )
    {
        s2 = s2.append(1, s1.at(num) );
        num = s1.find_first_of("0123456789.", num+1);
    }
    int wlen = s2.size();
 
    s2.copy(chmoney, wlen, 0);
 
    if (strlen(chmoney) > 18)
    {
        exit(1); cout << "Error! The array is full!";
    }
    else dmoney = atof(chmoney);
 
    cout << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2) << dmoney;
};
 
int main()
{
    money m1;
 
    m1.mstold();
 
    return 0;
}
Только при вводе: $1,234,567,890,123.99
Вывод будет такой: 1234567890124.00

Не знаю почему последнии две "99" округляются.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2011, 16:43     Не определяется функция _atold
Еще ссылки по теме:

Последовательность многочленов T0(x),T1(x),. определяется следующим образом C++
Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений C++
C++ Не определяется идентификатор

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

Или воспользуйтесь поиском по форуму:
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
20.04.2011, 16:43     Не определяется функция _atold #40
Тут вроде бы последние 99 не округляются Но побороть возможность выхода за пределы массива что-то не получается (т.е. можно ввести, например, 1111111111111111111,1111111 и произойдет что-нибудь нехорошое).
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
class money
{
private:
    double n;
public:
    double mstold(char strm[])
    {
        string s="0123456789.";
        char retstr[20];
        for(int i=0, j=0; i<strlen(strm); i++)
            if( s.find_first_of(strm[i]) < s.size() )
                retstr[j++]=strm[i];
        n = atof(retstr);
        return n;
    }
};
 
 
int main()
{
    money m1;
    char strm[20], yn;
    do
    {
        cout << "Enter: ";
        cin >> setw(22) >> strm;
        cout << "You entered: $" << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2) << m1.mstold(strm);
        cout << "\nContinue?(y/n)"; cin >> yn;
    } while(yn!='n');
 
    return 0;
}
Yandex
Объявления
20.04.2011, 16:43     Не определяется функция _atold
Ответ Создать тему
Опции темы

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