C# Automat

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
techstep
Nováček
Nováček
Registrován: 18. črc 2010

C# Automat

Příspěvek od techstep »

Zdravim,
Dostal jsem za úkol udělat jednoduchej automat na jízdenky, asi jako každej na začátek. Ale trochu si s ním nevím rady, nedělal už ho někdo z vás a nepodělil by se se mnou o poznatky? Abych se měl aspon čeho chytit, docela dost tápu :(
Exp
Začátečník
Začátečník
Registrován: 24. črc 2004
Bydliště: Tábor
Kontaktovat uživatele:

Re: C# Automat

Příspěvek od Exp »

Co ti není jasný? Na začátku automat vyzve k volbě jízdenky za určitou hodnotu, uživatel vybere jízdenku, vhodí peníze, jakmile je dostatek peněz, automat tiskne. Pokud je co, automat vrátí.
techstep
Nováček
Nováček
Registrován: 18. črc 2010

Re: C# Automat

Příspěvek od techstep »

Tak volbu jízdenky a cenu mám, ale ted nevím jak udělat to vhození, příčtení a vrácení peněz
Exp
Začátečník
Začátečník
Registrován: 24. črc 2004
Bydliště: Tábor
Kontaktovat uživatele:

Re: C# Automat

Příspěvek od Exp »

Pokud to má bejt uplně nejjednodušší (takže mj. bez GUI), pak bych zvolil čísla 1-6 pro 1Kč, 2Kč, 5Kč, 10Kč, 20Kč a 50Kč. Uživatel by tak zadal třeba 5, stisknul enter a automat by vložil "do banku" 20Kč. Automat musí mít ve výchozím stavu určitý počet mincí od každého druhu. K těm se přičtou vhozené mince a podle aktuálního stavu vrátí mince v takových hodnotách, aby to vyšlo co nejlíp (takže třeba 12Kč nebude vracet šesti dvoukorunama, ale desetikorunou a dvoukorunou - pokud je má). Nejlepší je po vhození dostatečné sumy pro tisk lístu provést kontrolu, jestli má automat dost mincí na vrácení, pokud by neměl, stornuje objednávku a vhozené peníze vrátí.
techstep
Nováček
Nováček
Registrován: 18. črc 2010

Re: C# Automat

Příspěvek od techstep »

Tak ta kontrola a to stornování tam být nemusí..takhle to právě vím taky, ten postup v hlavě mám ale nedokážu to zapsat, ten zásobník na mince mám a počet mincí tam mám taky, ale tam jsem skončim, nedokážu příčíst ty nově vhozené mince do zásobníku automatu a odečítat je od ceny jízdenky.
PiranhaGreg
Nováček
Nováček
Registrován: 02. led 2013

Re: C# Automat

Příspěvek od PiranhaGreg »

Kdysi jsem napsal něco podobnýho pro kámoše (ten mi za to koupil flašku :mrgreen: ). Tehdy mi prográmko ještě tak nešlo, takže to není nic extra, ale myslím si že to právě chceš :) .

Kód: Vybrat vše

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

namespace Automat
{
    class Program
    {
        static void Main(string[] args)
        {
            Automat automat = new Automat("Automat");
            string akce;

            while (true)
            {
                Console.Clear();

                Console.WriteLine(automat.Jmeno + " \n");
                Console.WriteLine("Vhozeno: " + automat.Vhozeno + " Kč");
                Console.WriteLine("Cena jízdenek: " + automat.AktualniCena + " Kč\n\n");

                Console.WriteLine("(M) Vhodit mince");
                Console.WriteLine("(J) Vybrat jízdenky");
                Console.WriteLine("(S) Storno objednávky a vrácení peněz");
                Console.WriteLine("(P) Potvrzení objednávky");

                Console.Write("\nAkce: ");
                akce = Console.ReadLine();
                akce.ToUpper();

                if (akce == "M")
                {
                    Mince mince;

                    do
                    {
                        mince = vratPolozku(automat.AkceptovatelneMince) as Mince;

                        if (mince != null)
                            automat.NovaMince(mince.Hodnota);

                    } while (mince != null);
                }
                else if (akce == "J")
                {
                    Jizdenka jizdenka;

                    do
                    {
                        jizdenka = vratPolozku(automat.DruhyJizdenek) as Jizdenka;

                        if (jizdenka != null)
                            automat.ObjednejJizdenku(jizdenka);

                    } while (jizdenka != null);
                }
                else if (akce == "S")
                {
                    Console.WriteLine("\n" + automat.Storno());
                    Console.ReadLine();
                }
                else if (akce == "P")
                {
                    Console.WriteLine("\n" + automat.Potvrdit());
                    Console.ReadLine();
                }
            }
        }

