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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.65
Noname2512
4 / 4 / 1
Регистрация: 25.06.2010
Сообщений: 106
#1

непонятки - C++

02.08.2011, 13:40. Просмотров 4741. Ответов 81

у меня есть прога которая берет дабл и разделяет его на две сост. целое и дробное
C++
1
2
this->z = int(d);
this->p = ( d - int(d) )*100+0.5;
объясните почему без "+0.5" ничего не работает для чисел чья дробная часть( нечетная и меньше равна 9 )?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2011, 13:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос непонятки (C++):

непонятки с for - C++
Издавна мучает вопрос почему некоторые используют в цикле for ( int i = n; i < m ; i++), а другая часть населения for ( int i = n; i < m ;...

Непонятки с bind2nd - C++
Привет. Вот к примеру есть такой код: #include <algorithm> #include <functional> #include <iostream> #include <array> ...

Непонятки с классами - C++
Народ, уже всё перерыл, впервые с проблемой столкнулся :( Создаю консольное приложение: файл class.h #pragma once class Order{ ...

Непонятки с итераторами - C++
Здравствуйте, господа программисты. Пытался написать вот эту задачку, но получается что-то нехорошее. Помогите, пожалуйста! #include...

Непонятки со scanf - C++
char str_check; //строка для функции "check", которая проверяет введенные данные { scanf("%s",&str_check); } выскакивает...

Непонятки с wchar_t - C++
Прошу помощи: что-то не так с wchar_t. Не копирует имена файлов. Содержание program_config.txt config.cfg C:\\Projects\\abx.txt...

81
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
03.08.2011, 13:17 #61
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вбей вот так и давай забудем эту тему
Не смешно. Здесь нет целого, а округление производит cout.
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
03.08.2011, 13:57 #62
Цитата Сообщение от grizlik78 Посмотреть сообщение
округление производит cout
Кстати, тоже вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iomanip>
#include <sstream>
 
int main(){
    double d;
    
    while ( std::cout << "> " && std::cin >> d ){
        std::stringstream ss;
        int iPart, fPart;
        char ch;
        
        ss << std::fixed << std::setprecision(3) << d;
        ss >> iPart >> ch >> fPart;
        
        std::cout << "Int part: " << iPart << " Fract part: " << fPart << std::endl;
    }
    
    return 0;
}
1
grizlik78
03.08.2011, 13:59
  #63

Не по теме:

Чего только люде не сделают, чтобы 0.5 не прибавлять

0
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2011, 14:21 #64
Цитата Сообщение от grizlik78 Посмотреть сообщение

Не по теме:

Чего только люде не сделают, чтобы 0.5 не прибавлять

Напишу грубо т.к. устал от препинаний здесь, я не виноват что кто-то ТУГОЙ и за сout совсем с другой целью писал, вобщем ничего не прибавляю, не убавляю, вот тебе пример и тестируй на здоровье
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
//http://www.cyberforum.ru/cpp-beginners/thread338338.html
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
    char ch;
    double val;
 
    double fpart;
    double spart;
    do
    {
        printf("Enter double\r\n");
        scanf("%lf",&val);
 
        fpart = floor(val);
        spart = val - fpart;
        printf("%.0f RU %.0f KOP\r\n",fpart,100.0*spart);
 
        printf("Celay chast' %lf\r\n",fpart);
        printf("Drobn chast' %lf\r\n",spart);
 
        printf("[Y/N] - Y - Enter new value\r\n");
        ch = getch();
    }
    while(ch == 'Y' || ch == 'y');
    return 0;
}
0
Миниатюры
непонятки  
grizlik78
03.08.2011, 15:05
  #65

Не по теме:

Кто-то, ага. Теперь printf делает округление, что замечательно видно на скриншотах.
-=ЮрА=-, надеюсь ты не работаешь программистом, и не собираешься (я не работаю).

0
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2011, 16:02 #66
Цитата Сообщение от grizlik78 Посмотреть сообщение
Теперь printf делает округление, что замечательно видно на скриншотах.
Теперь понятно почему ты не работаешь программистов cout<< и printf осуществляют форматный вывод, который зависит от спецификаторов настройки этого самого вывода
Цитата Сообщение от easybudda Посмотреть сообщение
std::setprecision(3)
- задал число знаков после запятой,

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
printf("%.0f RU %.0f KOP\r\n",fpart,100.0*spart);
- я настроил вывод без запятых, что тебе ещё не ясно???Хочешь узнать как осуществляется работа cout или printf - напиши разработчикам в мсдн и попроси код, тогда и поймёшь за форматированный вывод дабл. На сим считаю, что тема сама себя исчерпала...Если атврору топика нужно будет само число, никто ему не запрещает использовать sprintf c теми же спецификаторами вывода

Изначально раделение дабл на компоненты шло во всех вариантах , потом тебе не давало покоя что вывод копеек не тот, вот тебе его вывели, ну и что ты кипишь как чайник???

Добавлено через 7 минут
grizlik78, в завершение привожу апдейт кода, чтобы у тебя отпало желание спорить в этом топике - заметь без 0,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
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
char s[2];
 
int main()
{
    char ch;
    double val;
 
    double fpart;
    double spart;
    int kop;
    do
    {
        printf("Enter double\r\n");
        scanf("%lf",&val);
 
        fpart = floor(val);
        spart = val - fpart;
        printf("%.0f RU",fpart);
        sprintf(s,"%0.f",100.0*spart);
        sscanf(s,"%d",&kop);
        printf(" %d KOP\r\n",kop);
        
        printf("Celay chast' %lf\r\n",fpart);
        printf("Drobn chast' %lf\r\n",spart);
 
        printf("[Y/N] - Y - Enter new value\r\n");
        ch = getch();
    }
    while(ch == 'Y' || ch == 'y');
    return 0;
}
Добавлено через 1 минуту
Жду следующих язв
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
03.08.2011, 16:21 #67
Да, последний код, наконец-таки, делает то, что нужно. Но делает он это посредством округления в (s)printf, нравится тебе это, или нет.

Не по теме:


Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что тебе ещё не ясно???
Мне с самого начала абсолютно всё ясно. И почему некоторые программы не работают, и почему некоторые работают. На уровне машинного представления целых и дробных чисел.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ну и что ты кипишь как чайник???
Я спокоен как бык

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
чтобы у тебя отпало желание спорить в этом топике
Да я что-то спора и не заметил. Из спора обычно обе стороны выгоду извлекают, у нас же никто. На этом и закончим.

0
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2011, 16:25 #68
Цитата Сообщение от grizlik78 Посмотреть сообщение
Но делает он это посредством округления в (s)printf, нравится тебе это, или нет.
Я с этим и не спорил, а этого добивался, сам за копейки начал...
Да думаю на сим на той теме надо ставить - CLOSED
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
03.08.2011, 16:28 #69
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я с этим и не спорил, а этого добивался, сам за копейки начал...
Дык ведь +0.5 делает это в десятки раз эффективнее, нежели printf.

Не по теме:

Вот блин, не сдержался. Ухожу-ухожу.

0
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2011, 16:53 #70
Цитата Сообщение от grizlik78 Посмотреть сообщение
Дык ведь +0.5 делает это в десятки раз эффективнее, нежели printf.
Чем эффективнее?+0,5 ты искажаешь введеное число, я считаю это неверным.
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
03.08.2011, 17:20 #71
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Жду следующих язв
Всегда пожалуйста:
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char s[2];
одна цифра только поместилась бы, а учитывая, что длинна строки в
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sprintf(s,"%0.f",100.0*spart);
вообще никак не проверяется, скорее всего грохнется програмка...

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Чем эффективнее?
видимо, тем, что простое арифметическое действие отработает быстрее, чем вызов двух функций (sprintf() + sscanf())...
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2011, 19:40 #72
Цитата Сообщение от easybudda Посмотреть сообщение
while ( printf("> ") && scanf("%lf", &val) == 1 ){
* * * * * * * * double tmp = signround(val * pow(10.0, PRECISION));
* * * * * * * * int64_t iPart = (int64_t)(tmp / pow(10.0, PRECISION));
* * * * * * * * int64_t fPart = lost_tail_zeros((int64_t)tmp % (int64_t)(pow(10.0, PRECISION)));
* * * * * * * * printf("Int part: %lld *Fract part: %lld\n", iPart, fPart);
- это эффективней, вызов цикла, возведение в степень, деление, преобразование типа...
Цитата Сообщение от easybudda Посмотреть сообщение
ss << std::fixed << std::setprecision(3) << d;
- остальные знаки наверное тоже не нужны?

Внимание сюрприз в Release версии нормально работает с s[2], забыл о мусоре в конце строк кода '\0' не поставил???Но если уж так хочешь чтобы всё было по букве закона можно s[3] поставить, сути єто НЕ ИЗМЕНИТ...
0
Миниатюры
непонятки  
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2011, 19:46 #73
Цитата Сообщение от easybudda Посмотреть сообщение
вообще никак не проверяется, скорее всего грохнется програмка...
Ну что проверил, грохнулась, видишь нет!
Жду новых замечаний
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.08.2011, 20:02 #74
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в Release версии нормально работает с s[2]
Работает до поры до времени, видимо случайный ноль в памяти позволил программе не падать. Это несерьезно.
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2011, 20:09 #75
Я уже чуть выше об этом написал
Цитата Сообщение от fasked Посмотреть сообщение
аботает до поры до времени, видимо случайный ноль в памяти позволил программе не падать. Это несерьезно.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
чтобы всё было по букве закона можно s[3] поставить
PS:Какое отношение к разделению double на целую и дробную части с возможностью записать требуемое число знаков после запятой в инт это всё имеет???? Все посты построены на каких то нападках на мой код(видимо всем сложно признать что замудрённые алгоритмы всё же хуже), в то время как искажение ввода, вызов цикла, отбрасывание разрядов, ненужное приведение типа как бы приветсвуется, где тут справедливость, а главное логика????
0
03.08.2011, 20:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2011, 20:09
Привет! Вот еще темы с ответами:

Непонятки по ссылкам - C++
Доброго времени суток! Помогите, пожалуйста разобраться. Изучаю ссылки и мне кое-что не понятно. Допустим мы объявили функцию: ...

Непонятки с синтаксисом - C++
В заголовочном файле мне встретилось такое описание класса: class source_mcast_reciever { uint16_t m_port; ...

Непонятки со списком - C++
Нашёл код в интернете и немного не понимаю его в некоторых местах. Объясните мне пожалуйста, зачем в коде вот тут: ...

непонятки с указателями - C++
Добрый день! изучаем плюсы, наткнулся на одну странную ситуацию, не могу сообразить, в чём дело... :( Есть структура - Point...


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

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

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