2011-01-27 4 views
2

Я пытаюсь построить температурный преобразователь, чтобы помочь себе изучить C#. Я знаю только большинство основ, и это то, к чему я пришел. То, что я застрял, занимает номер, который вводит пользователь, и преобразовывает его в выбор, который ранее вводил пользователь, будучи farenheit или celsius. Опять же, я знаю только основы, но помощь будет очень оценена.Самоучитель: начинающий пытается сделать преобразователь температуры

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("What sort of temperature would you like to convert?"); 
      string tempType = Console.ReadLine(); 
      ConvertChoice(tempType.ToLower()); 
      Console.WriteLine("Please enter a temperature to convert: "); 
      string temperatureString = Console.ReadLine(); 
      int temperature = int.Parse(temperatureString); 
      Console.ReadLine(); 
     } 

     static void ConvertChoice(string tempType) 
     { 
      switch (tempType) 
      { 
       case "farenheit": 
        Console.WriteLine("Farenheit it is!"); 
        return; 
       case "celsius": 
        Console.WriteLine("Celsius it is!"); 
        return; 
       default: 
        Console.WriteLine("Invalid type, please type farenheit or celsius."); 
        return; 
      } 
     } 
    } 
} 

ответ

0

Предполагая, что вы вводите что-то вроде «по Цельсию, 20» означает, что вы хотите конвертировать 20ºC в градусы Фаренгейта, вам нужно немного логики, как этот

if type == fahrenheit 
    result = [formula from fahrenheit to celsius, using 'temperature'] 
    restype = "celsius" 
else 
    result = [formula from celsius to fahrenheit, using 'temperature'] 
    restype = "fahrenheit" 

print "The result is", result, "degrees", restype 

Не уверен, если это отвечает на ваш вопрос, хотя.

Другим способом будет поддержка Кельвина. Преобразуйте входную температуру в Kelvin из того, что вводит пользователь, а затем преобразуйте Kelvin в любое удобное для пользователя. Затем вы можете поддержать преобразования в/из любого вида блоков без необходимости обрабатывать каждый случай в отдельности:

any unit -> kelvin -> any other unit 

Если вы не видите преимущества, представьте, как бы вы закодировать это на 5 или 10 различных единиц вместо всего 2.

0

У вас есть выбор, хранящийся в tempType. Используйте это.

static double GetTemp(string tempChoice, int temperature) 
{ 
    double convertedTemp = 0.0; 

    if(tempChoice.Equals("farenheit", StringComparison.CurrentCultureIgnoreCase)) 
    { 
     convertedTemp = ((double)temperature * 9.0/5.0) + 32.0; 
    } 
    else 
    { 
     convertedTemp = ((double)temperature -32.0) * 5.0/9.0; 
    } 

    return convertedTemp; 
} 

Просто позвоните этой функции с вашего основного().

(Примечание: Да, я понимаю, что это ограничено по функциональности и предполагает, что возможны только две возможные температурные шкалы. ОП сказал, что он изучает программирование, поэтому я пошел с самым простым примером).

EDIT Fixed мой алгоритм. Теперь логика действительно работает по назначению.

0

Как это можно сделать?

namespace ConsoleApplication1 
{ 
    // Using an enum to store the result of 
    // parsing user input is good practice. 
    public enum Scale 
    { 
     Unknown, 
     Celsius, 
     Farenheit 
    } 


    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.WriteLine("What sort of temperature would you like to convert?"); 
      string tempType = Console.ReadLine(); 

      switch(ConvertChoice(tempType)) 
      { 
       case Scale.Celsius: 
       // do celsius work here 
       break; 
       case Scale Farenheit: 
       // do farenheit work here 
       break; 
       default: 
       // invalid input work here 
      } 
      Console.ReadLine(); 
     } 

     static Scale ConvertChoice(string tempType) 
     { 
      // use the framework. also, when dealing with string equality, its best 
      // to use an overload that uses the StringComparison enum. 
      if(tempType.StartsWith("f", StringComparison.CurrentCultureIgnoreCase)) 
      return Scale.Farenheit; 
      if(tempType.StartsWith("c", StringComparison.CurrentCultureIgnoreCase))) 
      return Scale.Celsius; 
      return Scale.Unknown; 
     } 
    } 

}

0

Используя объектный подход .... Простите некоторые возможные ошибки синтаксиса/стиль, как правило, не используют C# сам ...

class TempConverter 
{ 
    public string degreeType {get; set;} 
    public double userTemp {get; set;} 

    public TempConverter(){} 

