2016-11-15 2 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; 
    } 

    } 
} 

А класс: с помощью системы; с использованием System.Collections.Generic; с использованием System.Linq; с использованием System.Text; с использованием 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. Он должен (возможно) вернуть false, если вы установите «Неверный ввод».

  • (Незначительный) int [] Количества = новый int [3]; никогда не используется, кроме как писать на него.

  • (Незначительный) var pizzas = new Pizza[3]; также не используется. Он просто перезаписывается Declare несколькими строками позже. Pizza[] pizzas=null; или просто Pizza[] pizzas; - лучшая альтернатива. Однако здесь не самая большая структура.

  • (Незначительная) Ваша переменная с именем price в Declare плохо названа так, как представляется, фактически является количеством. Такие вещи легко отбрасывают людей.

  • WriteOut никогда не вызывается. withTax, tax и subTotal в OrderButton_Click являются , вероятно, вычисляется правильно, но значения не выводятся.

Чем дольше ответ

Это немного на грязной стороне! Я ценю, что это всего лишь учебная вещь - мы все были там, но хорошая гигиена кода так же важна (если не важнее), чем структура языка.

UX: Не перезаписывайте то, что вводил пользователь - в частности, не заменяйте ввод текстового поля «неправильным вводом»; Лучше сходить на другой лейбл. Я бы предположил, что вы уже почувствовали, насколько странным является такой опыт, проверяя код.

Названные вещи, которые не нуждаются в конкретном классе: Как сырная пицца и ветчина. Перечисления - ваш друг! Используйте их вместо строк, как «сыр»:

public enum PizzaType{ 
    Cheese, 
    Tomato 
} 

Использования перечислений таким образом помогает избежать удивительного мира боли, что является неожиданной капитализацией и это значительно быстрее. CheEse пицца кто-нибудь?

Повторение: Большие части вашего кода также повторяются; Вы захотите практиковать, избегая его как можно больше. («DRY»/«Не повторяйте себя»). Небольшое планирование вперед помогает в массовом порядке. У всех есть предпочтения в структуре кода; мой здесь будет отдельный класс «Pizza displayer», который содержит поле ввода количества и выполняет также проверку.

Junk: Немного связанный с вышесказанным, вы создаете кучу списков и массивов, которые создаются каждый раз, когда функция вызывается, а затем просто выбиваются. Создайте один массив более абстрактного типа (например, массив «Дисплеи пиццы») и сохраните этот массив как свойство в форме. Здесь мало, но, зная, сколько мусора создает ваша программа, ваш код быстрее развивается.

Заметки о поплавках: Вы никогда, никогда не использование поплавка/двойной для денег. Вместо этого используйте десятичную дробь или просто делайте все в гроши. Плавающие точки неточны, и вы рано или поздно столкнетесь с проблемой округления.

+0

В свою защиту: Я думал, что должен сообщить массиву, сколько элементов в нем при объявлении. Спасибо за помощь! Сейчас все работает отлично. Я сделал сообщения об ошибках в текстовых полях, потому что пользователю все равно придется его менять, поэтому зачем создавать больше меток. Я снова переписал код. Еще не совсем поняли концепцию объектов. Я знаю, что теория не использует их на практике. В любом случае, спасибо! – alex3wielki

+0

@ alex3wielki без проблем! Вы правы в массивах, но массив также является объектом - каждый раз, когда вы делаете «new {something}», вы создаете совершенно новый объект *, если только это не структура. Так, например, 'var pizzas = new Pizza [3];' и внутри объявить, что у вас есть 'new Pizza [3];' второй раз - это два совершенно разных объекта; первый из них не используется :) –

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