2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72

Создание списка объектов класса с заранее неизвестным именем (именем самих объектов)

07.09.2014, 10:44. Показов 12253. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые программисты, не получается решить такую задачу: требуется создать приложение (в консоли) "клиенты банка". Есть два класса 1) клиенты 2) счета. Реализовал создание клиента, +нескольких счетов к нему, а вот как создать список клиентов, который можно будет редактировать, не доходит пока.
код

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
 
    class Client
    {
        private string _fio;
        private string _age;
        private string _company;
        //список счетов
        List<Check> Checks;
        
        //конструктор 1 (0 вх.параметров)
        public Client()
        {
            _fio = "Null";
            _age = "Null";
            _company = "Null";
        }
        //конструктор 2 (3 вх.параметров)
        public Client(string fio, string age, string company)
        {
            _fio = fio;
            _age = age;
            _company = company;
        }
 
        //метод создания клиента
        public void EnterDataClient()
        {
            Console.WriteLine("Введите имя: ");
            _fio = Console.ReadLine();
            Console.WriteLine("Введите возраст: ");
            _age = Console.ReadLine();
            Console.WriteLine("Введите компанию, в которой он работает: ");
            _company = Console.ReadLine();
        }
 
        //метод, который проверяет, есть ли у клиента счета,
        //если нет, создает новый список счетов. Добавляет новый счет в список
        public void AddChecks(Check NewCheck)
        {
            if (Checks == null)
                Checks = new List<Check>();
            Checks.Add(NewCheck);
        }
 
        //метод, который удаляет счет клиента по указанному индексу
        public void DelChecks(int i)
        {
            if (Checks != null)
                Checks.RemoveAt(i);
            else
                Console.WriteLine("список счетов для данного клиента пуст");
        }
 
    }
}
-------------------------------------------------------------------

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
 
    class Check
    {
        int _balance;
        string _historyBalance;
 
        //базовый конструктор без переменных
        public Check()
        {
            _balance = 0;
            _historyBalance = "";
        }
 
        //свойство баланс 
        public int Balance
        {
            get
            {
                return _balance;
            }
            set
            {
                if (value >= 0)
                    _balance += value;
                else 
                    _balance -= value;
            }
        }
 
        //cвойство история баланса
        public string History
        {
            get
            {
                return _historyBalance;
            }
            set
            {
                _historyBalance += value;
            }
        }
 
        //метод, изменяющий  баланс, затем вносящий запись в историю баланса
        public void ContribMoneyOnBalance(int i)
        {
            try
            {
                Balance += i;
                History +="Изменение баланса на сумму: "+Convert.ToString(i)+" от "+DateTime.Now+ "\n";
            }
            catch
            {
                Console.WriteLine("Ошибка при изменении баланса");
            }
            Console.WriteLine("Ваш текущий баланс: ");
            Console.WriteLine(Convert.ToString(_balance)," руб.");
        }
 
        //метод просмотр истории баланса
        public void ViewHstoryBalance()
        {
            Console.WriteLine("История прихода-расхода:");
            Console.WriteLine(History);
        }
 
    }
