C # списки и значения для торгового автомата - PullRequest
0 голосов
/ 25 ноября 2018

Этот пост в большей или меньшей степени связан с моим предыдущим постом: C # добавление значения / индекса к элементам в массиве и отслеживание в консоли того, как часто они нажимались

I 'Я не уверен, как назвать мой заголовок, извините за путаницу.Мое задание - кодирование основного торгового автомата.

Итак, я получил два списка прямо сейчас.ListBox 1 имеет прикрепленный enum.В этом перечислении 4 предмета, которые имеют цену за каждый предмет.Item1 имеет цену 1,7 евро (индекс enum равен 170), Item2 оценивается в 2 евро (индекс enum равен 200) и так далее.Я уже закодировал это.

При выборе одного из этих элементов появляется ListBox2.Это содержит монеты, которые вы можете нажать, чтобы оплатить выбранный предмет.Монеты 0,10, 0,20, 0,30, 0,50, 1,00 и 2,00.Я уже закодировал эти списки и их перечисление / массив.

То, что я должен делать (и изо всех сил пытаюсь это сделать), - это создавать массив (я так думаю, по крайней мере), который будет учитываться каждый раз, когда я нажимаю на любой изэти монеты.Если я выбрал Item1, стоимость которого составляет 1,70 евро (индекс равен 170), то если я щелкну 0,50 4 раза, получится значение 2,00 (индекс 200), что означает, что значение Item1 достигнуто.Появится надпись, в которой будет упомянуто значение, которое было достигнуто, а также будет показано, сколько монет (и сколько каждой монеты) было выбрано.

Кроме того, если значение монет больше, чем значениевыбранный предмет, затем появятся дополнительные строки, сколько из каждой монеты вы получите.В этом случае следует сказать 1 из 0,10 и 1 из 0,20.

Я не могу понять, как решить эту проблему.Я абсолютный новичок в программировании, и это для задания, которое должно быть сегодня вечером.

Я надеюсь, что любой мог бы помочь мне с этим.

1 Ответ

0 голосов
/ 25 ноября 2018

Поскольку я помог вам в предыдущем посте, я подумал, что помогу вам и здесь.Это было просто, когда вы понимаете логику.Я написал и приложение, которое делает то, что требуется.Может потребоваться привести в порядок, но он полностью работоспособен.

