Модуль для работы с ассоциативными массивами в c builder


Содержание

Модуль для работы с ассоциативными массивами в c builder

БлогNot. C++ Builder: динамический массив компонентов и доступ к его элементам

C++ Builder: динамический массив компонентов и доступ к его элементам

Распространённая у начинающих проблема — динамическое создание массивов компонентов. Ясно, что динамический массив из 5 полей ввода, который создаст сама программа, явно будет удобнее, чем «ручное» размещение на форме каждого из них. Если создание массива компонентов мы одолели, возникает вторая проблема — как не плодить кучу одинаковых обработчиков событий, а заставить множество компонентов обходиться одним обработчиком, различая при этом, какая именно кнопка или поле ввода инициировали событие.

Приведём маленький пример, который отвечает на эти вопросы.

Создадим пустой проект C++ Builder, в интерфейсе модуля (файла Unit1.h ) пропишем в секции public: массивы указателей на 5 полей ввода, 5 кнопок и общую для всех кнопок функцию-обработчик события OnClick (щелчка по кнопке):

Переключимся на файл Unit1.cpp . Динамическое создание и размещение компонентов на форме реализуем в любой подходящей функции, например, в обработчике события OnClick формы:

На всякий случай, повторное создание компонентов предотвращается с помощью статической переменной-флажка Created . Компоненты размещаются парами сверху вниз, слева — поле ввода, а справа — кнопка:

Наконец, реализуем добавленный нами метод класса TForm1 — функцию ButtonClick :

Здесь показано, как узнать, от какой именно из кнопок поступило событие (вычисляем её «номер» i ) и как затем с помощью оператора static_cast получить доступ к полю ввода с тем же «номером».

Также для различения компонент можно использовать свойство Tag , присваивая ему различные порядковые значения.

07.09.2014, 19:40; рейтинг: 13191

Модуль для работы с ассоциативными массивами в C++ Builder

Вступление

Мой любимый язык – PHP. Он изящен и прост, но, к сожалению, предназначен только для программирования сайтов. «Обычную» программу на нём не напишешь.

К счастью, некоторые технологии, реализованные в PHP можно перенести и в другие языки программирования: например, в C++.

Одна из таких технологий – ассоциативные массивы.

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

array[«name»] = «John Silver»;

Здесь в массиве array создаются два элемента, один из которых имеет ключ «0» и числовое значение «123», другой – ключ «name» и строковое значение «John Silver». «ass_arr» – не массив задниц, как подумало большинство читателей, а возможное имя типа (класса) ассоциативного массива.

Удобно? Удобно! Не нужно описывать входящие в массив элементы и их типы. Не нужно думать о размере массива – он динамичен. Не нужно заботится ни о чём, кроме свободной памяти.

Подробнее об удобствах

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

Рассмотрим простой пример. Возьмём структуру, в которой хранятся настройки некоей программы. Опишем её так:

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

bool savePreferences(struct preferences* pref)

При добавлении в структуру нового поля, придётся дополнять эту функцию.

Если же вместо переменной подобной структуры использовать ассоциативный массив – всё что потребуется функции сохранения – перед началом работы сформировать список ключей этого массива и в цикле по списку ключей, сохранить каждый элемент, основываясь на его типе.

Это могло бы выглядеть так:

bool savePreferences(ass_arr* pref)

// цикл по всем элементам

for (i = 0; i Count(); i++)

// извлекаем очередной элемент

// если элемент числового типа,

// сохраняем его числовое значение

if (VarType(v) == varInteger)

// далее для других типов

Как быть, если нужно заполнить данными настроек Builder’овскую форму? Потребуется ещё одна функция. При использовании ассоциативных массивов эту процедуру можно автоматизировать.

А главное: при добавлении в массив настроек нового поля – не нужно ничего менять.

Существует ещё много подобных задач. Ассоциативные массивы – универсальное средство. Но как реализовать их в C++?

Реализация ассоциативных массивов в C++ Builder

Для реализации класса ассоциативного массива, я использовал несколько стандартных классов: во-первых, Variant – мультитип. В переменной типа Variant может хранится значение любого из стандартных типов. Во-вторых, CList – для создания внутренних списков. Поэтому, вне Builder’а – например, в MSVC++, этот класс работать не будет. Однако, при большом желании, его можно портировать (использовав list из stl и написав свою реализацию Variant).

Моя библиотека содержит три класса: ass_arrEl – класс элемента массива, ass_arr – класс простого ассоциативного массива, и его наследник – prop_ass_arr, предназначенный для работы с окнами настройки. Он «умеет» сохранять и загружать своё содержимое из реестра, заполнять им формы и заполняться содержимым формы сам.

