
- •1.1. Что такое программа и как она выглядит?
- •1.2. Комментарии
- •1.3. Зарезервированные слова и типы данных
- •1.4. Объявление переменных
- •1.5. Операции и выражения
- •1.6. Ввод и вывод
- •1.7. Переменные и константы
- •1.8 Логические операторы
- •1.9. Управляющие операторы
- •1.10. Операторы циклов
- •1.11. Операторы перехода
- •2. Функции
- •2.1. Передача параметров
- •2.2. Библиотечные функции
- •2.3. Локальные и глобальные переменные
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Int local_var; /* по умолчанию auto */
- •2.4. Перегрузка
- •Виртуальный метод
- •3. Массивы
- •Перечисления
- •Объединения
- •858993459 //Результат будет неопределенным,
- •Множества
- •4. Структуры
- •Int numberPeriod; //число переодов начисления процентов
- •Int page; //Количество страниц
- •Void print(); /*Внимание, записывается только прототип функции */
- •Int yearBorn; //год рождения
- •Int yearBorn; //год рождения
- •4.1. Демонстрационные программы
- •Int done;/*переменная, которая информирует о конце списка файлов */
- •6. Объединения
- •Info;//Обявление переменной типа объединение
- •Info;//Обявление переменной типа объединение
- •7. Объектно-ориентированное программирование
- •7.1. Классы и объекты
- •Демонстрационные программы
- •Результат работы программы
- •7.2. Конструкторы и деструкторы
- •Конструктор копирования
- •Конструктор копирования
- •7.5. Наследование
- •7.3. Создание объектов и обращение к членам объекта
- •8. Абстрактные типы данных
- •9. Пространство имен
- •Void greeting();/*это пространство имен содержит функцию с тем же
- •Void big_greeting(); /*эта функция не попадает ни в одно из созданных подпространств,т.Е. Принадлежит пространству имен std */
- •//Определение функций
- •Void big_greeting() /* определение данной функции не принадлежит ни одному из созданных пространств имен, следовательно дальнейший код помещается в глобальное пространство имен */
- •10. Строки
- •4.3 Демонстрационные программы
- •4.10. Класс string
- •Класс AnsiString
- •Класс AnsiString
- •Класс Set
- •4.9. Перегрузка операторов
- •Использование "умных" указателей
- •4.8. Полиморфизм
- •Главное меню — компонент MainMenu
- •Диалоги
- •Файлы и потоки
- •Ввод-вывод в файл
- •Ifstream inStream; //Объявление входного потока
- •InStream.Open("character.Dat"); /*присоединение файла к входному потоку */
- •InStream.Close(); //закрытие входного потока
- •If(!out){ //при неудачной попытке
- •If(in.Fail()){ //поток не создан, то сообщение и выход
- •Управление потоком ввода-вывода
- •Дополнительные возможности cin и cout
- •Что внутри iostream.H
- •Использование cout
- •Использование символа-заполнителя
- •Управление цифрами значений с плавающей точкой
- •Вывод и ввод одного символа за один раз
- •Чтение ввода с клавиатуры по одному символу за раз
- •Чтение с клавиатуры целой строки
- •Что вам необходимо знать
- •5.2. Ввод имен файлов
- •5.3. Манипуляторы
- •5. Указатели
- •5.1.Типы указателей и операции с указателями
- •Адресная арифметика
- •Сравнение указателей
- •Преобразование типа указателя
- •Указатель void
- •5.2. Динамические массивы
- •Int array[10]; //объявляется массив с именем array
- •Int a[10]; //объявляется массив с именем a
- •Int *array1; //указатель типа int с именем array1
- •Int *array[5];/*массив с именем array, его элементы указатели*/
- •Int (*point)[4][5]; /*объявление указателя на двумерный массив без имени */
- •Использование указателей в функциях и указатели на функции
- •Указатель классов
- •Шаблоны
- •Шаблоны функций
- •Void Swap (t& X, t& y) /* к моменту обращения тип т будет известен и заменен, например, на int */
- •Void sort(t array[], int maxIndex){ /*передали массив и его размер */
- •6.2. Шаблоны классов
- •6.3 Демонстрационные программы
- •7.1 Обработка исключений
- •Исключения и их стандартная обработка
- •Базовый класс исключений vcl Exception
- •Упражнения
- •Обработка исключительных ситуаций, возбуждаемых оператором new
- •Исходные файлы и объявление переменных
- •Связанные списки
- •Void newHead(PtrNode& head, //адрес головного узла
- •Void newHead(PtrNode& head, //адрес головного узла
- •Поиск в связанных списках
- •Void newHead(PtrNode& head, //адрес головного узла
- •Директивы препроцессора.
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Особенности программирования под Windows.
- •Создание окон.
- •Функция WinMain
- •Создание проекта Win32Application.
- •Библиотека mfc.
- •Создаем код
- •Шпаргалка
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Файл проекта
- •Введение
- •Свойства компонентов
- •События
- •Менеджер проектов
- •Пример: создание простейшего приложения
- •Графика Внедрение картинок
- •Редактор изображений
- •Классы для хранения графических объектов.
- •If (SelectDirectory( //Компонент библиотеки
- •Методы создания собственной графики. Рисование по пикселам
- •Int px, py; //координаты пикселей
- •Рисование с помощью пера
- •Int px, py; //координаты пикселей
- •Рисование кистью
- •Мультимедиа и анимация Общие сведения о звуковых и видеофайлах
- •Способы воспроизведения звуков
- •Создание мультфильма
- •Воспроизведение немых видео клипов — компонент Animate
- •Проигрыватель MediaPlayer
- •Процессы, потоки, распределенные приложения
- •If include "uOverlayl.H" // включение головного файла приложения
- •Функция CrateProcess
- •Заключение
- •Что такое ansi?
- •Почему вместо русских букв в консольном приложении выводится мусор? Автор: Алексей Кирюшкин Версия текста: 1.0
- •Выход 1
- •Выход 2
- •Выход 3
- •Выход 4
- •Ввод-вывод файлов
- •Выбор компонентов для групповых операций
- •Установка разделяемых свойств компонентов
- •Изменение размера компонентов
- •Выравнивание компонентов
- •Пример: Создание текстового редактора Проектирование формы приложения
- •Создание обработчиков событий
- •Создание меню
Пример: создание простейшего приложения
Теперь попробуем создать простейшее приложение, позволяющее вводить текст в редактируемое поле и добавлять этот текст к списку при нажатии мышью на кнопку. Выберем пункт меню File/New Application для создания проекта и сохраним его главную форму под именем samp1.cpp, а сам проект под именем samp.mak. Поместим на форму компоненты Button, Edit и ListBox со страницы Standard палитры компонент.
Рис. 9. Размещение компонентов на форме
После этого выберем на форме компонент Edit и удалим текущее значение свойства Text. Затем установим свойство Caption для Button1 равным "Добавить".
Чтобы добавить обработчик события OnClick для кнопки Добавить, нужно выбрать эту кнопку на форме, открыть страницу событий в инспекторе объектов и дважды щелкнуть мышью на колонке справа от события OnClick. В соответствующей строке ввода появится имя функции. C++ Builder сгенерирует прототип обработчика событий и покажет его в редакторе кода. После этого следует ввести следующий код в операторные скобки { ... } тела функции:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (!(Edit1->Text == ""))
{
ListBox1->Items->Add(Edit1->Text);
Edit1->Text = "" ;
}
}
Для компиляции приложения в меню Run выберем пункт Run. Теперь можно что-нибудь ввести в редактируемое поле, нажать мышью на кнопку Добавить и убедиться, что вводимые строки добавляются к списку.
Рис.10. Так выглядит готовое приложение.
Теперь модифицируем приложение, добавив кнопки Удалить и Выход. Для этого добавим еще две кнопки, изменим их свойство Caption и создадим обработчики событий, связанных с нажатием на эти кнопки:
Рис. 11. Модифицированное приложение
Для кнопки Удалить:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (!(ListBox1->ItemIndex == -1))
ListBox1->Items->Delete(ListBox1->ItemIndex);
}
Для кнопки Выход:
Close();
Сохраним и скомпилируем приложение, а затем протестируем его
Классы в среде Builder C++
Как и в «чистом» С++, в среде Builderкласс это тип данных, определенных пользователем. Работа с ними ничем не отлисается от работы с классами рассмотренными ранее. Хотя определенные особенности все же имеются. Рассмотрим некоторые из них.
Класс должен быть объявлен до того, как будет объявлена хотя бы одна переменная этого класса.
Синтаксис объявления класса следующий:
class <имя класса>: <список классов - родителей>
{
public: // доступно всем
<данные, методы, свойства, события>
published // видны в Инспекторе Объекта и изменяемы
<данные, свойства>
protected: // доступно только потомкам
<данные, методы, свойства, события>
private: // доступно только в классе
<данные, методы, свойства, события>
} <список перемен-ных>;
//обратите внимание на раздел published
Например,
class MyClass: public Classl, Class2
{
public:
MyClass(int = 0)
void SetA(int);
int GetA(void);
private:
int FА;
double В,С;
protected:
int F(int);
};
Вообще говоря, имя класса может быть любым допустимым идентификатором, но в BuilderC++ классам наследникам библиотеки компонентов принято начинать с символа «Т».
Раздел public (открытый) предназначен для объявлений, которые доступны для внешнего использования.
Раздел published (публикуемый) содержит открытые свойства, которые появляются в процессе проектирования на странице свойств Инспектора Объектов и которые, пользователь может устанавливать, в процессе проектирования.
Раздел private (закрытый) содержит объявления полей и функций, используемых только внутри данного класса.
Раздел protected (защищенный) содержит объявления доступные только для потомков объявляемого класса.Однако в отличие от закрытых, защищенные элементы доступны для программистов, которые захотят производить от этого класса производные классы, причем не требуется, чтобы производные классы объявлялись в этом же модуле.
В приведенном выше примере через объект данного класса можно получить только к функциям MyClass, SetA и GetA. Поля F, A, В, С и функция F — закрытые элементы. Это вспомогательные данные и функция, которые используют в своей работе открытые функции. Открытая функция MyClass с именем, совпадающим с именем класса, это так называемый конструктор класса. При отсутствии конструктора программист должен сам позаботиться о задании начальных значений полям класса.
Пред именами классов-родителей в объявлении класса также может указываться спецификатор доступа (в примере public). Смысл этого спецификатора тот же, что и для элементов класса: при наследовании public (открытом наследовании) можно обращаться через объект данного класса к методам и свойствам классов-предков, при наследовании private подобное обращение невозможно.
По умолчанию в классах (в отличие от структур) предполагается спецификатор private.
В объявлении класса поля запрещается инициализировать. Для инициализации данных служат конструкторы.
После того, как объявлен класс, можно создавать объекты этого Если созанный класс не наследует свойства ласса библиотеки компонентов то объект классасоздается как любая переменная другого типа простым объявлением, например, оператор
MyClass МС, МС10[10], *Рmс;
создает объект МС объявленного выше класса MyClass, массив МС10 объектов данного класса и указатель Рmс на объект этого классп,
В момент создания объекта класса, имеющего конструктор, можи инициализировать его данные, перечисляя в скобках после имени объекта значение данных. Например, оператор
MyClass МС(3) ;
не только создает объект МС, но и задает его полю FA значен по 3. Если этого не селать, то в момент создания объекта поле получит значение; по умолчанию, занное в прототипе конструктора.
Создание переменных, использующих класс, можно совместитить с объявлением самого класса, размещая их список между закрывающей класс фигурной скобкой и завершающей точкой с запятой. Например:
class MyClass : public Classl, Class2
{
. . . .
} MC, MC10[10], *Pmc;
Пример программирования в среде Builder C++6
В качестве примера рассмотрим задачу пересчета мощности заданной в лошадиных силах в киловатты. Напомним, что одна лошадиная сила это 735, 499 Вт. Задача представляет определенный интерес для людей интересующихся автомобильными двигателями. Конечно, соответствующие вычисления проще выполнить на калькуляторе, но наша задача сотоит в том, что бы создать программу с удобным интерфейсом.
В простейшем случае интерфейс должен выглядеть как виртуальный калькулятор, т.е. представлять собой панель на которой имеется окно в которое можно вводить мощность в лошадиных силах и получать резуьтат в киловаттах. Кроме того должна быть кнопка «Вычислить».
Первое, что нужно сделать это запустить BuilderC++ 6. По умолчанию система подготовит форму для программирования. Если вы уже работали сBuilder, то можно поступить так: войти в менюFile|New|Application. В итоге появится заготовка формы с именемForm1и окно с именемUnit1. ФормаForm1 - это и есть та панель на которой будет установлено окно и кнопка.
Для начала посмотрим, как будет выглядеть
наша панель. Для этого запустим созданную
нами программу с помощью кнопки
на главной панели с инструментами илиF9. Если появившаяся форма
вас чем то не устраивает, то вы можете
изменить ее свойства, обратившись к
инспектору объектов (ObjectInspector), на рисунке он
представлен в виде панели в нижней левой
части. Например, можно изменить название
формы. Уточним сказанное. Форма имеет
имя (Name), которое используется
в программе наравне с именами других
объектов, но форма имеет название или
заголовок (Caption). В окнеCaptionукажем другое название,
например «Мощность», кроме того изменим
размеры формы. Для этого достаточно
подвести курсор к границам формы, и
после того как он превратится в стелки
изменить границы формы. Обратите
внимание, что меняя размеры формы числа
в окнахHeight(Высота) иWidth(Ширина) также изменяются.
Это говорит о том, что размеры формы
можно менять вводя их в указанные окна
инспектора объектов.
По желанию можно изменить шрифт, его цвет, вид рамки формы, цвет фона, добавить всплывающие подсказки, начальное положение на экране и многое другое. Попробуйте сами изменить какие-нибудь свойства.
Теперь на закладке Standartщелкнем по компанентуLabel, он обозначен буквойA, после чеог щелкнемпо форме. На форме появится заготовка для текста с именемLabel1. Тоже самоепроделаем с компанентамиEdit(Редактор) иButton(Кнопка).
Расположим поудобнее эти компаненты путем их перетаскивания с помощью мыши.
Каждый из установленных компонентов, как и форма, кроме имени имеет заголовок, именно он отражается в виде надписей на установленных компонентах. Сейчас он совпадает с именем. Изменим свойство Captionэтих компанентов. ВместоLabel1 в окнеCaptionзапишем «Мощность в лошадиных силах». Это предложение достаточно длинное, а для того, чтобы записать его в несклько строк нужно в окнеAutiSize(АвтоРазмер) устнолвитьfalse, а в окнеWordWrap(Перенос слов)true. После чего подобрать соответствующий размер метки точно также как мы изменяли размер самой формы. Заголовок редактора целесообразно очистить совсем, а на поверхности кнопке написать «Вычислить». В результате получится примерно следующая панель.
Панель готова. Обратите внимании, что кнопка нажимается, т.е. подведя на нее указатель нажатие кнопки мыши соответствует утапливанию кнопки панели, точнее смене рисунка. Панель можно закрыть нажав на кнопку с крестиком в правом углу, свернуть или наоборот, развернуть во весь экран.
Теперь нужно написать программу которая считывала бы число записанное в окне редактора, пересчитывала его и выводила в окно редактора после нажатия кнопки «Вычислить». Нажатие кнопки мыши в ситеме Win32 означает возникновение некоторого события, которое в виде сообщения поступит в систему. Если теперь нажатие кнопки мыши произойдет тогда когда рисунок кнопки панели меняется, то можно сделать так, что создаваемая нами программа отправит сообщениеWin32. Это делается с помощью исключений. Иначе говоря, мы имитируем событие. Воспользуемся этим, чтобы написать обработчик событий.
Как указывалось ранее обработчик событий пишется в файле реализации, в данном случае Unit1.cpp. Для того, чтобы сгенерировать событие в инспекторе объектов выберем компонентButton1, т.е. кнопку. Перейдем в инспекторе объектов на вкладкуEvents, что означает события. В окнеOnClickщелкним два раза левой кнопкой мыши. Послее этого в заголовочном файле автоматически произойдет объявление прототип функции обработчика события:
void __fastcall Button1Click(TObject *Sender);
а в файле реализации появится код шаблона функции для генерирования исключения:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
}
Рассмотрим подробнее этот код. Слово void говорит о том, что эта функция не возвращает никакого значения. Следующее слово __fastcall означает, что функция хранится в стеке, что позволяет быстро обращаться к ней.TForm1:: говорит о том, что областью видимости является классTForm1 наследник класса TForm. КлассTForm1, как говорилось ранее, объявлен в заголовочном файлеUnit1.h. Откуда в файле реализации известно об этом? Ответ простой. В директивах препроцессора есть оператор#include "Unit1.h".
Имя функции Button1Click означает щелчек по кнопке. Имя дается автоматически. В принципе его можно изменить, но обычно это никто не делает,т.к. оно достаточно информативно. Наконец функции передается параметр классаTObjectв виде указателя, т.е. адреса некоторого объекта. TObject.
Остается в шаблон обработчика событий занести код. Например, это могут быть следующие операторы:
float p;
Label1->Caption="Мощность в киловатах";
p=StrToFloat(Edit1->Text);
p=0.735499*p;
Edit1->Text=p;
Первая строка это объявление новой переменной. Вторая изменяет свойство Captionметки. Третья считывает строку из окна редактора и переводит ее в переменную типаfloat. Третья осуществляет пересчет мощности в киловатты. Последняя меняет свойствоTextредактора.
Обратите внимание, что доступ к свойствам и методам объектов осуществляется через указатели. Иногда свойство объекта само является объектом. Тогда вбращаясь к такому объекту нужно указывать всю цепочку предшествующих объектов. Например метки имеют свойство Fontт.е. шрифт. У этого объекта много своих свойств – размер, вид, цвет, тип и др. Чтобы изменить цвет метки на красный нужно нужно написать
Label1->Font->Color=clRed;
Ползунки и полосы прокрутки - компоненты TrackBar ScrollBar
Компонент TrackBar расположен на вкладке Win 32, и представляет собой элемент управления в виде ползунка, который пользователь может перемещать курсором мыши или клавишами во время выполнения. Таким образом, пользователь может управлять какими-то процессом сам: громкостью звука, размером изображения и т.п. На рис. приведены различные формы отображения ползунка. Как видно из рисунка, он может располагаться горизонтально, вертикально, иметь шкалу с различных сторон, иметь кой-то выделенный диапазон шкалы
Основное свойство компонента - Position. Это свойство можно задавать во время проектирования или программно во время выполнения. При перемещении пользователем ползунка можно прочитать значение Position, характеризующее позицию, в которую пользователь переместил ползунок. Для возможности такого чтения служит событие OnChange. В обработчике этого события можно прочитать значение Position и использовать его для управления каким-то компонентом.
Свойство Position — целое, значение которого может изменяться в пределах задаваемых свойствами Min и Мах. По умолчанию Min = 0, Мах = 10, так что Position может принимать только 11 значений — от 0 до 10. Если задать больше значение Мах, соответственно увеличится количество возможных значений Position в диапазоне Min—Max.
Свойство Orientation определяет ориентацию ползунка: trHorizontal — горизонтальная, trVertical — вертикальная.
Свойство TickMarks указывает размещение шкалы относительно компоненте и может принимать значения: tmBottomRight — снизу или справа в зависимости от ориентации компонента (верхний и правый компоненты на рис. ), tmTopLeft — сверху или слева в зависимости от ориентации компонента (нижний компонент на рис.), tmBoth — с обеих сторон (средний компонент на рис.).
Свойство TickStyle определяет способ изображения шкалы. Оно может принимать значения: tsAuto — автоматическая прорисовка шкалы, tsNonc — отсутствие шкалы, tsManual — программное рисование шкалы с помощью методе SetTick(Value: Integer), который помещает метку шкалы в позицию, соответствующую.величине Value. Метки, соответствующие началу и концу шкалы автоматически размещаются и в случае TickStyle = tsManual.
При TickStyle=tsAuto частота меток шкалы определяется свойством Frequency. Это свойство задает, сколько возможных значений Position лежит между метками. Например, если Frequency=2, то метки будут соответствовать только каждому второму возможному значению позиции (такое значение Frequency задано в верхнем компоненте на рис.).
Свойства LineSize и PageSize определяют, насколько смещается ползунок, если пользователь управляет им с помощью соответственно клавиш со стрелками или клавишами PageUp и PageDown.
Свойство SelStart и SelEnd позволяют визуально выделить на шкале некоторый диапазон (см. средний компонент на рис.), который о чем-то говорит пользователю, например, рекомендуемый диапазон значений. При этом ничто не мешает пользователю выйти за пределы этого диапазона.
Похож на ползунок по своим функциям и компонент ScrollBar, расположенный на вкладке Standart, хотя выглядит он иначе и предназначен по замыслу для других целей. Этот компонент представляет собой стандартную линейку прокрутки Windows. Однако он может использоваться и для целей прокрутки (впрочем, многие оконные компоненты C++Builder имеют собственные полосы прокрутки), и для управления, подобно компоненту TrackBar.
Основные свойства ScrollBar — Position, Min и Мах те же, что у компонента TrackBar. Свойство Kind, определяющее горизонтальное или вертикальное расположение полосы и принимающее соответственно значения sbHorizontal или sbVertical, аналогично свойству Orientation компонента TrackBar.
Имеются два свойства, отсутствующие у TrackBar: SmallChange и LargeChange. Они определяют соответственно «малый» сдвиг при щелчке на кнопке в конце полосы или нажатии клавиши со стрелкой, «большой» сдвиг при перемещении на страницу щелчком рядом с бегунком или нажатием клавиш PageUp и in PageDown.
Событие, соответствующее перемещению пользователем бегунка полосы прокрутки — OnScroll. В процедуру обработчика этого события передается по ссылке параметр ScrollPos — позиция бегунка, которую можно читать, но можно и изменять, и передается параметр ScrollCode, характеризующий вид перемещения бегунка. Этот параметр может иметь значения:
scLineUp, scLineDown |
«Малый» сдвиг: перемещение соответственно вверх или налево и вниз или вправо после нажатия кнопки полосы прокрутки или клавиши со стрелкой. |
scPageUp, scPageDown |
«Большой» сдвиг: перемещение на страницу щелчком рядом с бегунком или нажатием клавиш PageUp или PageDown. |
scPosition |
Пользователь переместил и освободил бегунок.
|
scTrack |
Пользователь перемещает бегунок.
|
scTop, scBottom |
Бегунок перемещен соответственно в крайнюю верхнюю или левую позицию и в крайнюю нижнюю или правую позицию. |
scEndScroll |
Окончание перемещения.
|
В обработке события ScrollPos можно поместить операторы, перемещающие тре вуемую область формы или компонент, а можно поместить операторы, которые управляют некоторым компонентом, используя значение позиции бегунка ScrollPos.
Заголовки — компоненты HeaderControl и Header
Компоненты заголовков HeaderControl и Header являются компонентами помощью которых можно управлять размещением расположенных под ними панелей. Заголовок состоит из ряда секций, причем пользователь во время выполния приложения может изменять ширину отдельных секций с помощью мыши. По умолчанию свойство Align в HeaderControl задано равным alTop, что обеспечивает размещение компонента вверху окна формы. Но это свойство можно изменить, например, на alNone и разместить компонент в любом необходимом месте Основное свойство компонента HeaderControl — Sections. Оно является списком объектов типа THoaderSеction, каждый из которых описывает одну секцию