        static object vratPolozku(object[] menu)
        {
            Console.CursorVisible = false;
            ConsoleKeyInfo klavesa = new ConsoleKeyInfo();
            int index = 0;

            do
            {
                Console.Clear();
                vykreslyMenu(menu, index);

                klavesa = Console.ReadKey(true);

                if (klavesa.Key == ConsoleKey.DownArrow)
                    index++;
                else if (klavesa.Key == ConsoleKey.UpArrow)
                    index--;

                if (index < 0)
                    index = menu.Length;
                else if (index > menu.Length)
                    index = 0;

            } while (klavesa.Key != ConsoleKey.Enter);

            Console.Clear();
            Console.CursorVisible = true;

            if (index == menu.Length)
                return null;
            else
                return menu[index];
        }

        static void vykreslyMenu(object[] menu, int index)
        {
            int maxDelka = 0;

            foreach(object polozkaMenu in menu)
                if (maxDelka < polozkaMenu.ToString().Length)
                    maxDelka = polozkaMenu.ToString().Length;

            for (int i = 0; i <= menu.Length; i++)
            {
                if (i == index)
                    Console.BackgroundColor = ConsoleColor.Blue;

                if (i < menu.Length)
                    Console.WriteLine(menu[i].ToString() + new String(' ', maxDelka - menu[i].ToString().Length));
                else
                    Console.WriteLine("Zpět" + new String(' ', maxDelka - "Zpět".Length));

                Console.BackgroundColor = ConsoleColor.Black;
            }
        }
    }

    /// <summary>
    /// Třída obsahující informace o prodejním automatu
    /// </summary>
    class Automat
    {
        int prebytek = 0;
        string jmeno;
        List<Mince> mince = new List<Mince>();
        List<Jizdenka> jizdenky = new List<Jizdenka>();
        List<Jizdenka> pozadovaneJizdenky = new List<Jizdenka>();

        /// <summary>
        /// Vytvoří nový automat
        /// </summary>
        /// <param name="jmeno">Jméno automatu</param>
        public Automat(string jmeno)
        {
            this.jmeno = jmeno;

            // Podporované mince
            mince.Add(new Mince("Padesát korun", 50, 5));
            mince.Add(new Mince("Dvacet korun", 20, 5));
            mince.Add(new Mince("Deset korun", 10, 10));
            mince.Add(new Mince("Pět korun", 5, 10));
            mince.Add(new Mince("Dvě koruny", 2, 10));
            mince.Add(new Mince("Koruna", 1, 20));

            // Podporované jízdenky
            jizdenky.Add(new Jizdenka("Obyčejná", 14));
            jizdenky.Add(new Jizdenka("Dětská", 8));
            jizdenky.Add(new Jizdenka("Celodenní", 50));
            jizdenky.Add(new Jizdenka("Celodenní dětská", 30));
        }

        /// <summary>
        /// Vrátí všechny druhy jízdenek, které dokáže automat vydávat
        /// </summary>
        public Jizdenka[] DruhyJizdenek
        {
            get { return this.jizdenky.ToArray(); }
        }

        /// <summary>
        /// Jméno automatu
        /// </summary>
        public string Jmeno
        {
            get { return this.jmeno; }
        }

        /// <summary>
        /// Vypíše seznam mincí, které automat podporuje
        /// </summary>
        public Mince[] AkceptovatelneMince
        {
            get { return this.mince.ToArray(); }
        }

        /// <summary>
        /// Přidá do automatu novou minci
        /// </summary>
        /// <param name="hodnota">Hodnota mince</param>
        public string NovaMince(int hodnota)
        {
            if (vratMinci(hodnota) != null)
            {
                vratMinci(hodnota).Pocet++;
                prebytek += hodnota;
                return "Mince přijata";
            }
            else
            {
                return "Tuto minci automat nepodporuje!";
            }
        }

        /// <summary>
        /// Vrátí mince, které automatu nepatří
        /// </summary>
        /// <returns>Textový výpis mincí</returns>
        private string VratMince()
        {
            string mince = "Vráceno:\n\n";

            for (int i = prebytek; i > 0; i--)
            {
                if (vratMinci(i) != null)
                {
                    mince += "\n" + vratMinci(i).Jmeno;
                    vratMinci(i).Pocet--;
                    prebytek -= vratMinci(i).Hodnota;
                    i = prebytek + 1;
                }
            }

            return mince;
        }

        /// <summary>
        /// Vrátí minci podle hodnoty
        /// </summary>
        /// <param name="hodnota">Hodnota mince</param>
        /// <returns>Pokud mince vložené hodonty neexistuje, vrátí null</returns>
        private Mince vratMinci(int hodnota)
        {
            foreach (Mince mince in this.mince)
                if (mince.Hodnota == hodnota)
                    return mince;

            return null;
        }

