Gå til innhold

C#: Praktisk utfordring: lage funksjoner for å regne ut tankvolum og fyllingsgrad


Anbefalte innlegg

Holder på å lage et lite program som regner ut antall liter i en tank ved en gitt fyllingshøyde.

Tanken er ikke linjær, men jeg har en peiletabell, som jeg har lagret i en xml fil.

 

Er litt usikker på om jeg har løst dette på den beste måten, derfor poster jeg denne utfordringen her. Slik at om noen vil prøve seg, så kan jeg sammenligne løsningen med min. Kommer til å poste min egen kode om et par dager, men håper på å få et par andre løsninger innen den tid.

 

Noen som har lyst til å lage en klasse med to metoder, som retunerer henholdsvis antall liter i tanken ved en gitt veskehøyde, og veskehøyde i mm ved antall liter i tanken. Se lenger nede i posten for eks på metoder.

 

 

Eks på peiletabell:

mm - liter

100 - 10

200 - 30

300 - 60

400 - 100

500 - 150

600 - 200

 

Metoder

int GetLtr(int mm)...

int GetMM(int ltr)..

Lenke til kommentar
Videoannonse
Annonse

Noe slikt kanskje?

 

public class Tank
{
   [serializable]
   public class Item
   {
       public double Meters { get; set; }
       public double Litres { get; set; }

       public override string ToString()
       {
           return string.Format("{0} meters - {1} litres", Meters, Litres);
       }
   }

   private List<Item> items { get; set; }

   public IEnumerable<Item> Items { get { return items.AsReadOnly(); } }

   public Tank(IEnumerable<Item> generator)
   {
       items = new List<Item>(generator);
   }

   private static double Interpolate(double x1, double x2, double t)
   {
       return x1 + (x2 - x1) * t;
   }


   private double GetGeneric(double value, Func<Item, double> item1, Func<Item, double> item2)
   {
       var max = items.Max(item1);
       if (value > max || value < 0)
           throw new ArgumentOutOfRangeException();
       else if (value == max)
           return max;
       var index = items.FindIndex(item => item1(item) > value);

       if (index == -1)
           throw new Exception("An unknown error occured");

       var x2 = item1(items[index]);
       var x1 = index - 1 < 0 ? 0 : item1(items[index - 1]);
       var t = (value - x1) / (x2 - x1);
       return Interpolate(index < 0 ? 0 : item2(items[index - 1]), item2(items[index]), t);
   }

   public double GetMeters(double litres)
   {
       return GetGeneric(litres, i => i.Litres, i => i.Meters);
   }
   public double GetLitres(double meters)
   {
       return GetGeneric(meters, i => i.Meters, i => i.Litres);
   }

}

 

edit: forkortet noe

 

Måtte gjøre en antagelse av formen på tanken dog, altså at den består kun av rette kanter.

Endret av GeirGrusom
Lenke til kommentar
  • 2 uker senere...

post-11814-0-50077100-1301089072_thumb.png

Jeg prøvde meg litt fram i Excel og det viste seg at det går an å lage en formel som returnerer volum som fuksjon av målt høyde. Her er det brukt polynom med order 4, hvis det var mitt prosjekt ville jeg kanskje gått for 2. For å reversere det må du nok interpolere eller bruke en eller annen iterasjonsmetode, for eksempel Newtons - det spørs hvor nøyaktig resultatet må være. Beklager, ingen C# innhold her, men implementering av formelen må være trivielt.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...