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

Функция _atold - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
6a6kin
 Аватар для 6a6kin
232 / 102 / 2
Регистрация: 18.04.2010
Сообщений: 295
05.07.2010, 09:42     Функция _atold #1
встал вопрос о функции _atold(_atoldbl)
Дело в том, что функция _atold не существует(была указана в учебнике), а _atoldbl просит в качестве первого аргумента числа типа _LDOUBLE*, а компилятор, естественно, ругается на указанный 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
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
void main( void )
{
    char* omg = "1234.54233";
    cout.setf(ios::fixed);
    cout.precision(5);
    cout << atold(omg);
 
    _getch();
}
 
double func( double x, int n )
{
    double value = x;
    if( n == 0 )
    {
        value = 1;
    } else if( n > 0 )
    {
        for( int i = 1; i < n; i++ )
        value *= x;
    } else
        value = 1/func(x,labs(n));
 
    return value;
}
 
long double atold( char str[] )
{
    int numb[10] = {0,1,2,3,4,5,6,7,8,9};
    char numbs[10] = {48,49,50,51,52,53,54,56,56,57};
 
    long double value = 0.0;
 
    int len = strlen(str), b = 0, y = 0;
 
    for( int i = 0; i < len; i++ )
        if( str[i] == '.' )
            y = len-i;
 
    for( int i = len-1; i >= 0; i-- )
    {
        if( str[i] == '.' )
        {
            b = 1;
            y = -1;
        } else
        {
            int n = 0;
            for( int q = 0; q < 10; q++ )
                if( str[i] == numbs[q] )
                    n = numb[q];
 
            if( b == 0)
            {
                y--;
                value += n*func(10, -y);
            } else
            {
                y++;
                value += n*func(10, y);
            }
        }
 
    }
 
    return value;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vint456
 Аватар для Vint456
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 14
06.11.2010, 13:49     Функция _atold #2
А можешь прокомментировать свои действия по всему твоему коду, очень тяжело разобраться для начинающего.
не могу понять смысла массива элементов char.
По моему это строчка невозможна никогда,либо я не могу понять ее смысл.

Цитата Сообщение от 6a6ka Посмотреть сообщение
C++
1
2
 if( str[i] == numbs[q] )
          n = numb[q];
потому что он допустим 6 будет сравнивать с 54( хоть это и символы) но они не будут равны.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
06.11.2010, 14:38     Функция _atold #3
strtod(), strtold() - есть такие функции ?

И кстати компилятор бы хоть указал что-ли
А то компиляторы понимаешь разные бывают - в одних нету, в других есть
6a6kin
 Аватар для 6a6kin
232 / 102 / 2
Регистрация: 18.04.2010
Сообщений: 295
20.11.2010, 01:24  [ТС]     Функция _atold #4
Суть моей функции в том, чтобы использовать ASCII-код символа из принимаемой строки.
Мы берем эквивалент цифровой и фактически используем формулу перевода в десятичную систему. Правда, из десятичной системы, тоже))

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
double func( double x, int n ) //функция, которая возвращает числов в n-степени
{
        double value = x;
        if( n == 0 ) //степень равна нулю - значение равно 1(тут можно сразу использовать return)
        {
                value = 1;
        } else if( n > 0 )//если степень полож. - возводим число в степень, умножая его самом на себя n-раз
        {
                for( int i = 1; i < n; i++ )
                value *= x;
        } else //если отрицательная  - делим на единицу число в степени n
                value = 1/func(x,labs(n));
 
        return value;
}
 
long double atold( char str[] )
{
        int numb[10] = {0,1,2,3,4,5,6,7,8,9};
        char numbs[10] = {48,49,50,51,52,53,54,56,56,57}; //массив кодов
 
        long double value = 0.0;
 
        int len = strlen(str), b = 0, y = 0;
 
        for( int i = 0; i < len; i++ ) //получаем самый маленький разряд до точки
                if( str[i] == '.' )
                        y = len-i;
 
        for( int i = len-1; i >= 0; i-- ) //обрабатываем исходную строку, начиная с конца
        {
                if( str[i] == '.' ) //если мы пришли к "точке", устанавливаем целочисленные "режимы" 
                {
                        b = 1; //режим(0 - дробный, 1 - целочисленный)
                        y = -1; //сбрасываем счетчик степени(разряда)
                } else
                {
                        int n = 0;
                        for( int q = 0; q < 10; q++ )
                                if( str[i] == numbs[q] ) //сравниваем код символа с таблицей символов
                                        n = numb[q]; //устанавливаем численный эквивалент
 
                        if( b == 0) //режим - дробная часть
                        {
                                y--; //уменьшаем счетчик степени(разряда)
                                value += n*func(10, -y); //приводим число к нужному разряду и суммируем с возвращаемым
                        } else //режим - целая часть
                        {
                                y++; //увеличиваем счетчик степени(разряда)
                                value += n*func(10, y); //приводим число к нужному разряду и суммируем с возвращаемым
                        }
                }
 
        }
 
        return value;
}

odip, это было давно и для меня сейчас не актуально
Yandex
Объявления
20.11.2010, 01:24     Функция _atold
Ответ Создать тему
Опции темы

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