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

Постоянная ошибка - C++

Восстановить пароль Регистрация
 
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
28.09.2013, 01:24     Постоянная ошибка #1
Здравствуйте. Пишу программу по расчёту мин. кол-ва банкнот и монет для набора суммы. При целых суммах всё нормально, но при вводе суммы с дробной части у 10-долларовой банкноты(почему-то только у неё, все остальные считаются правильно) происходят дикие вещи и переполнение. Не могу найти ошибку...помогите пожалуйста.

Код: http://pastebin.com/sKgXSZDy

P.S. Заранее спасибо =)

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
#include <stdio.h>
#include <conio.h>
#include <locale>
#include <windows.h>
//функция расчёта для количества купюр и монет при стандарт параметрах
void calculate(float summa, float bank[], float monet[],int kol_monet[],int kol_bank[])
{
        int i=0,p=0;
        while (summa!=0.0)
        {
                if (summa>=10.00)
                {
                        if (summa>=bank[i])
                        {
                        summa=summa-bank[i];
                        kol_bank[i]++;
                        }
                        else {i++;}
                }
                else
                {
                        if (summa>=monet[p])
                        {
                        summa=summa-monet[p];
                        kol_monet[p]++;
                        }
                        else p++;
                }
        }
}  
//функция вывода при стандарт параметрах
void vivod(int kol_bank[],float bank[],float monet[],int kol_monet[])
{
                for(int k=0;k<=5;k++)
        {
                if(kol_bank[k]!=0)
                printf("%-.0f$: %i\n", bank[k], kol_bank[k]);
        }
        for(int k=0;k<=5;k++)
        {
                if(kol_monet[k]!=0)
                printf("%-3.2f: %i\n", monet[k], kol_monet[k]);
        }
}
 
 
void main()
{
        //setlocale(LC_ALL, "Russian");
        float bank[]={5000,1000,500,100,50,10},monet[]={5,2,1,0.50,0.10,0.05},summa;
        int kol_bank[]={0,0,0,0,0,0},kol_monet[]={0,0,0,0,0,0};
        printf("Введите сумму: ");
        scanf("%f", &summa);
        calculate(summa, bank, monet,kol_monet,kol_bank);
        vivod(kol_bank,bank,monet,kol_monet);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2013, 01:24     Постоянная ошибка
Посмотрите здесь:

Постоянная Капрекара. C++
C++ постоянная ссылка
Запись из файла двумерного массива N x 2, где N -величина не постоянная C++
C++ измерения,задержка,цикличность,постоянная
C++ Число, переходящее само в себя, - постоянная Капрекара

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
28.09.2013, 03:42     Постоянная ошибка #2
Магические константы - зло (начнём с 13ой строки).
Во-вторых - откуда вообще 10-долларовые купюры взялись?.. Купюры похоже на рублёвые =)
Проблема в том, что десятичные числа плохо кодируются в двоичной системе исчисления и таким образом сильно теряется точность. Как вариант - использовать double. Или сделать свой тип на коленке.

Добавлено через 2 минуты
Алсо - пастбины это хорошо... если выбирать syntax highlight.
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
28.09.2013, 12:59  [ТС]     Постоянная ошибка #3
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Магические константы - зло (начнём с 13ой строки).
Где там магические?
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Во-вторых - откуда вообще 10-долларовые купюры взялись?..
Это моя собственная денежная система =)
Цитата Сообщение от AnyOne697 Посмотреть сообщение
использовать double
не помогло( Но я нашёл решение: нужно сравнивать не с 0, а с неким Epsilon, которое больше нуля, но меньше наименьшей монеты. Но спасибо, ты навёл меня на ошибку)
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
28.09.2013, 18:52     Постоянная ошибка #4
Цитата Сообщение от Xerocry Посмотреть сообщение
не помогло( Но я нашёл решение: нужно сравнивать не с 0, а с неким Epsilon, которое больше нуля, но меньше наименьшей монеты. Но спасибо, ты навёл меня на ошибку)
В принципе да, это тоже как вариант. Правда он может дать неправильный результат в некоторых особых случаях.

Добавлено через 2 минуты
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Магические константы - зло
Цитата Сообщение от Xerocry Посмотреть сообщение
Где там магические?
Это любая неимнованная константа. В 13ой строчке, емнип, было сравнение с 10.0. Почему 10.0, что это такое?.. В данном случае я довольно быстро догадался, но это просто программа не очень большая, да и относительно не далеко был от определения bank.
Алсо, транслит тоже очень и очень плохо. По крайне менее, если собираемся овладеть на профессиональном уровне программированием.
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
28.09.2013, 20:39  [ТС]     Постоянная ошибка #5
Цитата Сообщение от AnyOne697 Посмотреть сообщение
некоторых особых случаях.
Например?
Цитата Сообщение от AnyOne697 Посмотреть сообщение
транслит тоже очень и очень плохо.
Учту на будущее, спасибо :3
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
28.09.2013, 23:42     Постоянная ошибка #6
Цитата Сообщение от Xerocry Посмотреть сообщение
Например?
Когда точности будет не хватать. Сейчас Вы просто сверяете не со 100% точность, а скажем, с точностью 95%. И её сейчас хватает. А может так стасться, что где-то точности не хватит (монета достоинства меньше точности) и в результат может закрасться ошибка.
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
29.09.2013, 12:42  [ТС]     Постоянная ошибка #7
А как тогда повысить точность?(double использовать?)
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
29.09.2013, 12:48     Постоянная ошибка #8
Цитата Сообщение от Xerocry Посмотреть сообщение
А как тогда повысить точность?(double использовать?)
Как вариант. Или запилить свою структуру с преферансами и блудницами отдельным длинным целым числом и дробной частью.
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
29.09.2013, 12:50  [ТС]     Постоянная ошибка #9
Свои структуры писать не умею пока =(
Ладно, будем пытаться. Действительно теряется точность опять при больших числах-выявилось при тестах.
Yandex
Объявления
29.09.2013, 12:50     Постоянная ошибка
Ответ Создать тему
Опции темы

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