2013-12-09 2 views
1

В основном я пытаюсь получить целочисленное значение в функции, я делаю простую программу для торгового автомата, где у меня есть опция «Осмотреть машину», которая подсчитывает количество чипсов в машине. проблема заключается в том, что, когда я прихожу, чтобы посмотреть, сколько на самом деле находится в машине, в ней указано, что количество равно 0. Как бы исправить это, чтобы он мог фактически просмотреть, сколько чипсов в данный момент находится в машине?Функции в C# - Как получить целочисленное значение в функцию?

Вот мой код до сих пор:

static void Main(string[] args) 
{ 
    //Declare variables 
    int iOption = 0; //used to store users menu option 
    int iFillCrisps = 0; //used to store the amount of crisps the user wants to add to the machine 
    int iBuyCrisps = 0; //used to store the amount of crisps the user wants to buy 
    int iTotalNumCrisps = 0; //used to show the total number of crisps in the machine 

    //Menu 
    while (iOption != 4) //Program continously loops until user types "4" which is the exit key 
    { 
     GetMenuOption(iOption); 
     iOption = Convert.ToInt32(Console.ReadLine()); 

     //Process menu 
     if (iOption == 1) 
     { 
     FillCrisps(iFillCrisps, iTotalNumCrisps); 
     } 

     else if (iOption == 2) 
     { 
     BuyCrisps(iBuyCrisps, iTotalNumCrisps); 
     } 

     else if (iOption == 3) 
     { 
     InspectMachine(ref iTotalNumCrisps); 
     } 

     else if (iOption == 4) 
     { 
     Console.WriteLine("Exit"); 
     } 
    } 
} 

static int GetMenuOption(int piOption) 
{ 
    Console.WriteLine("Vending machine"); 
    Console.WriteLine(); 
    Console.WriteLine("Please choose an option"); 
    Console.WriteLine("1: Fill machine with crisps"); 
    Console.WriteLine("2: Buy Crisps"); 
    Console.WriteLine("3: Inspect Machine"); 
    Console.WriteLine("4: Exit"); 

    return piOption; 
} 

static int FillCrisps(int piFillCrisps, int piTotalNumCrisps) 
{ 
    Console.WriteLine("Fill machine with crisps"); 
    Console.WriteLine("How many crisps would you like to add to the machine?"); 
    piFillCrisps = Convert.ToInt32(Console.ReadLine()); 
    piTotalNumCrisps = piFillCrisps + piTotalNumCrisps; 
    Console.WriteLine("You are adding " + piFillCrisps + " packs of crisps to them machine"); 
    Console.WriteLine("There are now " + piTotalNumCrisps + " packs of crisps in the machine"); 

    return piTotalNumCrisps; 
} 

static int BuyCrisps(int piBuyCrisps, int piTotalNumCrisps) 
{ 
    Console.WriteLine("Buy Crisps"); 
    Console.WriteLine("How many crisps would you like to buy?"); 
    piBuyCrisps = Convert.ToInt32(Console.ReadLine()); 
    piTotalNumCrisps = piTotalNumCrisps - piBuyCrisps; 
    Console.WriteLine("You are buying " + piBuyCrisps + " crisps"); 
    Console.WriteLine("There are now " + piTotalNumCrisps + " packs of crisps in the machine"); 

    return piTotalNumCrisps; 
} 

static void InspectMachine(ref int piTotalNumCrisps) //Needs a way of retrieving the total value into it 
{ 
    Console.WriteLine("Inspect Machine"); 
    Console.WriteLine("There are currently " + piTotalNumCrisps + " crisps in the machine."); 
} 
+0

Вы ничего не делаете с результатами своих методов; например вызов 'FillCrisps' должен, вероятно, быть« iTotalNumCrisps = FillCrisps (iFillCrisps, iTotalNumCrisps) ». –

ответ

2

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

Таким образом, изменение кода

GetMenuOption(iOption); 
    iOption = Convert.ToInt32(Console.ReadLine()); 

в

iOption = Convert.ToInt32(Console.ReadLine()); 
    GetMenuOption(iOption); 

и повторите попытку.

Кроме того, другая функция просто принимает параметры снаружи. Они что-то делают, но ничего не дают взамен. Например, эта функция:

static int FillCrisps(int piFillCrisps, int piTotalNumCrisps) 

пытается изменить счетчики, но как только «считывает» параметры с внешней стороны, то, что он рассчитывает не виден на внешних переменных. Попробуйте изменить его на

static int FillCrisps(ref int piFillCrisps, ref int piTotalNumCrisps) 

и отрегулируйте остальную часть кода. Теперь изменения будут видны и во внешних переменных.

С другой стороны, эта функция:

static void InspectMachine(ref int piTotalNumCrisps) 
     //Needs a way of retrieving the total value into it 

только ЧИТАЕТ и распечатывает значения. Он не меняет их. Вам здесь не нужен ref. Изменение его обратно:

static void InspectMachine(int piTotalNumCrisps) 

, и он будет в порядке (до тех пор, как вы исправите другие функции тоже!).

Таким образом, ваши функции должны иметь подписи:

// functions that don't change the data 
static int GetMenuOption(int piOption) 
static void InspectMachine(int piTotalNumCrisps) 

// functions that DO change the data 
static int FillCrisps(ref int piFillCrisps, ref int piTotalNumCrisps) 
static int BuyCrisps(ref int piBuyCrisps, ref int piTotalNumCrisps) 
+1

+5 для определения того, что ответ так быстро, несмотря на дерьмовый титул и +5 за то, что он бог ацтеков. :) – paqogomez

+0

Спасибо! Именно то, что я искал, работает 100%, я знал об этом ref, но, как вы видите, я их путал! Глупо мне, спасибо за помощь :) – Tom

2

Существует гораздо более простой способ сделать это, чем способом, указанным выше, вы могли бы просто просто добавить «iTotalNumCrisps =» до фактической функции, должно произойти .. например:

  if (iOption == 1) 
       { 
       iTotalNumCrisps = FillCrisps(iFillCrisps, iTotalNumCrisps); 
       } 
+0

Спасибо, попробовал это до вышеописанного метода и отлично работает, но мне понравилась идея использования ссылок в моем коде, спасибо! – Tom

+0

@ user2985995 Очистить код лучше, чем классный код. – paqogomez

+0

Да, я думаю, ваше право, я думаю, с C# есть много разных возможных ответов на проблемы, Оба этих ответа работали, только я хотел бы принять их обоих – Tom

Смежные вопросы