Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
1

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

07.09.2014, 10:44. Просмотров 9256. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2014, 10:44
Ответы с готовыми решениями:

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

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

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

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

6
313 / 273 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
07.09.2014, 15:08 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
Спасибо за ответ, завтра попробую , но я не понял одну строчку
Цитата Сообщение от titans2011 Посмотреть сообщение
client...//установить разные значения
Прошу прощения, если туплю, просто уже вечер, голова плохо соображает, но прошу ответить на этот вопрос. Какие например, "разные значения"? (завтра повнимательней посмотрю)
0
313 / 273 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
07.09.2014, 20:08 4
Ну смотрите. 3 пункт у вас -просмотреть всех клиентов. Как вы собираетесь просматривать данные, если поля у вас закрытые(приватные), а паблик у вас только функции, которые ничегосеньки не возвращают?
1
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
08.09.2014, 11:17  [ТС] 5
Спасибо, Вы дали верный ответ, и все-таки не совсем понятен принцип работы. Насколько я знаю, при инициализации объекта в "куче" выделяется память и присваивается ссылка на эту область в памяти объекту. Тогда каким образом при создании объекта с одним и тем же именем (смотрите код) ему два раза присваиваются новые значения и новые не стирают старые(ведь мы содаем НОВЫЕ ДАННЫЕ для ЭТИХ же полей)

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
313 / 273 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
08.09.2014, 11:54 6
Лучший ответ Сообщение было отмечено Ilyko как решение

Решение

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

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

Добавлено через 18 минут
Разобрался с циклом)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2014, 12:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.