    public double convert() 
    { 
    switch(this.degreeType) 
    { 
     case "F": 
      return this.convertToF(); 
     case "C": 
      return this.convertToC(); 
     default: 
      return null; 
    } 

    } 
    public double convertToF() 
    { 
     return //user temp converted to F 
    } 

    public double convertToC() 
    { 
     return //user temp converted to C 
    } 
} 

Тогда ваш главный класс будет что-то вроде:

class Program 
    { 
     static void Main(string[] args) 
     { 
     TempConverter converter = new TempConverter(); 
      Console.WriteLine("What sort of temperature would you like to convert?"); 
      converter.degreeType = Console.ReadLine(); 
      ConvertChoice(converter.degreeType); 
      Console.WriteLine("Please enter a temperature to convert: "); 
      converter.userTemp = Convert.ToDouble(Console.ReadLine()); 
      Console.WriteLine(Double.ToString(converter.convert()); 
     } 

     static void ConvertChoice(string tempType) 
     { 
      switch (tempType) 
      { 
       case "farenheit": 
        Console.WriteLine("Farenheit it is!"); 
        return; 
       case "celsius": 
        Console.WriteLine("Celsius it is!"); 
        return; 
       default: 
        Console.WriteLine("Invalid type, please type farenheit or celsius."); 
        return; 
      } 
     } 
    } 
0

Ваша программа имеет несколько недостатков; в первую очередь вам нужно сохранить тип конверсии, который пользователь хочет выполнить, чтобы вы могли фактически выполнить его, когда он ввел температуру, которая должна быть преобразована. Поскольку вы работаете только с двумя типами температуры (Fahrenheit и Celsius (да, ну, кто же Réaumur?)), Вы можете сохранить выбор пользователя как логическое, указывающее, был ли выбран Fahrenheit или нет. Вы также можете принять десятичные числа.

Так, сказав, что, вот, как вы могли бы изменить программу, чтобы отразить мои предложения:

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      bool isFahrenheit; 
      bool temperatureTypeHasBeenDetermined = false; 
      while(!temperatureTypeHasBeenDetermined){ 
       Console.WriteLine("What sort of temperature would you like to convert?"); 
       string tempType = Console.ReadLine(); 
       temperatureTypeHasBeenDetermined = ConvertChoice(tempType.ToLower(), out isFahrenheit); 
      } 
      decimal temperature; 
      bool temperatureEnteredCorrectly = false; 
      while(!temperatureEnteredCorrectly){ 
       Console.WriteLine("Please enter a temperature to convert: "); 
       string temperatureString = Console.ReadLine(); 
       temperatureEnteredCorrectly = decimal.TryParse(temperatureString, out temperature); 
      } 
      //Now we are ready to do the conversion 
      decimal convertedTemperature = isFahrenheit ? 
              ConvertFromFahrenheitToCelsius(temperature) : 
              ConvertFromCelsiusToFahrenheit(temperature); 
      string from = isFahrenheit ? "F" : "C"; 
      string to = isFahrenheit ? "C" : "F"; 

      Console.WriteLine("{0}{1} = {2}{3}", temperature, from, convertedTemperature, to);     

      Console.ReadLine(); 
     } 

     static decimal ConvertFromFahrenheitToCelsius(decimal temperature) 
     { 
      //Implement properly 
      return 60m; 
     } 

     static decimal ConvertFromCelsiusToFahrenheit(decimal temperature) 
     { 
      //Implement properly 
      return 42m; 
     } 

     static bool ConvertChoice(string tempType, out bool isFahrenheit) 
     { 
      isFahrenheit = false; 
      switch (tempType) 
      { 
       case "fahrenheit": 
        Console.WriteLine("Fahrenheit it is!"); 
        isFahrenheit = true; 
        return true; 
       case "celsius": 
        Console.WriteLine("Celsius it is!"); 
        return false; 
       default: 
        Console.WriteLine("Invalid type, please type fahrenheit or celsius."); 
        return false; 
      } 
     } 
    } 
} 

Обратите внимание, что я удостоверился, что правильные значения вводятся как для типа температуры и значения температуры на не зацикливание до действительное значение.

Надеюсь, это поможет вам в правильном направлении для дальнейшего самостоятельного изучения. Пожалуйста, не стесняйтесь спрашивать, есть ли у вас какие-либо вопросы относительно вышеуказанного. Как отказ от ответственности я должен сказать, что я не скомпилировал вышеуказанный код, но мой умственный синтаксический контролер обычно довольно надежный ;-)

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