Как работать с моими классами

Несколько наглядных примеров:

Простой массив. Работа со значениями.

// так можно создать элементы

// а так – обратиться к их значениям

a[«name»].v() возвращает значение типа Variant.

Работа с ключами

// Создаём два значения

// Выводим их в цикле

for (i = 0; i Debugger Options

Здесь нас интересует вкладка Language Exceptions. Заходим внутрь, и что мы видим? Налицо суровое нарушение правил безопасности! Оказывается, дебаггер успешно игнорирует исключения, принадлежащие Delphi, Microsoft, VisiBroker, CORBA! Но зачем? Ответ очевиден – каждый из этих шедевров мысли имеет свои собственные обработчики исключений, которые заточены под специфические нужды. И они вовсе не собираются пользоваться стандартным обработчиком.

Мы, конечно, можем вписать сюда тип int, но в этом случае дебаггер будет игнорировать все, что связано с этим типом данных. Это не есть правильно.

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

Назовем его TCustomException. Кликаем по Add, и вписываем это в строчку диалога. Потом щелкаем OK. Все, поздравляю дамы и господа! Мы успешно зарегистрировали тип данных. То есть теперь дебаггер не будет обижаться на то, что мы используем для генерации исключений что-то, о чем он не знает.

Итак, уходим из опций дебаггера, и возвращаемся в программу.

сlass TCustomException<>; // Наш тип данных

TCustomException NewEx; // Объект класса (типа) TCustomException

try // Начало блока создания исключений

throw NewEx; //Создание исключения

catch(TCustomException) // Начало блока отлова исключений

MessageDlg(«Exception. «,mtError, TMsgDlgButtons()

Модуль для работы с ассоциативными массивами в C++ Builder

Заев А.А. Вступление Мой любимый язык – PHP. Он изящен и прост, но, к сожалению, предназначен только для программирования сайтов. «Обычную» программу на нём не напишешь. К счастью, некоторые технологии, реализованные в PHP можно перенести и в другие языки программирования: например, в C . Одна из таких технологий – ассоциативные массивы. В ассоциативном массиве вместо числовых индексов используются ключи любых типов. Данные в ассоциативном массиве так же могут быть разнотипными. К примеру: ass arr array; array = «Joh Silver»; Здесь в массиве array создаются два элемента, один из которых имеет ключ «0» и числовое значение «123», другой – ключ « ame» и строковое значение «Joh Silver». «ass arr» – не массив задниц, как подумало большинство читателей, а возможное имя типа (класса) ассоциативного массива. Удобно? Удобно! Не нужно описывать входящие в массив элементы и их типы. Не нужно думать о размере массива – он динамичен. Не нужно заботится ни о чём, кроме свободной памяти. Подробнее об удобствах Ассоциативный массив – всего лишь способ представления данных. Любая задача, решаемая посредством ассоциативных массивов, может быть решена посредством структур или классов. Однако, использование ассоциативности существенно упрощает решение многих задач. Рассмотрим простой пример. Возьмём структуру, в которой хранятся настройки некоей программы. Опишем её так: s ruc prefere ces < i Wi dowWid h; i Wi dowHeigh ; i Wi dowX; i Wi dowY; char docume Pa h; >; Для сохранения данных этой структуры где-либо, потребуется специальная функция, которая будет «знать» все поля, которые присутствуют в этой структуре. Например, такая: bool savePrefere ces(s ruc prefere ces pref) < saveI eger(pref->Wi dowWid h); saveI eger(pref->Wi dowHeigh ); . saveS ri g(pref->docume Pa h); > При добавлении в структуру нового поля, придётся дополнять эту функцию. Если же вместо переменной подобной структуры использовать ассоциативный массив – всё что потребуется функции сохранения – перед началом работы сформировать список ключей этого массива и в цикле по списку ключей, сохранить каждый элемент, основываясь на его типе. Это могло бы выглядеть так: bool savePrefere ces(ass arr pref) < i i; Varia v; // цикл по всем элементам for (i = 0; i &l ; pref->Cou (); i ) < // извлекаем очередной элемент v = ( pref).v() // если элемент числового типа, // сохраняем его числовое значение if (Var ype(v) == varI eger) < saveI eger(( pref).asI eger()); >// далее для других типов . > > Как быть, если нужно заполнить данными настроек Builder’овскую форму? Потребуется ещё одна функция. При использовании ассоциативных массивов эту процедуру можно автоматизировать. А главное: при добавлении в массив настроек нового поля – не нужно ничего менять. Существует ещё много подобных задач. Ассоциативные массивы – универсальное средство. Но как реализовать их в C ? Реализация ассоциативных массивов в C Builder Для реализации класса ассоциативного массива, я использовал несколько стандартных классов: во-первых, Varia – мультитип. В переменной типа Varia может хранится значение любого из стандартных типов.

Илон Маск рекомендует:  Что такое код imagecolorexactalpha

Во-вторых, CLis – для создания внутренних списков. Поэтому, вне Builder’а – например, в MSVC , этот класс работать не будет. Однако, при большом желании, его можно портировать (использовав lis из s l и написав свою реализацию Varia ). Моя библиотека содержит три класса: ass arrEl – класс элемента массива, ass arr – класс простого ассоциативного массива, и его наследник – prop ass arr, предназначенный для работы с окнами настройки. Он «умеет» сохранять и загружать своё содержимое из реестра, заполнять им формы и заполняться содержимым формы сам. Как работать с моими классами Несколько наглядных примеров: Простой массив. Работа со значениями. #i clude «ass arr.h»; ass arr a; // так можно создать элементы a = «Бесноватый»; // а так – обратиться к их значениям ShowMessage(a.v() возвращает значение типа Varia . Работа с ключами #i clude «ass arr.h»; ass arr a; i i; // Создаём два значения a = «Бесноватый»; // Выводим их в цикле for (i = 0; i &l ; a.Cou (); i ) < // a.key(i) возвращает ключ i-го по счёту элемента. // Ключ тоже типа Varia . Заметьте, что при выводе я напрямую // не указываю ключей: они определяются автоматически ShowMessage(a.v()); >В ключах не существует недопустимых символов. Вы можете использовать в качестве ключей даже имена файлов с полными путями! Вложенные массивы. Простейшее дерево. #i clude «ass arr.h»; ass arr a; ass arr i er; i i; // создаём новый ассоциативный массив i er = ew ass arr; // заполняем его данными. ( i er)[] — обращение к оператору // обьекта по указателю. ( i er) = «Сумкин»; // вносим его в нулевой элемент массива a a = «Фёдор»; ( i er) = i er; i er = ew ass arr; ( i er) = «Беззвестный»; // присваивать можно ссылку на массив, либо же сам массив a = i er; // теперь выведем поле sur ame второго элемента i er = a.sub(); // заносим в i er ссылку на вложенный массив второго элемента ShowMessage(( i er)); // выведем поле ame третьего элемента (можно писать так) ShowMessage(( (a); Вложенные массивы так же могут иметь вложенные массивы. Подобные структуры, по сути, представляют из себя деревья с узлами произвольной структуры. Заполнение формы значениями массива. Загрузка значений ассоциативного массива. Сохранение ассоциативного массива в реестре и загрузка его из реестра. Допустим, на форме mai Form два поля: Edi logi и Edi password. Кроме того, в массиве конфигурации необходимо хранить число запусков программы ( umS ar s). #i clude «ass arr.h»; prop ass arr co fig; . mai Form::o Crea e(.) < // загружаем конфигурацию из реестра if (!co fig.loadSec io (HKEY CURRE USER, "Sof ware/Kuu/Passworder")) ShowMessage("Не удалось загрузить конфигурацию из реестра"); co fig.v() 1; >. mai Form::o Show(.) < // заполняем форму значениями конфигурации co fig. oForm( his); >. mai Form::o Des roy(.) < // заполняем конфигурацию значениями из формы co fig.fromForm( his); if (!co fig.saveSec io (HKEY CURRE USER, "Sof ware/Kuu/Passworder")) ShowMessage("Не удалось сохранить конфигурацию в реестр"); >Так просто? Да! saveSec io и loadSec io поддерживают вложенные массивы неограниченного уровня вложенности. Виктор Соколов Исключения в Borla d С Builder 6.0

В статье рассматриваются проблемы, возникающие при работе с исключениями в среде Borla d C Builder 6.0 Я не спроста уточнил, что все нижеизложенное относится в первую очередь к шестой версии среды, поскольку я натолкнулся на эти проблемы именно в ней, и не проверял прочие версии. Итак, краткий инструктаж по применению исключений, согласно книгам, статьям и официальным исходникам. Конструкция исключений имеет следующий вид. Пример №1 ry // ry — указывает на то, что дальше пойдет блок исключений < hrow 1; // hrow – ключевое слово, собственно и создающее исключение >ca ch(i a) // ca ch – указывает на то, что дальше пойдет блок отлова исключений < MessageDlg("Excep io - 1",m Error, MsgDlgBu o s() &l ;&l ; mbOK, 0); // Сообщение о // поимке исключения >; Теперь, разберем эту конструкцию поподробнее. ry Ключевое слово, указывающее на начало блока исключений. Используется только в С , а в С придется использовать ry. Однако, ry можно так же использовать в C . Блок исключений заключается в фигурные скобки, как это показано выше, и при необходимости, в нем создается исключение. hrow Ключевое слово, создающее исключение. Иными словами, при создании исключения, hrow инициализирует временный объект того типа, с помощью которого мы хотим создать исключение. В приведенном примере, мы используем тип i , соответственно, создается временный объект типа i , содержащий данные – 1. ca ch Ключевое слово, указывающее на начало блока обработки исключений. Здесь мы можем разместить любые реакции на пойманные исключения. В параметрах блока мы должны указать тип данных, использованный при создании исключений. Поскольку в приведенном выше примере мы создавали исключений типа i , то и слушать нам надо на предмет типа i . Так что мы указываем этот тип в скобках. И вроде бы все! Создаем новый проект, помещаем на форму кнопочку, и вставляем в обработчик нажатия этой кнопки наш пример. Потом запускаем. Компилятор уверенно считывает строчки. Линкер не видит ничего подозрительного. Программа запускается, и радостно ожидает начала работы. Мы нажимаем на кнопочку Бах. И хорошо, если вам скажут, что «Projec XXX.exe raised excep io class i wi h message ‘Excep io Objec Address: 0x8E4C6E’. process s opped. use S ep or Ru o Co i ue.» В некоторых случаях вас вообще могут вышвырнуть из среды, включая полное зависание всей Wi dows. Итак, что же неправильно в этом коде? Во-первых, давайте разберемся, что такое «Projec XXX.exe raised excep io » Это сообщение появляется тогда, когда программа, над которой трудится дебаггер, создает исключение. Проблема в том, что С Builder (равно как и Delphi) почему-то все исключения, которые находит, по умолчанию скидывает на стандартный обработчик. Однако, подобное сообщение мы можем увидеть не только при обработке своего исключения. Это сообщение возникает так же в случаях, если это Opera i g Sys em Excep io (Исключение операционной Системы) или La guage Excep io (Исключение Языка). В данном примере, мы работаем с помощью средств языка, нисколько не трогая (ну разве что самую малость) операционную систему. Так что стоит сходить в гости к дебаггеру, и проверить – чем он там занимается.

Этот специализированный вычислитель с рекордной теоретической производительностью в 1000 триллионов операций в секунду предназначен для решения задач молекулярной динамики и, более конкретно, моделирования сворачивания белков. Техническое сотрудничество и поддержку институту RIKEN в этой разработке оказывали японское подразделение компании Intel и SGI Japan. В основе системы лежат собственной разработки процессоры MDGrape-3, изготовленные фирмой Hitachi и обеспечивающие производительность 230 Гфлопс каждый. Один вычислительный модуль содержит 24 таких чипа, а в целом суперкомпьютер состоит из 201 модуля. Работу главного вычислительного ядра обеспечивают две группы серверов на основе процессоров Intel: кластер из 65 параллельных серверов, каждый из которых содержит 256 двухъядерных чипов Intel Xeon (Dempsey), и еще один кластер из 37 серверов (по 74 одноядерных процессора Xeon 3,2 ГГц). Компания SGI Japan собрала все эти компьютеры в единую массивно-параллельную систему. Японский петафлопсный супервычислитель MDGrape-3 по производительности почти втрое превосходит «самый быстрый компьютер планеты», американский IBM BlueGene/L, находящийся в ядерной Ливерморской лаборатории им. Лоуренса

Модуль для работы с ассоциативными массивами в c builder

Мой любимый язык – PHP. Он изящен и прост, но, к сожалению, предназначен только для программирования сайтов. «Обычную» программу на нём не напишешь.

К счастью, некоторые технологии, реализованные в PHP можно перенести и в другие языки программирования: например, в C++.

Одна из таких технологий – ассоциативные массивы.

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

array[«name»] = «John Silver»;

Здесь в массиве array создаются два элемента, один из которых имеет ключ «0» и числовое значение «123», другой – ключ «name» и строковое значение «John Silver». «ass_arr» – не массив задниц, как подумало большинство читателей, а возможное имя типа (класса) ассоциативного массива.

Удобно? Удобно! Не нужно описывать входящие в массив элементы и их типы. Не нужно думать о размере массива – он динамичен. Не нужно заботится ни о чём, кроме свободной памяти.

Подробнее об удобствах

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

Илон Маск рекомендует:  Что такое код pspell_store_replacement

Рассмотрим простой пример. Возьмём структуру, в которой хранятся настройки некоей программы. Опишемеётак:

C++ Builder: создание динамического массива

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

Определение массива, чаще всего, предполагает обязательное указание его размерности. Например:

int A[5]; // определение массива из 5 элементов типа int int A[5][5]; // определение массива размерностью 5х5 элементов типа int int A[]=<1,2,3>; // определение массива с инициализацией его элементов int A[5]=<1,2>; // определение массива с частичной инициализацией его элементов static int A[5]; // определение массива. Все элементы этого массива примут значение 0

В целом, все просто. Сложности возникают, когда появляется надобность в инициализации массива, размерность которого заранее неизвестна. В такой ситуации придется прибегнуть к указателям.

Выглядит сие действо так:

double* Mas1 = new double[kol1];

Здесь Mas1 – название массива, а kol1 – его размерность, которая будет определена по ходу выполнения программы.

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

double** Mas2 = new double*[kol2]; for(int i=0;i Mas2 – название массива, а kol2 – его размерность, которая будет определена по ходу выполнения программы.

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

Модуль для работы с ассоциативными массивами в c builder

Мой любимый язык – PHP. Он изящен и прост, но, к сожалению, предназначен только для программирования сайтов. «Обычную» программу на нём не напишешь.

К счастью, некоторые технологии, реализованные в PHP можно перенести и в другие языки программирования: например, в C++.

Одна из таких технологий – ассоциативные массивы.

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

array[«name»] = «John Silver»;

Здесь в массиве array создаются два элемента, один из которых имеет ключ «0» и числовое значение «123», другой – ключ «name» и строковое значение «John Silver». «ass_arr» – не массив задниц, как подумало большинство читателей, а возможное имя типа (класса) ассоциативного массива.

Удобно? Удобно! Не нужно описывать входящие в массив элементы и их типы. Не нужно думать о размере массива – он динамичен. Не нужно заботится ни о чём, кроме свободной памяти.

Подробнее об удобствах

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

Рассмотрим простой пример. Возьмём структуру, в которой хранятся настройки некоей программы. Опишемеётак:

BestProg

Пример разработки приложения демонстрации работы списков и ассоциативных массивов. Классы Dictionary , List , StreamReader

В данной теме приведен пример разработки приложения типа Windows Forms Application , которое демонстрирует использование списков (класс List ) и ассоциативных массивов (класс Dictionary ).

Приложение реализует лабораторную работу одного из учебных заведений.

Используя данный пример Вы получите опыт работы с классами Dictionary и List , которые относятся к обобщенным коллекциям.

При разработке приложения реализованы следующие задачи:

  • чтение данных из файла и отображение их в элементе управления типа ListBox ;
  • демонстрация использования класса StreamReader из модуля System.IO для чтения данных из файла;
  • демонстрация работы класса Dictionary для организации коллекции. Класс сохраняет пары «ключ-значение»;
  • демонстрация работы класса List для организации динамического массива или списка.

Содержание

Условие задачи

Реализовать приложение типа Windows Forms Application с использованием списков и ассоциативных массивов.

Файлы содержат неограниченное количество строк. Каждая строка файла содержит данные, которые разделены символом ‘ , ‘ (запятая).

Одна строка файла « Flight.txt » имеет следующую структуру:

  • номер рейса (целое число);
  • пункт отправки (строка символов);
  • время вылета, часа (целое число);
  • общее количество мест (целое число).

Одна строка файла « Tickets.txt » имеет следующую структуру:

  • номер билета (целое число);
  • номер рейса (целое число);
  • место (целое число);
  • дата вылета (строка символов);
  • пункт назначения (строка символов);
  • дата прибытия (строка символов);
  • время прибытия (целое число);
  • цена (число с плавающей запятой);
  • время продажи билета (строка символов).

В программе нужно решить следующие задачи:

1. Прочитать данные из файла « Flight.txt » и выполнить над ними следующие операции:

  • отобразить их на Windows -форме в элементе управления типа ListBox ;
  • организовать данные в коллекцию (класс Dictionary ).

2. Прочитать данные из файла « Tickets.txt » и выполнить над ними следующие операции:

  • отобразить их на Windows -форме в элементе управления типа ListBox ;
  • организовать данные в динамический массив (класс List ).

3. Вывести на форму рейсы с максимальной продолжительностью полета. Вычисление выполнить с использованием классов Dictionary и List .

4. Вывести на форму число пассажиров, которые ждут отправления в введенный момент времени. Вычисление выполнить с использованием классов Dictionary и List .

Пример содержимого файла Flight.txt :

Пример файла « Tickets.txt «:

Выполнение

1. Запустить MS Visual Studio .

Создать проект по шаблону C# как Windows Forms Application . Пример создания такого проекта подробно описывается здесь .


2. Создание формы приложения.

Разместить на форме следующие элементы управления (рисунок 1):

  • элемент управления типа ListBox для отображения данных из файла « Flights.txt «. Автоматически создается объект с именем listBox1 ;
  • элемент управления типа ListBox для отображения данных из файла « Tickets.txt «. Автоматически создается объект с именем listBox2 ;
  • элементы управления типа Label для отображения информационных сообщений. Создаются объекты с именами label1 , label2 , label3 , label4 , label5 ;
  • элемент управления типа TextBox который представляет строку ввода данных (время отправления). Создается объект с именем textBox1 ;
  • элемент управления типа Button (кнопка « Вычислить «). Создается объект с именем button1 ;
  • элемент управления типа ListBox (список рейсов с максимальной продолжительностью полетов). Создается объект с именем listBox3 .

Скорректировать размеры и позиции элементов управления так как показано на рисунке 1.

Рис. 1. Форма приложения после размещения элементов управления

3. Настройка свойств элементов управления.

Настройка свойств элементов управления осуществляется с помощью окна « Properties » системы Microsoft Visual Studio 2010 .

Настроить следующие свойства элементов управления:

  • в элементе управления label1 свойство Text = «Файл Flight.txt»;
  • в элементе управления label2 свойство Text = «Файл Tickets.txt»;
  • в элементе управления label3 свойство Text = «Время отправления»;
  • в элементе управления textBox1 свойство Text = «»;
  • в элементе управления label4 свойство Text = «Число пассажиров, которые ждут отправления: «;
  • в элементе управления button1 свойство Text = «Вычислить»;
  • в элементе управления label5 свойство Text = «Рейсы максимальной продолжительностью полета:».

После настройки свойств и корректирования позиций и размеров элементов управления форма приложения будет иметь вид как показано на рисунке 2.

Рис. 2. Форма приложения после настройки элементов управления

4. Организация данных в виде структур.

Данные, которые размещаются в одной строке того или иного файла целесообразно представить в виде структуры. Это осуществляется с целью повышения эффективности работы программы. Так как, в отличие от класса, который есть ссылкой, структуры в C# реализованы как типы-значения . В сравнении со структурами, при доступе к объектам класса по ссылке, увеличивается количество выделенных ресурсов и оперативной памяти.

Представим данные одной строки файла « Flight.txt » в виде структуры Flight :

По тому же принципу представляются данные одной строки файла « Tickets.txt » в структуре Tickets :

Фрагмент листинга файла « Form1.cs » после ввода структур имеет следующий вид:

5. Классы Dictionary и List . Описание основных структур данных.

В соответствии с условием задачи, данные, которые размещены в файлах « Flight.txt » и « Tickets.txt «, формируются в коллекции.

Коллекция типа «словарь» ( Dictionary ) представляется в виде: «ключ-значение». Причем значение ключа есть уникальным (не может повторяться).

Для структуры Flight целесообразно сформировать данные в виде словаря или ассоциированного массива. Это связано с тем, что номер рейса в списке рейсов есть уникальным (не может повторяться).

В C# для представления коллекции типа «словарь» (ассоциированный массив) реализовано два базовых класса:

  • класс HashTable – принадлежит к необобщенным коллекциям;
  • класс Dictionary – принадлежит к обобщенным коллекциям.

В соответствии с условием задачи, нужно использовать класс Dictionary .

Для представления ассоциированного массива в текст класса формы нужно ввести объект с именем avia , что есть типа Dictionary :

В этом описании тип int есть номером рейса, а тип Flight есть структурой, которая соответствует этому рейсу.

Для разных рейсов номер билета может повторяться. Поэтому, удобно реализовать билеты в виде обобщенного динамического массива типа List . Вместо типа подставляется структура Tickets – в итоге получается List .

Ввести объект с именем tickets:

6. Подключение пространства имен System.IO . Класс StreamReader .

В соответствии с условием задачи, в программе осуществляется чтение из файла. Библиотека классов .NET Framework представляет множество средств для организации взаимодействия программы с файлами (открытие файла, чтение файла и т.д.).

В данной работе использованы возможности класса StreamReader . Этот класс описывается в просторные имен System.IO . Итак, в начале файла « Form1.cs » нужно ввести строку:

Класс StreamReader предназначен для ввода символов из байтового потока. Для вывода символов в байтовый поток используется класс StreamWriter .

В классе StreamReader есть метод ReadLine() , читающий текстовую строку из файла. Метод ReadLine() возвращает строку типа string . Этот метод будет использован при чтении файла в данной задаче.

7. Программирование методов чтения данных из файлов « Flight.txt » и « Tickets.txt «.

Прочитанные из файлов « Flight.txt » и « Tickets.txt » данные отображаются в элементах управления listBox1 и listBox2 . Для отображения данных нужно создать два метода.

Илон Маск рекомендует:  Функции zip файлов (только для чтения)

Первый метод Read_Avia() выполняет следующие операции:

  • читает список авиарейсов из файла « Flight.txt «;
  • формирует ассоциированный массив avia типа Dictionary ;
  • формирует список авиарейсов в listBox1 для его отображения на форме.

Второй метод Read_Tickets() выполняет следующие операции:

  • читает перечень купленных билетов из файла « Tickets.txt «;
  • формирует динамический массив tickets типа List ;
  • выводит содержимое файла « Tickets.txt » в listBox2 .

Листинг методов Read_Avia() и Read_Tickets() следующий:

Объясним некоторые фрагменты кода в методах Read_Avia() и Read_Tickets() .

Чтение файла осуществляется с помощью класса StreamReader , который предназначен для ввода символов из байтового потока. Открытие файлов реализуется в конструкторе класса StreamReader :

Чтение строки из файла осуществляется методом ReadLine() класса StreamReader . Если достигнут конец файла, то метод возвращает null .

С помощью строки

происходит разделение строки на составные части. Разделитель между составными частями – это символ ‘ , ‘.

добавляет в коллекцию avia типа Dictionary номер рейса и заполненную структуру sa .

добавляет в коллекцию tk типа List структуру tk .

8. Изменение кода конструктора формы Form1() .

Методы Read_Avia() и Read_Tickets() размещаются в конструкторе формы Form1() .

Листинг конструктора формы Form1() следующий:

9. Программирование события клика на кнопке « Вычислить «.

Листинг обработчика события клика на кнопке « Вычислить » имеет вид:

В вышеприведенном листинге следует отметить. При просмотре коллекций используется оператор foreach (и только foreach ). Оператор foreach служит для циклического обращения к элементам коллекции, которая представляет собой группу объектов. Использование других операторов цикла приводит к ошибке.

Список рейсов с максимальной продолжительностью полета выводится в элемент управления listBox3 .

10. Запуск приложения на выполнение.

Результат работы приложения изображен на рисунке 3.

Модуль для работы с ассоциативными массивами в c builder

БлогNot. C++ Builder: динамический массив компонентов и доступ к его элементам

C++ Builder: динамический массив компонентов и доступ к его элементам

Распространённая у начинающих проблема — динамическое создание массивов компонентов. Ясно, что динамический массив из 5 полей ввода, который создаст сама программа, явно будет удобнее, чем «ручное» размещение на форме каждого из них. Если создание массива компонентов мы одолели, возникает вторая проблема — как не плодить кучу одинаковых обработчиков событий, а заставить множество компонентов обходиться одним обработчиком, различая при этом, какая именно кнопка или поле ввода инициировали событие.

Приведём маленький пример, который отвечает на эти вопросы.

Создадим пустой проект C++ Builder, в интерфейсе модуля (файла Unit1.h ) пропишем в секции public: массивы указателей на 5 полей ввода, 5 кнопок и общую для всех кнопок функцию-обработчик события OnClick (щелчка по кнопке):

Переключимся на файл Unit1.cpp . Динамическое создание и размещение компонентов на форме реализуем в любой подходящей функции, например, в обработчике события OnClick формы:

На всякий случай, повторное создание компонентов предотвращается с помощью статической переменной-флажка Created . Компоненты размещаются парами сверху вниз, слева — поле ввода, а справа — кнопка:

Наконец, реализуем добавленный нами метод класса TForm1 — функцию ButtonClick :

Здесь показано, как узнать, от какой именно из кнопок поступило событие (вычисляем её «номер» i ) и как затем с помощью оператора static_cast получить доступ к полю ввода с тем же «номером».

Также для различения компонент можно использовать свойство Tag , присваивая ему различные порядковые значения.

07.09.2014, 19:40; рейтинг: 13191

Модуль для работы с ассоциативными массивами в C++ Builder

Мой любимый язык – PHP. Он изящен и прост, но, к сожалению, предназначен только для программирования сайтов. «Обычную» программу на нём не напишешь.

К счастью, некоторые технологии, реализованные в PHP можно перенести и в другие языки программирования: например, в C++.

Одна из таких технологий – ассоциативные массивы.

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

array[«name»] = «John Silver»;

Здесь в массиве array создаются два элемента, один из которых имеет ключ «0» и числовое значение «123», другой – ключ «name» и строковое значение «John Silver». «ass_arr» – не массив задниц, как подумало большинство читателей, а возможное имя типа (класса) ассоциативного массива.

Удобно? Удобно! Не нужно описывать входящие в массив элементы и их типы. Не нужно думать о размере массива – он динамичен. Не нужно заботится ни о чём, кроме свободной памяти.

Подробнее об удобствах

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

Рассмотрим простой пример. Возьмём структуру, в которой хранятся настройки некоей программы. Опишемеётак:

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

bool savePreferences(struct preferences* pref)

При добавлении в структуру нового поля, придётся дополнять эту функцию.

Если же вместо переменной подобной структуры использовать ассоциативный массив – всё что потребуется функции сохранения – перед началом работы сформировать список ключей этого массива и в цикле по списку ключей, сохранить каждый элемент, основываясь на его типе.

Это могло бы выглядеть так:

bool savePreferences(ass_arr* pref)

// цикл по всем элементам

for (i = 0; i Count(); i++)

// извлекаем очередной элемент

// если элемент числового типа,

// сохраняем его числовое значение

if (VarType(v) == varInteger)

// далее для других типов

Как быть, если нужно заполнить данными настроек Builder’овскую форму? Потребуется ещё одна функция. При использовании ассоциативных массивов эту процедуру можно автоматизировать.

А главное: при добавлении в массив настроек нового поля – не нужно ничего менять.

Существует ещё много подобных задач. Ассоциативные массивы – универсальное средство. Но как реализовать их в C++?

Реализация ассоциативных массивов в C++ Builder

Для реализации класса ассоциативного массива, я использовал несколько стандартных классов: во-первых, Variant – мультитип. В переменной типа Variant может хранится значение любого из стандартных типов. Во-вторых, CList – для создания внутренних списков. Поэтому, вне Builder’а – например, в MSVC++, этот класс работать не будет. Однако, при большом желании, его можно портировать (использовав list из stl и написав свою реализацию Variant).

Моя библиотека содержит три класса: ass_arrEl – класс элемента массива, ass_arr – класс простого ассоциативного массива, и его наследник – prop_ass_arr, предназначенный для работы с окнами настройки. Он «умеет» сохранять и загружать своё содержимое из реестра, заполнять им формы и заполняться содержимым формы сам.

Как работать с моими классами

Несколько наглядных примеров:

Простой массив. Работа со значениями.

// так можно создать элементы

// а так – обратиться к их значениям

a[«name»].v() возвращает значение типа Variant.

// Создаём два значения

// Выводим их в цикле

for (i = 0; i Debugger Options

Здесь нас интересует вкладка Language Exceptions. Заходим внутрь, и что мы видим? Налицо суровое нарушение правил безопасности! Оказывается, дебаггер успешно игнорирует исключения, принадлежащие Delphi, Microsoft, VisiBroker, CORBA! Но зачем? Ответ очевиден – каждый из этих шедевров мысли имеет свои собственные обработчики исключений, которые заточены под специфические нужды. И они вовсе не собираются пользоваться стандартным обработчиком.

Мы, конечно, можем вписать сюда тип int, но в этом случае дебаггер будет игнорировать все, что связано с этим типом данных. Это не есть правильно.

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

Назовем его TCustomException. Кликаем по Add, и вписываем это в строчку диалога. Потом щелкаем OK. Все, поздравляю дамы и господа! Мы успешно зарегистрировали тип данных. То есть теперь дебаггер не будет обижаться на то, что мы используем для генерации исключений что-то, о чем он не знает.

Итак, уходим из опций дебаггера, и возвращаемся в программу.

сlass TCustomException<>; // Наш тип данных

TCustomException NewEx; // Объекткласса (типа) TCustomException

try // Начало блока создания исключений

throw NewEx; //Создание исключения

catch(TCustomException) // Начало блока отлова исключений

MessageDlg(«Exception. «,mtError, TMsgDlgButtons()

Модуль для работы с ассоциативными массивами в c builder

Мой любимый язык – PHP. Он изящен и прост, но, к сожалению, предназначен только для программирования сайтов. «Обычную» программу на нём не напишешь.

К счастью, некоторые технологии, реализованные в PHP можно перенести и в другие языки программирования: например, в C++.

Одна из таких технологий – ассоциативные массивы.

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

array[«name»] = «John Silver»;

Здесь в массиве array создаются два элемента, один из которых имеет ключ «0» и числовое значение «123», другой – ключ «name» и строковое значение «John Silver». «ass_arr» – не массив задниц, как подумало большинство читателей, а возможное имя типа (класса) ассоциативного массива.

Удобно? Удобно! Не нужно описывать входящие в массив элементы и их типы. Не нужно думать о размере массива – он динамичен. Не нужно заботится ни о чём, кроме свободной памяти.

Подробнее об удобствах

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

Рассмотрим простой пример. Возьмём структуру, в которой хранятся настройки некоей программы. Опишемеётак:

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL