- •Предисловие
- •Глава 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. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
238 |
16 |
|
|
else if(')' == c || ']' == c || '}' == c){ // Встретилась закрывающая |
|||
|
bro = pop(); |
// Берем из стека открывающую |
|
|
if(bro == EOF || (bro == '(' && c != ')') |
// Проверка |
|
|
|
|| (bro == '[' && c != ']') |
// соответствия |
|
|
|| (bro == '{' && c != '}')){ |
// скобок |
cerr << "Для " << char(c) << " нет открывающей\n"; exit(1);
}
}
// Чтение текста закончено
if(pop() != EOF) // Если стек не пуст cerr << "Открывающих больше чем закрывающих \n";
else
cout << "Скобки расставлены верно \n"; return 0;
}
Поскольку данная программа состоит из двух файлов, следует создать проект, в который включить файлы Stack.cpp и Brackets.cpp. Далее приведены результаты двух запусков программы.
Первый запуск:
)(^Z Стек пуст
Для ) нет открывающей
Второй запуск:
{[()]}^Z Стек пуст
Скобки расставлены верно
16.4.Пространства имен
Внастоящее время в C++ добавлен еще один инструмент управления именами – пространства имен, которые создаются с использованием ключевого слова namespace. Назначение пространства имен состоит в том, чтобы снизить вероятность конфликта имен при разработке больших программ. Старые компиляторы, в частности TC, не поддерживают пространства имен, но современные компиляторы, например, C++Builder их поддерживают.
Продемонстрируем использование пространства имен на примере программы 52 о стеке.
Оформим файл Stack.h в виде:
//Файл Stack.h
#ifndef STACKH |
// Страж |
|
Программы из нескольких файлов |
239 |
#define STACKH |
// включения |
|
namespace Stack{ |
// Создаем пространство имен Stack |
|
void push(int c); |
// Поместить c в стек |
|
int pop(); |
// Извлечь элемент из вершины стека |
|
} |
// Конец объявления пространства имен |
#endif
Теперь имена функций push и pop принадлежат пространству имен Stack и к ним надо обращаться в виде Stack::push и Stack::pop. Если после изменения файла Stack.h выполнить компиляцию файла Brackets.cpp, то будут выданы ошибки:
Call to undefined function push (Вызов неопределенной функции push) Call to undefined function pop (Вызов неопределенной функции pop)
При компиляции файла Stack.cpp ошибок не будет, но функции push и pop, определенные в этом файле, ничего общего не имеют с функциями Stack::push и Stack::pop, так как не входят в пространство имен Stack. Перепишем файл Stack.cpp в виде:
// Файл Stack.cpp |
|
#include <iostream.h> |
|
#include "Stack.h" |
|
static const int SZ = 100; |
// Максимальный размер стека |
static char s[SZ]; |
// Массив под элементы стека |
static int sp = 0; |
// Позиция свободного элемента массива |
// push: поместить c в стек |
|
void Stack::push(int c) |
// Используем полное имя Stack::push |
{…} |
|
// pop: извлечь элемент из вершины стека |
|
int Stack::pop() |
// Используем полное имя Stack::pop |
{…} |
|
Перепишем теперь файл Brackets.cpp в виде:
// Файл Brackets.cpp #include <iostream.h> #include <stdlib.h> #include <conio.h> #include "stack.h"
using namespace Stack; // Делаем доступными имена из пространства // имен Stack
int main()
{
…
240 16
}
Теперь программа будет работать так же, как до введения пространства имен.
Директива using: using namespace Stack;
делает доступными все имена из пространства имен Stack.
Можно было бы сделать доступными только отдельные имена из пространства имен с помощью объявлений using:
using Stack::push; using Stack::pop;
поместив их вместо директивы using.
Можно, не используя директиву using и объявления using, просто везде писать полные имена с квалификаторами: Stack::push и Stack::pop, но это, обычно, утомительно.
Стандартные пространства имен
В C++ можно использовать библиотеки функций языка Си и соответствующие заголовочные файлы, например, math.h, stdlib.h, stdio.h (заголовочный файл библиотеки ввода/вывода языка Си) и другие. Для собственных библиотек языка С++ заголовочные файлы сначала получили расширение .h. Позднее в C++ было добавлено понятие пространства имен и было решено поместить все имена из стандартных библиотек в пространство имен std. Для этого пришлось изменить заголовочные файлы – у них убрали расширение .h. Таким образом, вместо
iostream.h появился iostream, но все имена в нем находятся в пространстве имен std. При использовании файла iostream это надо учитывать, например,
#include <iostream> void main()
{
std::cout << ”Hello, ”;
std::cout << ”World!” << std::endl; std::cin.get();
}
Чтобы не писать перед именами квалификатор std, можно использовать директиву using:
#include <iostream> using namespace std;
Программы из нескольких файлов 241
void main()
{
cout << ”Hello, World!” << endl; cin.get();
}
Чтобы можно было выполнять старые программы в новых средах разработки, старые версии заголовочных файлов также оставлены. Приводимые в данной книге программы оформлены, в основном, в старом стиле. При выполнении в новых средах их можно переписать в новом стиле, заменив директиву
#include <iostream.h>
на
#include <iostream> using namespace std;
Некоторые заголовочные файлы языка Си были преобразованы в файлы C++, например, math.h превратился в cmath. Здесь префикс c указывает на происхождение данных файлов из языка Си. Такие файлы могут уже включать элементы, не относящиеся к Си, например,
namespace std.
Задачи -. Работа со стеком
186.Напишите программу, которая печатает содержание входного файла, выводя символы каждой строки в обратном порядке. Для размещения символов очередной строки используйте стек.
187.Напишите программу для работы со стеком целых чисел. Помещайте вводимые числа в стек, найдите сумму чисел, помещенных
встек, максимальное число в стеке.
188.Напишите программу для работы со стеком целых чисел. Программа должна помещать вводимые целые числа в стек. При вводе знаков арифметических операций +, -. *, / программа должна брать из стека два числа и, произведя над ними соответствующую операцию, помещать результат в стек. Нажатие некоторой клавиши, например w или W, должно приводить к печати значения из вершины стека без его удаления из стека.
189.Напишите программу для работы со стеком из строк символов. Такой стек можно реализовать в виде массива указателей на строки, память под которые выделяется динамически. Организуйте с помощью такого стека печать строк входного файла в обратном порядке.
242 16