2016-10-23 7 views
1

Привет и спасибо за проверку моего сообщения. Новое для C# и Oop в целом. До сих пор обучение было гладким, но у меня возникают проблемы, когда я пытаюсь создать (и вызвать) конструктор, который вычисляет ввод данных пользователем.Конструктор классов, который вычисляет ввод с использованием C#

Если возможно: я хотел бы создать 3 класса.

Класс MainDisplay, который отображает информацию и получает пользовательский ввод.

Класс BMIBlueprint, который «только» делает расчет для bmi.

Класс BFPBlueprint, который вычисляет bfp (требуется использовать общее количество bmi).

Я выполнил эту задачу, используя один класс. Но мне бы очень хотелось узнать/понять, как это сделать, используя несколько классов. Я смотрел/читал/изучал каждый источник, который мог найти за последние 2 недели, прежде чем создавать это, но я не смог понять, как создать конструктор, который выполняет расчет, а затем называть его основным для использования пользовательских входных данных для переменных.

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

Это то, что у меня есть до сих пор. Во-первых, мой класс BMIBlueprint, который я создал, просто для использования в качестве калькулятора для bmi на основе ввода от пользователя, который я планирую вызвать в своем MainClass. Кроме того, это мой 200-й другой версии, пытаясь заставить его работать, и это, вероятно, очень далеко от того, что он может/должен выглядеть на самом деле ...

class BMIBlueprint { 

    public double bmiBefore; 
    public double bmiAFter; 

    public BMIBlueprint() { } 

    public BMIBlueprint(double height, double weight) { 

     bmiBefore = (height * height) * weight; 
    } 

    public BMIBlueprint(double bmiConst) { 

     bmiAFter = bmiBefore * 703; 

    } 
} 

Как «использовать» конструктор выше класса для рассчитать, что пользователь вводит в мой основной класс? или я в порядке с ним? Мой основной класс ниже, где я запрашиваю ввод пользователя, затем помещаю эти значения в свой конструктор.

