Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

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:

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):

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:

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
 
Nahoru Odpovědět  +2 15.8.2015 18:40
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

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