2017-09-04 47 views
4

我正在嘗試編寫一個簡單的計算器,但閱讀和收聽不同的教程,我應該遵循OOP方法。試圖讓我的所有代碼都不在按鈕點擊方法中,我認爲合理的方法是以一種形式進行所有計算,例如添加除法,百分比,form1類將變量值傳遞到所有邏輯發生的計算類。但出於某種原因,總數總是等於我最後輸入的數字,而不是總數+總數。任何幫助表示讚賞。將變量傳遞給另一個類,執行一個計算然後將其傳遞迴

namespace calculator 
{ 
    public partial class calculator : Form 
    { 
     public calculator() 
     { 
      InitializeComponent(); 
     } 

     private void btnInput_Click(object sender, EventArgs e) 
     { 
      Calculations calculations = new Calculations(); 
      calculations.total = Convert.ToInt32(txtPrice.Text); 

      calculations.GetPrice(); 
      displayBox.Text = Convert.ToString(calculations.total);  
     } 
    } 
} 

計算類

class Calculations 
{ 
    public int total; 

    public int GetPrice() 
    { 
     total =+ total; 

     //See whats being stored in total 
     String totalCheck = Convert.ToString(total); 
     System.Windows.Forms.MessageBox.Show(totalCheck);      

     return total; 
    }   
} 
+1

您每次單擊按鈕時都會創建一個新的'Calculations'類。所以沒有辦法參與以前的價值。這並不意味着什麼,因爲您每次都直接從用戶輸入設置「total」字段,即使您只保留一個實例,也會覆蓋之前的值。無論如何,這個設計並不是非常有用,但是如果你想繼續下去,可以考慮在運行總量中保留一個字段,併爲操作提供方法,在那裏你傳入的值被加,減,分,乘等等。 –

+0

彼得你好。你能給出更多的背景知道你想要計算什麼嗎?此外,您在此處發佈的計算課程是否已完成?因爲我看不出爲什麼會這樣編譯;您正在計算器表單中使用「calculate.totalPrice」,但該屬性在發佈的Calculations類中不存在。 – rqnn

+0

嗨,這是完整的代碼,我只是想在我添加更多的按鈕之前得到這個工作。唯一缺少的是使用系統語句。總價格應該是全部。 –

回答

0

我已經制定了本辦法一個控制檯應用程序。簡單來完成它:

namespace Calculations 
{ 
    public class Program 
    { 
     private static List<Calculations> calcs = new List<Calculations>(); 

     public static void Main(string[] args) 
     { 
      Console.WriteLine("In this program you will put 10 different prices and a value will be returned."); 
      Console.WriteLine(); 
      for (int i = 0; i < 10; ++i) 
      { 
       Console.Write("Enter a price: "); 
       Calculations calc = new Calculations(int.Parse(Console.ReadLine())); 
       calc.GetPrice(); 
       calcs.Add(calc); //This is for example if you want to modify or re-access them 
      } 
     } 
    } 

    public class Calculations 
    { 
     private static Calculations instance; 
     private static int _total; 

     private static int total 
     { 
      get 
      { 
       return _total; 
      } 
      set 
      { 
       //The logic happens here. 
       instance.actsubtotal = value; 
       instance.acttotal = _total; 
       _total += value; //The single value will be summed to a stored absolute total. 
      } 
     } 

     //actsubtotal: Is the actual subtotal you entered. 
     //acttotal: Is the total that was stored in each case, if you enter for example: 
     //--- 30, 20, 50, you will have 3 instances, and the value of each acttotal will be: 30, 50, 100 
     public int actsubtotal, 
        acttotal; 

     public Calculations(int subtotal) 
     { 
      instance = this; //There is the magic, with this, you will tell the property where to find the last value. 
      total = subtotal; //Pass it as a single value (without summing it) 
     } 

     public void GetPrice() 
     { 
      Console.WriteLine("-------------"); 
      Console.WriteLine(); 
      Console.WriteLine("You actually entered: {0}", actsubtotal); 
      Console.WriteLine("Your current total is: {0}", total); 
      Console.WriteLine(); 
      Console.WriteLine("-------------"); 
     } 
    } 
} 

在這個程序,你將進入一個價格,這將是存入總,你將可以在以後再次訪問,如果你想要的。

我不知道這是否是更好的方式來做到這一點,但正如您所看到的,值存儲在稍後寫入控制檯輸出或您的情況下在MessageBox中的小計中。

通過這種方式,節省了實例的每叫你將能總結您通過使用屬性中輸入的最後一個值。

+0

靜態字段的要點是什麼?這是一個控制檯應用程序,但問題是關於Windows窗體。爲什麼你需要跟蹤所有的計算對象? – CodingYoshi

+0

靜態屬性是因爲是一個總數。沒有單獨的總數,總數是每個實例的總和,由於這個原因,使用靜態屬性而不是本地屬性的邏輯更多。 – z3nth10n

+0

你真的認爲你需要所有的代碼來添加數字嗎?這是結束工程。 – CodingYoshi

2

in GetPrice(),它應該是total += total; 不是total =+ total;

感謝@Tipx的提醒。

因爲我的英語不好,我引用的https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/index以下描述來解釋+==+

x + = y - 增量。將y的值添加到x的值中,將結果存儲在x中,並返回新值。

+ X - 返回x

沒有操作者=+的值,x =+ y意味着x = +y

+1

解釋@cocoa回答的問題:+ =意思是「總計加總數,並使總數的新值」。你有什麼,= +,實際上是「total = + total」,所以「將total設置爲total的'additive non-inverse'值。 – Tipx

+0

雖然這個答案對'+ ='是正確的,這沒有什麼區別,答案仍然是錯誤的。 – CodingYoshi

0

有一個更好的做法,可以做類,但我會遵循你的邏輯,只是爲了不讓自己感到困惑,第一件事首先從來沒有做過一個類裏面的messagebox展示(好吧,你可以但不是好的做法,無論如何,你只是用它來檢查值,但使用斷點練習):

public partial class calculator : Form 
{ 
    public calculator() 
    { 
     InitializeComponent(); 
    } 
     //assuming this is clicking the Add (+) Button 
    private void btnInput_Click(object sender, EventArgs e) 
    { 
     double fNum = 0.0; //initialize a variable with default value 
          //if you didn't include 0.0 you will get a "local variable" error 

     Calculations calculations = new Calculations(); 
     calculations.Total = Convert.ToInt32(txtPrice.Text); 

     fNum = calculations.GetPrice(); 

     //take Note the below code will really just return the value you have just entered in your textbox since you didn't used calculations.GetPrice(); 
     //displayBox.Text = Convert.ToString(calculations.Total); 

     //the below code will show the value you have entered added 
     //to itself since the logic from your class is just Total+=Total 
     // example I input 1. (so Total = 1) then fNum will be (Total = 1 + 1) 
     // which is 2 
     displayBox.Text = Convert.ToString(fNum); 


    } 
} 



public class Calculations 
{ 
    public int Total {get; set;} //Best practice to use CamelCase for properties inside a class 

    public int GetPrice() 
    { 
     Total += Total; 

     return Total; 
    }   
} 
+0

這將產生不正確的結果。它所要做的就是將結果加倍並返回... – CodingYoshi

+0

是的,這就是爲什麼我在評論中指出它的原因。而且我還包括我遵循他的邏輯只是爲了避免混淆......我不需要用勺子喂這個傢伙......讓他做邏輯,我只是​​展示了他的程序中可能出現的錯誤 –