C# :: Aufgabe #305

3 Lösungen Lösungen öffentlich

flexible Temperaturumrechnung

Fortgeschrittener - C# von Gnom - 10.04.2020 um 11:24 Uhr
Gegeben sei ein String-Array mit einer beliebigen Anzahl von Temperaturangaben in °C, °F oder K (z. B. "24,5 °C", "74.3 °F" oder "-270 K"). Dabei sollen unterschiedliche Ausprägungen vorliegen: positive/negative Zahlen, Ganzzahlen/Kommazahlen, Trennung durch Punkt oder Komma, Angaben mit "°" oder ohne, Angabe der Einheit ("K"/"C"/"F", evtl. auch "k"/"c"/"f"), Variationen der Anordnung von Leerzeichen.

Das Programm soll nacheinander alle Strings analysieren und jeweils die Zahl und die Einheit ermitteln und in Variablen speichern, die Temperatur von der gegebenen Einheit in die beiden anderen Einheiten umrechnen und alle drei Werte geordnet mit einer Nachkommastelle ausgeben.

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 12.04.2020 um 11:08 Uhr
NET Core 3.x

Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace CS_Aufgabe_305_Temperaturumrechnung
{
    class Program
    {
        static void Main(string[] args)
        {

            var lstTemp = new string[] {"23.5 c", "22° F", "-24°c", "-277,6 K", "2C", "122K", "44.2 ° F"};
  
            var regC = new Regex(@"([0-9\.\,\-]+)([ ]*[°]?[ ]*[Cc]{1})");
            var regF = new Regex(@"([0-9\.\,\-]+)([ ]*[°]?[ ]*[Ff]{1})");
            var regK = new Regex(@"([0-9\.\,]+)([ ]*[Kk]{1})");

            var lst = new List<(double c, double f, double k)>();

            foreach (var t in lstTemp)
            {
                var con = new Converter();

                if (regC.IsMatch(t))
                    con.Celsius = GetTemp(regC, t);

                else if (regF.IsMatch(t))
                    con.Fahrenheit = GetTemp(regF, t);

                else if (regK.IsMatch(t))
                    con.Kelvin = GetTemp(regK, t);

                lst.Add((con.Celsius, con.Fahrenheit, con.Kelvin));
            }

            static double GetTemp(Regex r, string s) => Convert.ToDouble(r.Match(s).Groups[1].Value.Replace('.', ','));

            foreach (var (c, f, k) in lst)
                Console.WriteLine($"C: {c,6:F1}\tF: {f,6:F1}\tK: {k,6:F1}");
        }
    }
    class Converter
    {
        private double _celsius;

        public double Celsius
        {
            get => Math.Round(_celsius, 2);
            set => _celsius = value;
        }

        public double Fahrenheit
        {
            get => Math.Round(_celsius * 1.8 + 32, 2);
            set => _celsius = (value - 32) * (5.0 / 9.0);
        }

        public double Kelvin
        {
            get => Math.Round(_celsius + 273.15, 2);
            set => _celsius = value - 273.15;
        }
    }
}

vote_ok
von DavidDev024 (250 Punkte) - 20.04.2020 um 18:58 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Text.RegularExpressions;

namespace Temperatur
{
    enum Einheit
    {
        Celsius,
        Farenheit,
        Kelvin,
        Unknown
    }
    class Program
    {
       
