- •Предисловие
- •Глава 1. Основные понятия
- •1.1. Элементы языка программирования
- •1.2. Процесс создания программы
- •1.3. Первая программа
- •1.4. Состав программы
- •Глава 2. Средства разработки на C++
- •2.1. Системы Turbo C++ 3.0/Borland C++ 3.1
- •2.2. Система C++ Builder
- •Глава 3. Работа с числовыми данными
- •3.1. Целые типы
- •3.2. Числа с плавающей точкой
- •3.3. Ввод и вывод чисел
- •3.4. Логический тип и логические операции
- •3.5. Математические функции
- •Глава 4. Операторы. Ключевые слова
- •4.1. Операторы
- •4.2. Приоритеты операторов
- •4.3. Ключевые слова
- •4.4. Структура программы
- •4.5. Константы
- •Задачи - . Простейшие вычисления
- •Глава 5. Управление и циклы
- •5.1. Условный оператор
- •5.2. Операторы цикла
- •5.3. Переключатель
- •5.4. Операторы break и continue
- •Задачи -. Выбор и циклы
- •Глава 6. Массивы
- •6.1. Одномерные массивы
- •6.2. Двумерные массивы
- •Задачи -. Одно- и двумерные массивы
- •Глава 7. Функции
- •7.1. Определение функции
- •7.2. Формальные параметры и фактические аргументы
- •7.3. Автоматические и статические переменные
- •7.4. Прототипы функций
- •7.5. Массивы как аргументы функций
- •7.6. Внешние переменные
- •7.7. Рекурсия
- •7.8. Перегруженные имена функций
- •7.9. Аргументы функций по умолчанию
- •Задачи -. Функции
- •Глава 8. Символы и строки
- •8.1. Символы
- •8.2. Строки символов
- •Задачи -. Символы и строки
- •Глава 9. Препроцессор
- •9.1. Директивы препроцессора
- •9.2. Макросы
- •Задачи -. Макросы
- •Глава 10. Указатели и ссылки
- •10.1. Указатели и адреса
- •10.2. Указатели и массивы
- •10.3. Адресная арифметика
- •10.4. Символьные указатели
- •10.5. Массивы указателей
- •10.6. Указатели на функции
- •10.7. Ссылки
- •10.8. Операторы new и delete
- •Задачи -. Указатели и ссылки
- •Глава 11. О файлах и командной строке
- •11.1. Знакомство с файлами
- •11.2. Командная строка
- •11.3. Перенаправление стандартного ввода и вывода на файл
- •11.4. Аргументы командной строки
- •Задачи -. Файлы и командная строка
- •Глава 12. Работа с экраном дисплея
- •12.1. Текстовый режим
- •12.2. Графический режим
- •Задачи -. Работа с экраном
- •Глава 13. Внутреннее представление чисел
- •13.1. Двоичная система счисления
- •13.2. Беззнаковые целые
- •13.3. Двоичный дополнительный код
- •13.4. Двоичный код с избытком
- •13.5. Побитовые операторы
- •13.6. Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8. Преобразование типов
- •Задачи -. Побитовые операторы
- •Глава 14. Структуры, перечисления, объединения
- •14.1. Объявление структур
- •14.2. Структуры и функции
- •14.3. Указатели на структуры
- •14.4. Массивы структур
- •14.5. Перечисления
- •14.6. Объединения
- •14.7. Битовые поля
- •14.8. О бинарных файлах
- •Задачи -. Структуры
- •Глава 15. Классы
- •15.1. Структуры в C++. Инкапсуляция
- •15.2. Встроенные функции
- •15.3. Классы. Скрытие данных
- •15.4. Конструкторы
- •15.5. Статические члены класса
- •15.6. Друзья класса
- •15.7. Копирование объектов класса
- •15.8. Управление доступом
- •15.9. Ссылка на себя
- •15.10. Деструкторы
- •Задачи -. Работа с классами
- •Глава 16. Программы из нескольких файлов
- •16.1. Работа с проектами
- •16.2. Область действия имен
- •16.3. Заголовочные файлы
- •16.4. Пространства имен
- •Задачи -. Работа со стеком
- •Глава 17. Перегрузка операторов
- •17.1. Правила перегрузки операторов
- •Задачи -. Перегрузка операторов
- •Глава 18. Конструктор копирования и оператор присваивания
- •18.1. Проблемы при копировании
- •Задачи -. Конструктор копирования
- •Глава 19. Ввод и вывод
- •19.1. Вывод
- •19.2. Ввод
- •19.3. Ввод и вывод определяемых пользователем типов
- •19.4. Работа с файлами
- •Глава 20. Взаимоотношения классов
- •20.1. Объекты как члены класса
- •20.2. Конструкторы встроенных типов
- •20.3. Наследование
- •20.4. Виртуальные функции
- •20.5. Абстрактные классы
- •20.6. Совместимость типов
- •20.7. Множественное наследование
- •Задачи -. Наследование классов
- •Глава 21. Шаблоны, исключения
- •21.1. Шаблоны
- •21.2. Шаблоны функций
- •21.3. Классы и шаблоны
- •21.4. Обработка исключений
- •21.5. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
Средства разработки на C++ 35
Рис.22. Добавление выражений в окно просмотра
Нажав четыре раза F7, дойдем до строки с ошибкой. Нажмем в этот момент Ctrl+F7, появится окно, рис.23, в поле которого Watch Expression, можно ввести переменную или выражение для просмотра.
Введем сначала имя переменной b, а затем выражение 2 * 2. В окне просмотра увидим значение переменной и выражения, рис.24. Теперь очевидна причина ошибки – деление на нуль.
Пример с выражением 2*2 приведен, чтобы показать, что в окне просмотра могут вычисляться выражения и отображаться их значения.
Рис.25. Добавление выражений в окно просмотра
2.2. Система C++ Builder
Система C++ Builder позволяет разрабатывать самые сложные программы для операционной системы Windows с современным графическим интерфейсом. Она имеет богатую возможностями среду разработки, полное изучение которой требует много времени, поэтому здесь кратко рассмотрим только создание консольных приложений в среде C++ Builder версии 6. Компания Borland выпускает с сентября 2006 г. бесплатные варианты своих средств разработки под названием Turbo Explorer, которые обладают небольшими ограничениями, по сравнением с полными вариантами, но вполне годны для учебных целей. Среда разработки на языке C++ получила название Turbo CPP, ее интерфейс лишь немного модернизирован по сравнению с интерфейсом C++ Builder 6. Скачать Turbo Explorer можно с сайта www.turboexplorer.com.
Разработка консольных приложений
Консольные приложения выполняются в текстовом окне и управляются из командной строки без графического интерфейса. Их использования достаточно для изучения языка C++ как такового.
36 2
Рис. 26. Выбор типа вновь создаваемого элемента
При загрузке C++ Builder автоматически создается оконный проект, содержащий одно пустое окно (форму), которое можно использовать в качестве основы будущей программы. Для создания консольного приложения нужно выполнить команду меню File, New, Other…, в
диалоге New Items выбрать Console Wizard (рис. 26) и нажать OK.
Мастер создания консольного приложения предъявит диалог, на котором следует сделать настройки, показанные на рис.27.
Рис.27. Установка параметров консольного приложения
После нажатия кнопки OK в окне Console Wizard будет
предложено сохранить автоматически созданный оконный проект, о котором речь шла выше, рис.28. Здесь нужно нажать кнопку No.
Средства разработки на C++ 37
Рис.28. Предложение сохранить изменения в проекте
Система автоматически сгенерирует заготовку программы, состоящую из функции main, которая будет показана в окне программного кода, рис. 29. Здесь можно вводить и редактировать текст программы.
Рис. 29. Окно программного кода
Добавим в окно кода три строки, чтобы получилась следующая программа 3.
Программа 3. Hello
#include <iostream.h>
int main (int argc, char* argv [])
{
cout << "Hello, World!"; cin.get();
return 0;
}
38 2
Рис.30. Сохранение модуля кода
Сохраним проект командой File, Save Project As… . Сначала
откроется диалог сохранения модуля программного кода, рис.30. Здесь следует выбрать папку для размещения файлов проекта и дать модулю кода имя, например, UnHello.cpp. Приставка Un будет напоминать, что файл содержит модуль (Unit) кода, а слово Hello отражает назначение модуля. Проекты в C++ Builder состоят из несколько файлов, поэтому каждый проект целесообразно размещать в отдельной папке. В приводимом примере для программы создана папка Hello. После сохранения модуля кода будет предложено сохранить файл проекта под именем Project1.bpr. Назовем проект PrHello.bpr и сохраним его в той же папке Hello, что и модуль кода.
Выполнение и отладка программы
Компиляция и сборка программы выполняется командами меню
Project:
Compile Unit (комбинация клавиш Alt+F9) – компиляция модуля, создается объектный файл UnHello.obj;
Make PrHello (или Ctrl+F9) – сборка программы из откомпилированных модулей;
Build PrHello – сборка программы с перекомпиляцией всех модулей.
После выполнения команд Make или Build создается исполняемая программа PrHello.exe, имя которой совпадает с именем проекта.
Средства разработки на C++ 39
Для запуска программы нужно выполнить команду Run, Run или нажать клавишу F9. При выполнении рассматриваемой программы
будет создано текстовое окно, в которое выведутся результаты работы, рис.31. После нажатия клавиши Enter работа программы завершается и
ее окно закрывается.
Рис.31. Работа консольного приложения
Пошаговое выполнение (трассировку) программы можно производить командами меню Run:
Step over или F8 – выполнение одной строки программы без захода
в функции;
Run, Trace into или F7 – выполнение одной строки программы с
заходом в функции, вызываемые в выполняемой строке; Run, Go to cursor или F4 – выполнение программы до точки
расположения курсора;
Run, Program reset или Ctrl+F2 – выход из режима отладки;
Add Watch или Ctrl+F5 – добавление переменной или выражения для просмотра.
Окно для наблюдения за переменными и выражениями выводится командой View, Debug Windows, Watches или Ctrl+Alt+W.
Файлы проекта
В состав проекта для программы 3 войдут файлы: UnHello.cpp – файл с программным кодом; PrHello.bpr – файл с описанием проекта;
UnHello.obj – файл, содержащий машинные команды (объектный); PrHello.exe – рабочая программа.
Кроме этого, автоматически будут созданы файлы:
PrHello.bpf |
– |
текстовый файл с описанием проекта; |
PrHello.res |
– |
двоичный файл ресурсов проекта; |
PrHello.tds |
– |
двоичный файл c отладочной информацией; |
*.~cp, *.~bpr, *.~h – резервные копии соответствующих файлов.
Основными файлами являются файлы: *.bpr, *.bpf, *.res, *.cpp, *.h. Только они необходимы при переносе программ с компьютера на
40 2
компьютер. Остальные файлы можно безболезненно удалять с диска, так как они при компиляции всякий раз создаются заново.
В программу могут входить несколько cpp-файлов. Тот из них, который содержит функцию main, называют головным модулем проекта. В рассматриваемом примере головным модулем является файл
UnHello.cpp.
Автоматическая генерация кода
Из рассмотренного примера видно, что стандартные элементы программного кода C++ Builder генерирует автоматически, в частности, создает простейший вариант главной функции программы main. Также автоматически выполняются действия по созданию файла проекта, нужно только правильно сохранять проект.
Висходный код включаются директивы препроцессора, которые рационализируют процесс создания программы. Рассмотрим их.
Впрограмму часто входят весьма большие заголовочные файлы, многократная перекомпиляция которых не нужна и занимает много времени. Если в настройках среды в диалоге Project, Options,
вызываемом командой меню Project, Options…, выбран переключатель Use pre-compiled headers, то заголовочные файлы компилируются
только один раз и в откомпилированном виде записываются на диск. Директива
#pragma hdrstop
завершает список заголовочных файлов, подлежащих предварительной компиляции.
Директива
#pragma argused
подавляет вывод предупреждения о том, что аргументы функции, следующей за этой директивой, не используются. Если удалить (или закомментировать) эту директиву (рис. 29), компилятор выдаст предупреждение о том, что нигде не используются аргументы функции
main:
[C++ Warning] UnHello.cpp(16): W8057 Parameter 'argc' is never used [C++ Warning] UnHello.cpp(16): W8057 Parameter 'argv' is never used
Здесь 16 – номер последней строки функции main, в пределах которой обнаружена данная неточность.
Средства разработки на C++ 41
Особенности ввода и вывода
Попытаемся напечатать приветствие по-русски.
#include <iostream.h>
int main(int argc, char* argv[])
{
cout << "Здравствуй, Мир!"; cin.get();
return 0;
}
Программа выведет:
╟фЁртёЄтєщ, ╠шЁ!
Непонятный набор символов вместо русских букв выводится потому, что при вводе текста программы и при ее выполнении используются разные кодовые таблицы с различной кодировкой русских букв. Windows-программы, в том числе и C++ Builder, используют кодовую таблицу 1251, исполняется же консольная программа в текстовом окне, где применяется кодовая таблица 866 операционной системы DOS. Чтобы правильно отображать русские буквы при работе программы, необходимо делать перекодировку из кодовой таблицы 1251 в кодовую таблицу 866. Для этого можно применять функцию
bool CharToOem(char* in, char* Buff);
которая переводит строку символов in в строку Buff, используя кодировку, принятую в среде исполнения программы. В нашем случае средой выполнения программы является окно DOS, поэтому будет использована соответствующая кодировка русских букв. Для доступа к функции
CharToOem в программу нужно включить заголовочный файл windows.h. Напишем вспомогательную функцию Rus для упрощения
преобразования:
#include <windows.h> |
// Для доступа к CharToOem |
char Buff[500]; |
// Буфер для преобразованной строки |
char* Rus(char* in) |
// Функция для преобразования русских букв |
{ |
|
CharToOem(in, Buff); |
// Функция CharToOem преобразует строку in |
return Buff; |
// в строку Buff, используя кодировку DOS |
} |
|
#pragma hdrstop |
|
#pragma argsused |
|
42 2
#include <iostream.h>
int main(int argc, char* argv[])
{
cout << Rus("Здравствуй, Мир!"); cin.get();
return 0;
}
Эта программа, как и ожидалось, напечатает:
Здравствуй, Мир!
Функцию Rus нельзя применять в цепочках печати вида: cout << Rus(”Здравствуй,” << Rus(” Мир!");
так как в этом случае будет напечатано:
Здравствуй, Здравствуй,
Для печати нескольких строк по-русски каждую строку можно выводить отдельным оператором:
cout << Rus(”Здравствуй,”; cout << Rus(” Мир!");
В дальнейшем дополнительно не будем обговаривать, как организовывать вывод на русском языке.