2016-11-15 111 views
0

我的目標是讓這個程序採取一些比薩餅和類型的比薩餅,並計算他們花費多少。我決定採用對象解決方案。問題是它不計算它,即使在字段爲空的情況下它也允許程序運行。我從字面上不知道爲什麼它不計算它。我也是新來的對象,所以可能會有一些邏輯錯誤。對象計算驗證C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Assignment_2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void OrderButton_Click(object sender, EventArgs e) 
     { 
      double withTax = 0; 
      double tax = 0; 
      double subTotal = 0; 
      var pizzas = new Pizza[3]; 
      if(ValidateAndDeclareQuantities()) 
      { 
       pizzas = Declare(); 
       subTotal = CalcSubTotal(pizzas); 
       tax = CalcTax(pizzas); 
       withTax = CalcWithTax(pizzas); 
      } 

     } 
     bool ValidateAndDeclareQuantities() 
     { 
      var combolist = new List<ComboBox>(); 
      combolist.Add(comboBox1); 
      combolist.Add(comboBox2); 
     combolist.Add(comboBox3); 
     var textboxlist = new List<TextBox>(); 
     textboxlist.Add(Quantity1); 
     textboxlist.Add(Quantity2); 
     textboxlist.Add(Quantity3); 
     for (int i = 0; i < 3; i++) 
     { 
      if (combolist[i].Text == "Cheese" || combolist[i].Text ==  "Vegetable" || combolist[i].Text == "Meat") 
      { } 
      else combolist[i].Text = "Wrong input"; 
     } 
     int[] Quantities = new int[3]; 
     for (int i = 0; i < 3; i++) 
     { 
      if (int.TryParse(textboxlist[i].Text, out  Quantities[i])&&textboxlist[i].Text!=null) 
      { } 
      else { textboxlist[i].Text = "Wrong input"; } 
     } 
     return true; 
    } 

    Pizza[] Declare() 
    { 
     var pizzas = new Pizza[3]; 
     string type; 
     int price; 
     type = comboBox1.Text; 
     price = int.Parse(Quantity1.Text); 
     Pizza pizza1 = new Pizza(type, price); 
     pizzas[0] = pizza1; 

     type = comboBox2.Text; 
     price = int.Parse(Quantity2.Text); 
     Pizza pizza2 = new Pizza(type, price); 
     pizzas[1] = pizza2; 

     type = comboBox3.Text; 
     price = int.Parse(Quantity3.Text); 
     Pizza pizza3 = new Pizza(type, price); 
     pizzas[2] = pizza3; 

     return pizzas; 
    } 

    double CalcSubTotal(Pizza[] pizzas) 
    { 
     double subTotal = 0; 
     for (int i = 0; i < 3; i++) 
     { 
      subTotal += pizzas[i].Price; 
     } 
     return subTotal; 
    } 

    double CalcTax(Pizza[] pizzas) 
    { 
     double tax = 0; 
     for (int i = 0; i < 3; i++) 
     { 
      tax += pizzas[i].Tax; 
     } 
     return tax; 
    } 

    double CalcWithTax(Pizza[] pizzas) 
    { 
     double withTax = 0; 
     for (int i = 0; i < 3; i++) 
     { 
      withTax += pizzas[i].WithTax; 
     } 
     return withTax; 
    } 

    void WriteOut(double subTotal, double tax, double withTax) 
    { 
     lblSubTotal.Text = "" + subTotal; 
     lblTax.Text = "" + tax; 
     lblTotal.Text = "" + withTax; 
    } 

    } 
} 

and the class: using System; using System.Collections.Generic;使用System.Linq的 ; using System.Text; using System.Threading.Tasks;

