ОБНОВЛЕНИЕ: Объединив первые два метода в один, мои результаты стали надежными.Таким образом, проблема заключалась в том, что переменные, указанные во втором методе, не были инициализированы, даже если они были в первом методе.Каким образом я смогу сослаться на значение двойных 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.Выходные данные методов дают мне непредсказуемый результат для каждого начального щелчка обработчика событий.