Помогите с лабораторной пожалуйста

Бинарные Файлы
создание комплексных программ, используя бинарные файлы, структуры и функции в языке программирования C++.

Напишите программу, которая позволяет пользователю выбирать один из пунктов меню (создание файла из структур; вывод на экран содержимого файла; добавление данных в файл; изменение данных из файла; сортировка данных файла; поиск данных по определенному критерию в файле; удаление данных из файла; выход и другие). Данные в виде структур записываются и читаются в бинарный файл. Тема, по которой вы должны создать базу данных и необходимые поля, указана в вашем варианте. (Мозг сейчас взорвется).

1)Сотовый салон (IMEI, Марка, Модель, Цвет, Страна, Цена)

ianiq, а в чем собственно вопрос? Или ты рассчитываешь, что сейчас все побегут писать для тебя лабу?

Мне нужен пример! Я никого в задницу не поцеловал чтобы написать для меня лабораторку. Если есть пример то норм или какаято часть.

ianiq, чем обижаться, ты лучше напиши с чем конкретно у тебя проблемы. От твоего первого поста у меня тоже сложилось впечатление, что ты хочешь, что бы за тебя написали программу. Но я промолчал.

А в общем-то ты сам виноват, что на твой пост такая реакция. Если ты смотрел другие топики форума, то наверно заметил, что охотнее помогают тем, кто сначала сам пытается разобраться, написать какой-то код, а уже потом просит помощи. А ты даже не написал с чем у тебя возникли сложности. («Мозг сейчас взорвется» — не в счёт, это к МЧС.)

Ну тогда сорри что так получилось с постом. Мне бы примерчик какой-то. Я пока сам не знаю с чего начать и как это переварить. Сложно мне с языком C.

языке программирования C++

Сложно мне с языком C

Определитесь уже.

Если на С++, то я бы реализовал как-нибудь так:

#include <iostream>
#include <fstream>
#include <list>
#include <string>

//Описываем структуру
struct mobile_phone
{
    char IMEI[15];
    char brand[20];
    char model[20];
    char color[20];
    char country[20];
    double price;
};

//Описываем функции, которые будут вызываться при выборе пункта меню

//Пункт "Печать базы"
void print_base();
//Пункт "Сортировка данных в базе"
void sort_base();
//Пункт "Поиск по критерию"
void find();
//Пункт "Удаление данных"
void remove_data();
//Пункт "Выход"
void exit();

//База данных
std::list<mobile_phone> dbase;


//Точка входа в программу
int main()
{
    std::cout << "Здравсвуйте, вас приветствует программа для управления БД сотовых телефонов\n";

    while ( true )
    {
        //Массив указателей на функции - пункты меню
        void (*options[])() = { print_base,
                                sort_base,
                                find,
                                remove_data,
                                exit };

        std::cout << "Выберите действие:\n\
                     1. Просмотреть базу данных\n\
                     2. Вывести на экран содержимое базы данных\n\
                     3. Отсортировать базу\n\
                     4. Поиск в базе\n\
                     5. Выход из программы\n > ";
        unsigned choise;
        std::cin >> choise;

        //Проверяем выбор на "правильность"
        if ( choise > 5 )
        {
            std::cout << "Неверный выбор!\n";
        }
        else
        {
            //Если выбор правильный, вызываем соответсвующий пункт
            options[choise+1]();
        }

    }
    return 0;
}


Для данного кода не хватает только реализаций функций-пунктов. Думаю, вы сами способны их реализовать.

porshe, всё хорошо, только вот этот фрагмент лучше переписать так:

        //Проверяем выбор на "правильность"
        if ( choise < 1 || choise > 5 )
        {
            std::cout << "Неверный выбор!\n";
        }
        else
        {
            //Если выбор правильный, вызываем соответсвующий пункт
            options[choise-1]();         // !!!
        }

И я несколько удивлён твоим выбором std::list для базы данных. На мой взгляд вектор был бы удобнее.

На мой взгляд вектор был бы удобнее.

У вектора же вроде «дорогие» операции вставки\удаления. А я так понял, что эти операции будут нередко вызываться.

