NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Ondřej Krsička:15.8.2015 18:20

Ahoj, tenhle kód nefunguje kvůli zásobníku. Proč? Jak lépe to udělat?

static int[] Platba(int cislo)
{
    List<int> seznam = new List<int>();
    int bankovka = 0;
    if (cislo / 5000 > 0) bankovka = 5000;
    else if (cislo / 2000 > 0) bankovka = 2000;
    else if (cislo / 1000 > 0) bankovka = 1000;
    else if (cislo / 500 > 0) bankovka = 500;
    else if (cislo / 200 > 0) bankovka = 200;
    else if (cislo / 100 > 0) bankovka = 100;
    else if (cislo / 50 > 0) bankovka = 50;
    else if (cislo / 20 > 0) bankovka = 20;
    else if (cislo / 10 > 0) bankovka = 10;
    else if (cislo / 5 > 0) bankovka = 5;
    else if (cislo / 2 > 0) bankovka = 2;
    else if (cislo / 1 > 0) bankovka = 1;
    seznam.Add(bankovka);
    seznam.AddRange(Platba(cislo - bankovka));
    return seznam.ToArray();
}
 
Odpovědět
15.8.2015 18:20
Avatar
Odpovídá na Ondřej Krsička
Patrik Valkovič:15.8.2015 18:35

Zkus misto rekurze použít cyklus. Jaké číslo zadáváš?

Nahoru Odpovědět
15.8.2015 18:35
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Ondřej Krsička
Josef Kuchař - Pepa489:15.8.2015 18:37

Zkus

List<int> seznam = new List<int>();

dát mimo funkci Platba, protože se vždy zavolá konstruktor a vynuluje se to(si myslím) :D ;)

Nahoru Odpovědět
15.8.2015 18:37
2x piš, jednou debuguj
Avatar
Odpovídá na Ondřej Krsička
Patrik Valkovič:15.8.2015 18:39

Už to mám. Nemás podmínku, kdy je číslo nula, tedy ti funkce vrací porůád bankovku o hodnotě nula.

Nahoru Odpovědět
15.8.2015 18:39
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Jan Vargovský:15.8.2015 18:40

Zkus to někdy ukončit...

 
Nahoru Odpovědět
15.8.2015 18:40
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:15.8.2015 19:26

Musel sem si zkusit nové věci z C# 6.0 :D

internal class Program
{
    class Bankovka
    {
        public int Pocet { get; }
        public int Hodnota { get; }

        public Bankovka(int pocet, int hodnota)
        {
            Pocet = pocet;
            Hodnota = hodnota;
        }

        public override string ToString()
        {
            return Pocet < 2 ? Hodnota.ToString() : $"{Pocet}x{Hodnota}";
        }
    }

    private static List<Bankovka> Platba(int cislo)
    {
        int[] hodnoty = { 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
        var vysledek = new List<Bankovka>();
        int index = 0;
        while (cislo > 0 && index < hodnoty.GetLength(0))
        {
            int pocet = cislo / hodnoty[index];
            if (pocet != 0)
            {
                vysledek.Add(new Bankovka(pocet, hodnoty[index]));
                cislo %= hodnoty[index];
            }
            index++;
        }

        return vysledek;
    }

    [STAThread]
    private static void Main(string[] args)
    {
        Console.WriteLine(string.Join(" ", Platba(353)));
        Console.WriteLine(string.Join(" ", Platba(5001)));
        Console.WriteLine(string.Join(" ", Platba(9987)));
    }
}
Editováno 15.8.2015 19:28
 
Nahoru Odpovědět
15.8.2015 19:26
Avatar
Ondřej Krsička:15.8.2015 20:02
static int[] Platba(int cislo)
{
    List<int> seznam = new List<int>();
    if (cislo > 0)
    {
        int bankovka = 0;
        if (cislo / 5000 > 0) bankovka = 5000;
        else if (cislo / 2000 > 0) bankovka = 2000;
        else if (cislo / 1000 > 0) bankovka = 1000;
        else if (cislo / 500 > 0) bankovka = 500;
        else if (cislo / 200 > 0) bankovka = 200;
        else if (cislo / 100 > 0) bankovka = 100;
        else if (cislo / 50 > 0) bankovka = 50;
        else if (cislo / 20 > 0) bankovka = 20;
        else if (cislo / 10 > 0) bankovka = 10;
        else if (cislo / 5 > 0) bankovka = 5;
        else if (cislo / 2 > 0) bankovka = 2;
        else if (cislo / 1 > 0) bankovka = 1;
        seznam.Add(bankovka);
        seznam.AddRange(Platba(cislo - bankovka));
    }
    return seznam.ToArray();
}

Díky za radu. Heh, stačí myslet :D

Kdyžtak mi sem můžete napsat vlastní řešení jako to udělal Jan, třeba se něčemu přiučím.

 
Nahoru Odpovědět
15.8.2015 20:02
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.