static void Main() { 

    Write("Enter weight: "); 
    double weight = double.Parse(ReadLine()); 

    Write("Enter height: "); 
    double height = double.Parse(ReadLine()); 

    BMIBlueprint calcBmi = new BMIBlueprint(newBmiOne, newBmiTwo); 

    //then display after calculated 
    WriteLine("The finished cal should be shown here: {0:N2}", calcBmi); 

Я пробовал это много разных способов, но именно здесь я сейчас; Если у кого-то есть время или доброта, чтобы опубликовать код, который должен быть с парочками, чтобы я мог изучить его, было бы абсолютно здорово, но, возможно, слишком много просило. Если бы не была оказана никакая помощь/совет/метафоры/аналогии.

Код, где я сделал все это в одном классе - почти все, но не является частью вопроса и его следует игнорировать.

static void Main() { 

    EntranceBlueprint entrance = new EntranceBlueprint(); 

    WriteLine(entrance); 

    BMIBlueprint bmiCalculator = new BMIBlueprint(); 

    Write("First, enter your weight in lbs: "); 
    double newWeight = double.Parse(bmiCalculator.weight = ReadLine()); 

    Write("\nGreat, now enter your height in inches: "); 
    double newHeight = double.Parse(bmiCalculator.height = ReadLine()); 

    bmiCalculator.bmiVar = 703; 
    double totalBmi = ((newWeight * bmiCalculator.bmiVar)/
         (newHeight * newHeight)); 

    WriteLine("\nPerfect! Your bmi is: {0:N2}. With just a few more 
       inputs we'll have your bfp. ", +totalBmi); 

    Write("\npress any key to continue"); 
     ReadKey(); 

    BFPBlueprint bfpCalculator = new BFPBlueprint();    

    Write("According to _ your bfp is more accurate because it takes  
    into account your age and gender. So enter your age first: "); 

    double newAge = double.Parse(bfpCalculator.age = ReadLine()); 
    Write("\nGreat, now enter your sex, like this (male or female): "); 

    string newSex = ReadLine(); 

     if (newAge >= 13 && newSex.ToLower() == "male") { 
      double totalAdultMale = 
       (1.20 * totalBmi) - (0.23 * newAge) - (10.8 * 1) - 5.4; 
       Write("\nYour bfp is: {0:N2} ", totalAdultMale); 
        if (totalAdultMale > 1 && totalAdultMale < 13) 
        Catagories(); } 

     else if (newAge <= 12 && newSex.ToLower() == "male") { 
      double totalYouthMaleBfp = 
      (1.51 * totalBmi) - (0.70 *newAge) - (3.6 * 1) + 1.4; 
      Write("Perfect! Your bfp is: {0:N2}", 

     else if (newAge >= 13 && newSex.ToLower() == "female") { 
      double totalAdultFemaleBfp = 
      (1.20 * totalBmi) - (0.23 * newAge) - (10.8 * 0) - 5.4; 
      Write("Perfect! Your bfp is: {0:N2} ",totalAdultFemaleBfp); } 


     else if (newAge <= 12 && newSex.ToLower() == "female") { 
      double totalYouthFemaleBfp = 
      (1.51 * totalBmi) - (0.70 * newAge) - (3.6 * 0) + 1.4; 
      Write("Perfect! Your bfp is {0:N2} ", totalYouthFemaleBfp); } 

     else { Write("\nYou must have typed something wrong, Try 
       again"); } 

     ReadKey(); 
+2

Вы не должны использовать конструкторы для расчета вещей для вас. Конструктор BMIBlueprint должен принимать высоту и вес, а * хранить только эти значения *. Тогда у вас будет два метода: 'GetBMI()', который возвращает BMI на основе высоты и веса, и второй метод, который возвращает BMI на основе настройки. – Rob

+0

Это было бы полезно. [Конструктор Конструктор] (https://msdn.microsoft.com/en-us/library/ms229060 (v = vs.110) .aspx) – shadow

+0

Согласен с @Rob. Кроме того, когда экземпляр класса создается, будет использоваться только * один * конструкторов. Например, BMIBlueprint bmiCalculator = новый BMIBlueprint(); 'будет выбирать конструктор без аргументов - остальные 2 конструктора не будут выполнены. –

ответ

0

Вот простой пример:

using System; 

namespace ConsoleApplication 
{ 
    class BMIBlueprint 
    { 
     private const int BMI_VAR = 703; 

     public double Bmi { get; private set; } 

     public BMIBlueprint(double height, double weight) 
     { 
      Bmi = height * height * weight; 
     } 

     public void Adjust() 
     { 
      Bmi *= BMI_VAR; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write("Enter weight: "); 
      double weight = double.Parse(Console.ReadLine()); 

      Console.Write("Enter height: "); 
      double height = double.Parse(Console.ReadLine()); 

      BMIBlueprint calcBmi = new BMIBlueprint(height, weight); 

      calcBmi.Adjust(); 

      //then display after calculated 
      Console.WriteLine("The finished cal should be shown here: {0:N2}", calcBmi.Bmi); 

      Console.Write("\nPress any key..."); 
      Console.ReadKey(); 
     } 
    } 
} 
+0

Отлично! Большое спасибо. – Dany

0

ваша проблема этот код:

WriteLine("The finished cal should be shown here: {0:N2}", calcBmi); 

WriteLine функция не будет принимать calcBmi, который является BMIBlueprint, в качестве параметра. Также {0:N2} - неправильный синтаксис. Вы можете сделать это, однако:

WriteLine("The finished cal.bmiBefore should be shown here: {0}", calcBmi.bmiBefore); 
WriteLine("The finished cal.bmiBefore should be shown here: {0}", calcBmi.bmiBefore); 
+0

Я понимаю, что вы имеете в виду. Благодарю . – Dany

1

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

Создайте свой объект с помощью конструктора инициализации членов вашего класса по вашим параметрам строительства:

public class BMIBlueprint { 

    private const double BMI_CONST = 703; 

    public double Height {get; private set;} 
    public double Weight {get; private set;} 


    public BMIBlueprint(double height, double weight) { 

     this.Height = height; 
     this.Weight = weight; 
    //instead of passing in variables to perform a function in your constructor 
    //use them to initialize your member variables 
    //bmiBefore = (height * height) * weight; 
    } 

    public double GetBMIBefore(){ 

     double bmiBefore = (this.Height * this.Height) * this.Weight; 
     return bmiBefore; 
    } 

    public double GetBMIAfter() { 

     double bmiBefore = this.GetBMIBefore(); 
     double bmiAfter = bmiBefore * BMI_CONST; 
     return bmiAfter; 
    } 

Затем вызовите метод (ы), содержащихся в этом классе, чтобы сделать свой расчет (ы) из объекта :

static void Main() { 
    Write("Enter weight: "); 
    double weight = double.Parse(ReadLine()); 

    Write("Enter height: "); 
    double height = double.Parse(ReadLine()); 

    BFPBlueprint bmiCalculator = new BFPBlueprint(height, weight); 

    double bmiBefore = bmiCalculator.GetBMIBefore(); 
    double bmiAfter = bmiCalculator.GetBMIAfter(); 
    //etc... 

Дело в том, чтобы инкапсулировать всю логику вычисления BMI и значения в одном классе, так легко использовать.

ИЛИ

Вы могли бы вместо того, чтобы использовать статический класс, который реализует эти методы и не содержит каких-либо переменных-членов:

public static class BmiCalculator 
{ 
    private const double BMI_CONST = 703; 

    public double static GetNewBMI(double height, double weight) 
    { 
     double newBMI = (height * height) * weight; 
     return newBMI; 
    } 

    public double GetAdjustedBMI(double oldBMI) 
    { 
     double adjustedBMI = oldBMI * BMI_CONST; 
     return adjustedBMI; 
    } 

Для реализации в главном:

static void Main() { 
    Write("Enter weight: "); 
    double weight = double.Parse(ReadLine()); 

    Write("Enter height: "); 
    double height = double.Parse(ReadLine()); 

    double bmiBefore = BmiCalculator.GetNewBMI(height, weight); 
    double bmiAfter = BmiCalculator.GetAdjustedBMI(bmiBefore); 
    //etc... 
+0

Отлично! Иногда мне просто нужно что-то точное, чтобы посмотреть и заполнить пробелы в голове. Я всегда преподавал на других языках, но C# - это мой первый oop, и кажется, что чем дольше я смотрю на проблему, не соображая ее, тем больше урон я делаю, вспоминая, что на самом деле правильно ... Если это имеет смысл. – Dany

+0

Да! Я чувствую, что программирование аналогично математике в том, что иногда у вас есть момент «ага» при работе над концепцией. Я бы сказал, что самообучение учится экспериментировать и выходить за пределы вашей зоны комфорта, поэтому вы направляетесь в правильном направлении. Получение обратной связи от других, которые уже справились с такими же проблемами, ускорит вас. Также есть бесплатные бесплатные онлайн-курсы от Microsoft в [Microsoft Virtual Academy] (https://mva.microsoft.com/) для получения дополнительной информации о C# –

0

Вот более продвинутый пример подхода ООП, в комплекте с проверкой входных данных. Обратите внимание: вам может потребоваться изменить Личность на основе точной функциональности, которую вы хотите использовать. Калькуляторы/отслеживание истории могут быть самими объектами. Я просто показал, как вы можете опубликовать выдержку, написанную в стиле C#/OOP.

using System; 
using System.Linq; 

namespace BMI_StackOverflow 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PersonValidator inputValidator = new PersonValidator(); 
      Person person = new Person(); 
      person.Weight = CollectUserInput<double>("First, enter your weight in lbs: ", 
       inputValidator.IsValidWeight, "Please enter a positive number: "); 
      person.Height = CollectUserInput<double>("\nGreat, now enter your height in inches: ", 
       inputValidator.IsValidHeight, "Please enter a positive number: "); 

      double bmi = person.GetBmi(); 
      Console.WriteLine("\nPerfect! Your bmi is: {0:N2}. With just a few more inputs we'll have your bfp. ", +bmi); 
      Console.Write("\nPress any key to continue"); 
      Console.ReadKey(); 

      person.Age = CollectUserInput<int>("According to _ your bfp is more accurate because it takes into account your age and gender. So enter your age first: ", 
       inputValidator.IsValidAge, "Please enter a positive, non-decimal number."); 
      string sex = CollectUserInput<string>("\nGreat, now enter your sex, like this (male or female): ", 
       inputValidator.IsValidSex, $"That sex is not recognized. Please input one of: {string.Join(", ", Enum.GetNames(typeof(Person.BiologicalSex)).Select(x => x.ToLower()))}"); 
      person.Sex = inputValidator.ParseSex(sex).Value; 

      double bfp = person.GetBfp(); 
      Console.WriteLine("Perfect! Your bfp is {0:N2} ", +bfp); 
      Console.ReadKey(); 
     } 

     /// <summary> 
     /// Prompts user for console input; reprompts untils correct type recieved. Returns input as specified type. 
     /// </summary> 
     /// <param name="message">Display message to prompt user for input.</param> 
     private static T CollectUserInput<T>(string message = null) 
     { 
      if (message != null) 
      { 
       Console.WriteLine(message); 
      } 
      while (true) 
      { 
       string rawInput = Console.ReadLine(); 
       try 
       { 
        return (T)Convert.ChangeType(rawInput, typeof(T)); 
       } 
       catch 
       { 
        Console.WriteLine($"Please input a response of type: {typeof(T).ToString()}"); 
       } 
      } 
     } 

     /// <summary> 
     /// Prompts user for console input; reprompts untils correct type recieved. Returns input as specified type. 
     /// </summary> 
     /// <param name="message">Display message to prompt user for input.</param> 
     /// <param name="validate">Prompt user to reenter input until it passes this validation function.</param> 
     /// <param name="validationFailureMessage">Message displayed to user after each validation failure.</param> 
     private static T CollectUserInput<T>(string message, Func<T, bool> validate, string validationFailureMessage = null) 
     { 
      var input = CollectUserInput<T>(message); 
      bool isValid = validate(input); 
      while (!isValid) 
      { 
       Console.WriteLine(validationFailureMessage); 
       input = CollectUserInput<T>(); 
       isValid = validate(input); 
      } 
      return input; 
     } 
    } 

    public class Person 
    { 
     public double Weight { get; set; } 
     public double Height { get; set; } 
     public int Age { get; set; } 
     public BiologicalSex Sex { get; set; } 

     private const int bmiVar = 703; 

     public double GetBmi() 
     { 
      return ((Weight * bmiVar)/
        (Math.Pow(Height, 2))); 
     } 

     public double GetBfp() 
     { 
      double bmi = GetBmi(); 
      switch (Sex) 
      { 
       case BiologicalSex.MALE: 
        if (Age >= 13) 
        { 
         return (1.20 * bmi) - (0.23 * Age) - (10.8 * 1) - 5.4; 
        } 
        return (1.51 * bmi) - (0.70 * Age) - (3.6 * 1) + 1.4; 
       case BiologicalSex.FEMALE: 
        if (Age >= 13) 
        { 
         return (1.20 * bmi) - (0.23 * Age) - (10.8 * 0) - 5.4; 
        } 
        return (1.51 * bmi) - (0.70 * Age) - (3.6 * 0) + 1.4; 
       default: 
        throw new Exception($"No BFP calculation rule for sex: {Sex}"); 
      } 
     } 

     public enum BiologicalSex 
     { 
      MALE, 
      FEMALE 
     } 
    } 

    public class PersonValidator 
    { 
     public bool IsValidWeight(double weight) 
     { 
      return weight >= 0; 
     } 

     public bool IsValidHeight(double height) 
     { 
      return height >= 0; 
     } 

     public bool IsValidAge(int age) 
     { 
      return age >= 0; 
     } 

     public bool IsValidSex(string sex) 
     { 
      return ParseSex(sex) != null; 
     } 

     /// <summary> 
     /// Attempts to parse sex from string. Returns null on failure. 
     /// </summary> 
     public Person.BiologicalSex? ParseSex(string sex) 
     { 
      int temp; 
      bool isNumber = int.TryParse(sex, out temp); 
      if (isNumber) 
      { 
       return null; 
      } 
      try 
      { 
       return (Person.BiologicalSex)Enum.Parse(typeof(Person.BiologicalSex), sex, ignoreCase: true); 
      } 
      catch (ArgumentException ex) 
      { 
       return null; 
      } 
     } 
    } 
} 
+0

Это замечательно видеть. Я работал над корпусами переключателей, чтобы изменить их, публикуя это, но вы упростили путь более, чем я. Спасибо, что сломал его так же, как и с – Dany

+0

PersinalValidator. На самом деле, я могу понять это в контексте. – Dany

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

  • Нет связанных вопросов^_^