IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Přetečení zásobníku

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
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.