Информатика, математика, архитектура ПК, история искусства

Логическая организация
памяти ПК
Адресное пространство
PC и XT
Сегментные и линейные
адреса
http://kursmt.ru/
DOS Память VGA
BIOS видеоадаптеров
Платы сетевых адаптеров
Базовая система
ввода/вывода
Карты ПЗУ
IBM BIOS
Дополнительная память
Предотвращение конфликтов
резидентные программы
Широковещательные сети
и протоколы
Подуровень управления
http://kursmat.ru/
дискретная система
беспроводные ЛВС
шумовой сигнал
волоконно-оптические кабели
Метод инфракрасной
передачи
Архитектура Bluetooth
Виртуальные сети
кодирующее устройство
Новый стиль в Европе
Ар Нуво как стиль
http://kurspr.ru/
Чарлз Ренни Макинтош
Коломан Мозер
Развитие промышленности в Америке
Чикагская архитектурная
школа
Адольф Лоос
производственный союз
Рождение абстрактного
искусства
Художники-кубисты
футуристическая живопись
итальянские художники
идеи "Де Стейл"
Кандинский Василий
Васильевич
Движение супрематизм
Малевич
производственное искусство
средовой дизайн
Машиностроительное черчение
Основы начертательной
геометрии
Фронтальная проекция
Компьютерные технологии
Панель свойств объектов
Настройка рабочей среды
Системы координат
Декартовы и полярные координаты
Свойства примитивов
Управление видимостью слоя
Полилиния Эскизы стили
Разработка чертежей
Эротика в искусстве
Эпоха Ренессанса и Рококо
расцвет искусства
Средневековое искусство
Вакханка Семейное счастье
Сластолюбивый фавн Адам
Гравюра Пикари
Радости Вакха
И. Саделер. Радости Вакха
Гравюра. Шабаш ведьм.
В женском доме Гравюра
итальянская гравюра
Ювелирное искусство
Крестьянин и сластолюбивая госпожа
Эскиз для бокала
Марс и Венера
Тольциус. Батсеба в купальне
Встроенные операторы
и функции
Запись и считывание данных
Язык С Фортран Макрос
Внешние вызовы
Установка закладок
Графические результаты
двумерные графики
трехмерные графики
Числа и числовые константы
Комплексные числа
Списки выражений
Массивы, векторы и матрицы
Бинарные операторы
Операторы объединения
Тригонометрические функции
Гиперболические функции
Операции с векторами
Графическая визуализация
Импликативные функции
Условные выражения
Ключи в процедурах
Операции ввода и вывода
Высокое возраждение
в Италии, Франции и Испании
Тайная вечеря
Леонардо да Винчи
Собор Св. Петра
Микеланджело
Рафаэль
Брунеллески
Неоплатонизм
Тициан Маньеризм
Эль Греко
Итальянские скульпторы
Северное Возрождение
Барокко в Италии и Испании
Караваджо
Архитектура и скульптура
в Италии
Живопись в Испании
Барокко во Фландрии и
Голландии
Рембрандт. Ночной дозор
Пейзаж и натюрморт
в живописи
эпоха Версаля
Никола Пуссен
Королевская Академия
Математика примеры задачи
Дифференциальное и
интегральное
исчисление функции одной
переменной
Понятие производной
Площадь плоской фигуры в полярных координатах
Геометрический смысл производной
Правила дифференцирования
Понятие дифференциала
Теорема Ролля
Вычисление длины дуги кривой

Правило Лопиталя

Выпуклость функции

Асимптоты графика функции

Неопределенный интеграл
Таблица интегралов
Введение в анализ. Предел
Понятие множества
Операции над множествами
Функции и отображения
Числовые множества
Предел последовательности
Фундаментальные последовательности
Монотонные
последовательности
Предел функции

Критерий Коши

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

Программирование в среде С++

