Самоучитель: новичок пытается сделать преобразователь температуры - PullRequest
2 голосов
/ 27 января 2011

Я пытаюсь создать преобразователь температуры, чтобы помочь себе выучить C #. Я знаю только большинство основ, и это то, что я придумал до сих пор. То, на чем я застрял, - это взять число, которое вводит пользователь, и преобразовать его в выбор, который пользователь ввел ранее, будь то фаренгейт или градус Цельсия. Опять же, я знаю только основы, но помог бы очень признателен.

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;
            }
        }
    }
}

Ответы [ 5 ]

0 голосов
/ 27 января 2011

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

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

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;
            }
        }
    }
}

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

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

0 голосов
/ 27 января 2011

Использование объектного подхода .... Простите за некоторые вероятные синтаксические / стилевые ошибки, обычно я не использую 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 голосов
/ 27 января 2011

У вас есть выбор, сохраненный в 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;
}

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

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

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

0 голосов
/ 27 января 2011

Как насчет этого?

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 голосов
/ 27 января 2011

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

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

Не уверен, что это ответ на ваш вопрос, однако.

Более причудливый способ - поддержать Кельвина.Преобразуйте входную температуру в Кельвины из того, что вводит пользователь, а затем преобразуйте Кельвины во все, что хочет пользователь.Тогда вы можете поддерживать преобразование в / из любых типов единиц без необходимости обрабатывать каждый случай отдельно:

any unit -> kelvin -> any other unit

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

...