Объектно-ориентированное программирование на C++


         

Объектно-ориентированное программирование на C++

Прежде чем приступать к изучению объектно-ориентированного программирования (ООП) вспомним ряд положений, без понимания которых невозможно понять парадигму ООП. Одной из основных посылок для понимания такого метода программирования является четкое представление о типах данных, которые Вы собираетесь использовать в своей программе.
А начнем мы разговор с вещей, которые большинство из Вас считает простыми и давно известными. Мы поговорим о базовых типах данных и о конструкторах новых типов, используемых в языке С. Для нас стало уже привычным в начале каждой программы, функции описывать переменные, c которыми мы собираемся оперировать. При этом Вы иногда обоснованно, иногда нет, присваиваете каждой переменной один из доступных в данном языке программирования типов. А почему нам доступны именно эти типы? Насколько адекватно они позволяют описывать моделируемый в программе мир? Можно ли использовать другие, более подходящие типы? На эти и множество других, еще не заданных вопросов, мы и попытаемся сегодня найти ответы.
Каждая используемая нами в программе переменная только тогда имеет смысл, когда может принимать какие-либо значения. Множество значений, которые может принимать переменная, играет столь важную роль для характеристики переменной, что оно называется типом переменной.

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

Современное понятие типа
Базовые типы
Базовые типы - 2
Базовые типы - 3
Базовые типы - 4
Базовые типы - 5
Основные конструкторы типов.
Основные конструкторы типов. - 2
Основные конструкторы типов. - 3
Основные конструкторы типов. - 4

Bash - командный интерпретатор GNU Bourne
bash - это sh-совместимый интерпретатор командного языка, выполняющий команды, прочитанные со стандартного входного потока или из файла. Командный интерпретатор bash также включает полезные средства командных интерпретаторов Korn и C (ksh и csh).

Описание
Опции
Аргументы
Вызов
Вызов - 2
Определения
Зарезервированные слова
Простые команды
Конвейеры
Списки

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

Переменные командного интерпретатора
Переменные командного интерпретатора - 2
Переменные командного интерпретатора - 3
Переменные командного интерпретатора - 4
Переменные командного интерпретатора - 5
Переменные командного интерпретатора - 6
Переменные командного интерпретатора - 7
Массивы

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

Перенаправление входного потока
Перенаправление выходного потока
Добавление перенаправленного вывода
Перенаправление стандартного выходного потока
Конструкция "документ здесь"
Дублирование дескрипторов файлов
Открытие дескрипторов файлов для чтения и записи
Псевдонимы
Функции
Вычисление арифметических выражений

Пометки событий
При включении опции -o history с помощью встроенной команды , командный интерпретатор обеспечивает доступ к истории выполнения команд - списку ранее введенных команд. Текст последних HISTSIZE команд (по умолчанию - 500) сохраняется в списке истории. Командный интерпретатор сохраняет в списке истории команды до подстановки значений параметров и переменных (см. раздел "" ранее), но после подстановки команд из списка истории, с учетом значений переменных командного интерпретатора HISTIGNORE и HISTCONTROL.

История выполнения команд
Подстановка команд из списка истории
Пометки событий
Пометки слов
Модификаторы
Встроенные команды интерпретатора
Встроенные команды интерпретатора - 2
Встроенные команды интерпретатора - 3
Встроенные команды интерпретатора - 4
Встроенные команды интерпретатора - 5

Информация об ошибках
После того, как определено, что ошибка действительно существует, используйте команду bashbug для посылки сообщения об ошибке. Если вы знаете, как ошибку исправить, пришлите и исправление! Предложения и "философские" сообщения об ошибках можете отправлять по электронной почте по адресу или в дискуссионную группу Usenet gnu.bash.bug.

Информация об ошибках
Ошибки