        static void Main(string[] args)
        {
            string[] testData = new string[] { "26.5 °C", "74,3 F", "-270 K", "26.98348 C", "74.4f", "-13k", "30C" };

            foreach (string input in testData)
            {
                Console.WriteLine("Input: " + input);
                Console.WriteLine("Output: ");
                Ausgabe(GetEinheit(input), GetValue(input));
                Console.WriteLine();
            }
           
            Console.ReadKey();
        }
        private static void Ausgabe(Einheit einheit, float value)
        {
            if (einheit == Einheit.Unknown)
                throw new NotSupportedException();

            switch (einheit)
            {
                case Einheit.Celsius:
                    Console.WriteLine("Celsius: " + Math.Round(value,1));
                    Console.WriteLine("Fahrenheit: " + Math.Round((value * 9 / 5 + 32), 1));
                    Console.WriteLine("Kelvin: " + Math.Round((value + 273.15), 1));
                    break;
                case Einheit.Farenheit:
                    Console.WriteLine("Celsius: " + Math.Round((value - 32) * 9 / 5, 1));
                    Console.WriteLine("Fahrenheit: " + Math.Round(value, 1));
                    Console.WriteLine("Kelvin: " + Math.Round(((value - 32) * 5 / 9) + 273.15, 1));
                    break;
                case Einheit.Kelvin:
                    Console.WriteLine("Celsius: " + Math.Round((value - 273.15), 1));
                    Console.WriteLine("Fahrenheit: " + Math.Round(((value - 273.15) * 9 / 5 + 32), 1));
                    Console.WriteLine("Kelvin: " + Math.Round(value, 1));
                    break;
            }
        }
        private static Einheit GetEinheit(string input)
        {
            string lastSymbol = input.Substring(input.Length - 1, 1);

            if (lastSymbol == "C" || lastSymbol == "c")
            {
                return Einheit.Celsius;
            }
            else if (lastSymbol == "K" || lastSymbol == "k")
            {
                return Einheit.Kelvin;
            }
            else if (lastSymbol == "F" || lastSymbol == "f")
            {
                return Einheit.Farenheit;
            }

            return Einheit.Unknown;
        }
        private static float GetValue(string input)
        {
            input = input.Replace('.', ',');
            input = Regex.Replace(input, "[^0-9,-]", "");
            input = input.Trim();

            return float.Parse(input);
        }
    }
}
vote_ok
von paddlboot (3970 Punkte) - 02.09.2020 um 08:23 Uhr
Quellcode ausblenden C#-Code
namespace Temperaturumrechner
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] temps = new string[] { "10°K", "-10 C", "5,5° F", "6.6k", "-10,6 °c", "- 8.5f"};

            foreach(string t in temps)
            {
                string s = replaceChars(t);
                double zahl = getNum(s);
                string einheit = getEinheit(s);

                switch(einheit)
                {
                    case "k":
                        Console.WriteLine("Temperatur in Kelvin: " + zahl);
                        Console.WriteLine("Temperatur in Celsius: " + (zahl - 273.15).ToString("0.0"));
                        Console.WriteLine("Temperatur in Fahrenheit: " + (zahl * 1.8 - 459.67).ToString("0.0") + "\n");
                        break;
                    case "c":
                        Console.WriteLine("Temperatur in Celsius: " + zahl);
                        Console.WriteLine("Temperatur in Kelvin: " + (zahl + 273.15).ToString("0.0"));
                        Console.WriteLine("Temperatur in Fahrenheit: " + (zahl * 1.8 + 32).ToString("0.0") + "\n");
                        break;
                    case "f":
                        Console.WriteLine("Temperatur in Fahrenheit: " + zahl);
                        Console.WriteLine("Temperatur in Kelvin: " + ((zahl + 459.67) / 1.8).ToString("0.0"));
                        Console.WriteLine("Temperatur in Celsius: " + (zahl - 32 / 1.8).ToString("0.0") + "\n");
                        break;
                    default:
                        Console.WriteLine("Ungültige Einheit");
                        break;
                }

            }

            Console.ReadKey();
        }

        static string replaceChars(string var)
        {
            if(var.Contains("."))
            {
                var = var.Replace(".", ",");
            }

            if(var.Contains("°"))
            {
                var = var.Replace("°", "");
            }

            return var.Replace(" ", "");
        }

        static double getNum(string var)
        {
            double num;
            
            var = var.Remove(var.Length - 1);
            double.TryParse(var, out num);

            return num;
        }

        static string getEinheit(string var)
        {
            return var[var.Length - 1].ToString().ToLower();
        }
    }
}