Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30

Не могу понять, куда пропадают сотые

17.11.2017, 23:37. Показов 1477. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include<iostream> 
#include<iomanip> 
#include <stdio.h>
#include  <math.h>
class money
{
public:
    money(bool pr = true);
    void display();
    money add(money s1);
    money sub(money s1);
    double div(money s1);
    money mulreal(double s1);
    money divreal(double s1);
    int equal(money s1);
private:
    unsigned long int x;
    int y;
};
 
int main(int argc, char* argv[])
{
    //setlocale(LC_ALL, "Russian");
    money x1(true), y1(true), z(false);
    double rez, koef;
    int rez1;
    scanf("%lf", &koef);
    z = x1.add(y1); //Сумма
    z.display();
    z = x1.sub(y1); //Разность
    z.display();
    rez = x1.div(y1); //Деление сумм
    printf("%10.6lf\n", rez);
    z = x1.divreal(koef); //Деление первой суммы на дробь
    z.display();
    z = y1.divreal(koef); //Деление второй суммы на дробь
    z.display();
    z = x1.mulreal(koef); //Уножение первой суммы на дробь
    z.display();
    z = y1.mulreal(koef); //Умножение второй суммы на дробь
    z.display();
    rez1 = x1.equal(y1);
    if (rez1 == 0) printf("equal \n");
    if (rez1 == 1) printf("greate \n");
    if (rez1 == -1) printf("less \n");
    int i, n;
    scanf("%ld", &n);
    money *mas;
    //mas = new money[n];
    for (i = 0; i<n; i = i + 1)
    {
 
        mas = new money[2];
        scanf("%lf", &koef);
        z = mas[0].add(mas[1]);
        z.display();
        z = mas[0].sub(mas[1]);
        z.display();
        rez = mas[0].div(mas[1]);
        printf("%10.6lf\n", rez);
        z = mas[0].divreal(koef); 
        z.display();
        z = mas[1].divreal(koef);
        z.display();
        z = mas[0].mulreal(koef);
        z.display();
        z = mas[1].mulreal(koef);
        z.display();
        rez1 = x1.equal(y1);
        rez1 = mas[0].equal(mas[1]);
        if (rez1 == 0) printf("equal \n");
        if (rez1 == 1) printf("greate \n");
        if (rez1 == -1) printf("less \n");
    }
    system("PAUSE");
    return 0;
}
money::money(bool pr)
{
    double prom;
    if (pr)
    {
        scanf("%lf", &prom); x = (int)prom; y = (int)((prom - x) * 100 + 0.5);
    }
    else
    {
        x = 0; y = 0;
    };
    //printf("x= %9d , y= %2d   ЧТО ТЫ ТАКОЕ\n",x,y);
};
void money::display()
{
    printf("%10d,%02d   \n", x, y);
};
money money::add(money s1)
{
    money temp(false);
    temp.x = x + s1.x;
    temp.y = y + s1.y;
    if (temp.y>100) { while (temp.y>100) { temp.y = temp.y - 100; temp.x = temp.x + 1; } };
    return temp;
};
money money::sub(money s1)
{
    money temp(false);
    long int prom1;
    if (x<s1.x) { temp.x = -x + s1.x; temp.y = -y + s1.y; };
    if (x>s1.x) { temp.x = x - s1.x;  temp.y = y - s1.y; };
    if (x == s1.x) { temp.x = 0; temp.y = abs(y - temp.y); };
    //printf(" sub %10d  %5d \n",temp.x,temp.y);
    if (temp.y<0) {
        //printf("yes \n");
        while (temp.y<0) { temp.y = temp.y + 100; temp.x = temp.x - 1; }
    };
    //printf("%10d  %5d\n",temp.x,temp.y);
    return temp;
};
double money::div(money s1)
{
    double temp; double prom1, prom2;
    prom1 = x + y / 100.0;
    prom2 = s1.x + s1.y / 100.0;
    temp = prom1 / prom2;
    //printf("%10.6lf\n",temp);
    return temp;
};
money money::mulreal(double s1)
{
    money temp(false);
    int del;
    double prom;
    prom = x + y / 100.00;
    prom = prom*s1;
    temp.x = prom;
    temp.y = ((prom - temp.x) * 100 +0.5);
    return temp;
};
money money::divreal(double s1)
{
    money temp(false);
    int del;
    double prom;
    prom = x + y / 100.00;
    prom = prom / s1;
    temp.x = (int)prom;
    temp.y = (int)((prom - temp.x) * 100 + 0.5);
    return temp;
};
int money::equal(money s1)
{
    int tmp;
    long int temp;
    temp = x * 100 - s1.y - s1.x * 100 + y;
    if (temp<0) tmp = -1;
    if (temp == 0) tmp = 0;
    if (temp>0) tmp = 1;
    return tmp;
};
Имеется такой код. Не могу понять, куда пропадают сотые доли при делении и умножении в divreal и mulreal. При чем они пропадают как-то рандомно, в некоторых вычислениях все хорошо, а в некоторых не хватает... Округление не помогает никак вообще.
Миниатюры
Не могу понять, куда пропадают сотые  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2017, 23:37
Ответы с готовыми решениями:

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