Программирование на C++ с использованием библиотеки Qt4
Библиотека Qt представляет собой набор классов C++ и инструментов разработки программ для Windows, Linux, MacOSX и встраиваемых систем (Embedded Linux). Исходные тексты библиотеки открыты, но лицензия GPL требует, чтобы программы, которые разрабатываются с использованием Qt, распространялись с открытым исходным кодом. Поэтому если вы не желаете открывать исходный код своей программы, то должны приобрести коммерческую версиюQt.

Основные сведения
Коммерческие и свободные версии Qt4

Порядок установки
Для работы со свободной версией Qt4 должен быть установлен компилятор MinGW (к сожалению, поддержка компилятора Microsoft C++ включена только в коммерческие версии Qt); путь к исполняемым файлам MinGW, находящимся в папке bin, должен быть указан в системной переменной PATH (напоминаем, что после редактирования значений переменных окружения требуется перезагрузить компьютер, чтобы все изменения вступили в силу).

Предварительные условия:
Порядок установки:
Компиляция Qt4 в Linux
Порядок установки:

Простейшее приложение Qt4
// Простейшее приложение Qt4 (пустое окно) 2 3 #include QApplication 4 #include QMainWindow 5 6 int main(int argc, char *argv[]) { 7 8 QApplication app(argc, argv); 9 10 QMainWindow *mw = new QMainWindow(0, Qt::Window); 11 mw-setWindowTitle("Hello Qt4"); 12 mw-resize(400, 300); 13 mw-show(); 14 15 return app.exec(); 16 }

Qmake
Qmake
Pro
Qmake
Make
Build.cmd
Pro
Листинг 2
Кодеков
Листинг 3

Интегрированная среда разработки
Конечно, с исходным текстом программ можно работать, используя любой текстовый редактор, а компиляцию проводить с помощью командной строки. Но более удобно (во всяком случае, так считают те, кто мало знаком с миром Unix/Linux-систем) вести разработку программ в какой-нибудь интегрированной среде (IDE). В состав библиотеки Qt входит утилита QtDesigner, с помощью которой можно в диалоговом режиме вести проектирование графического интерфейса приложений.

Ctags
Инструменты | Инструменты

Обработка событий
Для связывания событий, происходящий с объектами, и функций, предназначенных для обработки этих событий, в библиотеке Qt используется интересный механизм

Assistant
Листинг 5 (файл examples-qt/01/01.cpp)

Строка состояния
Строка состояния QStatusBar создаётся автоматически в нижней части главного окна приложения, если в программе хоть раз вызвается метод MainWindow::statusBar. При наведении указателя мыши на кнопку панели инструментов или пункт меню в строке состояния на время появляется текст подсказки, если этот текст определён для данной кнопки или данного пункта.

Действие
Меню
Обработка событий - виртуальные методы
Наследники класса QObject и метакомпилятор
Компилятора метаобъектов
Пример приложения с меню и строкой состояния
Листинг 6. Меню и строка состояния
Листинг 7. Меню и строка состояния
Листинг 7. Меню и строка состояния - 2
QtDesigner

"Ручное" размещение
С помощью метода setGeometry(int x, int y, int w, int h) или setGeometry(const QRect) можно задать положение и размер любого визуального элемента в пикселах. Для установки размеров без изменения положения может использоваться метод resize(int w, int h) или resize(const QSize). Наоборот, для перемещения элемента в нужную позицию с сохранением прежних размеров служит метод move(int x, int y) или move(const QPoint).

Перерасчёт геометрии в методе resizeEvent
Перерасчёт геометрии в методе resizeEvent
Перерасчёт геометрии в методе resizeEvent - 2
Перерасчёт геометрии в методе resizeEvent - 3
Менеджеры размещения
Менеджеры размещения

Создание диалогов с помощью QtDesigner
Для разработки интерфейса программы в Qt имеется специальный инструмент-- QtDesigner. Он используется либо как самостоятельное приложение, либо как компонент, встроенный в интегрированную среду Microsoft Visual Studio. Во втором случае доступ к его функциям производится с помощью пункта меню

