Помогите с лабораторной пожалуйста
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Бинарные Файлы
создание комплексных программ, используя бинарные файлы, структуры и функции в языке программирования C++.
Напишите программу, которая позволяет пользователю выбирать один из пунктов меню (создание файла из структур; вывод на экран содержимого файла; добавление данных в файл; изменение данных из файла; сортировка данных файла; поиск данных по определенному критерию в файле; удаление данных из файла; выход и другие). Данные в виде структур записываются и читаются в бинарный файл. Тема, по которой вы должны создать базу данных и необходимые поля, указана в вашем варианте. (Мозг сейчас взорвется).
1)Сотовый салон (IMEI, Марка, Модель, Цвет, Страна, Цена)
ianiq, а в чем собственно вопрос? Или ты рассчитываешь, что сейчас все побегут писать для тебя лабу?
Мне нужен пример! Я никого в задницу не поцеловал чтобы написать для меня лабораторку. Если есть пример то норм или какаято часть.
ianiq, чем обижаться, ты лучше напиши с чем конкретно у тебя проблемы. От твоего первого поста у меня тоже сложилось впечатление, что ты хочешь, что бы за тебя написали программу. Но я промолчал.
А в общем-то ты сам виноват, что на твой пост такая реакция. Если ты смотрел другие топики форума, то наверно заметил, что охотнее помогают тем, кто сначала сам пытается разобраться, написать какой-то код, а уже потом просит помощи. А ты даже не написал с чем у тебя возникли сложности. («Мозг сейчас взорвется» — не в счёт, это к МЧС.)
Ну тогда сорри что так получилось с постом. Мне бы примерчик какой-то. Я пока сам не знаю с чего начать и как это переварить. Сложно мне с языком C.
Определитесь уже.
Если на С++, то я бы реализовал как-нибудь так:
Для данного кода не хватает только реализаций функций-пунктов. Думаю, вы сами способны их реализовать.
porshe, всё хорошо, только вот этот фрагмент лучше переписать так:
И я несколько удивлён твоим выбором
std::list
для базы данных. На мой взгляд вектор был бы удобнее.Ну да, мой косяк, потому что не проверял код :\
У вектора же вроде «дорогие» операции вставки\удаления. А я так понял, что эти операции будут нередко вызываться.
Много времени тратится на выделения памяти. Элементы вектора хранятся подряд в памяти, для поддержки прямого доступа, поэтому, при сильной фрагментации данных все данные придется копировать в новый блок памяти, если в текущем места для нового элемента не хватает.
С
std::list
тоже есть проблема для нашего конкретного случая. Любая БД должна поддерживать выборку одной записи по ключевому полю. Поэтому, я бы использовалstd::map
для хранения элементов. И в качестве ключа, генерировал бы числовой идентификатор для каждой записи, увеличивая счетчик на единицу при добавлении нового элемента в БД.porshe, делаете сразу резерв для большого кол-ва элементов и нормально будет.
IMEI?
Ну, мы же все понимаем, что «взрослые» БД организованы совершенно по другому принципу, нежели бинарные записи структур в файл ;)
Поэтому, предлагая вектор, исходил только из соображений удобства кодирования конкретной учебной задачи. Тестировать производительность данной программы на 100К записях всё равно ни кто не будет. Да и незачем.
В целом согласен с тобой. Хотя, 100К записей — это не много, даже для такой игрушечной БД.
std::map
вернет запись по ключу одинаково быстро, как при 100 тысячах, как и при 10 записях в БД.А вот, поиск по
std::list
имеет сложность O(n) :-) Вектор для 100к записей, я думаю, будет нормально работать, Хотя, копирование данных при реаллокации будет довольно долгим, я подозреваю. Да и большие блоки менеджеру памяти сложнее искать, особенно при сильной фрагментации.Вообще, неплохая идея для обучающей статьи — написать простую БД с реализацией индексов по полям, сортировкой, выбором по нескольким критериями, автоматическим дампом и загрузкой с диска.
Ой ли? Если не ошибаюсь,
std::map
использует бинарное дерево. Следовательно скорость будет пропорциональна логарифму. Или я что-то путаю?Я уже писал, что тестировать производительность этой учебной программы ни кто не будет. БД, которая сидит полностью в памяти, это не БД, по большому счёту, а просто массив данных. И, в 90% случаев, глубоко плевать какой контейнер там используется. Вся черёмуха начинается, когда данные не помещаются в память. А если ещё критерий отбора не тривиальный...
Я всегда тащусь, когда в учебниках по программированию вижу примеры типа «давайте напишем программу для поиска книг в библиотеке». Нуб читает, и понимает как это просто: написать СУБД для библиотеки. И после этого твёрдо уверен, что сможет написать СУБД для любой предметной области. Автор, конечно, хотел просто продемонстрировать приёмы работы со структурами (или классами), работу с файлами и т.д., но ощущение простоты написания СУБД почему-то возникает почти всегда. Кстати, вышесказанное, касается и идеи обучающей статьи. IMHO, конечно.
Да, извиняюсь, я почему-то думал, что
std::map
использует хеш-таблицы, а не бинарные деревья. Для быстрого поиска по ключу, нужно использоватьstd::unordered_map
.Не знаю, у меня не возникает. Но об ощущениях спорить не будем.
Считаю, что практические примеры всегда лучше воспринимаются, чем абстрактные. В том, что кому-то может показаться, что написать реальную СУБД — это просто, не вижу ничего особо страшного.
Во первых, более-менее адекватному человеку должно быть очевидно, что учебный пример и практическая реализация настоящей СУБД — две большие разницы :-) А во вторых, такое заблуждение само по себе не очень деструктивно, и в скором времени пройдет.
Примерчик не плохой! Спасибо большое Porshe. Извините если что )