Много времени тратится на выделения памяти. Элементы вектора хранятся подряд в памяти, для поддержки прямого доступа, поэтому, при сильной фрагментации данных все данные придется копировать в новый блок памяти, если в текущем места для нового элемента не хватает.

С std::list тоже есть проблема для нашего конкретного случая. Любая БД должна поддерживать выборку одной записи по ключевому полю. Поэтому, я бы использовал std::map для хранения элементов. И в качестве ключа, генерировал бы числовой идентификатор для каждой записи, увеличивая счетчик на единицу при добавлении нового элемента в БД.

porshe, делаете сразу резерв для большого кол-ва элементов и нормально будет.

И в качестве ключа, генерировал бы числовой идентификатор для каждой записи, увеличивая счетчик на единицу при добавлении нового элемента в БД.

IMEI?

Ну, мы же все понимаем, что «взрослые» БД организованы совершенно по другому принципу, нежели бинарные записи структур в файл ;)

Поэтому, предлагая вектор, исходил только из соображений удобства кодирования конкретной учебной задачи. Тестировать производительность данной программы на 100К записях всё равно ни кто не будет. Да и незачем.

В целом согласен с тобой. Хотя, 100К записей — это не много, даже для такой игрушечной БД. std::map вернет запись по ключу одинаково быстро, как при 100 тысячах, как и при 10 записях в БД.

А вот, поиск по std::list имеет сложность O(n) :-) Вектор для 100к записей, я думаю, будет нормально работать, Хотя, копирование данных при реаллокации будет довольно долгим, я подозреваю. Да и большие блоки менеджеру памяти сложнее искать, особенно при сильной фрагментации.

Вообще, неплохая идея для обучающей статьи — написать простую БД с реализацией индексов по полям, сортировкой, выбором по нескольким критериями, автоматическим дампом и загрузкой с диска.

std::map вернет запись по ключу одинаково быстро, как при 100 тысячах, как и при 10 записях в БД.

Ой ли? Если не ошибаюсь, std::map использует бинарное дерево. Следовательно скорость будет пропорциональна логарифму. Или я что-то путаю?

Я уже писал, что тестировать производительность этой учебной программы ни кто не будет. БД, которая сидит полностью в памяти, это не БД, по большому счёту, а просто массив данных. И, в 90% случаев, глубоко плевать какой контейнер там используется. Вся черёмуха начинается, когда данные не помещаются в память. А если ещё критерий отбора не тривиальный...

Я всегда тащусь, когда в учебниках по программированию вижу примеры типа «давайте напишем программу для поиска книг в библиотеке». Нуб читает, и понимает как это просто: написать СУБД для библиотеки. И после этого твёрдо уверен, что сможет написать СУБД для любой предметной области. Автор, конечно, хотел просто продемонстрировать приёмы работы со структурами (или классами), работу с файлами и т.д., но ощущение простоты написания СУБД почему-то возникает почти всегда. Кстати, вышесказанное, касается и идеи обучающей статьи. IMHO, конечно.

Да, извиняюсь, я почему-то думал, что std::map использует хеш-таблицы, а не бинарные деревья. Для быстрого поиска по ключу, нужно использовать std::unordered_map.

Автор, конечно, хотел просто продемонстрировать приёмы работы со структурами (или классами), работу с файлами и т.д., но ощущение простоты написания СУБД почему-то возникает почти всегда.

Не знаю, у меня не возникает. Но об ощущениях спорить не будем.

Кстати, вышесказанное, касается и идеи обучающей статьи. IMHO, конечно.

Считаю, что практические примеры всегда лучше воспринимаются, чем абстрактные. В том, что кому-то может показаться, что написать реальную СУБД — это просто, не вижу ничего особо страшного.

Во первых, более-менее адекватному человеку должно быть очевидно, что учебный пример и практическая реализация настоящей СУБД — две большие разницы :-) А во вторых, такое заблуждение само по себе не очень деструктивно, и в скором времени пройдет.

Примерчик не плохой! Спасибо большое Porshe. Извините если что )

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.