Qt
NewForm
Label
Редактор свойств
Text
Lay Out Horizontally
Lay Out Vertically
Preview in
Edit Tab Order
Previewin

Работа с базами данных в Qt4
В библиотеке Qt4 имеются драйверы для работы со следующими СУБД: QDB2 -- IBM DB2 версии не ниже 7.1; QIBASE -- Borland InterBase; QMYSQL -- MySQL; QOCI -- Oracle; QODBC -- ODBC (в том числе Microsoft SQL Server); QPSQL -- PostgreSQL; QSQLITE -- SQLite версии не ниже 3; QSQLITE2 -- SQLite версии 2; QTDS -- Sybase Adaptive Server.

Компиляция SQL-драйверов
Компиляция SQL-драйверов - 2

Подключение к базе данных и выполнение SQL-запросов
Для подключения к базе данных надо указать название SQL-драйвера, например: QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "MyDB1"); Второй необязательный параметр позволяет задать имя соединения.

Подключение к БД и выполнение SQL-запросов
Выполнение SQL-запросов
Выполнение SQL-запросов -2
Выполнение SQL-запросов - 3

Работа с таблицами баз данных
Самый простой способ отображения информации базы данных в виде таблицы заключается в использовании классов QSqlQueryModel и QTableView: QSqlQueryModel model; model.setQuery("select * from employee"); QTableView view; view.setModel(model); view.show();

Таблица базы данных
Таблица базы данных - 2

Разработка модели и представления таблицы БД
Решим сначала простую задачу: в ячейках последнего столбца таблицы, где хранится только два возможных значения, будем отображать элемент QCheckBox и текст "Да" или "Нет" (). Кроме того, запретим редактирование первого столбца, изменим цвет фона ячеек первого и последнего столбцов, а также параметры шрифта во втором столбце.

Разработка модели и представления таблицы БД
Модель и представление таблицы БД
Модель и представление таблицы БД - 2
Модель и представление таблицы БД - 3

Делегаты для ячеек таблицы
Делегаты -- это специальные классы, которые могут использоваться для управления режимами отображения или редактирования ячеек таблицы QTableView, равно как и элементов других представлений (QListView, QTreeView). В данном разделе мы определим делегатов для редактирования дат и чисел в ячейках таблицы.

Делегаты для ячеек таблицы
Делегаты
Делегаты - 2
Делегаты - 3

Borland C++ Builder
Современные средства разработки информационных систем, к числу которых относится C++Builder, ориентированы на широкую поддержку различных СУБД, как настольных, так и серверных. Построение эффективных и надежных с точки зрения сохранности и защиты данных многопользовательских информационных систем, как правило, производится с использованием последних. Создание приложений в архитектуре клиент/сервер с помощью C++ Builder обладает рядом особенностей, отличающих их от приложений, использующих настольные СУБД.

Среда разработки C++ Builder
Компоненты C++ Builder
Свойства компонентов
События
Методы
Менеджер проектов
Создание приложений в С++ Builder
Пример: создание простейшего приложения
Изучаем компоненты Borland C++ Builder
Выбор компонентов для групповых операций

C++ 3d.Комментарии
Хотелось бы отметить, что есть еще несколько очень важных мест, где мы имеем неожиданную и порой весьма существенную "поддержку времени выполнения". Это конструкторы/деструкторы (сложных) объектов, код создания/уничтожения массивов объектов, пролог/эпилог создающих объекты функций и, отчасти, вызовы виртуальных функций.

Эффективность и структура
Эффективность и структура - 2
Виртуальные функции
Виртуальные функции - 2
Виртуальные функции - 3
Обобщенные алгоритмы
Ноль
Перегруженные имена функций
Неуказанное количество аргументов
Указатель на функцию

Справочник советов и примеров по C++Builder
Чтобы помигать иконкой приложения в панели задач, разместите на форме компонент TTimer (Timer1) и напишите следующий обработчик события OnTimer (предварительно выставив интервал таймера и сделав его активным):

