Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выборка из массива структур, типа как в базах данных 
:(
    Опции темы
Igor_K
Дата 2.5.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Здравствуйте! 

Мне нужно понять ка реализовать такую штуку для лабы.

Есть массив структур, например:
Код

struct mystr {
    int n;
    int m;
};


И нужно реализовать вывод определенных структур массива по определению которое вводит пользователь с клавиатуры. Например вводим:
Код

n > 10 AND m < 5 AND n != 15

типа выборка как из базы данных.

Я не могу сообразить как выбрать данные по таким критерием. То есть не пойму как разобрать , например "n > 10" и выбрать все елементы, в которых елемент структуры n больше 10.
Наверно нужно гдето почитать как реализовано такое в базах данных. Никто не знает где? ИЛи может кто-то может словами объяснить как такое делается.

Спасибо всем за любую информацию!
PM MAIL   Вверх
bronislav
Дата 2.5.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



А каким способом пользователь вводит ограничения?

У тебя в структуре два члена m и n. Пользователь может наложить на них условие
Код

>=
<=
<
>
==
!=


А в программе читаешь строку-условие например из файла или из консоли, разбираешь ее на отдельные сооставляющие. И делаешь выборку по условиям. Ну типа если такое ограничение найдено, то найдем множество структур, которые соостветствуют этому условию.

А потом когда найдены множества для отдельных условий ищешь их пересечения, объединения и т.д.

Я понятно объяснил? Если что-то не понятно то пиши.

Можно воспользоваться стандартной функцией std::find_if

Ей передаются три параметра, итератор начала, итератор конца и предикат (или условие).
Предикат - єто функция, которая как аргумент получает элемент твоей структуры и как результат выдает ответ соответствует структура условию или нет.

Пишеться функция, предикат, в которой происходит обработка разобранного условия, а условие разбирается (парсится) единоразово при чтении из файла.

Это сообщение отредактировал(а) bronislav - 2.5.2008, 23:03


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Igor_K
Дата 2.5.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Цитата(bronislav @  2.5.2008,  22:43 Найти цитируемый пост)
А каким способом пользователь вводит ограничения?

По типу формата SQL 
Код

n > 10 AND m < 5 AND n != 15


не очень понятно как делать выборку. 
Например разбил условие 
Код

n > 10
 на три составляющие "n ", ">", "10"
 как их применить к условию выборки?

PM MAIL   Вверх
bronislav
Дата 2.5.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Ну пишеш switch который проверяет так, условие применимо к элементу 'n', оператор = '>', ограничение = 10.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Igor_K
Дата 2.5.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



bronislav, спасибо большое за помощь! smile  Завтра уже наверно буду думать как написать на свежую голову. Пойду спать. Может приснится реализация smile 
PM MAIL   Вверх
bronislav
Дата 2.5.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Еще несколько советов.
При разборе строки условия создаешь список структур условий:
Код

enum element {"n","m"};
enum oper {">","<","!=","==","<=",">="};

struct condition
{
  element el; // елемент, к которому применяется условие
  oper op;     // операто условия: <, >, ==, ...
  int cond;     // ограничение
}

std::list<condition> cond_list;



Потом пишешь предикат, в котором поелементно проверяешь условия: если условие верно, переходем к следующему, если не верно возвращаем false.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.