Изменяются ли мои методы по мере их выполнения? - PullRequest
1 голос
/ 03 апреля 2019

ОБНОВЛЕНИЕ: Объединив первые два метода в один, мои результаты стали надежными.Таким образом, проблема заключалась в том, что переменные, указанные во втором методе, не были инициализированы, даже если они были в первом методе.Каким образом я смогу сослаться на значение двойных IntegralSlices в методе один из второго метода?

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

Я протестировал следующий код в контексте обработчика событий кнопки с тестовыми данными 13,5 для диаметра и 6 для количества гостей, с проверкой результатов.Помещение кода в три метода и вызов их с помощью обработчика событий каждый раз дает, казалось бы, случайный результат.При каждом последующем щелчке по обработчику событий значения слегка увеличиваются.

#pragma endregion
    private: Void GetSlicesPerPizza(double &pizzaDiameter, double &pizzaRadius, double &pizzaArea, double &IntegralSlices)
    {
        //calculate number of slices in a pizza of user-dtermined diameter
        double::TryParse(txtDiameter->Text, pizzaDiameter);
        pizzaRadius = pizzaDiameter / 2;
        pizzaArea = 3.14159 * Math::Pow(pizzaRadius, 2);
        IntegralSlices = Math::Floor(pizzaArea / 14.125);
    }

    private: Void GetNumberofPizzas(int &numberPeople, int &SlicesNeeded, double &IntegralSlices, double &IntegralPizzas)
    //input number of people at party, determine slices per person, number of pizzas needed
    {
        Int32::TryParse(txtNumberOfPeople->Text, numberPeople);
        SlicesNeeded = numberPeople * 4;
        IntegralPizzas = Math::Ceiling(SlicesNeeded / IntegralSlices);
    }
    //display result
    private: Void OutputPizzaData(double &IntegralSlices, double &IntegralPizzas)
    {
        txtSlicesPerPizza->Text = IntegralSlices.ToString();
        txtPizzasNeeded->Text = IntegralPizzas.ToString();
private: System::Void btnCalculate_Click(System::Object^  sender, System::EventArgs^  e) {
    //declare variables
    double pizzaDiameter, pizzaRadius, pizzaArea, IntegralSlices, IntegralPizzas;
    int numberPeople, SlicesNeeded;

    //collect user-entered diameter and number of guests, calculate pizza area/slices
    GetSlicesPerPizza(pizzaDiameter, pizzaRadius, pizzaArea, IntegralSlices);

    //determine how many pizzas are needed given number of guests and pizza size
    GetNumberofPizzas(numberPeople, SlicesNeeded, IntegralPizzas, IntegralSlices);

    //output number of slices per pizza and number of pizzas per order
    OutputPizzaData(IntegralPizzas, IntegralSlices);

Учитывая данные испытаний диаметром 13,5 и 6 человек, ожидаемый результат составляет 10 IntegralSlices и 3 IntegralPizzas.Код, выполняемый исключительно в обработчике событий, дает этот результат.

Методы дают любое количество случайных результатов и затем увеличивают его в одном таком тесте: IntegralSlices: 4.20327840774627E-293 IntegralPizzas: 5.70982877455134E + 293

Мое подозрение относительно приращения для каждого клика состоит в том, что переменные, объявленные в соответствии с методом, сохраняются как переменные экземпляра и изменяются для каждого клика, хотя входные значения не меняются.Во-вторых, я понятия не имею, как объяснить несоответствие в исходном результате.Учитывая данные испытаний 13,5 диаметра и 6 человек, результат должен быть 10 IntegralSlices и 3 IntegralPizzas.Выходные данные методов дают мне непредсказуемый результат для каждого начального щелчка обработчика событий.

...