Курсор мыши
Экран и рабочий стол
Экран и рабочий стол - 2
Редактор
Редактор - 2
Диски и файлы
Диски и файлы - 2
Диски и файлы - 3
Диски и файлы - 4
Диски и файлы - 5

Цветовые константы
Объект - это совокупность данных и способов работы с ними. Инкапсуляция - это механизм объединения и защиты данных и кода. Объект - это то, что поддерживает инкапсуляцию. Объединение кода и данных представляет собой "черный" ящик. Объект характеризуется свойствами. Свойства объекта - это данные, методы обращения с данными объекта, события, на которые объект может реагировать. Данные объекта представляются полями или записями. Внутри объекта коды и данные могут быть закрытыми (private) для этого объекта или от-крытыми (public).

Алгоритм создания программного кода на С++.
Алгоритм создания программного кода на С++. - 2
Алгоритм создания программного кода на С++. - 3
Алгоритм создания программного кода на С++. - 4
Алгоритм создания программного кода на С++. - 5
Создание и сохранение нового проекта.
Открытие и использование менеджера проектов.
Планирование работ - список To-Do List.
Задание информации о версии программы.
Работа с формами.

Программирование для Windows на Borland C++
Чтобы ввести исходный текст программы, откомпилировать и увидеть на экране окно Windows-приложения, необходимо выполнить следующие действия: Сделайте двойной щелчок левой клавиши мыши (или нажатие ENTER) на пиктограмме Borland C++. Появится окно компилятора BC4. Щелчок левой клавиши мыши на элементе меню Project (или переход в строку меню путем нажатия F10, поиск и высвечивание элемента Project с помощью клавиш ¬ и ®. Раскрыть Project с помощью клавиши ENTER).

Исходный текст приложения
Пояснения к программе
Задание
Немного английского
Динамическое создание объекта класса TApplication
Исходный текст приложения
Пояснения к программе
Исходный текст приложения
Задание
Создание объекта главного окна

Создание VxD на Visual C++ без ассемблерных модулей
Виртуальные драйверы устройств (VxD) в Windows во многих случаях являются единственным «честным» способом обхода ограничений, установленных системой для приложений Win32: невозможности прямого доступа к портам ввода-вывода и служебной памяти, эффективной обработки аппаратных прерываний, использования сервисных функций существующих VxD и т.п. Кроме того, без VxD не обходится практически ни один полноценный драйвер физического или виртуального устройства.

Смысл и назначение драйвера
Имя и идентификатор драйвера
Статические и динамические драйверы
Порядок загрузки статических драйверов
Системные сообщения драйверу
Сервисные функции драйвера
Интерфейс с прикладными программами
Структура и функционирование драйвера
Секции файла драйвера
Блок описателя драйвера

Visual C++ FAQ
Клавиша Alt+Print Screen (не забывайте, что эффект распространяется только на текущее окно) С помощью MFC это делается командами GetDC(GetDesktopWindow), затем BitBlt куда надо. RTFM: BitBlt, CreateCompatibleDC, CreateCompatibleBitmap:

Как сделать надпись перевернутую на 90 градусов?
Как сетевую карту отключить через Win32 API?
Ресурсы_ dll видны в пользующей его программе
Как запустить текущего e-mail клиента?
Как сделать, чтобы некотоpое пpиложение
Как я могy закpыть пpиложение?
Как программно переключить раскладку клавиатуры?
Как программно сделать eject для CD-ROM'a, ZIP'a?
Как убрать часы из SystemTray?
Как определить, что запущен Screen Saver?

Настройка параметров доступа к данным в C++ Builder
Современные средства разработки информационных систем, к числу которых относится C++Builder, ориентированы на широкую поддержку различных СУБД, как настольных, так и серверных. Построение эффективных и надежных с точки зрения сохранности и защиты данных многопользовательских информационных систем, как правило, производится с использованием последних. Создание приложений в архитектуре клиент/сервер с помощью C++ Builder обладает рядом особенностей, отличающих их от приложений, использующих настольные СУБД.