Куда подсоединить винчестер - не могу понять
Разобрал комп пару месяцев назад, сейчас понадобился - стал собирать, и не могу понять, куда втыкать провод от винчестера. Ситуация...

Не могу понять, куда делась память на SSD
Не могу понять, куда делась память на SSD. Сегдня произошло увеличение занятого объёма памяти. Я программировал, некорректно выполнил...

32
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30
18.11.2017, 11:34  [ТС]
Студворк — интернет-сервис помощи студентам
Вот задание
Миниатюры
Не могу понять, куда пропадают сотые  
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30
18.11.2017, 11:37  [ТС]
А здесь примеры тестов на сайте.
Миниатюры
Не могу понять, куда пропадают сотые  
Вложения
Тип файла: txt Тест 2.txt (869 байт, 2 просмотров)
0
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
18.11.2017, 11:39
xansi710, где класс LongLong вашем коде?
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30
18.11.2017, 11:40  [ТС]
Да это не суть важно, если честно. Прога не из-за этого ругается) он типа реализован по-другому, через x и y(целая и дробная части)
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
18.11.2017, 11:41
Цитата Сообщение от xansi710 Посмотреть сообщение
x = (int)prom; y = (int)((prom - x) * 100 + 0.5);
что будет если ввести 0.999?
чему будет равен y?а x?
Цитата Сообщение от xansi710 Посмотреть сообщение
unsigned long int x;
int y;
почему целая часть беззнаковая а дробная знаковая?
0
18.11.2017, 11:45

Не по теме:

Цитата Сообщение от xansi710 Посмотреть сообщение
а это не суть важно, если честно. Прога не из-за этого ругается) он типа реализован по-другому, через x и y(целая и дробная части)
Ага, вот у меня ору будет, если тест на сайте тупо считывает код на наличие класса LongLong. Мало ли что там профессора напридумывать могли):D
Просто создание класса потребует нескольких дней и там используются очень интересные алгоритмы, которые вас должны будут чему-то научить...

0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30
18.11.2017, 11:57  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
Сообщение от xansi710
unsigned long int x;
int y;
почему целая часть беззнаковая а дробная знаковая?
это я исправил у себя уже, тут чуть старая версия кода.
Цитата Сообщение от ValeryS Посмотреть сообщение
Сообщение от xansi710
x = (int)prom; y = (int)((prom - x) * 100 + 0.5);
что будет если ввести 0.999?
чему будет равен y?а x?
код не идеальный, не спорю, но мне просто надо сдать, если честно

Добавлено через 1 минуту
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Не по теме:
Сообщение от xansi710
а это не суть важно, если честно. Прога не из-за этого ругается) он типа реализован по-другому, через x и y(целая и дробная части)
Ага, вот у меня ору будет, если тест на сайте тупо считывает код на наличие класса LongLong. Мало ли что там профессора напридумывать могли)
я проверял через другой код (переделал у друга), с классом Long Long, но проблема с сотыми осталась, замена как сейчас с float не помогла там

