|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.09.2013, 23:30 | #11 |
Я только Учусь
Форумчанин
Регистрация: 06.03.2013
Сообщений: 193
|
:conf used:
|
07.09.2013, 00:11 | #12 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Кроме того, там используется QMap для хранения абонентов, но ТС надо выбирать их как по номеру, так и по имени - QMap для этого не подходит. Цитата:
|
||
07.09.2013, 00:48 | #13 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Нет. Хотя здесь они так же не нужны.
Нет. Гибкость здесь не нужна. Есть конкретная задача, которую нужно решить. Если когда нибудь понадобится модифицировать код: простой код проще модифицировать. Код переусложненный проще переписать заново. Цитата:
PhoneBook book; book.Add("Vasya Pupkin 1111 - 1111"); или: PhoneBook book; book<< "Vasya Pupkin"<< 1111 << 1111; или PhoneBook book; book[name] = "Vasya Pupkin"; book[phone]= "1111 - 1111"; Каким бы ни был возможный дизайн, пользователя справочника не интересуют его внутренние данные. А в самом справочнике данные лучше хранить в том виде, в каком по нему проще делать выборку/добавление/удаление новых записей в базу. С точки зрения разработчика справочника - это банальная база данных. И ему без разницы: Вася Пупкин - это абонент, или марка автомобиля. Ему просто нужно хранить и делать выборку. |
|
07.09.2013, 11:50 | #14 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Я тоже считаю, что не нужно усложнять простую задачу и делать решение "гибким" для неё.
Вижу две проблемы: 1) Как заставить пользователей вводить "нормальный" номер телефона. К примеру, "+7-917-349-99-57" или "8-917-34-99-957" 2) Хранение, выборка, сортировка данных и т.д. Сложность первой проблемы нужно возложить на библиотеку (к примеру Qt). Нужно запретить пользователю вводить неправильный номер (только цифры и чёткий формат). Можно будет показать пример ввода пользователю: Этот пример взят из книги "Foundation of Qt development". Просто нужно создать пустой проект, создать файл main.cpp и добавить в main.cpp следующий код: main.cpp Код:
- http://programmersforum.ru/showpost....33&postcount=2 - http://programmersforum.ru/showpost....35&postcount=3 - http://programmersforum.ru/showpost....36&postcount=4 - http://programmersforum.ru/showpost....37&postcount=5 Здесь уже приводился пример адресной книги на Qt. В книге "Foundation of Qt development" есть более подходящий пример: Прикрепил файлы проекта. Их просто нужно добавить в пустой проект в Qt Creator. Сложность второй проблемы "2) Хранение, выборка, сортировка данных и т.д." решается с помощью базы данных. К примеру, SQLitе. Для Qt есть полноценный пример для начала работы с SQLite: http://www.youtube.com/watch?v=cc06D3wuTn4 |
07.09.2013, 12:21 | #15 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Поэтому решил припахать кутю для решения задачи человеком, который не знает даже основ с++? Всерьёз думаешь, что кутю осилит человек, который не в состоянии осилить даже каркас класса phonebook?
По-моему, ты сверх переусложнил решение. IMHO: Когда нибудь, кто то будет изучать кутю, загуглит твоё решение и скажет тебе спасибо. Но автору этой темы такое решение бесполезно. |
07.09.2013, 12:32 | #16 | |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Я надеюсь, что автор установит Qt. Если он будет выполнять инструкции, на которые я дал ссылки и будет описывать конкретные тупики здесь... в общем, я надеюсь...
Если речь идёт о "показать что-то преподавателю, ну хотя бы и не своё, а просто объяснить, чтобы получить зачёт, пусть и не доделанное до конца, но видно, что человек искал, старался, поэтому ему можно поставить зачёт". Я тут поупражнялся немного. Только не учёл, что искать придётся не только по имени, но и по номеру телефона. Я использовал map. В map поиск по ключу. В нашем случае, ключ - имя абонента. main.cpp Код:
Цитата:
Код:
Код:
Код:
Код:
Последний раз редактировалось 8Observer8; 07.09.2013 в 12:35. |
|
07.09.2013, 18:11 | #17 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Код:
Цитата:
Либо ты будешь использовать структуру/класс абонента, либо хранить list<pair<string,string> >. Второй случай неудобный, негибкий, трудно поддерживаемый, несамодокументирующийся и все такое. Я жду от Берса другого решения (чтобы угловые скобки ставить не приходилось - он грил что знает как это сделать xD) |
||
07.09.2013, 21:01 | #18 |
Я только Учусь
Форумчанин
Регистрация: 06.03.2013
Сообщений: 193
|
Спасибо задача должна решатся с помощю бинарного дерева.
|
08.09.2013, 02:39 | #19 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Phonebook book; book.Add("Vasya Pupkin, 1111-1111"); Для пользователя строка "Vasya Pupkin, 1111-1111" - это и есть абонент, который его интересует. Класс Абонентов пользователю не нужен. В этой задаче присутствуют элементы работы с базой данных: нужно делать выборку записей по критериям: искать однофомильцев, чьи номера укладываются в заданный диапазон. И как ты это сделаешь без использования структур наподобие map? Ты конечно можешь завелосипедить код поиска. Но вот только по итогу это и получится грубым и тормозным аналогом поиска, как в специально оптимизированных для этого деревьях. Мне лениво решать эту задачку. Я лишь показываю принцип, как можно быстро выполнять выборку записей по ключу: http://codepad.org/a8lcQ1Od Понятно, что в реальной задаче придется использовать mutlimap, либо если не устраивает скорость поиска по ключу map, можно использовать любые другие деревья ещё лучше оптимизированные для поиска. Понятно, что в реальной задаче придется использовать несколько связанных multimap по принципу: ключ - имя столбца, значение - запись И так со всеми столбцами: имя - запись фамилия - запись номер - запись Сначала выборка происходит по заданным критериям по отдельным столбцам по принципу, который иллюстрирует ссылка выше. А Затем отсеиваются все записи, которые не были обнаружены во всех участвовавших в поиске столбцах. Для этого сравниваются найденные диапазоны участвовавших в поиске столбцов. И формируется самый узкий диапазон по какому либо столбцу. Таким образом на осадке останутся только те записи, которые удовлетворяют критериям по всем столбцам. Но ты попробуй ради эксперимента сделать выборку хотя бы по одному столбцу имени, как в ссылке выше, не используя деревья. И сравни по скорости. Я погляжу, как struct { string name, size_t number }; тебе поможет. Последний раз редактировалось _Bers; 08.09.2013 в 02:41. |
|
08.09.2013, 03:12 | #20 | |||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Зато нашел это: Цитата:
map<string, int>, то map<int, string> соответственно либо при выборке все данные впихиваются в словарь, либо хранится сразу 2 словаря (с разными ключами) Цитата:
ну и я бы multiset тут использовал (там есть параметр шаблона, в который я передал бы этот lessByName). |
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Телефонный справочник | Денис999 | Помощь студентам | 2 | 26.02.2011 18:41 |
Телефонный справочник | vladxxl | Общие вопросы C/C++ | 1 | 15.12.2010 20:28 |
Телефонный справочник | schtefan | Фриланс | 8 | 16.11.2010 21:53 |
Телефонный справочник | Krechet | Софт | 5 | 10.08.2009 15:51 |
Телефонный справочник на TC | Qai | Фриланс | 5 | 25.05.2008 01:02 |