DBase
Paradox
ODBC-источники
ODBC-источники - 2
Oracle
InterBase
О проектировании для клиент-серверных С++Builder
Терминология при проектировании БД
Нормализация данных
Пример проектирования информационной системы

Практическая работа с компилятором С++ Builder 6
В C++Builder все объекты компонентов размещаются в объектах - формах. Для каждой формы, которую вы проектируете в своем приложении, C++Builder создает отдельный модуль. Именно в модулях и осуществляется программирование задачи. В обработчиках событий объектов - форм и компонентов, вы помещаете все свои алгоритмы. В основном они сводятся к обработке информации, содержащейся в свойствах одних объектов, и задании по результатам обработки свойств других объектов. При этом вы постоянно обращаетесь к методам различных объектов.

Создание и сохранение нового проекта.
Открытие и использование менеджера проектов.
Планирование работ - список To-Do List.
Задание информации о версии программы.
Работа с формами.
Включение в проект новой формы.
Просмотр форм и модулей
Размещение компонентов на форме.
Размещение компонентов на форме. - 2
Размещение компонентов на форме. - 3

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

Работа с областями памяти и строками
Работа с областями памяти и строками - 2
Определение класса символов и преобразование
Форматные преобразования данных
Работа с каталогами файловой системы
Операции над файлами
Ввод и вывод
Ввод и вывод - 2
Функции вода/вывода высокого уровня
Функции вода/вывода высокого уровня - 2

Программирование на С++ с помощью компилятора Borland C++ 5.02 и библиотеки OWL 5.00
Для Windows можно разрабатывать 16-ти и 32-разрядные приложения (программы). Можно разрабатывать как MS DOS, так и Windows-приложения. Приложение пишется на языке высокого уровня (С, С++, Pascal, Fortran и т.п.), после этого программа компилируется компилятором (компиляция - получение исполняемого файла с расширением exe или com). В настоящее время хорошим компилятором является компилятор фирмы Borland версии 5.02.

Программирование на С++
Программирование в среде Windows
Интегрированная среда разработки Borland C++ 5.02
Файл проекта
Программирование. Borland C++ 5.02 Понятие класса.
Типы окон.
Программирование главного окна.
Программирование главного окна. - 2
Продолжение
Продолжение - 2

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

Создание заготовки программы.
Создание заготовки программы. - 2