Первые главы этого учебника носят ознакомительный и довольно элементарный характер Поскольку книга, как предполагается, адресована широкому кругу читателей, в том числе и новичкам, мы начнем с самых элементарных вещей. И прежде всего с того, как вообще организованы вычисления (в широком смысле слова) на компьютере. В этом разделе мы опишем “классический” процесс подготовки и трансляции программы на языке высокого уровня (в нашем случае это C++') в исполняемый файл, содержащий машинные инструкции и все остальное, что необходимо для работающей программы системы Windows. Компилятор “видел” сразу весь текст программы и мог непосредственно проконтролировать, например, количество и тип фактических параметров в вызове процедуры, — соответствуют ли они тем, что указаны в заголовке ее определения (формальным параметрам). Компилятор транслировал программу сразу в машинный код (исполняемый файл). Выше мы уже упоминали о библиотеках, не объясняя, впрочем, что они собой представляют. Конкретнее, мы имели в виду библиотеки объектных модулей; такая библиотека является просто собранием модулей объектного кода, скомпонованных в одном файле с расширением lib, своего рода архивом

Факсимильная технология Техническое обслуживание ПК

Интегрированная среда разработки C++Builder Окно редактора кода является основным рабочим инструментом программиста. Его функции не ограничиваются редактированием исходного текста программы. Консольное приложение Windows похоже на программу DOS, но только внешне. Оно работает в “окне MS-DOS”, которое на самом деле в 32-битных системах Windows таковым не является. Консольное приложение — 32-битное, и запустить его в обычной 16-битной DOS невозможно. Процедура создания приложения с графическим интерфейсом пользователя даже проще, чем в случае консольного приложения, поскольку C++Builder предназначен именно для этого В следующем примере мы покажем, как присоединить к программе функцию из библиотеки. Причем библиотека эта будет не простая, а динамическая. Наиболее существенной особенностью динамических библиотек (DLL) является то, что содержащиеся в них процедуры, функции и ресурсы могут совместно использоваться несколькими приложениями.

 Как уже говорилось, хорошее понимание языка С представляется необходимым для успешного программирования на C++. C++Builder в полной мере поддерживает стандарт ANSI С и, кроме того, некоторые другие версии языка (Керниган & Ричи, Unix V). Мы в основном будем ориентироваться на стандарт ANSI, который, кстати, является в какой-то мере результатом “обратного воздействия” языка C++. В этой главе мы, опираясь на короткие примеры, расскажем об элементах программы на С и синтаксисе различных его конструкций. Строка нашей программы, начинающаяся с двух знаков дроби (//), является комментарием. В данном случае этот “комментарий” ниИ. Саделер.чего не сообщает и введен только для того, чтобы визуально отметить начало определения функции. Строки исходного кода, начинающиеся со знака #, являются, как правило, директивами препроцессора, т. е. управляют обработкой текста программы еще до его передачи собственно компилятору (сюда относятся текстовые подстановки, вставка содержимого других файлов и некоторые специальные операции). После всех директив в программе расположено определение функции main () . Как уже говорилось, в строгом смысле любая программа на С содержит эту функцию, которая является ее входной точкой. Однако в среде Windows вместо main () часто используется WinMain () . Любая программа так или иначе обрабатывает данные. Наша маленькая программа обрабатывает свои данные — строку сообщения “Hello World”, выводя ее на экран. Рассмотрим, какие возможны варианты представления информации в С.

Любая информация рассматривается компилятором как принадлежащая к некоторому типу данных. В языке имеется несколько встроенных, или простых, типов (возможны и другие типы данных, например, определяемые пользователем) Именованная единица памяти для-хранения данных называется переменной. Разновидностью переменных являются типизированные константы. Это переменные, значение которых (заданное при инициализации) нельзя изменить. Точно так же и в языке C++ следующим уровнем представления данных после одиночных переменных и констант являются своего рода формулы, называемые выражениями. К арифметическим мы отнесем те операции, которые перечислены в таблице под рубриками “Мультипликативные” и “Аддитивные”.

Если в операторе присваивания тип результата, полученного при оценке выражения в правой части, отличен от типа переменной слева, компилятор выполнит автоматическое приведение типа (по-английски typecast или просто cast) результата к типу переменной В арифметическом выражении могут присутствовать операнды различных типов — как целые, так и вещественные, а кроме того, и те и другие могут иметь различную длину (short, long и т. д.), в то время как оба операнда любой арифметической операции должны иметь один и тот же тип При поразрядных операциях каждый бит одного операнда комбинируется (в зависимости от операции) с одноименным битом другого, давая бит результата. При единственной одноместной поразрядной операции — отрицании (~) — биты результата являются инверсией соответствующих битов ее операнда. Условная операция позволяет составить условное выражение, т. е. выражение, принимающее различные значения в зависимости от некоторого условия. Функция, как уже говорилось, является основным структурным элементом языка С

printf () является функцией стандартной библиотеки с переменным числом аргументов. Она всегда имеет по крайней мере один аргумент — строку формата, чаще всего строковый литерал. Строка может содержать спецификаторы преобразования. В строках языка С для представления специальных (например, непечатаемых) символов используются escape-последователъности, состоящие из обратной дробной черты, за которой следует один или несколько символов В языке С для ввода имеется “зеркальный двойник” printf() — функция scant (). Функция читает данные со стандартного ввода, по умолчанию — клавиатуры. Теперь мы напишем небольшую программу, которая проиллюстрирует все существенные моменты создания функции; в программе применяются некоторые из функций для работы со строками, описанных выше.

Переменные в С могут быть локальными и глобальными, статическими и автоматическими, регистровыми, внешними и даже нестабильными. Условный оператор if... else Время жизни переменной в известной мере определяется ее областью действия Модификаторы переменных Настоящая программа должна уметь “принимать решения”, т. е. изменять последовательность исполнения своих операторов в зависимости от текущей ситуации — входных данных, результатов вычислений, сообщений Windows и т. д

Условие оператора if может быть сколь угодно сложным выражением. Можно было бы сказать, что это выражение должно быть “логическим”, но в С нет логического типа данных. Часто возникают ситуации, когда некоторая переменная может принимать несколько возможных значений-вариантов, и для каждого варианта требуется выполнить какие-то свои действия. Демонстрация структуры switch В языке С структуры многократного повторения реализуются тремя разновидностями операторов цикла. Это циклы while, do... while и for.

Часто бывает необходимо “досрочно” выйти из некоторого цикла, до того, как будет удовлетворено условие его завершения (говоря точнее, до того, как условие продолжения станет ложным). Операторы прерывания блока Программа пузырьковой сортировки Указатель — это переменная, которая содержит адрес другого объекта Можно объявить, инициализировать и использовать указатель на функцию Между указателями и массивами в С существует тесная связь Встроенные типы данных, указатели и массивы образуют основу для представления и обработки информации на языке С. Подлинная же сила языка состоит в том, что он позволяет пользователю (под “пользователем” в подобного рода выражениях понимается программист) самому определять наиболее подходящие для конкретной задачи типы, способные адекватно представлять сложно структурированные данные реального мира. Ключевое слово enum позволяет описать перечислимый тип, представляющий переменные, которые могут принимать значения из заданного набора целых именованных констант. Массивы позволяют обращаться с набором логически связанных однотипных элементов как с единым целым. Если же требуется хранить набор разнородных, но логически связанных данных, описывающих, например, состояние некоторого объекта реального мира, используются структуры. Демонстрация работы со структурами

Препроцессор и особенности компилятора

Препроцессорная обработка представляет собой первую фазу того процесса, что именуется компиляцией программы на C/C++. Компилятор C++Builder не генерирует промежуточного файла после препроцессорной обработки. Компилятор C++Builder автоматически определяет некоторые макросы. Их можно разбить на две категории: макросы ANSI и макросы, специфические для C++Builder. Макросы могут выполнять не только простую текстовую подстановку. Возможно определение макросов с параметрами, напоминающих функции языка С Операция конкатенации (##) позволяет составить из нескольких лексем единое слово. Получившийся элемент повторно сканируется для обнаружения возможного идентификатора макроса Можно производить выборочную компиляцию различных участков кода в зависимости от оценки некоторого константного выражения или определения идентификатора.

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

Типичное применение препроцессорных директив

В этом коротком разделе мы покажем только некоторые из наиболее распространенных случаев, когда препроцессорные директивы могут оказаться полезны. Директивы условной компиляции могут использоваться для простого переключения между двумя различными вариантами кода — старым и экспериментальным алгоритмом Макрос assert() Соглашение о вызове определяет способ передачи параметров от вызывающей функции в вызываемую Псевдопеременные C++Builder служат представлением аппаратных регистров процессора и могут использоваться для непосредственной записи и считывания их содержимого В этом разделе мы рассмотрим установки диалога Project Options, имеющие отношение к программам на С. В основном это будет касаться страниц Compiler и Advanced Compiler этого диалога . Нас на этой странице интересует сейчас только раздел Conditionals.

Отладка программ

В этой главе вы познакомитесь с основными приемами отладки кода с помощью встроенного отладчика IDE. Это мощный инструмент, обладающий широкими возможностями вплоть до отладки на уровне машинного кода. При отладке вам понадобится обращаться в основном к трем меню; это каскадное меню View | Debug Windows, меню Run и контекстное меню редактора кода. Следующая таблица показывает пункты контекстного меню редактора в режиме приостановленной программы. В основном они дублируют перечисленные пункты главного меню, но в ряде случаев более удобны. Программа, запущенная под управлением отладчика IDE, исполняется как обычно, т. е. с полной скоростью, пока не будет встречена контрольная точка (breakpoint) Контрольные точки со счетчиком проходов можно считать разновидностью условных Контрольные точки на данных также устанавливаются при запущенной программе в диалоге, вызываемом командной Run | Add Breakpoint | Data Breakpoint... или Add Data Breakpoint в контекстном меню списка контрольных точек Контрольные точки загрузки модуля Выполняющуюся в IDE программу можно приостановить, выбрав в главном меню Run | Program Pause или нажав кнопку Pause на инструментальной панели. Редактор кода имеет встроенный инструмент, позволяющий чрезвычайно быстро узнать текущее значение переменной или выражения. Он называется подсказкой оценки выражения.

Инспектор отладки — это самый универсальный инструмент IDE для просмотра и модификации значений объектов данных, прежде всего объектов, принадлежащих классам. Командой View | Debug Windows | Local Variables можно открыть окно локальных переменных Окно CPU Стек вызовов Одной из важнейших и самых очевидных операций при отладке является пошаговое исполнение кода. Когда программа приостановлена в контрольной точке, вы можете наблюдать значения различных переменных.

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

В этой части мы будем изучать объектно-ориентированное программирование на C++. Конечно, C++ не единственный язык, работающий с классами и объектами. Есть Object Pascal, есть Java, есть и более старые языки вроде Smalltalk. Поэтому, наверное, имеет смысл поговорить и об общих принципах организации подобных языков. Символьные типы В С глобальная константа, т. е. инициализированная глобальная переменная с модификатором const, имеет своей областью действия всю программу (доступна для внешней компоновки), как и любая переменная без const. В языке С и первых версиях C++ не было специального булева (логического) типа данных. В качестве логических использовались переменные целочисленных типов Локальные переменные в С должны объявляться в начале блока, т. е. до всех исполняемых операторов. В C++ переменные можно объявлять где угодно.

Анонимные объединения

C++ допускает объявление объединений специального вида, называемых анонимными. Они не имеют этикеток и не являются именованными объектами. Последнее означает, что при обращении к разделам такого объединения не нужна операция-точка.В C++ имеется модифицированная форма указателей, называемая ссылкой (reference). Ссылка — это указатель, который автоматически разыменовывается при любом обращении к нему. Ссылки в качестве параметров функции Ссылка в качестве возвращаемого значения Определение функции транслируется компилятором в отдельный и относительно автономный блок объектного кода. При вызове функции в вызывающей процедуре (программе) генерируется инструкция CALL с предшествующим ей кодом, ответственным за передачу параметров, и последующим кодом очистки стека

В C++ имеется операция разрешения области действия, позволяющая в такой ситуации обращаться к глобальной переменной, предваряя ее имя символами “ : : ”. Первоначальное объявление пространства имен — это определение пространства с именем, еще не встречавшимся в программе Доступ к элементам конкретного пространства имен может осуществляться тремя способами Псевдонимы именных пространств В C++ допускаются перегруженные имена функций (термин взят из лингвистики), когда функции с одним именем можно тем не менее идентифицировать по их списку параметров, контексту, так сказать, в котором имя употребляется. Компилятор выполняет т. н. декорирование имен дополняя имя функции кодовой последовательностью символов, кодирующей тип ее параметров. Тем самым формируется уникальное внутреннее имя. Операции распределения памяти В C++ имеется библиотечная функция 5et_new_handler().Он будет вызываться при любой ошибке выделения памяти.

Об объектном подходе к программированию

Существует разные подходы к программированию. Любому из них присущ свой собственный способ абстрагирования сущностей, с которыми он работает. Так, процедурно-ориентированный подход оперирует абстракцией алгоритма. С, кстати, — типичный процедурный язык, хотя на нем возможно писать программы, напоминающие по стилю объектно-ориентированные. Логико-ориентированный имеет в виду цели, выражаемые на языке логических предикатов (таков язык Prolog). Наконец, объектно-ориентированное программирование абстрагирует классы и объекты Объекты нашего программного мира моделируют объекты реального или воображаемого мира (например, мира некоторой игры, хотя это мир тоже мыслимый, а стало быть, реальный в смысле логики). Поведение — это то, как объект взаимодействует с окружением (другими объектами). Объект может подвергаться воздействию окружения или сам воздействовать на него.

Класс — это множество объектов, имеющих одинаковую структуру. Класс в программировании является аналогом понятия, или категории. В то время как объект представляет собой конкретную сущность, класс является абстракцией сущности объекта. Конкретный объект является представителем, или (не совсем грамотно) экземпляром класса. Абстракция и инкапсуляция В C++ принято говорить просто о типах; представитель класса уже нельзя считать просто данными, поскольку ему присуще некоторое поведение. Определение класса начинается с ключевых слов class, struct или union. Правда, union применяется крайне редко. И структуры, и классы, и объединения относятся к “классовым” типам C++.

Классы С++

В прошлой главе мы показали, как определяются простейшие классы C++. То, что содержится в приведенном коде — это интерфейс класса. В самом определении класса объявляются обычно лишь прототипы функций-элементов. Чтобы класс стал работоспособным, необходима еще его реализация. Реализация класса, располагаемая часто в отдельном файле, содержит код его функций-элементов, а также некоторые элементы данных, называемые статическими. Функция-элемент класса объявляется внутри определения класса. Там же может быть расположено и оределение тела функции. В этом случае функцию-элемент называют встроенной и компилятор будет генерировать ее встроенное расширение на месте вызова. В языке С выделялось несколько различных типов области действия: глобальная, файл, функция, блок. В C++'вводится новый вид области действия — класс. Имена элементов класса расположены в области действия класса, и к ним можно обращаться из функций-элементов данного класса. Совершенно аналогично тому, что имеет место в случае элементов-данных, функции-элементы класса могут вызываться функциями-элементами того же класса просто по имени Любая функция-элемент класса, не являющаяся статической (что это такое, выяснится позднее) имеет доступ к объекту, для которого она вызвана, через посредство ключевого слова this. Типом this является имя_класса*.

Статические элементы класса

Статический элемент данных является по существу глобальной переменной с областью действия в классе и разделяется всеми представителями класса. Он только один, вне зависимости от того, сколько представителей имеет класс. На самом деле статический элемент данных существует даже в том случае, когда никаких представителей класса не создано. Функция класса, объявленная с модификатором static, не связывается ни с какими его конкретными представителями. Другими словами, ей не передается указатель this в качестве скрытого параметра Конструктор имеет то же имя, что и класс. Он вызывается компилятором всегда, когда создается новый представитель класса. Если в классе не определен никакой конструктор, компилятор генерирует конструктор по умолчанию (не имеющий параметров). Конструктор копии является конструктором специального вида, который принимает в качестве параметра ссылку или константную ссылку на объект данного класса. Операция присваивания это функция-элемент класса с именем operator, которая принимает в качестве своего единственного параметра ссылку или константную ссылку на объект данного класса. Деструктор является противоположностью конструктора. Он вызывается при уничтожении объектов и должен производить необходимую очистку объекта перед освобождением занимаемой им памяти Определение операций класса new и delete

Функции преобразования

Объекты класса могут быть преобразованы в другие типы (или созданы из других типов) с помощью операций приведения типа или конструкторов преобразования. Можно запретить вызовы конструктора с одним параметром в качестве конструктора преобразования, объявив его с ключевым словом explicit. В классе можно определять элементы-функции, которые будут обеспечивать явное преобразование типа данного класса в другие типы. Эти функции называют операциями приведения или процедурами преобразования. Можно создать представитель класса с модификатором const. Тем самым гарантируется, что после инициализации содержимое объекта нельзя будет изменить. Компилятор C++Builder выдает предупреждение в случае, если для объекта вызывается функция-элемент, не объявленная как const. Другие компиляторы могут выдать сообщение об ошибке и отказаться транслировать подобный код. Константная функция-элемент “обещает” не изменять значений элементов данных класса, что позволяет применять ее на константных объектах. Тем не менее, в некоторых ситуациях имеет смысл разрешить некоторым элементам меняться даже у константных объектов. Спецификаторы доступа позволяют указать, к каким элементам класса могут обращаться функции, в него не входящие. Однако могут быть случаи, когда целесообразно разрешить некоторому классу или функции обращаться к закрытым или защищенным элементам данного класса. Это можно сделать с помощью ключевого слова friend. Функции-элементы класса могут быть перегружены подобно обычным функциям; несколько функций-элементов могут иметь одно и то же имя, если их можно однозначно идентифицировать по списку аргументов Ниже мы приводим два примера классов с перегруженными операциями Перегрузка операции индексации Перегрузка операции вызова operator позволяет “вызывать” объект класса, как функцию. Возвращаемое значение будет чем-то вроде значения объекта по умолчанию. Класс в C++ может наследовать элементы-данные и элементы-функции от одного или нескольких базовых классов. Сам класс называется в этом случае производным по отношению к базовым классам или классом-потомком. При простом наследовании производный класс порождается всего одним базовым классом Для этого нужно написать конструктор производного класса, в котором конструктор базового класса будет вызываться через посредство списка инициализации. Язык C++ допускает не только простое, но и сложное наследование, т. е. наследование от двух и более непосредственных базовых классов. Это позволяет создавать классы, комбинирующие в себе свойства нескольких независимых классов-предков. Неоднозначности при сложном наследовании В качестве альтернативы операции разрешения области действия при сложном наследовании, подобном описанному в предыдущем параграфе, можно потребовать, чтобы производный класс содержал только одну копию базового. Этого можно достигнуть, описав базовый класс при наследовании от него как виртуальный с помощью ключевого слова virtual. Функции-элементы класса могут объявляться в C++ как виртуальные. Ключевое слово virtual заставляет компилятор генерировать для класса некоторую дополнительную информацию 6 функции. Виртуальная функция-элемент некоторого класса может быть объявлена чистой. Для реализации виртуальных свойств классов нужно обеспечить выбор нужной функции на этапе выполнения программы. Это называют поздним связыванием (объекта с его методами).

Форматирование

Библиотека ввода-вывода предусматривает три способа форматирования: посредством вызова форматирующих функций-элементов, с помощью манипуляторов или путем установки или сброса флагов потока. Форматирующие функции-элементы Манипуляторы потоков являются по существу функциями, которые можно вызывать непосредственно в цепочке операций извлечения или передачи в поток. Различают простые и параметризованные манипуляторы. У простых манипуляторов аргументы отсутствуют. Параметризованные манипуляторы имеют аргумент. Флаги управления форматированием являются битовыми полями, хранящимися в переменной типа fmtflags (псевдоним int). Для их чтения и/или модификации могут применяться следующие функции-элементы класса ics: Параметр mode, который имеет вторая форма конструктора, задает режим открытия файла. Однако в библиотеке C++ имеется немало функций бесформатного ввода-вывода, которые часто применяют для чтения и записи двоичных (не-текстовых) файлов. Чтение символов и строк

Шаблоны

Подобно тому, как класс является схемой для создания своих представителей-объектов, шаблон класса в C++ является схемой для образования конкретных представителей-классов шаблона, или шаблонных классов. Шаблоны классов называют иногда параметризованными типами, поскольку действительный тип (класс) создается посредством спецификации конкретных параметров шаблона. Шаблоны функций можно перегружать точно так же, как обычные функции Перегрузка и специализация шаблона Шаблон класса является обобщенным определением некоторого семейства классов, имеющих схожую структуру, но различных в смысле используемых типов или констант. Чтобы создать из шаблона представитель конкретного класса, нужно конструировать объект, указав для его типа имя шаблона с набором конкретных аргументов (типов и констант). В этом параграфе мы расскажем о некоторых возможностях шаблонов, предусмотренных в стандартном C++, но не реализуемых компилятором C++Builder. Нам кажется, что о них необходимо рассказать, хотя бы для того, чтобы, читая другие книги по C++, вы не пытались осуществить в C++Builder методики, которые на нем осуществить невозможно. Можно также полностью переопределить шаблон класса для какого-то конкретного типа аргумента. Это значит, что после определения общего шаблона нужно определить специализированный шаблон класса и предусмотреть переопределения всех его элементов-функций и статических элементов данных В качестве “друзей” класса чаще всего объявляют различные функции-операции, в которых участвуют объекты класса. Типичным примером может служить операция передачи объекта в поток.

Порождение представителей шаблона

Этот раздел посвящен тому, каким образом C++Builder генерирует шаблонные классы и функции в программах, состоящих из нескольких модулей исходного кода. Несколько модулей проекта могут подключать один и тот же заголовочный файл с шаблоном, и создавать объекты одного и того же шаблонного класса (с одинаковым набором аргументов шаблона). В C++Builder имеются средства, позволяющие избежать дублирования кода в такой ситуации. Ключи компилятора Ключевое слово typename

Библиотека стандартных шаблонов

До сравнительно недавнего времени в языке C++ не было других стандартных средств программирования, кроме старой библиотеки стандартных функций С, которая совершенно не использовала мощных нововведений, таких, как классы, шаблоны, inline-функции и исключения. Библиотека стандартных шаблонов (Standard Template Library), разработанная в HP Laboratories, явилась в свое время весьма удачным шагом в решении проблемы стандартной библиотеки ANSI C++, в которую она теперь и входит. Стандартная библиотека C++ вводит новый стиль спецификации заголовочных файлов Итераторы являются центральным механизмом, обеспечивающим работу с данными контейнеров. Чтобы продемонстрировать, как применяются итераторы, мы рассмотрим простейший вид итератора — обычный указатель. Итераторы, генерируемые классами контейнеров, используются точно таким же образом, как указатели в показанном выше примере, но для получения граничных значений итератора вызываются обычно функции вроде begin () или end () конкретного контейнерного объекта Простейший из итераторов — входной. Он может перемещаться по контейнеру только в поступательном направлении и допускает только чтение данных. Собственно, только входные и только выходные итераторы имеют смысл в основном при работе с потоками ввода-вывода, которые могут быть допускать либо только извлечение, либо только передачу данных. Любые контейнеры стандартной библиотеки генерируют более сложные, итераторы, которые, естественно, могут применяться и в качестве простых входных или выходных Двунаправленные итераторы допускают чтение и запись данных и к ним можно применять операции как инкремента, так и декремента Для вставки значений в контейнер применяются итераторы вставки. Их называют также адаптерами, поскольку они преобразуют контейнер в итератор, т. е. адаптируют его к специальному использованию в алгоритмах вроде copy (). Имеются две функции, которые могут оказаться полезными при работе с итераторами. Это advance () и distance (.) . Функции и предикаты

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

Контейнеры

В стандартной библиотеке имеется десять шаблонов классов, реализующих различные структуры данных. Каждый контейнер имеет свой тип iterator, через представители которого вы получаете доступ к данным. Благодаря тому, что контейнеры — это шаблоны, они обладают чрезвычайной общностью. В них можно хранить объекты, указатели на них и даже другие контейнеры, создавая, таким образом, многоуровневые структуры данных. Вектор характеризуется своим размером и вместимостью. Размер — это число элементов, хранящихся в векторе в настоящий момент. Вместимость показывает предел увеличения размера вектора без дополнительного выделения памяти. Списки — двусвязные линейные структуры данных, т. е. каждый элемент имеет два указателя для ссылки на два других элемента. Списки занимают ровно столько памяти, сколько необходимо для хранения наличных элементов. Вставка и удаление из списка очень эффективны. Контейнеры deque (формально это сокращение означает “двусторонняя очередь”) комбинируют в себе свойства списков и векторов. Они допускают прямой доступ к элементам, но эффективно работают при вставках и удалениях. Действия над множествами Битовое множество представляет собой контейнер, в котором могут храниться битовые последовательности фиксированной длины. Можно сказать, что оно служит представлением подмножеств фиксированного множества (в математическом смысле), каждому элементу которого соответствует один бит в определенной позиции Карты являются ассоциативными контейнерами и очень похожи на множества за исключением того, что в картах с ключами можно связать объекты произвольного типа. Ключ, таким образом, может служить своего рода индексом, по которому можно получить доступ к ассоциированному объекту

Стек — очень простая структура данных. В STL можно организовать три разновидности стеков: на основе вектора, на основе списка и на основе deque. Функционально они не отличаются друг от друга. Очередь отличается от стека порядком извлечения элементов: если в стеке операция pop () удаляет самый последний из помещавшихся в него элементов, то в очереди там же операция удаляет наиболее “старый” элемент. Создание и действия с приоритетной очередью Алгоритмы стандартной библиотеки выполняют разные распространенные действия на наборах данных, представленных стандартными контейнерами. Среди этих действий можно назвать сортировку, поиск, замену и т. д. Алгоритм count () осуществляет подсчет числа элементов контейнера с указанным значением. Алгоритм count_if() выполняет подсчет элементов, для которых выполняется условие заданного предиката Удаление элементов контейнера с указанным значением выполняется алгоритмами remove () и remove_if: Лексикографическое сравнение Под стандартными строкамипонимают объекты, принадлежащие шаблону basic_string, чаще всего его классам-представителям string или wstring. Как и контейнеры, строки характеризуются своим размером и вместимостью. Вот сводка функций-элементов, позволяющих манипулировать различными характеристиками строк. Операции над строками Функции строк

Управление исключениями

Грамотно организованная, устойчивая программа должна справляться с нестандартными ситуациями, встречающимися в реальной работе с реальными данными. Такой нестандартной ситуацией может быть, например, ошибка пользователя при вводе данных или нарушение структуры некоторого файла. В языках, предшествующих C++, подобные проблемы решались с помощью глобальных “флагов ошибки” или приписыванием определенному значению, возвращаемому функцией, специального смысла “индикатора ошибки”. Язык C++ вводит понятие управления исключениями, т. е. специальных средств изменения программного потока управления с целью обработки нестандартных, непредвиденных или ошибочных ситуаций, возникающих в процессе работы. Основные синтаксические конструкции За пробным блоком следует один или несколько обработчиков исключения, начинающихся ключевым словом catch. Порядок следования catch-обработчиков Спецификация исключений для функции Когда выбрасывается исключение, управление передается некоторому обработчику; он должен принадлежать функции, еще находящейся на стеке вызовов программы Если обработчика для данного исключения в программе не находится вообще, оно считается неуправляемым. В этом случае вызывается функция terminate () . Она, в свою очередь, вызывает функцию abort () , которая аварийно завершает программу.

Исключения и классы

Как уже упоминалось, выбрасывать можно не только выражения простых типов, но и объекты классов, определенных пользователем. Кроме того, нужно рассмотреть еще ряд вопросов, связанных с работой конструкторов и деструкторов во взаимодействии с механизмом исключений. Динамические объекты Классы исключений программы могут быть организованы в иерархическую структуру. Схожие типы исключений объявляются в качестве производных одного и того же базового класса, являющегося их обобщением. Используя полиморфные механизмы, можно перехватывать только указатель или ссылку на базовый класс; полиморфизм обеспечит адекватную обработку исключения любого производного класса В классе имеется функция-элемент raise (), посредством которой объект выбрасывает сам себя. Ею можно воспользоваться вместо оператора throw. Функция why () возвращает стандартную строку с сообщением, записанным в объект. В прежних версиях языка new при ошибке выбрасывала xalloc, класс, производный от xmsg Имеются три глобальные переменные, в которых хранится информация о текущем исключении Установки компилятора Как вы, возможно, помните, в языке С (расширенном) имеются две структуры управления исключениями. Это обработка кадра (__try/_except) и обработка завершения (_try/_finally). Наибольший интерес для нас представляют исключения, связанные с процессором. Их, как уже говорилось, нельзя обрабатывать стандартными средствами C++. Для этих исключений в заголовке winbase.h определен ряд символических констант.

RTTI и приведение типов

Аббревиатура RTTI означает RunTime Type Identification, т. е. “Идентификация типа времени выполнения”. Это механизм, позволяющий определить тип объекта во время выполнения программы, что очень полезно в иерархии типов, где указатель или ссылка базового класса может ссылаться на представитель любого производного класса. Полиморфные механизмы, конечно, хороши, но выглядят снаружи подобно “черному ящику”. Вы вызываете виртуальные методы, но не знаете, к чему, собственно, они применяются. Класс type_info объявлен следующим образом. Если typeid не может определить тип объекта, выбрасывается исключение bad_typeid. Целевой_тип может быть типом ссылки, указателя, целым, перечислимым или вещественным типом. Операция cons't_cast имеет ту же форму, что и предыдущая Нисходящее приведение указателей и ссылок Операция динамического приведения типа Приведение от виртуального базового класса

Введение в визуальное программирование

Вы, конечно, уже знакомы с визуальным программированием в С+ + Builder, когда на экране перед вами находится фирма, на нее накладываются различные компоненты, реализующие элементы управления графического интерфейса, а затем пишется код для событий этих компонентов, использующий свойства последних. Возможно, вы работали раньше с Visual Basic или даже с Delphi. Все эти системы внешне очень похожи друг на друга, a Delphi — вообще двойник C++Builder'a и опирается на ту же самую библиотеку компонентов. Установка свойств компонентов Ввод кода событий Определение класса формы создается в h-файле с тем же именем, что и имя модуля. Открыть в редакторе этот файл можно, выбрав в контекстном меню пункт Open Source/Header File Поле это просто другое название для элемента данных класса. Соответственно метод — синоним для функции-элемента класса. Для классов компонентов в C++Builder применяются именно эти термины. С точки зрения определения класса компонента события являются просто свойствами определенного типа. Проектирование формы сводится к установке подходящего (небольшого) ее размера и размещению всего трех командных кнопок с надписями “Старт”, “Стоп” и “Выход” Трахает подругу игрушкой в писю здесь совершенно бесплатно

Создание визуальных компонентов

Одним из показателей квалификации программиста является то, может ли он разрабатывать свои собственные компоненты для визуальной среды программирования вроде C++Builder. Пользовательский компонент должен ничем не отличаться от “настоящего” в том смысле, что его можно будет найти в палитре компонентов, можно будет устанавливать его свойства и события в инспекторе объектов и т. п. Эта глава посвящена написанию пользовательских визуальных компонентов и некоторым сопутствующим вопросам. Ключевое слово _closure позволяет объявить специальный указатель (замыкание) на функцию-элемент Ключевое слово _property служит для объявления свойств и спецификации их атрибутов Атрибуты stored, default и nodefault называются спецификаторами хранения В разделе класса _published объявляются опубликованные свойства. Перечисленные ниже аргументы _declspec, служащие для поддержки VCL, редко применяются непосредственно. Они используются в макросах, определяемых файлом vcl\sysmac.h. Это ключевое слово имеет отношение к VCL лишь постольку, поскольку последняя включает в себя средства для работы с нитями (threads) кода В программе может инициироваться несколько потоков управления исполняющих параллельно. Эти потоки и называются нитями.

Код компонента

Создание визуального компонента — процесс сам по себе не визуальный. Все сводится к написанию кода для свойств и методов класса компонента. Здесь вам может очень помочь ClassExplorer, автоматически или, скорее, полуавтоматически генерирующий базовый код. С двумя его диалогами — для полей и методов — вы уже познакомились в предыдущей главе. Правда, чтобы можно было вводить в класс компонента поля, методы и свойства средствами обозревателя классов, нужно сначала создать проект, который будет этот компонент использовать Ввод пользовательского кода Модуль компонента — CTickTape.cpp Разбор кода DoDrawText () производит вывод битовой матрицы на канву компонента, вызывая ее метод Draw () . Попутно он проверяет, не была ли измена ширина компонента и, если это так, вызывает Setup () и очищает компонент, вызывая FillRect (). Метод Tick() Это единственный, не считая конструктора и деструктора, открытый метод компонента. Именно он обеспечивает “бег” строки по экрану. Если строка остановлена или время нарисовать ее в следующей позиции еще не подошло, метод немедленно возвращает управление. Теперь можно тестировать и отлаживать компонент. Тестировать его как полноценный компонент, установленный в палитре, еще рано. Компоненты отлаживаются сначала в виде обычных модулей, скомпонованных с тестовым приложением. Код программы-тестера Чтобы установить компонент в палитру компонентов, выберите в меню Component | Install Component... В появившемся диалоге вам нужно будет задать только имя модуля компонента. Пример применения компонента

Развитие электроэнергетики России Энергосбережение

  • Развитие электроэнергетики страны в 1930-е годы характеризовалось началом формирования энергосистем. Наша страна протянулась с востока на запад на одиннадцать часовых поясов. Соответственно этому в отдельных регионах меняется потребность в электроэнергии и режимы работы электростанций.
  • Прогноз развития энергетики России до 2020 К 2020 году, согласно официальным прогнозам РАО ЕЭС, производство электроэнергии в России должно увеличиться на 70% - 100%. 
  • Энергетика, энергосбережение и энергетические ресурсы Энергосбережение – организационная, научная, практическая, информационная деятельность государственных органов, юридических и физических лиц, направленная на снижение расхода (потерь) топливно-энергетических ресурсов в процессе их добычи, переработки, транспортировки, хранения, производства, использования и утилизации
  • Электроэнергетические системы и электрические сети Выработка электроэнергии производится на: ТЭС, ГЭС (гидравлические электрические станции), АЭС, КЭС (конденсационные электрические станции или их еще называют ГРЭС – государственные районные электростанции) и ТЭЦ (теплоэлектроцентрали).
  • Российская программа по быстрым реакторам Первый отечественный демонстрационный энергетический реактор на быстрых нейтронах БН-350 тепловой мощностью 1000 МВт был введен в строй в 1973 году на восточном побережье Каспийского моря
  • Топливно-энергетические ресурсы РФ  Топливно-энергетические ресурсы региона (около 30% прогнозных запасов топливно-энергетических ресурсов европейской части России) представлены крупнейшими запасами нефти, природного газа (Тимано-Печорская и Баренцево-Карская провинции), угля (Печорский бассейн), горючих сланцев, торфа.
  • Энергосбережение – это организационная, научная, практическая, информационная деятельность, направленная на рациональное и экономическое использование первичной и преобразованной энергии и природных энергетических ресурсов на народное хозяйство с использованием технико-экономических и правовых методов.
  • Атомные электростанциями России
  • Физические  основы атомной энергетики Среди величайших достижений XX века наряду с генной и полупроводниковой технологиями открытие атомной энергии и овладение ею занимает особое место. Человечество получило доступ к громадному и потенциально опасному источнику энергии, который нельзя ни закрыть, ни забыть, его нужно использовать не во вред, а на пользу человечеству.
  • Особенности ядерных реакторов Ядерный реактор - устройство для осуществления управляемой реакции деления и преобразования выделившейся при делении энергии в тепловую для дальнейшего использования. Главным условием нормальной работы ядерного реактора является контролируемый процесс деления урана и отвод избыточного тепла, образующегося при этом.
  • Концепция развития атомной энергетики, представленная в Федеральной целевой программе «Развитие атомного энергопромышленного комплекса России на 2007-2010 годы и на перспективу до 2015 года», направлена на создание экономически эффективных, надежных и безопасных атомных станций, конкурентно способных в сравнении с другими источниками энергии. Программой предусмотрено продление срока эксплуатации ряда действующих АЭС с ВВЭР и строительство АЭС нового поколения с повышенными эксплуатационными характеристиками и высоким выгоранием топлива.
  • Работы по проведению комплексного инженерного и радиационного обследования: технологических помещений, оборудования и трубопроводов контуров охлаждения реактора МР и петлевых установок, включая спектрометрические исследования состава радионуклидов; внутрикорпусных устройств реакторов МР и РФТ