Şimdi Ara

Basit Bankamatik Sistemi Nasıl Yapılır?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
3 Misafir - 3 Masaüstü
5 sn
7
Cevap
0
Favori
526
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba Arkadaşlar.

    Bankamızda;

    • 3 tane 10TL
    • 5 tane 20TL
    • 1 tane 50TL'lik banknot bulunmaktadır.


    Bankamatikten en fazla 100TL çekilebilecek.

    Kullanıcı 90TL istediğinde 1 tane 50TL ve 2 tane 20TL varsa parayı verecek.
    Yada kullanıcı 30TL istediğinde 1 tane 20TL ve 1 tane 10TL varsa parayı verecek.

    Nasıl yapabilirim?

    Dil: C# Console Application



    < Bu mesaj bu kişi tarafından değiştirildi ABC456z -- 20 Ekim 2016; 16:21:12 >



  • using System; 
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication1
    {
    public class liste
    {
    public int banknotDegeri { get; set; }
    public int banknotSayisi { get; set; }
    }

    class Program
    {

    static List<liste> para = new List<liste>(); // eldeki paraları tutacağımız liste
    static int miktar, toplam = 0;
    static void Main(string[] args)
    {
    Console.Write("Para miktarı: ");
    miktar = Convert.ToInt32(Console.ReadLine());

    if (miktar % 10 != 0 || miktar > 100 || miktar < 10)
    {
    Console.WriteLine("10'un katları şeklinde en fazla 100TL çekilebilir.");
    }
    else
    {
    para.Add(new liste { banknotDegeri = 10, banknotSayisi = 3 }); //paralarımızı listeye ekliyoruz
    para.Add(new liste { banknotDegeri = 20, banknotSayisi = 5 });
    para.Add(new liste { banknotDegeri = 50, banknotSayisi = 1 });
    Program pg = new Program();
    pg.paraver(miktar);
    }
    Console.WriteLine("bitti");
    Console.ReadKey();

    }
    int paraver(int m)
    {
    /*
    * rekürsif fonksiyon. banknotları karşılaştırarak o an için verebileceği en yüksek banknotu verir. eğer hala para vermesi gerekiyor ise fonksiyon tekrar çalışır
    * örneğin 100TL için ilk aşamada elindeki en yüksek miktar olan 50TL'yi verdi. 50TL daha vermesi gerekiyor. Bu durumda 50TL bittiği için eldeki en yüksek 20TL'yi verir.
    * 30TL daha vereceğinden yine en yüksek banknot olan 20TL'yi verir. Kalan 10TL için eldeki en yüksek miktar olan 10TL'yi verip bitirir.
    *
    */
    for (int i = para.Count-1; i >= 0; i--)
    {
    if (para[i].banknotSayisi > 0 && para[i].banknotDegeri <= m)
    {
    Console.WriteLine("Paraver: "+para[i].banknotDegeri.ToString()+"TL");
    para[i].banknotSayisi--;
    toplam += para[i].banknotDegeri;
    break;
    }
    }
    if (toplam >= miktar) // para verim işleminin tamamlanıp tamamlanmadığını kontrol eder. eğer para verildiyse fonksiyonu bitirir.
    return 0;
    else
    return paraver(miktar - toplam); //para verme işlemi tamamlanmadı ise yeni miktar için tekrar kendini çağırır

    }
    }
    }




  • Ephésus kullanıcısına yanıt
    Daha basit bir şekilde yazabilir misiniz. get, set ve list komutu olmadan. Ayrıca mantığı daha açıklayıcı bir şekilde yazabilir misiniz?
  • ABC456z A kullanıcısına yanıt
    Liste çok kafanı karıştırmasın sadece eldeki paraları tutmak için mevcut o.

    Şöyle düşünelim, elimizde birtakım paralar mevcut. Bu paraları önümüzde küçükten büyüğe sıralı şekilde koyduk ve birisine para vereceğiz. Para verme işlemini minimum banknot sayısı ile yapmak için her adımda verebileceğimiz en büyük banknotu tercih ediyoruz. 100TL için önce elimizdeki 50lik banknotu veriyoruz. 50TL daha vermemiz gerek fakat elimizde başka 50lik banknot yok bu durumdan dolayı bir ufağı olan 20liğe bakıyoruz, elimizde mevcut ve onu veriyoruz. 50+20 şeklinde 2 banknot verdik yani 70TL etti. 30TL daha vermemiz gerek, eldeki 30TL'ye en yakın banknota bakıyoruz ve 20TL olduğunu görüyoruz. 20TL'yi 3. banknot olarak veriyoruz. Total 90TL yaptı, 10Tl daha vermemiz gerek. Son olarak onun içinde en büyük banknot olan 10TL yi verip, verdiğimiz miktar başta istenen miktara eşit olduğundan tamamını verdiğimizi anlıyor ve bitiriyoruz.




  • Yardımınız için teşekkür ederim.

    En basit şekilde kodları yazabilir misiniz, yani benim başladığım şeyin devamını getirebilir misiniz, ben hangi kodla başlayacağımı bilemiyorum.

    // ATM'nin kapasitesi
    public static int maxMoney = 100;
    public static int piece10 = 3;
    public static int piece20 = 5;
    public static int piece50 = 1;

    // Kullanıcının istediği miktar
    public static int reqMoney = 0;

    static void Main(string[] args)
    {
    while(reqMoney < 10)
    {
    Console.Clear();
    Console.WriteLine("10TL ve katları olmak üzere en fazla 100TL çekebilirsiniz.");
    Console.Write("Ne kadar istediğinizi yazın: ");
    reqMoney = int.Parse(Console.ReadLine());
    }
    }

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • ABC456z A kullanıcısına yanıt
    Rekürsif fonksiyon ve dizi konularına ne kadar hakimsin? Ona göre en basit yapıya dökmeye çalışayım.
  • List ve türevi(Dictionary vs.) kullanmadan yapılması zor değil.

    Edit: Fakat bu şekilde önermem. OOP mantığını kullanmadan iş yapmak biraz amatörce oluyor. İstediğin gibi hakim olamıyorsun, düzenleyemiyorsun vs.
    Edit2: For, While vs. gibi döngülerede gerek yok. Algoritmayı karıştırmaktan başka işe yaramaz eğer OOP kullanılmıyorsa. Ayrıca Herhangi bir döngü olsaydı benchmark sonuçları 2 kat'a kadar daha da yavaşlardı. Yani burada algoritma karmaşıklığı ve performans'ı, O(1) yani en iyi seviyededir. Bir döngü ile O(n)'e çıkacaktı.

    Banknotlar farklı şekilde tutulabilir ;

    1) En basiti List ve türevleri. (Generic Collection)
    2) 2 adet int[] jagged array oluşturulup, biri banknot sayısı, diğeri ise değerini tutabilir. Bir nevi dictionary gibi.
    3) 2D int[,] ile de aynı mantık yapılabilir.

    Farklı şekilde hesaplanabilir ;

    1) Recursive (Özyinelemeli) fonksiyon. Yani @Ephesus 'un verdiği örnekteki gibi.
    2) LINQ kullanarak ki bence en kolay yolu.

    Ama hâlâ diyorsan, abi kafa yapma işte kodu ver dersen, senin için yazdım 2 satır ;

    CODE:

     

    int banknot1 = 0, banknot5 = 0, banknot10 = 0, banknot50 = 0, banknot100 = 0, banknot200 = 0;
    Console.Write("Çekilecek TL giriniz : ");

    int girisParasi = 0;

    //Güvenli int dönüştürme işlemidir
    if (int.TryParse(Console.ReadLine(), out girisParasi)) {

    //Büyükten küçüğe gitme sebebi önce 200'lük destelere bölmek istememiz. Öncelik herzaman yukarıda olandadır.
    banknot200 = girisParasi / 200;
    girisParasi = girisParasi % 200;

    banknot100 = girisParasi / 100;
    girisParasi = girisParasi % 100;

    banknot50 = girisParasi / 50;
    girisParasi = girisParasi % 50;

    banknot10 = girisParasi / 10;
    girisParasi = girisParasi % 10;

    banknot5 = girisParasi / 5;
    girisParasi = girisParasi % 5;

    banknot1 = girisParasi;

    Console.WriteLine("1'lik banknot sayısı = {0}", banknot1);
    Console.WriteLine("5'lik banknot sayısı = {0}", banknot5);
    Console.WriteLine("10'lik banknot sayısı = {0}", banknot10);
    Console.WriteLine("50'lik banknot sayısı = {0}", banknot50);
    Console.WriteLine("100'lik banknot sayısı = {0}", banknot100);
    Console.WriteLine("200'lik banknot sayısı = {0}", banknot200);
    Console.WriteLine("\nToplam çekilen TL = {0}", (banknot1 * 1) + (banknot5 * 5) + (banknot10 * 10) + (banknot50 * 50) + (banknot100 * 100) + (banknot200 * 200));

    } else {
    Console.WriteLine("Lütfen rakam giriniz!");
    }
    //Dentrax



    NOT: Basit olduğuda bakma, çok verimli bir kod'dur. Büyük rakamlarda LINQ veya Recursive herzaman yavaş kalacaktır.

    BENCHMARK TESTI:

    1.000 kez çalıştı, 892 TL ile : 0,0774 ms.

    1.000 kez çalıştı, 2.147.483.648 (int.MaxValue) TL ile : 0,0801 ms.

    100.000 kez çalıştı, 2.147.483.648 (int.MaxValue) TL ile : 19,3904 ms.

    1.000.000 kez çalıştı, 2.147.483.648 (int.MaxValue) TL ile : 85,6251 ms.

    1.000.000 kez çalıştı, 9.223.372.036.854.775.807 (long.MaxValue) TL ile : 203,0107 ms.

    NOT: Testler i7 4720HQ (%70 MAX) 'da yapıldı, kendiniz de StopWatch ile test edebilirsiniz. Görüldüğü üzere en sonuncu bile saniyenen 5'de 1'in de çözüyor. Çok çok iyi bir değer.

    INPUT:

    892


    OUTPUT:

    Çekilecek TL giriniz : 892 
    1'lik banknot sayısı = 2
    5'lik banknot sayısı = 0
    10'lik banknot sayısı = 4
    50'lik banknot sayısı = 1
    100'lik banknot sayısı = 0
    200'lik banknot sayısı = 4

    Toplam çekilen TL = 892



    < Bu mesaj bu kişi tarafından değiştirildi Dentrax -- 21 Ekim 2016; 22:47:26 >




  • Yapay Zeka’dan İlgili Konular
    Nasıl bir sistem
    16 yıl önce açıldı
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.