Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tekhnologia_programmirovania.pdf
Скачиваний:
182
Добавлен:
08.04.2015
Размер:
1.76 Mб
Скачать

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