        /// <summary>
        /// Přidání nové jízdenky
        /// </summary>
        /// <param name="jizdenka">Jízdenka</param>
        /// <returns>Vrátí potvrzení přijmutí volby jízdenky</returns>
        public string ObjednejJizdenku(Jizdenka jizdenka)
        {
            pozadovaneJizdenky.Add(jizdenka);
            return jizdenka.Jmeno + " byla přidána na seznam";
        }

        /// <summary>
        /// Stornuje objednávku a vrátí peníze
        /// </summary>
        /// <returns>Vrátí textový výpis vrácených peněz (pokud nějaké jsou)</returns>
        public string Storno()
        {
            pozadovaneJizdenky.Clear();

            if (prebytek > 0)
                return VratMince();
            else
                return "Stornováno";
        }

        /// <summary>
        /// Koupit požadované jízdenky
        /// </summary>
        /// <returns>Vrátí výpis koupených jízdenek a vrácených peněz</returns>
        public string Potvrdit()
        {
            string vypis = "Objednávka vyřízena\n\nVrácené jízdenky:";

            for (int i = 0; i < pozadovaneJizdenky.Count; i++)
            {
                if (prebytek >= pozadovaneJizdenky[i].Cena)
                {
                    vypis += "\n" + pozadovaneJizdenky[i].Jmeno + " (" + pozadovaneJizdenky[i].Cena + " Kč)";
                    prebytek -= pozadovaneJizdenky[i].Cena;
                }
            }

            pozadovaneJizdenky.Clear();

            if (prebytek > 0)
            {
                vypis += "\n\n" + VratMince();
            }

            return vypis;
        }

        /// <summary>
        /// Kolik korun bylo do automatu vhozeno
        /// </summary>
        public int Vhozeno
        {
            get { return this.prebytek; }
        }

        /// <summary>
        /// Aktuální celková cena koupených jízdenek
        /// </summary>
        public int AktualniCena
        {
            get 
            {
                int cena = 0;

                foreach (Jizdenka jizdenka in this.pozadovaneJizdenky)
                    cena += jizdenka.Cena;

                return cena;
            }
        }
    }

    /// <summary>
    /// Obsahuje informace o minci
    /// </summary>
    class Mince
    {
        int hodnota, pocet;
        string jmeno;

        /// <summary>
        /// Vytvoří nový typ mince
        /// </summary>
        /// <param name="jmeno">Jméno mince</param>
        /// <param name="hodnota">Hodnota mince</param>
        /// <param name="pocet">Počet mincí v automatu</param>
        public Mince(string jmeno, int hodnota, int pocet)
        {
            this.jmeno = jmeno;
            this.hodnota = hodnota;
            this.pocet = pocet;
        }

        /// <summary>
        /// Jméno mince
        /// </summary>
        public string Jmeno
        {
            get { return this.jmeno; }
        }

        /// <summary>
        /// Hodnota mince
        /// </summary>
        public int Hodnota
        {
            get { return this.hodnota; }
        }

        /// <summary>
        /// Počet mincí v automatu
        /// </summary>
        public int Pocet
        {
            get { return this.pocet; }

            set 
            {
                if (value > 0)
                    this.pocet = value;
                else
                    this.pocet = 0;
            }
        }

        /// <summary>
        /// Přepsání metody ToString()
        /// </summary>
        /// <returns>Vrátí název mince</returns>
        public override string ToString()
        {
 	         return this.jmeno;
        }
    }

    /// <summary>
    /// Obsahuje informace o jízdence
    /// </summary>
    class Jizdenka
    {
        string jmeno;
        int cena;

        /// <summary>
        /// Vytvoří nový druh jízdenky
        /// </summary>
        /// <param name="jmeno">Jméno jízdenky</param>
        /// <param name="cena">Cena jízdenky</param>
        public Jizdenka(string jmeno, int cena)
        {
            this.jmeno = jmeno;
            this.cena = cena;
        }

        /// <summary>
        /// Jméno jízdenky
        /// </summary>
        public string Jmeno
        {
            get { return this.jmeno; }
        }

        /// <summary>
        /// Cena jízdenky
        /// </summary>
        public int Cena
        {
            get { return this.cena; }
        }

        /// <summary>
        /// Přepsání metody ToString()
        /// </summary>
        /// <returns>Vrátí jméno jízdenky</returns>
        public override string ToString()
        {
 	         return this.jmeno + " (" + this.cena + " Kč)";
        }
    }
}
Nemáte oprávnění prohlížet přiložené soubory.
techstep
Nováček
Nováček
Registrován: 18. črc 2010

Re: C# Automat

Příspěvek od techstep »

Díky díky díky moc, taky bych ti klidně koupil flašku, klidně i dvě :-D
Odpovědět

Zpět na „Programování a web“