Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Включение текстов из файлов




Замены в тексте

 

Для замены идентификатора заранее подготовленной последовательностью символов используется директива:

#define идентификатор строка_замещения

Директива может размещаться в любом месте обрабатываемого текста, а её действие в обычном случае от точки размещения до конца текста. Директива, во-первых, определяет идентификатор как препроцессорный. В результате обработки все вхождения определённого командой #define идентификатора в текст программы заменяются строкой замещения, окончанием которой обычно служит признак конца той строки, где размещена команда #define. Символы пробелов, помещённые в начале и конце строки замещения, в подстановке не используются. Например:

Исходный текст

#define begin {

#define end }

void main ()

begin

операторы

end

Результат препроцессорной обработки

 

Void main ()

{

операторы

}

В данном случае программист решил использовать в качестве операторных скобок идентификаторы begin, end. компилятор языка С++ не может обрабатывать таких скобок, и поэтому до компиляции препроцессор заменяет все вхождения этих идентификаторов стандартными скобками { и }. Соответствующие указания программист дал препроцессору с помощью директив #define.

С помощью команды #define удобно выполнять настройку программы. Например, если в программе требуется работать с массивами, то из размеры можно явно определять н на этапе препроцессорной обработки:

 

Исходный текст

#define K 40

void main()

{ int M[K] [K];

fload A[K], B[K] [K];

Результат препроцессорной обработки

Void main()

{ int M[40] [40];

fload A[40], B[40] [40];

Замены в тексте можно отменять с помощью директивы:

#undef идентификатор

После выполнения такой команды идентификатор для препроцессора становится неопределённым и его можно определять повторно.

 

 

Для включения текста из файла используется команда #include, имеющая две формы записи:

#include <имя_файла> // имя в угловых скобках

#include “имя_файла” // имя в кавычках

Если имя_файла – в угловых скобках, то препроцессор разыскивает файл в стандартных системных каталогах. Если имя_файла заключено в кавычки, то вначале препроцессор просматривает текущий каталог пользователя и только затем обращается к просмотру стандартных системных каталогов.

Начиная работать с языком С++, пользователь сразу же сталкивается с необходимостью использования в программах средств ввода-вывода. Для этого в начале текста программы помещают директиву:

#include <iostream.h>

Выполняя эту директиву, препроцессор включает в программу средства связи с библиотекой ввода-вывода. Поиск файла iostream.h ведётся в стандартных системных каталогах.

По принятому соглашению префикс.h приписывается тем файлам, которые нужно помещать в заголовке программы, т.е. до исполняемых операторов. Кроме такого в некоторой степени стандартного файла, каким является iostream.h, в заголовок программы могут быть включены любые другие файлы (стандартные или подготовленные специально).

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

Заголовочный файл может быть, например, таким:

#include <iostream.h> // включение средств обмена

extern int ii, jj, ll; // целые внешние переменные

extern fload aa, bb; // вещественные внешние переменные

В практике программирования на С++ обычна в некотором смысле обратная ситуация. Если в программе используется несколько функций, то иногда удобно текст каждой из них хранить в отдельном файле. При подготовке программы пользователь включает в неё тексты используемых функций с помощью команды #include.

В качестве примера рассмотрим задачу обработки строк, в которой используем функции обработки строк, текст каждой из которых находится в отдельном файле.

Задача об инвертировании слов в предложении. Ввести с клавиатуры заканчивающееся точкой предложение, слова в котором отделены друг от друга пробелами. Записать каждое слово предложения в обратном порядке (инвертировать слово) и напечатать полученное предложение. Для простоты реализации ограничим длину вводимого предложения 80 символами. Тогда программа решения сформулирванной задачи может быть такой:

#include <iostrem.h>

#include “invert.cpp” // функция инвертирования строк

#include “conc.cpp” // функция соединения строк

void main()

{ char slovo[81], sp[81], c = ‘ ‘, *ptr = slovo;

sp[0] = ‘\0’; // очистка массива для нового предложения

cout << “\nВведите предложение с точкой на конце:\n”;

do

{ cin >> slovo; // читается слово из входного потока

invert (slovo); //инвертировать слово

c = slovo[0];

// убрать точку в начале последнего слова:

if (c == ‘.’) ptr = &slovo[1];

if (sp[0]!= ‘\0’) conc(sp,” \0”); // пробел перед словом

conc(sp, ptr); // добавить слово в предложение

} while (c!= ‘.’); // конец цикла чтения

conc (sp, “.\0”); // точка в конце предложения

cout << “\n” << sp;

}

В файле invert.cpp текст функции:

Void invert(char *e)

{ char s;

for (int m = 0; e[m]!= ‘\0’; m++);

for (int i = 0, j = m-1; i < j; i++, j--)

{ s = e[i]; e[i] = e[j]; e[j] = s; }

}

В файле conc.cpp текст функции:

Void conc (char *c1, char *c2)

{ for (int m = 0; c1[m]!= ‘\0’; m++);

// m – длина первой строки без символа ‘\0’

for (int i = 0; c2[i]!= ‘\0’; i++) c1[m+1] = c2[i];

c1[m+i] = ‘\0’;

}

Возможный результат выполнения:

Введите предложение с точкой в конце:

А ШОРОХ ХОРОШ. <ENTER>

Вывод: А ХОРОШ ШОРОХ.

В программе в символьный массив slovo считывается из входного потока (с клавиатуры) очередное слово; sp – формируемое предложение, в конец которого всегда добавляется точка. Переменная char с – первый символ каждого инвертированного слова. Для последнего слова предложения этот символ равен точке. При добавлении этого слова к новому предложению точка отбрасывается с помощью изменения значения указателя ptr.

Использованы директивы #include, включающие в программу средства ввода-вывода и тексты функций инвертирования строки invert() и конкатенации строк conc(). Обратите внимание, что длина массива – первого из параметров функции conc() должна быть достаточно велика, чтобы разместить результирующую строку.

 




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 651; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.