-------------------------------------------------------------------------
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
 
    class Program
    {     
        static void Main(string[] args)
        {
            List<Client> CatalogClient = new List<Client>();
            string a = "";
            Console.WriteLine(@"Выберите вариант:
            1. Создать клиента
            2. Удалить клиента.
            3. Посмотреть всех клиентов.");
 
            try
            {
                string b = Console.ReadLine();
                a = b;
            }
            catch
            {
                Console.WriteLine("Вводите только цифру и затем ввод (<Enter>)");
            }
            switch (a)
            {
                case "1":
                    
            }
 
            Console.ReadKey();
        }
    }
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2014, 10:44
Ответы с готовыми решениями:

Создание списка объектов собственного класса (SQL)
очень нужно! объясните, пожалуйста, доходчиво, а лучше с примером, как создать список из объектов класса, к примеру, &quot;human&quot;,...

Вызов объектов Wscript.Shell с именем из переменной
Задача: есть переменная, в которой задается количество объектов Wscript.Shell, которые надо вызвать. Как мне вызвать нужное количество...

Вызов метода с одним именем у объектов разных типов
Здравствуйте. Подскажите как решить задачу. Есть 3 класса: A, B, C которые не связаны друг с другом и не наследуют от общего класса. В...

6
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
07.09.2014, 15:08
Лучший ответ Сообщение было отмечено Ilyko как решение

Решение

Ну создать можно так:
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
try
{
    string b = Console.ReadLine();
    switch(b)
    {
       case("1"):
       {
          Client client=new  Client();
          client...//установить разные значения
          CatalogClient.Add(client);
       }
       case("2"):
       {
          Console.WriteLine("Вводите фамилию клиента, которого хотите удалить и затем нажмите Enter");
          //процедура удаления из списка
        }
       case("3"):
       {
            foreach (var client in CatalogClient)
            { 
               Console.WriteLine("Клиент {0}",client.Name);//не забудьте прописать get/set методы, а то тут ничего не выведется
            }
        }
     }
2
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
07.09.2014, 19:31  [ТС]
Спасибо за ответ, завтра попробую , но я не понял одну строчку
Цитата Сообщение от titans2011 Посмотреть сообщение
client...//установить разные значения
Прошу прощения, если туплю, просто уже вечер, голова плохо соображает, но прошу ответить на этот вопрос. Какие например, "разные значения"? (завтра повнимательней посмотрю)
0
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
07.09.2014, 20:08
Ну смотрите. 3 пункт у вас -просмотреть всех клиентов. Как вы собираетесь просматривать данные, если поля у вас закрытые(приватные), а паблик у вас только функции, которые ничегосеньки не возвращают?
1
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
08.09.2014, 11:17  [ТС]
Спасибо, Вы дали верный ответ, и все-таки не совсем понятен принцип работы. Насколько я знаю, при инициализации объекта в "куче" выделяется память и присваивается ссылка на эту область в памяти объекту. Тогда каким образом при создании объекта с одним и тем же именем (смотрите код) ему два раза присваиваются новые значения и новые не стирают старые(ведь мы содаем НОВЫЕ ДАННЫЕ для ЭТИХ же полей)

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
  
class Program
    {     
        static void Main(string[] args)
        {
            List<Client> CatalogClient = new List<Client>();
            Console.WriteLine(@"Выберите вариант:
            1. Создать клиента
            2. Удалить клиента.
            3. Посмотреть всех клиентов.");
 
            string b = Console.ReadLine();
           
            switch (b)
            {
                case ("1"):
                    Client client = new Client();
                    client.EnterDataClient();
                    CatalogClient.Add(client);
                    break;
                default:
                    Console.WriteLine("Клиент создан. Вы в меню. Создать второго клиента");
                    break;
                    
            }
            switch (b)
            {
                case ("1"):
                    Client client = new Client();
                    client.EnterDataClient();
                    CatalogClient.Add(client);
                    break;
            }
 
 
            Console.WriteLine("Клиент создан. Вы в меню. Посмотреть всех клиентов.");
 
            b = "3";
            switch (b)
            {
                case ("3"):
                    foreach (var client in CatalogClient)
                        Console.WriteLine("Клиент: {0}, возраст: {1}, компания: {2}", client.FIO,client.AGE,client.COMPANY);
                    break;
            }
 
            Console.ReadKey();
        }
    }
Все красиво отрабатывает и выдает имена всех объектов. Хотя я ожидал ошибку. Объясните, если не трудно логику работы..
0
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
08.09.2014, 11:54
Лучший ответ Сообщение было отмечено Ilyko как решение

Решение

Цитата Сообщение от Ilyko Посмотреть сообщение
при создании объекта с одним и тем же именем
не означает, что для этого объекта будет выделятся одна и та же память.
Как только вы ставите new Client();
Вы автоматически выделяете переменной новый адрес памяти в куче.
Потом вы добавляете его в список. И получается что лист по сути содержит ссылки на участки памяти.
1
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
08.09.2014, 12:19  [ТС]
И еще такой вопрос... В каком именно месте кода лучше организовать цикл, если я хочу создать нескольких клиентов? Спасибо за ответы

Добавлено через 4 минуты
Спасибо за помощ !

Добавлено через 18 минут
Разобрался с циклом)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2014, 12:19
Помогаю со студенческими работами здесь

Создание текстовых файлов с именем, совпадающим с именем каталога
Командный файл создания дерева каталогов. В каждом каталоге должен быть текстовый файл с именем,совпадающим с именем каталога.В файле...

Создание объектов в заранее выделенной памяти
Как можно создать объекты в заранее выделенной памяти? Цель: 1. Не запрашивать память динамически когда нужно создать новый...

Папка с неизвестным именем
Необходимо узнать имя папки.Известно её месторасположение , а имя нет

Создание переменной и класса с именем введенным пользователем
Приветствую ! Решил значит попробовать написать движок для сайта простенький на C#,HTML,CSS и JS , но сразу возникла такая проблема, как...

Вызов функции с неизвестным именем
Я знаю, что напрямую нельзя вызвать функцию по имени, которое хранится в char* но, может как-то возможно сделать &quot;финт-ушами&quot;? ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru