Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 03.03.2022
Сообщений: 5

Описать класс «товар»

03.03.2022, 22:00. Показов 1988. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Описать класс «товар», содержащий следующие закрытые поля:
• название товара;
• название магазина, в котором продается товар;
• стоимость товара в рублях;
• количество товара.
Предусмотреть свойства для получения состояния объекта.
Описать класс «Справка», содержащий закрытый массив товаров. Обеспечить
следующие возможности:
• • вывод информации о товаре по номеру с помощью индекса;
• • вывод на экран информации о товаре, название которого введено с
клавиатуры, если таких товаров нет, выдать соответствующее сообщение;
• • сортировку товаров по названию магазина, по наименованию и по цене;
• • перегруженную операцию сложения товаров, выполняющую сложение их
общей стоимости с группировкой по магазинам.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication1
{
    public static class Program
    {
        static Program()
        {
            throw new System.NotImplementedException();
        }
 
        public static void Main()
        {
            Menu(new Info());
        }
 
        private static void Menu(Info info)
        {
            while (true)
            {
                Console.Write("1. Добавить товар\n" +
                              "2. Найти товар по имени\n" +
                              "3. Вывести информацию о товаре по индексу\n" +
                              "41. Сортировать товары по названию магазина\n" +
                              "42. Сортировать товары по наименованию\n" +
                              "43. Сортировать товары по цене\n" +
                              "5. Вывести общую стоимость товаров с группирвкой по магазинам\n" +
                              "0. Выйти\n\n" +
                              "Выберите пункт меню: ");
                int choice;
                if (!int.TryParse(Console.ReadLine(), out choice))
                {
                    Console.WriteLine("Ошибка ввода!");
 
                    continue;
                }
                switch (choice)
                {
                    case 1:
                        info.Add(Good.CreateInteractive());
 
                        break;
                    case 2:
                        Console.Write("Введите имя товара для поиска: ");
                        var goodOrNull = info.FindGoodByName(Console.ReadLine());
                        if (goodOrNull == null)
                        {
                            Console.WriteLine("Товар не найден");
                        }
                        else
                        {
                            Console.WriteLine(goodOrNull);
                        }
 
                        break;
                    case 3:
                        Console.Write("Введите индекс: ");
                        int idx;
                        while (!int.TryParse(Console.ReadLine(), out idx))
                        {
                            Console.WriteLine("Введите число!");
                            Console.Write("Введите индекс: ");
                        }
                        try
                        {
                            Console.WriteLine(info[idx]);
                        }
                        catch (IndexOutOfRangeException e)
                        {
                            Console.WriteLine("Произошла ошибка: {0}", e);
                        }
 
                        break;
                    case 41:
                        foreach (var good in info.SortByShop())
                        {
                            Console.WriteLine(good);
                        }
 
                        break;
                    case 42:
                        foreach (var good in info.SortByName())
                        {
                            Console.WriteLine(good);
                        }
 
                        break;
                    case 43:
                        foreach (var good in info.SortByPrice())
                        {
                            Console.WriteLine(good);
                        }
 
                        break;
                    case 5:
                        var prices = new Dictionary<string, Good>();
                        foreach (var good in info)
                        {
                            if (!prices.ContainsKey(good.Shop))
                            {
                                prices[good.Shop] = good;
                            }
                            else
                            {
                                prices[good.Shop] += good;
                            }
                        }
                        Console.WriteLine("Общая цена по магазинам:");
                        foreach (var price in prices)
                        {
                            Console.WriteLine($"\t{price.Key}: {price.Value.Price}");
                        }
 
                        break;
                    case 0:
                        Console.WriteLine("Завершение программы...");
 
                        return;
                }
            }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication1
{
    public class Info
    {
        private readonly List<Good> _goods;
 
        public Info()
        {
            _goods = new List<Good>();
        }
 
        public void Add(Good good)
        {
            _goods.Add(good);
        }
 
        public Good this[int i]
        {
            get
            {
                if (i <= 0 || i > _goods.Count)
                    throw new IndexOutOfRangeException("Выход за границы массива!");
 
                return _goods[i - 1];
            }
        }
 
        public Good FindGoodByName(string name)
        {
            foreach (var good in _goods)
            {
                if (good.Name == name)
                {
                    return good;
                }
            }
            return null;
        }
 
       
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication1
{
    public class Good
    {
        private string _name;
        private string _shop;
        private double _price;
        private int _amount;
 
        // эквивалентно public string Name { get { return name; } }
 
        public string Name => _name;
        public string Shop => _shop;
        public double Price => _price;
        public int Amount => _amount;
 
        public Good(string name, string shop, double price, int amount)
        {
            _name = name;
            _shop = shop;
            _price = price;
            _amount = amount;
        }
 
        public static Good operator +(Good a, Good b)
        {
            if (a.Shop != b.Shop)
            {
                throw new InvalidOperationException("Нельзя сложить стоимость товаров из разных магазинов");
            }
            return new Good(string.Join(", ", a.Name, b.Name), a.Shop, a.Price + b.Price, a.Amount + b.Amount);
        }
 
        public static double operator +(double a, Good b)
        {
            return a + b.Price;
        }
 
        public static bool operator <(Good a, Good b)
        {
            return a.Price < b.Price;
        }
 
        public static bool operator >(Good a, Good b)
        {
            return a.Price > b.Price;
        }
 
        public static Good CreateInteractive()
        {
            Console.Write("Название товара: ");
            var name = Console.ReadLine();
            Console.Write("Название магазина: ");
            var shop = Console.ReadLine();
            Console.Write("Стоимость товара: ");
            double price;
            while (!double.TryParse(Console.ReadLine(), out price))
            {
                Console.WriteLine("Неверный формат цены, попробуйте снова!");
                Console.Write("Стоимость товара: ");
            }
            Console.Write("Количество товара: ");
            int amount;
            while (!int.TryParse(Console.ReadLine(), out amount))
            {
                Console.WriteLine("Неверный формат количества, попробуйте снова!");
                Console.Write("Количество товара: ");
            }
 
            return new Good(name, shop, price, amount);
        }
 
        public override string ToString()
        {
            return $"Название товара: {Name}\n\tМагазин: {Shop}\n\tСтоимость: {Price}\n\tКоличество в наличии: {Amount}";
        }
    }
}



Нужна помощь в исправлениях зависимостей и проблем с сортировками...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2022, 22:00
Ответы с готовыми решениями:

Описать класс «товар»
Описать класс «товар», содержащий следующие закрытые поля: • название товара; • название магазина, в котором продается товар; •...

Описать класс ТОВАР
Как это сделать??? Определить пользовательский класс в соответствии с вариантом задания. Определить в классе следующие конструкторы:...

Описать класс с именем Wares (товар)
Описать класс с именем Wares (товар), содержащий следующие закрытые поля: • Название товара; • Количество товара в килограммах; ...

6
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3407 / 2728 / 575
Регистрация: 04.09.2018
Сообщений: 8,567
Записей в блоге: 3
04.03.2022, 00:04
Написано немного кривовато, но чувствуется мощь мысли. Молодец.
На выходных подправлю, будет время.
0
0 / 0 / 0
Регистрация: 03.03.2022
Сообщений: 5
04.03.2022, 12:29  [ТС]
Спасибо заранее!
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3407 / 2728 / 575
Регистрация: 04.09.2018
Сообщений: 8,567
Записей в блоге: 3
06.03.2022, 18:05
Лучший ответ Сообщение было отмечено kilkahiuse как решение

Решение

kilkahiuse,
Вариант 1. Общий случай.

Класс "Товар"
class Good
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    internal class Good
    {
        private string _name;
        private string _shop;
        private decimal _price;
        private int _amount;
 
        public string Name => _name;
        public string Shop => _shop;
        public decimal Price => _price;
        public int Amount => _amount;
 
        public Good( string name, string shop, decimal price, int amount )
        {
            _name = name;
            _shop = shop;
            _price = price;
            _amount = amount;
        }
 
        public override string ToString() =>
            $"Название товара: {Name}\n Магазин: {Shop}\n Стоимость: {Price}\n Количество в наличии: {Amount} ед.";
    }

Класс "Справочник". Наследуется от списка класса Good - товары.
class Info
C#
1
2
3
    internal class Info : List<Good>
    {
    }

Класс Меню
class Menu
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    internal class Menu
    {
        readonly Actions actions;
        public Menu() => actions = new();
 
        /// <summary>Основное меню</summary>
        public void Show()
        {
            while ( true )
            {
                Console.Clear();
                Console.WriteLine( "<-- Главное меню -->" );
                Console.WriteLine(  "1. Добавить товар\n" +
                                    "2. Найти товар по имени\n" +
                                    "3. Вывести информацию о товаре по индексу\n" +
                                    "4. Сортировать товары\n" +
                                    "5. Вывести общую стоимость товаров с группировкой по магазинам\n" +
                                    "0. Выйти\n--------------------------" );
 
                int choice = ReadNumValue.ReadInt( "Выберите пункт меню: ", n => n > -1 && n <= 5 );
                switch ( choice )
                {
                    case 0: Environment.Exit( 0 ); break;
                    case 1: actions.AddGood(); break;
                    case 2: actions.SearchGoodByName(); break;
                    case 3: actions.ShowGoodByIndex(); break;
                    case 4: SubM(); break;
                    case 5: actions.ShowAllTotalPriceWithSortByShop(); break;
                }
            }
        }
 
 
        /// <summary>Подменю выбора типа сортировки</summary>
        private void SubM()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4. Выбор сортировки -->" );
            Console.WriteLine(  "1. Сортировать товары по названию магазина\n" +
                                "2. Сортировать товары по наименованию\n" +
                                "3. Сортировать товары по цене\n" +
                                "0. Выйти в главное меню\n--------------------------" );
 
            int choice = ReadNumValue.ReadInt( "Выберите пункт меню: ", n => n > -1 && n <= 3 );
            switch ( choice )
            {
                case 0: Show(); break;
                case 1: actions.SortByShop(); break;
                case 2: actions.SortByGoodName(); break;
                case 3: actions.SortByGoodPrice(); break;
            }
        }
    }

Класс Действий. Основное меню вряд ли нужно засорять конкретными действиями (логикой). Поэтому вся логика вынесена в отдельный класс, а из меню происходит только вызов нужных методов:
class Actions
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
    internal class Actions
    {
        readonly Info info;
        public Actions()
        {
            info = new();
 
            // Для тестирования! Заполнение магазинов товарами.
            TestGoods.Charge( info );
        }
               
 
        /// <summary>Добавить новый товар</summary>
        public void AddGood()
        {
            Console.Clear();
            Console.WriteLine( "<-- 1. Добавление товара -->" );
            Console.Write( "Название товара: " );
            string name = Console.ReadLine();
            Console.Write( "Название магазина: " );
            string shop = Console.ReadLine();
            decimal price = ReadNumValue.ReadDecimal( "Стоимость товара: ", n => n > 0.0m && n <= 1_000_000.0m );
            int amount = ReadNumValue.ReadInt( "Количество товара: ", n => n > -1 && n <= 10_000 );
            info.Add( new Good( name, shop, price, amount ) );
        }
 
 
        /// <summary>Поиск товара по наименованию</summary>
        public void SearchGoodByName()
        {
            Console.Clear();
            Console.WriteLine( "<-- 2. Поиск товара по наименованию -->" );
            Console.Write( "Введите название товара: " );
            string name = Console.ReadLine();
 
            foreach ( Good good in info )
                if ( good.Name == name )
                {
                    Console.WriteLine( good );
                    Console.ReadLine();
                    return;
                }
            Console.WriteLine( $"Товара с именем \'{name}\' не найдено!" );
            Console.ReadLine();
        }
 
 
        /// <summary>Информация о товаре по индексу</summary>
        public void ShowGoodByIndex()
        {
            Console.Clear();
            Console.WriteLine( "<-- 3. Информация о товаре по индексу -->" );
 
            if ( info.Count != 0 )
            {
                int idx = ReadNumValue.ReadInt( "Введите индекс: ", n => n >= 0 && n < info.Count );
                Console.WriteLine( info[ idx ] );
                Console.ReadLine();
                return;
            }
 
            Console.WriteLine( "Справочник товаров пуст!" );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по названию магазина</summary>
        public void SortByShop()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.1. Сортировка товаров по названию магазина -->" );
            List<Good> goods = info.OrderBy( x => x.Shop ).ToList();
            Console.WriteLine( string.Join( "\n\n", goods ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по названию товара</summary>
        public void SortByGoodName()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.2. Сортировка товаров по названию товара -->" );
            List<Good> goods = info.OrderBy( x => x.Name ).ToList();
            Console.WriteLine( string.Join( "\n\n", goods ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по цене</summary>
        public void SortByGoodPrice()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.3. Сортировка товаров по цене -->" );
            List<Good> goods = info.OrderBy( x => x.Price ).ToList();
            Console.WriteLine( string.Join( "\n\n", goods ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Вывод общей стоимости товаров с группировкой по магазинам</summary>
        public void ShowAllTotalPriceWithSortByShop()
        {
            Console.Clear();
            Console.WriteLine( "<-- 5. Вывод общей стоимости товаров с группировкой по магазинам -->\n" );
 
            // Для красоты, отсортируем список по названиям магазинов
            List<Good> goods = info.OrderBy( x => x.Shop ).ToList();
 
            // Группируем по магазинам
            var shops = goods.GroupBy( p => p.Shop );
 
            // Выводим в консоль
            foreach ( var good in shops )
                Console.WriteLine(  $"Магазин: \"{good.Key}\"\t" +
                                    $"Товаров на сумму: {good.Sum( p => p.Amount * p.Price )} рублей." );
            Console.ReadLine();
        }
    }

Обратим внимание на конструктор класса Actions: в нем происходит вызов метода Charge класса TestGoods.
Это сделано для тестирования приложения, чтобы при запуске каждый раз не заполнять магазины товарами в ручную.
В конечной версии приложения этот вызов и сам класс TestGoods можно удалить.
static class TestGoods
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    internal static class TestGoods
    {
        public static void Charge( Info inf )
        {
            inf.AddRange( new Good[] 
            {
                // Магазин Магнит
                new Good( "Яблоко", "Магнит ", 15.0m, 250 ),
                new Good( "Ананас", "Магнит ", 25.0m, 103 ),
                new Good( "Молоко", "Магнит ", 12.7m, 95 ),
                new Good( "Колбаса", "Магнит ", 120.9m, 74 ),
                new Good( "Хлеб", "Магнит ", 29.0m, 50 ),
                // Магазин Пятерочка
                new Good( "Вино красное", "Пятерочка", 199.3m, 30 ),
                new Good( "Вино белое", "Пятерочка", 181.6m, 45 ),
                new Good( "Мясо", "Пятерочка", 203.0m, 61 ),
                new Good( "Сосиски", "Пятерочка", 150.5m, 80 ),
                new Good( "Пельмени", "Пятерочка", 106.0m, 38 ),
                new Good( "Картофель", "Пятерочка", 18.4m, 140 ),
                // Магазин Автомаг
                new Good( "Колесо", "Автомаг", 3050.0m, 12 ),
                new Good( "Тормозные колодки", "Автомаг", 830.0m, 50 ),
                new Good( "Ремни ГРМ", "Автомаг", 89.2m, 120 ),
                new Good( "Жидкость для стеклоочистителя", "Автомаг", 100.0m, 37 ),
                new Good( "Масло для двигателя", "Автомаг", 305.0m, 26 ),
                // Магазин Рыболов
                new Good( "Удочка обычная", "Рыболов", 1020.0m, 11 ),
                new Good( "Удочка автоматическая", "Рыболов", 3140.0m, 9 ),
                new Good( "Блесна", "Рыболов", 205.0m, 25 ),
                // Магазин Мясной ряд
                new Good( "Говядина", "Мясной ряд", 160.5m, 180 ),
                new Good( "Свинина", "Мясной ряд", 143.6m, 136 ),
                new Good( "Баранина", "Мясной ряд", 124.0m, 200 ),
            } );
        }
    }

Главная программа содержит только один вызов основного меню:
class Program
C#
1
2
3
4
5
6
7
8
    internal class Program
    {
        static void Main()
        {
            Menu menu = new();
            menu.Show();
        }
    }


Тестирование приложения:
Test

Главное меню:
Code
1
2
3
4
5
6
7
8
9
<-- Главное меню -->
1. Добавить товар
2. Найти товар по имени
3. Вывести информацию о товаре по индексу
4. Сортировать товары
5. Вывести общую стоимость товаров с группировкой по магазинам
0. Выйти
--------------------------
Выберите пункт меню:
Так как товары в магазинах уже есть, попробуем найти товар "Вино красное":
Code
1
2
3
4
5
6
<-- 2. Поиск товара по наименованию -->
Введите название товара: Вино красное
Название товара: Вино красное
 Магазин: Пятерочка
 Стоимость: 199,3
 Количество в наличии: 30 ед.
Теперь получим сведения о товаре по индексу, например, 8:
Code
1
2
3
4
5
6
<-- 3. Информация о товаре по индексу -->
Введите индекс: 8
Название товара: Сосиски
 Магазин: Пятерочка
 Стоимость: 150,5
 Количество в наличии: 80 ед.
Выведем отсортированный список товаров по названию магазина:
Сортировка по названию магазина
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<-- 4.1. Сортировка товаров по названию магазина -->
Название товара: Колесо
 Магазин: Автомаг
 Стоимость: 3050,0
 Количество в наличии: 12 ед.
 
Название товара: Тормозные колодки
 Магазин: Автомаг
 Стоимость: 830,0
 Количество в наличии: 50 ед.
 
Название товара: Ремни ГРМ
 Магазин: Автомаг
 Стоимость: 89,2
 Количество в наличии: 120 ед.
 
Название товара: Жидкость для стеклоочистителя
 Магазин: Автомаг
 Стоимость: 100,0
 Количество в наличии: 37 ед.
 
Название товара: Масло для двигателя
 Магазин: Автомаг
 Стоимость: 305,0
 Количество в наличии: 26 ед.
 
Название товара: Яблоко
 Магазин: Магнит
 Стоимость: 15,0
 Количество в наличии: 250 ед.
 
Название товара: Ананас
 Магазин: Магнит
 Стоимость: 25,0
 Количество в наличии: 103 ед.
 
Название товара: Молоко
 Магазин: Магнит
 Стоимость: 12,7
 Количество в наличии: 95 ед.
 
Название товара: Колбаса
 Магазин: Магнит
 Стоимость: 120,9
 Количество в наличии: 74 ед.
 
Название товара: Хлеб
 Магазин: Магнит
 Стоимость: 29,0
 Количество в наличии: 50 ед.
 
Название товара: Говядина
 Магазин: Мясной ряд
 Стоимость: 160,5
 Количество в наличии: 180 ед.
 
Название товара: Свинина
 Магазин: Мясной ряд
 Стоимость: 143,6
 Количество в наличии: 136 ед.
 
Название товара: Баранина
 Магазин: Мясной ряд
 Стоимость: 124,0
 Количество в наличии: 200 ед.
 
Название товара: Вино красное
 Магазин: Пятерочка
 Стоимость: 199,3
 Количество в наличии: 30 ед.
 
Название товара: Вино белое
 Магазин: Пятерочка
 Стоимость: 181,6
 Количество в наличии: 45 ед.
 
Название товара: Мясо
 Магазин: Пятерочка
 Стоимость: 203,0
 Количество в наличии: 61 ед.
 
Название товара: Сосиски
 Магазин: Пятерочка
 Стоимость: 150,5
 Количество в наличии: 80 ед.
 
Название товара: Пельмени
 Магазин: Пятерочка
 Стоимость: 106,0
 Количество в наличии: 38 ед.
 
Название товара: Картофель
 Магазин: Пятерочка
 Стоимость: 18,4
 Количество в наличии: 140 ед.
 
Название товара: Удочка обычная
 Магазин: Рыболов
 Стоимость: 1020,0
 Количество в наличии: 11 ед.
 
Название товара: Удочка автоматическая
 Магазин: Рыболов
 Стоимость: 3140,0
 Количество в наличии: 9 ед.
 
Название товара: Блесна
 Магазин: Рыболов
 Стоимость: 205,0
 Количество в наличии: 25 ед.

Теперь отсортируем по цене:
Сортировка по цене
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<-- 4.3. Сортировка товаров по цене -->
Название товара: Молоко
 Магазин: Магнит
 Стоимость: 12,7
 Количество в наличии: 95 ед.
 
Название товара: Яблоко
 Магазин: Магнит
 Стоимость: 15,0
 Количество в наличии: 250 ед.
 
Название товара: Картофель
 Магазин: Пятерочка
 Стоимость: 18,4
 Количество в наличии: 140 ед.
 
Название товара: Ананас
 Магазин: Магнит
 Стоимость: 25,0
 Количество в наличии: 103 ед.
 
Название товара: Хлеб
 Магазин: Магнит
 Стоимость: 29,0
 Количество в наличии: 50 ед.
 
Название товара: Ремни ГРМ
 Магазин: Автомаг
 Стоимость: 89,2
 Количество в наличии: 120 ед.
 
Название товара: Жидкость для стеклоочистителя
 Магазин: Автомаг
 Стоимость: 100,0
 Количество в наличии: 37 ед.
 
Название товара: Пельмени
 Магазин: Пятерочка
 Стоимость: 106,0
 Количество в наличии: 38 ед.
 
Название товара: Колбаса
 Магазин: Магнит
 Стоимость: 120,9
 Количество в наличии: 74 ед.
 
Название товара: Баранина
 Магазин: Мясной ряд
 Стоимость: 124,0
 Количество в наличии: 200 ед.
 
Название товара: Свинина
 Магазин: Мясной ряд
 Стоимость: 143,6
 Количество в наличии: 136 ед.
 
Название товара: Сосиски
 Магазин: Пятерочка
 Стоимость: 150,5
 Количество в наличии: 80 ед.
 
Название товара: Говядина
 Магазин: Мясной ряд
 Стоимость: 160,5
 Количество в наличии: 180 ед.
 
Название товара: Вино белое
 Магазин: Пятерочка
 Стоимость: 181,6
 Количество в наличии: 45 ед.
 
Название товара: Вино красное
 Магазин: Пятерочка
 Стоимость: 199,3
 Количество в наличии: 30 ед.
 
Название товара: Мясо
 Магазин: Пятерочка
 Стоимость: 203,0
 Количество в наличии: 61 ед.
 
Название товара: Блесна
 Магазин: Рыболов
 Стоимость: 205,0
 Количество в наличии: 25 ед.
 
Название товара: Масло для двигателя
 Магазин: Автомаг
 Стоимость: 305,0
 Количество в наличии: 26 ед.
 
Название товара: Тормозные колодки
 Магазин: Автомаг
 Стоимость: 830,0
 Количество в наличии: 50 ед.
 
Название товара: Удочка обычная
 Магазин: Рыболов
 Стоимость: 1020,0
 Количество в наличии: 11 ед.
 
Название товара: Колесо
 Магазин: Автомаг
 Стоимость: 3050,0
 Количество в наличии: 12 ед.
 
Название товара: Удочка автоматическая
 Магазин: Рыболов
 Стоимость: 3140,0
 Количество в наличии: 9 ед.

Сортировка по наименованию товара:
Сортировка по наименованию товара
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<-- 4.2. Сортировка товаров по названию товара -->
Название товара: Ананас
 Магазин: Магнит
 Стоимость: 25,0
 Количество в наличии: 103 ед.
 
Название товара: Баранина
 Магазин: Мясной ряд
 Стоимость: 124,0
 Количество в наличии: 200 ед.
 
Название товара: Блесна
 Магазин: Рыболов
 Стоимость: 205,0
 Количество в наличии: 25 ед.
 
Название товара: Вино белое
 Магазин: Пятерочка
 Стоимость: 181,6
 Количество в наличии: 45 ед.
 
Название товара: Вино красное
 Магазин: Пятерочка
 Стоимость: 199,3
 Количество в наличии: 30 ед.
 
Название товара: Говядина
 Магазин: Мясной ряд
 Стоимость: 160,5
 Количество в наличии: 180 ед.
 
Название товара: Жидкость для стеклоочистителя
 Магазин: Автомаг
 Стоимость: 100,0
 Количество в наличии: 37 ед.
 
Название товара: Картофель
 Магазин: Пятерочка
 Стоимость: 18,4
 Количество в наличии: 140 ед.
 
Название товара: Колбаса
 Магазин: Магнит
 Стоимость: 120,9
 Количество в наличии: 74 ед.
 
Название товара: Колесо
 Магазин: Автомаг
 Стоимость: 3050,0
 Количество в наличии: 12 ед.
 
Название товара: Масло для двигателя
 Магазин: Автомаг
 Стоимость: 305,0
 Количество в наличии: 26 ед.
 
Название товара: Молоко
 Магазин: Магнит
 Стоимость: 12,7
 Количество в наличии: 95 ед.
 
Название товара: Мясо
 Магазин: Пятерочка
 Стоимость: 203,0
 Количество в наличии: 61 ед.
 
Название товара: Пельмени
 Магазин: Пятерочка
 Стоимость: 106,0
 Количество в наличии: 38 ед.
 
Название товара: Ремни ГРМ
 Магазин: Автомаг
 Стоимость: 89,2
 Количество в наличии: 120 ед.
 
Название товара: Свинина
 Магазин: Мясной ряд
 Стоимость: 143,6
 Количество в наличии: 136 ед.
 
Название товара: Сосиски
 Магазин: Пятерочка
 Стоимость: 150,5
 Количество в наличии: 80 ед.
 
Название товара: Тормозные колодки
 Магазин: Автомаг
 Стоимость: 830,0
 Количество в наличии: 50 ед.
 
Название товара: Удочка автоматическая
 Магазин: Рыболов
 Стоимость: 3140,0
 Количество в наличии: 9 ед.
 
Название товара: Удочка обычная
 Магазин: Рыболов
 Стоимость: 1020,0
 Количество в наличии: 11 ед.
 
Название товара: Хлеб
 Магазин: Магнит
 Стоимость: 29,0
 Количество в наличии: 50 ед.
 
Название товара: Яблоко
 Магазин: Магнит
 Стоимость: 15,0
 Количество в наличии: 250 ед.

Выведем информацию об общей стоимости товаров по магазинам:
Code
1
2
3
4
5
6
7
<-- 5. Вывод общей стоимости товаров с группировкой по магазинам -->
 
Магазин: "Автомаг"      Товаров на сумму: 100434,0 рублей.
Магазин: "Магнит "      Товаров на сумму: 17928,1 рублей.
Магазин: "Мясной ряд"   Товаров на сумму: 73219,6 рублей.
Магазин: "Пятерочка"    Товаров на сумму: 45178,0 рублей.
Магазин: "Рыболов"      Товаров на сумму: 44605,0 рублей.
Добавим товар в новый магазин:
Code
1
2
3
4
5
<-- 1. Добавление товара -->
Название товара: Кока-Кола
Название магазина: Красное и Белое
Стоимость товара: 50
Количество товара: 98
Снова выведем стоимость всех товаров по магазинам:
Code
1
2
3
4
5
6
7
8
<-- 5. Вывод общей стоимости товаров с группировкой по магазинам -->
 
Магазин: "Автомаг"      Товаров на сумму: 100434,0 рублей.
Магазин: "Красное и Белое"      Товаров на сумму: 4900 рублей.
Магазин: "Магнит "      Товаров на сумму: 17928,1 рублей.
Магазин: "Мясной ряд"   Товаров на сумму: 73219,6 рублей.
Магазин: "Пятерочка"    Товаров на сумму: 45178,0 рублей.
Магазин: "Рыболов"      Товаров на сумму: 44605,0 рублей.
Видим, что появился новый магазин "Красное и Белое" и общая стоимость его товаров.
2
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3407 / 2728 / 575
Регистрация: 04.09.2018
Сообщений: 8,567
Записей в блоге: 3
06.03.2022, 18:06
Лучший ответ Сообщение было отмечено kilkahiuse как решение

Решение

Вариант 2. Согласно условию задания: Справочник, содержащий закрытый массив товаров.

Ранее, класс Справочника сам по себе являлся "списком" товаров, т.к. наследовался от списка классов "Товар".
Теперь изменим его так, чтобы список товаров находился в нем самом => в закрытом поле массива товаров:
class Info
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    internal class Info
    {
        private List<Good> goods;
        public Info() => goods = new List<Good>();
 
 
        /// <summary>Добавление нового товара в Справочник</summary>
        public void Add( Good g ) => goods.Add( g );
 
        /// <summary>Перегруженный метод Add: Добавление массива товаров в Справочник</summary>
        public void Add( Good[] g ) => goods.AddRange( g );
 
 
        /// <summary>Получить информацию о товаре по индексу</summary>
        public Good this[ int i ]
        {
            get => goods[ i ];
        }
 
 
        /// <summary>Кол-во товаров в Справочнике</summary>
        public int Count => goods.Count;
 
        /// <summary>Получить список товаров</summary>
        public List<Good> GetAllGoods() => goods;
 
        /// <summary>Поиск товара по наименованию</summary>
        public Good GetGoodByName( string name )
        {
            foreach ( Good good in goods )
                if ( good.Name == name )
                    return good;
            return null;
        }
    }

Соответственно, незначительно изменится и класс Actions:
class Actions
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
    internal class Actions
    {
        readonly Info info;
        public Actions()
        {
            info = new();
 
            // Для тестирования! Заполнение магазинов товарами.
            TestGoods.Charge( info );
        }
        
 
        /// <summary>Добавить новый товар</summary>
        public void AddGood()
        {
            Console.Clear();
            Console.WriteLine( "<-- 1. Добавление товара -->" );
            Console.Write( "Название товара: " );
            string name = Console.ReadLine();
            Console.Write( "Название магазина: " );
            string shop = Console.ReadLine();
            decimal price = ReadNumValue.ReadDecimal( "Стоимость товара: ", n => n > 0.0m && n <= 1_000_000.0m );
            int amount = ReadNumValue.ReadInt( "Количество товара: ", n => n > -1 && n <= 10_000 );
            info.Add( new Good( name, shop, price, amount ) );
        }
 
 
        /// <summary>Поиск товара по наименованию</summary>
        public void SearchGoodByName()
        {
            Console.Clear();
            Console.WriteLine( "<-- 2. Поиск товара по наименованию -->" );
            Console.Write( "Введите название товара: " );
            string name = Console.ReadLine();
 
            Good res = info.GetGoodByName( name );
            if ( res != null )
            {
                Console.WriteLine( res );
                Console.ReadLine();
                return;
            }
 
            Console.WriteLine( $"Товара с именем \'{name}\' не найдено!" );
            Console.ReadLine();
        }
 
 
        /// <summary>Информация о товаре по индексу</summary>
        public void ShowGoodByIndex()
        {
            Console.Clear();
            Console.WriteLine( "<-- 3. Информация о товаре по индексу -->" );
 
            if ( info.Count != 0 )
            {
                int idx = ReadNumValue.ReadInt( "Введите индекс: ", n => n >= 0 && n < info.Count );
                Console.WriteLine( info[ idx ] );
                Console.ReadLine();
                return;
            }
            Console.WriteLine( "Справочник товаров пуст!" );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по названию магазина</summary>
        public void SortByShop()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.1. Сортировка товаров по названию магазина -->" );
            List<Good> goods = info.GetAllGoods().OrderBy( x => x.Shop ).ToList();
            Console.WriteLine( string.Join( "\n\n", goods ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по названию товара</summary>
        public void SortByGoodName()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.2. Сортировка товаров по названию товара -->" );
            List<Good> goods = info.GetAllGoods().OrderBy( x => x.Name ).ToList();
            Console.WriteLine( string.Join( "\n\n", goods ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по цене</summary>
        public void SortByGoodPrice()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.3. Сортировка товаров по цене -->" );
            List<Good> goods = info.GetAllGoods().OrderBy( x => x.Price ).ToList();
            Console.WriteLine( string.Join( "\n\n", goods ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Вывод общей стоимости товаров с группировкой по магазинам</summary>
        public void ShowAllTotalPriceWithSortByShop()
        {
            Console.Clear();
            Console.WriteLine( "<-- 5. Вывод общей стоимости товаров с группировкой по магазинам -->\n" );
 
            // Для красоты, отсортируем список по названиям магазинов
            List<Good> goods = info.GetAllGoods().OrderBy( x => x.Shop ).ToList();
 
            // Группируем по магазинам
            var shops = goods.GroupBy( p => p.Shop );
 
            // Выводим в консоль
            foreach ( var good in shops )
                Console.WriteLine( $"Магазин: \"{good.Key}\"\t" +
                                    $"Товаров на сумму: {good.Sum( p => p.Amount * p.Price )} рублей." );
            Console.ReadLine();
        }
    }

Примечание:
Так как в программе для ввода численных значений предусмотрен отдельный класс ReadNumValue, реализующий свои проверки ввода, то, в методе получения товара по индексу public Good this[ int i ] класса Info можно избавится от проверки введения неверного индекса, т.к. "неправильного" значения мы не получим никогда.
Метод ввода ReadNumValue.ReadInt будет гонять по кругу до второго пришествия, пока не будет введено корректное значение индекса. Предикат верного значения задается в аргументах метода.

Тестирование этого варианта приложения не привожу: все работает так же, как и при тестировании Варианта №1.

Вариант 3. Перегруженная операция сложения товаров.

Я пока не вижу применения перегруженных операторов сложения товаров в вашем случае. Где их складывать? Т.е. должен быть типа пункт Меню "Прибавить товар", или что-то в этом духе.

Вариант 4. Сортировки товаров.

В "предыдущих сериях" результат сортировки товаров по магазинам представлял собой новую коллекцию товаров, отсортированную по тому или иному критерию.
В данном варианте мы будем сортировать исходную коллекцию List<Good> goods, наследуя класс Good от интерфейса IComparable, реализовав в нем метод сравнения CompareTo.

Варианты 3 и 4 - продолжение позже. Сейчас времени нет.
1
0 / 0 / 0
Регистрация: 03.03.2022
Сообщений: 5
06.03.2022, 21:52  [ТС]
огромное спасибо за проделанный Вами труд!
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3407 / 2728 / 575
Регистрация: 04.09.2018
Сообщений: 8,567
Записей в блоге: 3
07.03.2022, 10:00
Лучший ответ Сообщение было отмечено kilkahiuse как решение

Решение

Вариант 3. Сортировка товаров компараторами.
Напишем три компаратора:
Compare
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma warning disable CS8632
 
namespace GoodsInfo3
{
    internal class CompareByShop : IComparer<Good>
    {
        public int Compare( Good? g1, Good? g2 )
        {
            if ( g1 is null || g2 is null )
                throw new ArgumentException( "Argument are invalid!" );
            return string.Compare( g1.Shop, g2.Shop, StringComparison.OrdinalIgnoreCase );
        }
    }
 
    internal class CompareByGoodName : IComparer<Good>
    {
        public int Compare( Good? g1, Good? g2 )
        {
            if ( g1 is null || g2 is null )
                throw new ArgumentException( "Argument are invalid!" );
            return string.Compare( g1.Name, g2.Name, StringComparison.OrdinalIgnoreCase );
        }
    }
 
    internal class CompareByGoodPrice : IComparer<Good>
    {
        public int Compare( Good? g1, Good? g2 )
        {
            if ( g1 is null || g2 is null )
                throw new ArgumentException( "Argument are invalid!" );
            if ( g1.Price < g2.Price ) return -1;
            else if ( g1.Price > g2.Price ) return 1;
            return 0;
        }
    }
}
#pragma warning restore CS8632

В класс Info добавим метод сортировки с выбором режима:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        /// <summary>Сортировка списка.</summary>
        /// 1 - по названию магазина
        /// 2 - по наименованию товара
        /// 3 - по цене товара
        public void Sort( SortType type )
        {
            int i = ( int ) type;
            switch ( i )
            {
                case 1: goods.Sort( new CompareByShop() ); break;
                case 2: goods.Sort( new CompareByGoodName() ); break;
                case 3: goods.Sort( new CompareByGoodPrice() ); break;
                default: throw new ArgumentException( "!" );
            } 
        }
Режимы перечислены в enum:
C#
1
2
3
4
5
6
7
8
9
namespace GoodsInfo3
{
    public enum SortType
    {
        ByShop = 1,
        ByGoodName,
        ByGoodPrice
    }
}
В классе Actions все три вида сортировок теперь такие:
class Actions - Сортировки
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        /// <summary>Сортировать товары по названию магазина</summary>
        public void SortByShop()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.1. Сортировка товаров по названию магазина -->" );
            info.Sort( SortType.ByShop );
            Console.WriteLine( string.Join( "\n\n", info.GetAllGoods() ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по названию товара</summary>
        public void SortByGoodName()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.2. Сортировка товаров по названию товара -->" );
            info.Sort( SortType.ByGoodName );
            Console.WriteLine( string.Join( "\n\n", info.GetAllGoods() ) );
            Console.ReadLine();
        }
 
 
        /// <summary>Сортировать товары по цене</summary>
        public void SortByGoodPrice()
        {
            Console.Clear();
            Console.WriteLine( "<-- 4.3. Сортировка товаров по цене -->" );
            info.Sort( SortType.ByGoodPrice );
            Console.WriteLine( string.Join( "\n\n", info.GetAllGoods() ) );
            Console.ReadLine();
        }

В класс Good я вернул ваш перегруженный оператор +, но пока неясно как и где его применить:
C#
1
2
3
4
5
6
public static Good operator +( Good a, Good b )
{
    if ( a.Shop != b.Shop )
        throw new InvalidOperationException( "Нельзя сложить стоимость товаров из разных магазинов" );
    return new Good( string.Join( ", ", a.Name, b.Name ), a.Shop, a.Price + b.Price, a.Amount + b.Amount );
}
Во вложении все три варианта программы.
Вложения
Тип файла: 7z GoodsInfo.7z (71.8 Кб, 10 просмотров)
Тип файла: 7z GoodsInfo2.7z (72.2 Кб, 8 просмотров)
Тип файла: 7z GoodsInfo3.7z (73.8 Кб, 8 просмотров)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2022, 10:00
Помогаю со студенческими работами здесь

Описать класс "склад" содержащий закрытый массив товар
Описать класс &quot;склад&quot; содержащий закрытый массив товар. Обеспечить следующие возможности: Вывод информации о товаре по номеру с помощью...

Описать класс "товар", содержащий закрытые поля
Описать класс «товар», содержащий следующие закрытые поля: • название товара; • название магазина, в котором продается товар; •...

Создать класс «Товар» и класс «Склад»
C# Разработать приложение, демонстрирующее возможности следующих классов: Класс «товар», содержащий следующие закрытые поля: название...

Описать базовый класс Point. Описать класс Прямоугольник от класса Point
Описать базовый класс Point - точка. Описать класс &quot;прямоугольник&quot;. Обязательные поля класса &quot;Прямоугольник&quot;: - имя...

Создать абстрактный класс «Товар», на его основе создать класс «Автомобиль»
Вечер добрый, а может и не добрый. В изучении C# столкнулся с такой проблемой - как исключения. Имею такую задачу. Создать абстрактный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru