View Single Post
m0b
m0b's Avatar
DonorAdministrator
Hadde et par ledige minutter nå, så jeg viser en objektorientert variant av dette. Det blir gjerne mer kode ut av det, men jeg liker å holde ting objektorientert. Koden tar også med flertall på valuta. Koden kan forkortes noe hvis man vil bruke linq. Gjorde i tillegg dette om til kun én løkke istedet for det jeg beskreiv tidligere. Dette går nok litt på bekostning av leselighet.

Kode

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

namespace KasseSystem
{
    public enum ValutaType
    {
        Lapp,
        Krone,
        Øre
    }

    public abstract class ValutaEnhet : ICloneable
    {
        public ValutaType ValutaType { get; set; }
        public double Verdi { get; set; }

        public override string ToString()
        {
            return string.Format("{0}-{1}", this.Verdi, this.ValutaType.ToString());
        }

        public object Clone()
        {
            return this.Clone();
        }
    }

    public class FemtiLapp : ValutaEnhet
    {
        public FemtiLapp()
        {
            this.ValutaType = ValutaType.Lapp;
            this.Verdi = 50d;
        }
    }

    public class Tyvekroning : ValutaEnhet
    {
        public Tyvekroning()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 20d;
        }
    }

    public class Tier : ValutaEnhet
    {
        public Tier()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 10d;
        }
    }

    public class Femmer : ValutaEnhet
    {
        public Femmer()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 5d;
        }
    }

    public class EnKrone : ValutaEnhet
    {
        public EnKrone()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 1d;
        }
    }

    public class FemtiØring : ValutaEnhet
    {
        public FemtiØring()
        {
            this.ValutaType = ValutaType.Øre;
            this.Verdi = 0.5d;
        }

        public override string ToString()
        {
            return string.Format("{0}-{1}", this.Verdi*100, this.ValutaType.ToString());
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            FemtiLapp femtiLapp = new FemtiLapp();
            Tyvekroning tyveKroning = new Tyvekroning();
            Tier tier = new Tier();
            Femmer femmer = new Femmer();
            EnKrone enKrone = new EnKrone();
            FemtiØring femtiØring = new FemtiØring();

            List<ValutaEnhet> valutaEnheter = new List<ValutaEnhet>();
            valutaEnheter.Add(femtiLapp);
            valutaEnheter.Add(tyveKroning);
            valutaEnheter.Add(tier);
            valutaEnheter.Add(femmer);
            valutaEnheter.Add(enKrone);
            valutaEnheter.Add(femtiØring);

            double pris = 27.5d;
            double betalt = 150;
            double rest = betalt - pris;

            List<ValutaEnhet> valutaTilbakePrint = new List<ValutaEnhet>();
            while (true)
            {
                if (rest < valutaEnheter[0].Verdi)
                {
                    if (valutaTilbakePrint.Count > 0)
                    {
                        string suffix = string.Empty;
                        if (valutaTilbakePrint.Count > 1)
                        {
                            suffix = "r";
                            if (valutaTilbakePrint[0].ValutaType == ValutaType.Lapp)
                                suffix = suffix.Insert(0, "e");
                        }

                        Console.Write("{0} - {1}{2}{3}", valutaTilbakePrint.Count, valutaTilbakePrint[0].ToString(), suffix, Environment.NewLine );
                        valutaTilbakePrint.Clear();

                        if (rest == 0d)
                            break;
                    }

                    valutaEnheter.RemoveAt(0);
                    continue;
                }

                rest -= valutaEnheter[0].Verdi;
                valutaTilbakePrint.Add(valutaEnheter[0] as ValutaEnhet);
            }
        }
    }
}
Utputt blir på denne måten:

Kode

2 - 50-Lapper
1 - 20-Krone
2 - 1-Kroner
1 - 50-Øre
Sist endret av m0b; 15. desember 2009 kl. 15:33.