Подсчет общей суммы по количеству вхождений - C#
Формулировка задачи:
Имеет файл в котором записано следующее:
Тел 1 шт - 2000
Тел 5 шт - 8000
Ноут 1 шт - 10000
Ноут 3 шт - 25000
Нужно сделать следующее:
Чтобы программа считала данные из файла, и когда пользователь введет, например, НоутНоутТелНоутТелТел, программа считала сумму общую сумму, то есть в данном примере должно получится: 31000. Как то так)
Сижу себе головную боль придумываю)
Решение задачи: «Подсчет общей суммы по количеству вхождений»
textual
Листинг программы
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace TelNout { class Program { private static Dictionary<string, Dictionary<int, int>> priceList; static void Main(string[] args) { priceList = GetPriceListFromFile("price.txt"); while (true) { var sum = GetSum(Console.ReadLine()); Console.WriteLine(sum); } } private static Dictionary<string, Dictionary<int, int>> GetPriceListFromFile(string file) { var priceList = new Dictionary<string, Dictionary<int, int>>(); var lines = File.ReadLines(file, Encoding.GetEncoding(1251)); foreach (var line in lines) { var split = line.Split(); var name = split[0]; var count = int.Parse(split[1]); var price = int.Parse(split[4]); if(!priceList.ContainsKey(name)) priceList.Add(name, new Dictionary<int, int>()); priceList[name].Add(count, price); } return priceList; } private static int GetSum(string line) { var pattern = @"[А-Я][а-я]{1,}"; var regex = new Regex(pattern); var split = regex.Matches(line).Cast<Match>().Select(x => x.Value); var tuples = split.GroupBy(value => value).Select(x => Tuple.Create(x.Key, x.Count())); return tuples.Sum(x => GetPrice(x.Item1, x.Item2)); } private static int GetPrice(string name, int count) { var keys = priceList[name].Keys.Cast<int>(); var counts = GetBestCounts(keys, count); return counts.Sum(x => priceList[name][x]); } private static IEnumerable<int> GetBestCounts(IEnumerable<int> keys, int num) { var list = new List<int>(); var array = keys.OrderByDescending(x => x).ToArray(); var i = 0; while (true) { var sum = list.Sum() + array[i]; if (sum <= num) { list.Add(array[i]); if(sum == num) return list; } else { if (i++ >= array.Length) break; } } throw new System.ArgumentException("В списке цен не нашли подходящий вариант"); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д