namespace Assignment_2 
{ 
class Pizza 
{ 
    string type; 
    int quantity; 
    public double Price; 
    public double SubTotal; 
    public double Tax; 
    public double WithTax; 
    public Pizza(string type, int quantity) 
    { 
     this.type = type; 
     this.quantity = quantity; 
     FindPrice(); 
     CalcSubTotal(); 
     CalcTax(); 
     CalcWithTax(); 
    } 
    private void FindPrice() 
    { 
     switch (type) 
     { 
      case "Cheese": 
       Price = 9.95; 
       break; 
      case "Vegetables": 
       Price = 10.95; 
       break; 
      case "Meat": 
       Price = 11.95; 
       break; 
     } 
    } 
    private void CalcSubTotal() 
    { 
     SubTotal = Price * quantity; 
    } 
    private void CalcTax() 
    { 
     Tax = SubTotal * 0.13; 
    } 
    private void CalcWithTax() 
    { 
     WithTax = SubTotal + Tax; 
    } 
} 
} 

Solution form

+2

對不起,說..但你需要重新考慮這裏的整個設置。至少while * validate * - * declare * part – Jim

回答

2

的快速解答:

  • ValidateAndDeclareQuantities永遠不會返回false。它應該(可能)在設置「錯誤輸入」時返回錯誤。

  • (小)int []數量= new int [3];除了寫作之外,從未被使用過。 (小)var pizzas = new Pizza[3];也從來沒有使用。它稍後被聲明幾行就被覆蓋。 Pizza[] pizzas=null;或只是Pizza[] pizzas;是一個更好的選擇。儘管這裏並不是最大的結構。

  • (次要)Declare中名爲price的變量名稱很差,因爲它看起來實際上是數量。像這樣的事情很容易讓人們失望。

  • WriteOut永遠不會被調用。 withTax,taxsubTotal in OrderButton_Click可能是被正確計算,但是這些值沒有被輸出。

較長的答案

這是在亂了點!我明白,這只是一個學習的東西 - 我們都在那裏 - 但良好的代碼衛生與語言的結構一樣重要(如果不是更重要的話)。

UX:不要覆蓋用戶輸入的內容 - 特別是,不要用「錯誤的輸入」替換文本框輸入;最好還有其他的標籤。我會想象你在測試代碼時已經感受到這種體驗是多麼奇怪。

命名的東西,不需要特定的類:像奶酪披薩和火腿之一。枚舉是你的朋友!用它們來代替串像「奶酪」:

public enum PizzaType{ 
    Cheese, 
    Tomato 
} 

以這種方式使用枚舉有助於避免疼痛是意外大寫的奇妙世界,它是相當快了。 CheEse比薩餅有人嗎?

重複:你的代碼大部分是重複太多;你會想要儘可能地避免它。 ('幹'/'不要重複自己')。有點前瞻性的計劃有助於大規模。每個人都喜歡代碼結構;我的這裏將是一個單獨的「披薩顯示器」類,它包含一個數量輸入框並進行驗證。

垃圾代碼:與上述內容略有關係,您將創建一堆列表和數組,每次調用該函數時都會創建一個列表和數組,然後纔會被刪除。創建一個更抽象類型的單個數組(比如「比薩展示器」數組),並將該數組作爲表單上的屬性。這裏很小,但更清楚程序創建多少垃圾有助於使代碼更快。

注意事項彩車:你永遠不應該,永遠使用浮點/雙精度的錢。使用十進制代替,或者只是用便士來做所有事情。浮點數不準確,你遲早會遇到舍入問題。

+0

在我的辯護中:我認爲我必須告訴Array在聲明時有多少元素。謝謝您的幫助!現在所有的作品都很好。我在文本框中輸入了錯誤報告,因爲用戶將不得不改變它,所以爲什麼要創建更多的標籤。我會再次重寫代碼。還不完全理解對象的概念。我知道這個理論並不是如何在實踐中很好地使用它們。 無論如何,謝謝! – alex3wielki

+0

@ alex3wielki沒問題!你說的是數組,但是數組也是一個對象 - 每次你做「new {something}」時,你都會創建一個全新的對象,除非它是一個struct *。例如,'var pizzas = new Pizza [3];'並且在裏面聲明你有'新比薩'[3];'第二次 - 這是兩個完全不同的對象;第一個去不使用:) –