Вот ваш главный:

 public partial class MainWindow : Window
    {
        List<KeyValuePair<string, int>> tracking = new List<KeyValuePair<string, int>>();
        List<KeyValuePair<string, int>> changeGiven = new List<KeyValuePair<string, int>>();
        List<decimal> coinItems = new List<decimal>();

        decimal valueSelected;
        decimal coinSoFar = 0;
        Hashtable coins = new Hashtable();
        Hashtable prices = new Hashtable();

        public MainWindow()
        {
            InitializeComponent();

            coins.Add("010", 0.10m);
            coins.Add("020", 0.20m);
            coins.Add("030", 0.30m);
            coins.Add("040", 0.40m);
            coins.Add("050", 0.50m);

            coinItems.Add(Convert.ToDecimal(coins["010"]));
            coinItems.Add(Convert.ToDecimal(coins["020"]));
            coinItems.Add(Convert.ToDecimal(coins["030"]));
            coinItems.Add(Convert.ToDecimal(coins["040"]));
            coinItems.Add(Convert.ToDecimal(coins["050"]));

            lbTodoList.ItemsSource = coinItems;

            prices.Add("100", 1.10m);
            prices.Add("120", 1.20m);
            prices.Add("130", 1.30m);
            prices.Add("140", 1.40m);
            prices.Add("150", 1.50m);
            prices.Add("160", 1.60m);
            prices.Add("170", 1.70m);

            List<decimal> priceItems = new List<decimal>();
            priceItems.Add(Convert.ToDecimal(prices["100"]));
            priceItems.Add(Convert.ToDecimal(prices["120"]));
            priceItems.Add(Convert.ToDecimal(prices["130"]));
            priceItems.Add(Convert.ToDecimal(prices["140"]));
            priceItems.Add(Convert.ToDecimal(prices["150"]));
            priceItems.Add(Convert.ToDecimal(prices["160"]));
            priceItems.Add(Convert.ToDecimal(prices["170"]));

            lbPrice.ItemsSource = priceItems;
        }

        private void lbTodoList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var item = this.lbTodoList.SelectedItem?.ToString();
            if (item != null)
            {
                if (!tracking.Select(x => x.Key == item).Any())
                {
                    tracking.Add(new KeyValuePair<string, int>(item, 1));
                    Console.WriteLine(item + " has been selected once");
                }
                else
                {
                    var currentItem = tracking.SingleOrDefault(x => x.Key == item);
                    var value = currentItem.Value;
                    tracking.Remove(currentItem);
                    value++;
                    tracking.Add(new KeyValuePair<string, int>(item, value));
                }

                var getIndex = item.Replace(".", "");
                coinSoFar += Convert.ToDecimal(coins[getIndex]);

                if (coinSoFar >= valueSelected)
                {
                    StringBuilder coinsInserted = new StringBuilder();
                    foreach (var coinTracked in tracking)
                    {
                        coinsInserted.Append(coinTracked.Key + " x " + coinTracked.Value + "; ");
                    }

                    var difference = coinSoFar - valueSelected;

                    int coinDifferenceIndex = 0;
                    StringBuilder coinsReturned = new StringBuilder();
                    while (difference != 0)
                    {
                        var currentCoin = coinItems[coinDifferenceIndex];
                        difference -= currentCoin;

                        var currentItem = changeGiven.SingleOrDefault(x => x.Key == currentCoin.ToString());
                        if (currentItem.Key != null)
                        {
                            var value = currentItem.Value;
                            changeGiven.Remove(currentItem);
                            value++;
                            changeGiven.Add(new KeyValuePair<string, int>(currentItem.Key, value));
                        }
                        else
                        {
                            changeGiven.Add(new KeyValuePair<string, int>(currentCoin.ToString(), 1));
                        }

                        if (difference > currentCoin)
                        {
                            coinDifferenceIndex++;
                        }
                        else
                        {
                            coinDifferenceIndex = 0;
                        }
                    }

                    foreach (var coin in changeGiven)
                    {
                        coinsReturned.Append(coin.Key + " x " + coin.Value + "; ");
                    }

                    if(changeGiven.Any())
                    {
                        this.lblEnoughMoneyReached.Content = "Cost value has been met. Coins inserted: " + coinsInserted + ".Change given: " + coinsReturned;
                    }
                    else
                    {
                        this.lblEnoughMoneyReached.Content = "Cost value has been met. Coins inserted: " + coinsInserted;
                    }  
                }
            }
            this.lbTodoList.SelectedItem = null;
        }

        private void lbPrice_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            valueSelected = Convert.ToDecimal(this.lbPrice.SelectedItem?.ToString());
        }
    }

И ваш XAML должен выглядеть так:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="300"/>
            <RowDefinition Height="300"/>
            <RowDefinition Height="300"/>
            <RowDefinition Height="300"/>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Grid.Column="0" Name="lbTodoList" HorizontalAlignment="Left" Height="154" Margin="145,56,0,0" VerticalAlignment="Top" Width="277" SelectionChanged="lbTodoList_SelectionChanged">
        </ListBox>

        <ListBox Grid.Row="0" Grid.Column="0" Name="lbPrice" HorizontalAlignment="Left" Height="154" Margin="525,56,0,0" VerticalAlignment="Top" Width="277" SelectionChanged="lbPrice_SelectionChanged">
        </ListBox>

        <Label Grid.Row="1" Grid.Column="0" Name="lblEnoughMoneyReached" HorizontalAlignment="Left" Height="154" VerticalAlignment="Top"></Label>

    </Grid>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...