Добавлено через 4 минуты
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Просто создание класса потребует нескольких дней и там используются очень интересные алгоритмы, которые вас должны будут чему-то научить...
Несколько дней, вот вот, это универ, преподу вобще дела нет ни до чего, а реализацию этого класса я видел, ужасная просто (для меня сложная из кучи строк кода)
По аналогии как у друга я сделал для себя
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
class LongLong {
public:
    int digit1, digit2, digit3, C1, C2, C3;
    double intpart1, intpart2, intpart3;
    long int intpart11, intpart21, intpart31;
    long int intpart12, intpart22, intpart13;
    void test();
    void category(long int ip, int dgt, long int &ip1, long int &ip2, int &c, int &dgtc);
};
void LongLong::category(long int ip, int dgt, long int &ip1, long int &ip2, int &c, int &dgtc) {
    ip1 = ip / dgt;
    if (ip1 > 0) {
        ip2 = abs(int(ip)) % dgt;
        c = 1;
    }
    else {
        ip2 = abs(int(ip)) % dgt;
        c = -1;
    }
    dgtc = dgt;
}
void LongLong::test() {
    if (abs(intpart1) / 1000 > 1) category(intpart1, 1000, intpart11, intpart12, C1, digit1);
    else if (abs(intpart1) / 100 > 1) category(intpart1, 100, intpart11, intpart12, C1, digit1);
    else if (abs(intpart1) / 10 > 1) category(intpart1, 10, intpart11, intpart12, C1, digit1);
    else {
        intpart11 = intpart1;
        intpart12 = 0;
        C1 = 0;
        digit1 = 1;
    }
    if (abs(intpart2) / 1000 > 1) category(intpart2, 1000, intpart21, intpart22, C2, digit2);
    else if (abs(intpart2) / 100 > 1) category(intpart2, 100, intpart21, intpart22, C2, digit2);
    else if (abs(intpart2) / 10 > 1) category(intpart2, 10, intpart21, intpart22, C2, digit2);
    else {
        intpart21 = intpart2;
        intpart22 = 0;
        C2 = 0;
        digit2 = 1;
    }
    //Тестим
    if (abs(intpart3) / 1000 > 1) category(intpart3, 1000, intpart31, intpart13, C3, digit3);
    else if (abs(intpart3) / 100 > 1) category(intpart3, 100, intpart31, intpart13, C3, digit3);
    else if (abs(intpart3) / 10 > 1) category(intpart3, 10, intpart31, intpart13, C3, digit3);
    else {
        intpart31 = intpart3;
        intpart13 = 0;
        C3 = 0;
        digit3 = 1;
    }
}
Добавлено через 3 минуты
Просто все упирается в сотые доли, которые не очень работают с float и double. С ними бы разобраться как-нибудь и достаточно бы было мне.

Добавлено через 1 минуту
SlavaSokolov, ValeryS, есть какой-нибудь способ разобраться просто с типом данных, чтобы работало на оба теста?
0
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
18.11.2017, 12:13
Зачем нужна 130 строка?
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30
18.11.2017, 12:20  [ТС]
SlavaSokolov, ни за чем, писал, да забыл убрать, операции делал(тестил версии разные), передумал потом, удалить забыл
0
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
18.11.2017, 12:33
xansi710, я тут проверяю mulreal и divreal, так они же работают правильно?
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30
18.11.2017, 12:34  [ТС]
SlavaSokolov, как бы по алгоритму да, но они выводят ответ чуть-чуть другой(сотые оличаются)
0
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
18.11.2017, 12:40
Дайте мне множитель и ценность моенты, которые дают неверное значение.
1
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 30
18.11.2017, 12:58  [ТС]
Я думаю, стоит закрыть тему. Я дописал "грязный код", все прокатило. Задача зачтена. И все были правы, код Админа "кривой", не знаю, почему только по нему все проверялось... и никто не захотел прислушаться... они правы и точка. Всем большое спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2017, 12:58

Не могу понять, куда уходить часть оперативной памяти
Вот скрины, нужна помощь.

Не могу понять куда делись 30 гигов дискового пространства
Здравствуйте , я уже не знаю что и делать весь интернет перерыл нет похожей проблемы дело в том что когда выбираю свойства локального диска...

Подскажите как пользоваться getch(), не могу понять куда вписывать
Пожалуйста подскажите как пользоваться функцией типа char getch(). Пытаюсь написать Hello world ! но программа сразу закрывается(я знаю...

Обработка нажатия на картинку, не могу понять куда тыкает пользователь
Друзья опять я к вам) Суть заключается в следующем, при нажатии на одну из картинок в базу должно заносится то что выбрал пользователь, не...

Никак не могу понять, куда именно впихивать сам исполняемый кусок, короче, что у меня тут не так? Пожалуйста, подсобите!
from tkinter import * import tkinter.messagebox as box window = Tk() window.title('Расчет индекса массы тела') #куда впихать...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru