Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
12 / 12 / 3
Регистрация: 09.05.2010
Сообщений: 384
1

Ищу код перевода числа в строку и назад...

09.02.2012, 22:27. Показов 2512. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
itoa и atoi не подходят...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2012, 22:27
Ответы с готовыми решениями:

Алгоритм перевода шестнадцатеричного числа в десятичный код
помогите написать программу "алгоритм перевода шестнадцатиличного числа в десятичный код"

Функция перевода числа в строку
всем привет. написал такую вот функцию char* itoa(int i) { static char buf; char *p = buf +...

Найти алгоритм перевода числа в строку
Суть в чем, нужно перевести строку ( к примеру 3425.45 ) в строку вида ( три тысячи четыреста...

Разбиение числа на цифры без перевода в строку
Подскажите пожалуйста как разбить число на цифры, без перевода в строку? Есть идея через остаток...

21
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
09.02.2012, 22:45 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <sstream>
#include <iostream>
 
int main()
{
    std::string s("10.66");
    double num;
    std::stringstream ss;
    ss << s;
    ss >> num;
    ss.clear();
    std::cout << "num returns "<< num << std::endl;;
    num = 100.9;
    ss << num;
    ss >> s;
    std::cout << "s returns "<< s << std::endl;
    return 0;
}
2
Заблокирован
Автор FAQ
10.02.2012, 10:44 3
Цитата Сообщение от AKE Посмотреть сообщение
itoa и atoi не подходят...
- пробуй
C++
1
2
3
4
5
6
7
8
char buf[32];
int val;
cout<<"Enter number : ";
cin>>val;
sprintf(buf,"%d",val);
int ret;
sscanf(buf,"%d",&ret);
cout<<ret<<endl;
для работы необходимо подключить <stdio.h> для Си и <cstdio> для С++ и не городи велосипед с использованием stringstream...
0
Заблокирован
10.02.2012, 10:51 4
Юра, сложность в том, что sscanf оперирует целыми, либо float.
Он не умеет работать с double. Из-за этого досадного обстоятельства, не всегда подходит.
А для float, всякие специализированные atof работают быстрее, чем универсальный sscanf
0
Заблокирован
Автор FAQ
10.02.2012, 10:52 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
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
    int iVal;
    double dVal;
    char buf[256];
    cout<<"Enter integer : ";
    cin>>iVal;
    cout<<"Enter double  : ";
    cin>>dVal;
    sprintf(buf,"%d %lf",iVal,dVal);
    cout<<"String : "<<buf<<endl;
    iVal = 0;
    dVal = 0;
    sscanf(buf,"%d %lf",&iVal,&dVal);
    cout<<"GetVal :\n"
        <<"integer : "<<iVal<<endl
        <<"double  : "<<dVal<<endl;
    system("pause");
    return 0;
}
Миниатюры
Ищу код перевода числа в строку и назад...  
0
Заблокирован
Автор FAQ
10.02.2012, 10:55 6
Цитата Сообщение от Bers Посмотреть сообщение
Юра, сложность в том, что sscanf оперирует целыми, либо float.
Он не умеет работать с double. Из-за этого досадного обстоятельства, не всегда подходит.
А для float, всякие специализированные atof работают быстрее, чем универсальный sscanf
- да неужели???
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sprintf(buf,"%d %lf",iVal,dVal);
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sscanf(buf,"%d %lf",&iVal,&dVal);
0
Заблокирован
Автор FAQ
10.02.2012, 11:00 7
Bers, ну так как, чё молчишь то???
Код Си для большего понимания что может scanf а что нет...
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
#include <stdio.h>
 
int main()
{
    int iVal    = 0;
    double dVal = 0;
    char buf[256];
    printf("Especialy for Bers\n");
    printf("Enter integer : ");
    scanf("%d",&iVal);
    printf("Enter double  : ");
    scanf("%lf",&dVal);
    sprintf(buf,"%d %lf",iVal,dVal);
    printf("String : %s\n",buf);
    iVal = 0;
    dVal = 0;
    sscanf(buf,"%d %lf",&iVal,&dVal);
    printf
    (
        "GetVal :\n"
        "integer : %d"
        "double  : %lf",
        iVal,dVal
    );
    getchar();
    return 0;
}
Миниатюры
Ищу код перевода числа в строку и назад...  
0
Заблокирован
10.02.2012, 11:34 8
Вот щас проверил:

C++
1
2
double dVal=123456.123456789; char buf[256]; 
    sprintf(buf,"%lf",dVal); //123456.123457
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
0
Заблокирован
Автор FAQ
10.02.2012, 11:38 9
Цитата Сообщение от Bers Посмотреть сообщение
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
- об этом уже велась речь на форуме, найду ссылку - сброшу...

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Ээээ... какой такой мой scanf? О чем речь вообще?
- посчитал что ставишь float т.к. на старых компиляторах double val;scanf("%lf",&val); без начального инита вылетает...
0
Заблокирован
10.02.2012, 11:45 10
Кстати, stringstream имеет такие же сложности с double.

Поэтому, что бы не иметь потерь данных, лично я глянул вот в эту сторону:

_fcvt_s
_gcvt_s

Вообще, их там целое семейство разных. Но мне вот этих двух за глаза хватило.
0
Заблокирован
Автор FAQ
10.02.2012, 11:54 11
Цитата Сообщение от Bers Посмотреть сообщение
имеет такие же сложности с double.
пока ищу почитай здесь
http://stackoverflow.com/quest... ith-just-f

Because C will promote floats to doubles for functions that take variable arguments. Pointers aren't promoted to anything, so you should be using %lf or %g to read in doubles.
Добавлено через 17 секунд
Хотя я сейчас и за lf найду...

Добавлено через 4 минуты
Bers, вот тут чёрным по белому написано

http://www.dgp.toronto.edu/~aj... rintf.html

Footnote: In printf(), the rvalue type promotions are expected. Thus %c actually corresponds to a parameter of type int and %f and %g actually correspond to parameters of type double. Thus in printf() there is no difference between %f and %lf, or between %g and %lg. However, in scanf() what is passed is a pointer to the variable so no rvalue type promotions occur or are expected. Thus %f and %lf are quite different in scanf, but the same in printf.
0
Заблокирован
Автор FAQ
10.02.2012, 12:00 12
Вот и скрин в потдверждение - scanf парсит всё число, всё дело в выводе
Миниатюры
Ищу код перевода числа в строку и назад...  
0
Заблокирован
10.02.2012, 12:05 13
так и я тоже в отладчике смотрел
0
Заблокирован
Автор FAQ
10.02.2012, 12:09 14
Цитата Сообщение от Bers Посмотреть сообщение
так и я тоже в отладчике смотрел
- ну и что тебе не нравится?
0
Заблокирован
10.02.2012, 12:16 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ну и что тебе не нравится?
Мне не нравится:

C++
1
2
double dVal=123456.123456789; char buf[256]; 
    sprintf(buf,"%lf",dVal); //123456.123457
Что в буфер он записал весьма весьма округленное число.
0
Заблокирован
Автор FAQ
10.02.2012, 12:58 16
Цитата Сообщение от Bers Посмотреть сообщение
Что в буфер он записал весьма весьма округленное число.
-

Bers, мне порядком поднадоела наша дискуссия, для тебя и для всех читающих код
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
#include <stdio.h>
 
int main()
{
    int iVal    = 0;
    double dVal = 0;
    char buf[256];
    printf("Especialy for Bers\n");
    printf("Enter integer : ");
    scanf("%d",&iVal);
    printf("Enter double  : ");
    scanf("%lf",&dVal);
    sprintf(buf,"%d %.11f",iVal,dVal);
    printf("String : %s\n",buf);
    iVal = 0;
    dVal = 0;
    sscanf(buf,"%d %lf",&iVal,&dVal);
    printf
    (
        "GetVal :\n"
        "integer : %d"
        "double  : %.11f",
        iVal,dVal
    );
    getchar();
    return 0;
}
PS:Bers, для тебя ещё раз объясняю - в
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
scanf("%lf",&dVal);
ключ lf имеет значение, в printf вывод дефалтится до 6-й цифр после запятой т.е. до float если надо больше цифирей вывести - юзай соотвествующий спецификатор вывода...
Пост 12 ещё раз для понимания
Миниатюры
Ищу код перевода числа в строку и назад...  
0
Заблокирован
Автор FAQ
10.02.2012, 13:01 17
Конечно смело пишу, но предлагаю администрации вынести код выше пост 17 в раздел часто рассматриваемых вопросов, т.к. невыносимо каждый раз чиать, а почему printf округляет, а почему в scanf ключ lf чувствуется а в printf нет, ИМХО взяли погуглили и не терзайте людям нервы...
0
Заблокирован
Автор FAQ
10.02.2012, 13:17 18
Т.к. всерьёз думаю что ко мне прислушаются, вот более менее подправленный код и тест, а то по предыдущему тесту всё не достаточно прозрачно видно
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
#include <stdio.h>
 
int main()
{
    int iVal    = 0;
    double dVal = 0;
    char buf[256];
    printf("Especialy for Bers\n");
    printf("Enter integer : ");
    scanf("%d",&iVal);
    printf("Enter double  : ");
    scanf("%lf",&dVal);
    sprintf(buf,"%d %.11f",iVal,dVal);
    printf("String : %s\n",buf);
    iVal = 0;
    dVal = 0;
    getchar();
    sscanf(buf,"%d %lf",&iVal,&dVal);
    printf
    (
        "GetVal :\n"
        "integer : %d\n"
        "double  : %.11f\n",
        iVal,dVal
    );
    getchar();
    return 0;
}
Миниатюры
Ищу код перевода числа в строку и назад...  
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.02.2012, 22:15 19
Цитата Сообщение от Bers Посмотреть сообщение
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
у double есть экспоненциальная форма, у float таковая отсутствует
http://liveworkspace.org/code/... c7926b9d4b

Добавлено через 5 минут
Цитата Сообщение от AKE Посмотреть сообщение
itoa и atoi не подходят...
обоснуй почему не подходят?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
10.02.2012, 22:54 20
Цитата Сообщение от Bers Посмотреть сообщение
Что в буфер он записал весьма весьма округленное число.
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void){
    double dVal=123456.123456789; char buf[256]; 
        sprintf(buf,"%.9lf",dVal); //123456.123457 - да ну?!
    printf("%s\n", buf);
    
    return 0;
}
Код
~/cpp/numbers $ gcc -o double double.c 
~/cpp/numbers $ ./double
123456.123456789
~/cpp/numbers $
Инструкции внимательнее читать надо.
0
10.02.2012, 22:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2012, 22:54
Помогаю со студенческими работами здесь

Написать функцию перевода числа в двоичный код
Добрый день всем! У меня маленьккая просьбочка подскажите функцию паскаль по перевода числа в его...

Сколько цифр после запятой (без перевода числа в строку)
Добрый день! На вход компьютеру поступает любое вещественное число, например 303,5703 Читает он...

Получение определенной цифры числа без перевода его в строку
Доброго времени суток! Только начинаю осваивать Ruby, появился такой вопрос: Как получить...

Построить машину Тьюринга которая реализует операцию перевода числа в прямой код
Построить машину тьюринга,которая реализует операцию перевода числа в прямой код.Заранее спасибо)


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru