Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

C# .NET .NET (C# a Visual Basic) Přetečení zásobníku American English version English version

Aktivity (1)
Avatar
Ondřej Krsička
Redaktor
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
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Ondřej Krsička
patrik.valkovic: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  -2 15.8.2015 18:37
2x piš, jednou debuguj
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Ondřej Krsička
patrik.valkovic: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  +2 15.8.2015 18:39
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jan Vargovský
Redaktor
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  +2 15.8.2015 18:40
Avatar
Jan Vargovský
Redaktor
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  +1 15.8.2015 19:26
Avatar
Ondřej Krsička
Redaktor
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.