Member 13418834 Ответов: 2

Как мне получить правильную сумму сдачи?


Мне нужно определить проблему в моем коде, это программа покупки билетов, и я предполагаю, что получаю сдачу, но вычисляется неправильная сумма, и я не могу понять почему. Вот код:
// Author:			John Moye
// Source file:		amuseProj.cpp
// Description: Amusement Park Project
// IDE used: XCode

#include <iostream>
#include <iomanip>
using namespace std;

 // Constants

const double CHILDPRICE = 12.00;
const double ADULTPRICE = 20.50;

int main ()
{
    
    // integers
   
    int childTix;
    double childTotal;
    double changeTotal;
    int adultTix;
    double totalBill;
    double adultTotal;
    double cashReceived;
    int ticketTotal;
    int confirmN;
    
    
    
    
    //title
    
    cout << "\n           Chesapeake Amusement Park" << endl << endl;
    
    
    
    
    cout << "\n  Enter children tickets (enter -1 to stop)....";
    confirmN= 99;
    cin >>childTix;
    
    while (childTix > 0)
        
    {
    
    childTix = childTix - (childTix/4);
    
    
    
    
    
    
    cout << "\n  Enter adult tickets...";
    
    cin >>adultTix;
        
  
  
      adultTotal = (adultTix * ADULTPRICE) - 3;
  
        
        confirmN ++;
        
        

        
  
       
    
    
    ticketTotal = adultTix + childTix;
        
 
    childTotal = childTix * CHILDPRICE;
    
    adultTotal = adultTix * ADULTPRICE;
    
    totalBill = adultTotal + childTotal;
    
        
    
    
        
        
        

        
    
        
  
    
    
    
    
    
    
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(2);
    
    cout << "\n\n                 Chesapeake Amusement Park";
    cout << "\n                 -------------------------";
    cout << "\n\n               Tickets      Price      Total\n";
    
    
    
    cout << "     Children   " << setw(3)  << childTix
                               << setw(14) << CHILDPRICE
                               << setw(11) << childTotal;
    
    cout << "\n     Adults     " << setw(3)  << adultTix
                               << setw(14) << ADULTPRICE
                               << setw(11) << adultTotal;
        
        
        
    cout <<"\n\n    Total Tickets:" << setw(3) << ticketTotal;
    
        
    if ( (ticketTotal > 20) || (childTix >= 14))
        cout << "\n\n Total Bill...               "<< setw(11)  << totalBill+15;
        
       
        
        
    else
      cout << "\n\n     Total Bill...               " << setw(11)  <<totalBill;
    
   
    
    cout << "\n\n Enter the amount you're going to pay:";
    
    cin >>cashReceived;
    
      
    
    cout << "\n\n     Cash Received              "<< setw(11)  <<cashReceived;
     
        
       
        do
        {
            cout << "\n\n Cash received is not enough, please give the total amount";
            cin >> cashReceived;
            
        }
        while (cashReceived < totalBill);
        cout << " \n\n Thank you";
        
        
        
       
    changeTotal = cashReceived - totalBill;
    
    cout << "\n\n     Change                      " << setw(11)  << changeTotal;
    cout << "\n\n     Confirmation Number:        " << setw(11)  << confirmN;
   
    
        
        cout << "\n\n     Enter children tickets (enter -1 to stop)...." << setw(11);
        
        cin >> childTix;
    
    }
    
    cout << "\n\n     Come back again soon        " << setw(11);
    
              
    
    
    
return 0;

}
[edit]добавлен блок кода-OriginalGriff [/edit]

Что я уже пробовал:

Я пробовал делать новые дубли и перемещать код в разные места

Richard MacCutchan

Не используйте двойные типы для финансовых приложений, они по своей сути неточны. Используйте десятичные типы, если они доступны, или целые числа, где каждое значение преобразуется в самый низкий тип денег (например, центы, пайсы и т. д.).

2 Ответов

Рейтинг:
1

OriginalGriff

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

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

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить почему. Поставить точку останова на строке:
while (childTix > 0)

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!

Да, я, наверное, мог бы сказать вам, в чем "проблема" - но сделать это самому несложно, и при этом вы узнаете что-то действительно стоящее!


Рейтинг:
0

Patrice T

Цитата:
Мне нужно определить проблему в моем коде, это программа покупки билетов, и я предполагаю, что получаю сдачу, но вычисляется неправильная сумма, и я не могу понять почему.

Вы только забыли сказать нам, что должен делать ваш код и в чем заключается неправильное изменение. Мы не можем знать, чего вы ожидаете.
Цитата:
Я пробовал делать новые дубли и перемещать код в разные места

Случайные изменения не являются жизнеспособным решением. Единственный способ - понять, в чем ошибка кода. Отладчик - это инструмент, который позволяет вам видеть, что делает ваш код, и проверять переменные при выполнении кода.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.