Кнопочки и сообщения
Выделим строку "2000app.rc" в проекте и дважды щелкнем на ней. Появится новое окно, которое называется редактором ресурсов. Развернем, нажав на плюс, пункт "DIALOG", и выделим единственный подпункт - "IDD_CLIENT (2000)" - см.2.2. (И вот тут я понял, что имя для нашей программы - 2000 - я выбрал не совсем удачно. То, что Вы видите в скобках - 2000 - это идентификационный номер ресурса "диалога" - и он никак не связан с выбранным нами именем программы.

Создание своей кнопки в окне программы.
Создание своей кнопки в окне программы. - 2
Заставим кнопку работать.
Заставим кнопку работать. - 2

Сообщения об ошибках и предупреждения
Удалим, например, первые кавычки во фразе "Вы нажали:". MessageBox(Вы нажали на кнопку\nСпасибо Вам за это!", Ага, текст изменил цвет и из синего стал красным. (Если вы читаете черно-белый вариант книги, то это превращение я Вам показать, конечно, не могу - смотрите на монитор). Не стану объяснять очевидное - красный цвет всегда означает что-то плохое. Таким незамысловатым образом Borland, следящий за каждым Вашим движением, сразу сообщает Вам, что Вы делаете что-то не то.

Сообщения об ошибках.
Сообщения об ошибках. - 2

Возвращаемые значения
MessageBox - это тоже функция. Мы ее вызываем, подсовывая (передавая) ей некоторые значения (тексты) и параметры-флаги. Эта функция рисует на экране окно сообщения. Когда мы нажимаем на кнопку в этом сообщении - именно в этот момент функция считается полностью выполненной - и возвращает вызвавшей ее программе какое-то значение. Что она может возвращать?

Возвращаемые значения.
Возвращаемые значения. - 2

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

Немного развлечемся.
Немного развлечемся. - 2

Работа с базами данных в Borland C++ Builder
Используя Borland C++ Builder, можно создать приложения, работающие как с однопользовательскими базами данных (БД), так и с серверными СУБД, такими как Oracle, Sybase, Informix, Interbase, MS SQL Server, DB2, а также с ODBC-источниками. Возможности C++ Builder, связанные с созданием приложений, использующих базы данных, весьма обширны для того, чтобы описать их в одной статье. Поэтому сегодня мы рассмотрим лишь простейшие возможности работы с таблицами баз данных.

Компонент TDataSource
Компонент TTable
Компонент TTable - 2
Компонент TField
Компонент TField - 2
Компонент TDBGrid
Разработка простейшего приложения
Приложение, использующее вычисляемое поле
Компоненты TDBLookup
Приложения, использующее просмотр БД

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

Установка.
Ник.
Подключение.
Открытие доступа к своим папкам.
Список хабов.
Дополнительные адреса хабов:
Настройка внешнего вида rmDC++.
Цвет фона и цвет шрифтов.
Цвет фона и цвет шрифтов. - 2
Цвет фона и цвет шрифтов. - 3

Сишные трюки от мыщъха
Мыщъх продолжает делиться трюками и хитростями эффективного программирования на си. сегодня мы рассмотрим: строки, указатели, циклы, память и многое другие аспекты практического программирования, которые наверняка вызовут дикий "вой" у всех теоретиков от языка, но… они работают и это главное!

Строки
Вариант с инвариантом в теле цикла
Вариант с выносом инварианта
Указатели
Лишние обращениями к памяти
Оптимизированный вариант
Оптимизированный вариант - 2
Регистровые ре-ассоциации
Кандидат на регистровую ре-ассоциацию
Счетчик цикла совмещен с указателем на массив

Создание контроллеров автоматизации с помощью C++Builder
В предыдущей статье данного мини-цикла мы рассмотрели создание приложения, являющегося сервером автоматизации. Теперь, основываясь на информации о методах класса его объекта автоматизации, содержащейся в библиотеке типов, создадим приложение, управляющее этим сервером. Такие приложения называются контроллерами автоматизации.

Создание контроллеров автоматизации C++Builder
Создание контроллера
Некоторые комментарии
Некоторые комментарии - 2
Некоторые комментарии - 3
Коллекции объектов внутри серверов
Коллекции объектов внутри серверов - 2
Использование информации из библиотек типов
Использование информации из библиотек типов - 2
Использование информации из библиотек типов - 3

Поставка приложений, созданных с помощью С++ Builder
При окончательной сборке исполняемого файла (то есть непосредственно перед созданием дистрибутива) следует убрать из исполняемого файла отладочную информацию. Для этого следует из менеджера проектов вызвать диалоговую панель Project Options и нажать кнопку Release.

Поставка исполняемых файлов
Установка и настройка Borland Database Engine
Установка и настройка Borland Database Engine - 2
Установка дополнительных компонентов приложения
Способы создания дистрибутивов
Создание дистрибутивов - InstallShield Express
Создание дистрибутивов - InstallShield Express - 2
Создание дистрибутивов - InstallShield Express - 3


Экономика. Учебные пособия - перейти
Введение в экономическую теорию. Учебник - перейти
Курс экономической теории - перейти
Хрестоматия по экономической теории - перейти
Экономика. Курс лекций - перейти
Экономика. Учебник - перейти
Зарождение и развитие экономической теории - перейти
Экономический образ мышления - перейти
Новые возможности Flash - перейти
Введение в технологию Flash - перейти
Основы работы с Flash MX - перейти
Работа с отдельными объектами - перейти
Рисование - перейти
Работа с цветом - перейти
Работа с текстом - перейти