КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |