Лабораторная работа № 4. Класс "Динамическая строка" и перегрузка операций - Технология разработки программного обеспечения систем управления

Объект ориентированный класс программирование

Цель Работы - изучить методику создания одномерных динамических символьных массивов при помощи конструкторов с захватом динамической памяти и деструкторов для их уничтожения, а также способа работы со строковыми объектами, познакомиться с механизмом перегрузки операций.

- Теоретические сведения

Для представления символьной (текстовой) информации можно использовать символы, символьные переменные и символьные константы.

Символьная константа представляется последовательностью символов, заключенной в кавычки: "Начало строки ". В С++ нет отдельного типа для строк. Массив символов - это и есть строка. Количество элементов в таком массиве на один элемент больше, чем изображение строки, т. к. в конец строки добавлен '' (нулевой байт).

Присвоить значение массиву символов с помощью обычного оператора присваивания нельзя. Поместить строку в массив можно либо при вводе, либо с помощью инициализации:

Char s[] = "ABCDEF".

Для работы со строками существует специальная библиотека string. h. Примеры функций для работы со строками из библиотеки string. h приведены в таблице 2.

Таблица 2 - Функции работы со строками

Функция

Прототип и краткое описание функции

Strcmp

Int strcmp(const char *str1, const char *str2);

Сравнивает строки str1 и str2. Если str1 < str2, то результат отрицательный, если str1 = str2, то результат равен 0, если str1> str2, то результат положительный.

Strcpy

Char* strcpy(char*s1, const char *s2);

Копирует байты из строки s1 в строку s2.

Strdup

Char *strdup (const char *str);

Выделяет память и переносит в нее копию строки str.

Strlen

Unsigned strlen (const char *str);

Вычисляет длину строки str.

Strncat

Char *strncat(char *s1, const char *s2, int kol);

Приписывает kol символов строки s1 к строке s2.

Strncpy

Char *strncpy(char *s1, const char *s2, int kol);

Копирует kol символов строки s1 в строку s2.

Strnset

Char *strnset(char *str, int c, int kol);

Заменяет первые kol символов строки s1 символом с.

Строки при передаче в функцию в качестве фактических параметров могут быть определены либо как одномерные массивы типа char[], либо как указатели типа char*. В отличие от обычных массивов, в этом случае нет необходимости явно указывать длину строки.

Функции преобразования строки S в число:

Целое: int Atoi(S);

Длинное целое: long Atol(S);

Действительное: double atof(S),при ошибке возвращает значение 0.

Функции преобразования числа V в строку S:

Целое: Itoa(int V, char S, int kod);

Длинное целое: Ltoa(long V, char S, int kod); 2<=kod<=36, для отрицательных чисел kod=10.

Перегрузка Операций

Для перегрузки операции для класса в С++ используется следующий синтаксис:

<Тип> operator <операция>(<входные параметры>)

{

<операторы>;

}

Где < Тип > - тип, возвращаемый функцией;

Operator - ключевое слово;

< операция > - перегружаемая операция.

В языке С++ имеются следующие ограничения на перегрузку операций:

    - С++ не различает префиксную и постфиксную формы ++ и - -; - переопределяемая операция должна присутствовать в языке (например, нельзя определить операцию с символом #); - нельзя переопределить операторы, заданные следующими символами: * :: ? ; - переопределенные операции сохраняют свой изначальный приоритет.

Наличие в классе конструктора String:: String(String&;) и операторов присваивания позволяет защитить объекты класса от побитового копирования.

Файловые Потоки. Классы файловых потоков:

Ifstream - файл ввода, производный от istream,

Ofstream - файл вывода, производный от ostream,

Fstream - файл ввода-вывода, производный от iostream.

Флаги Режимов Работы С Файлом:

Enum ios::open_mode

{

In = 0x01, // Открыть файл только для чтения

Out = 0x02, // Открыть файл только для записи

Ate = 0x04, // При открытии позиционироваться в конец файла

App = 0x08, // Открыть существующий для дополнения

Trunc = 0x10, // Создание нового файла взамен существующего

Nocreate=0x20, // Не создавать новый файл при его отсутствии

Noreplace=0x40, // Не создавать новый файл, если он существует

Binary= 0x80 // Двоичный файл ("прозрачный" ввод-вывод без // преобразования символов конца строки)

}

Конструкторы объектов (для классов ifstream, ofstream, fstream) и функции открытия/закрытия файлов:

Ifstream(); // Без открытия файлов

Ifstream( // С открытием файла в заданном

Char *name, // режиме imode

Int imode=ios::in,

Int prot=filebuf::openprot);

Ifstream(int fd); // С присоединением файла с дескриптором fd

Ifstream (// То же, с явно заданным буфером

Int fd,

Char *buf, int sz);

Void ifstream::open

Char *name, // Открытие файла в заданном режиме

Int imode=ios::in,

Int prot=filebuf::openprot);

Void close(); // Закрыть файл

Void setbuf(

Char *p, int sz);// Установить буфер потока

Int fd(); // Дескриптор открытого в потоке файла

Int is_rtl_open(); // 1 - файл открыт в потоке

Унаследованные переопределения операторов позволяют проверять наличие ошибок в потоках в виде:

Fstream ss;

If (ss) ... или if (!ss).

- Задание К Лабораторной Работе

Общая постановка. Пользовательский класс String должен содержать необходимые элементы-данные, которые создаются в динамической области памяти.

Конструктор для создания строк: String (...);

Деструктор: ~String();

Метод ввода исходной строки: Set();

Метод печати: void print(...);

Код методов - вне пространства определения класса. Программа иллюстрирует прямой и косвенный способы обращения к методам.

Ввести с клавиатуры строку символов S1. Признак окончания ввода строки - нажатие клавиши "Ввод". Программа должна содержать перегруженную операцию "=", использование которой скопирует S1 в S2 .

Исходную и преобразованную строки вывести в файл.

    - Варианты заданий 1. Если длина L нечетная, то удаляется символ, стоящий посередине строки. 2. Если длина L четная, то удаляются 2 первых и 2 последних символа. 3. Если длина L кратна 2, то удаляются все числа, которые делятся на 2. 4. Если длина L кратна 3, то удаляются все числа, делящиеся на 3. 5. Если длина L >10, то удаляются все цифры. 6. Если длина L >15, то удаляются все a..z. 7. Если длина L=10, то удаляются все A..Z. 8. Если длина L кратна 4, то первая часть строки меняется местами со

Второй.

9. Если длина L кратна 5, то подсчитывается количество скобок всех

Видов.

    10. Если длина L >5, то выделяется подстрока до первого пробела. 11. Если длина L >6, то выделяется подстрока { } скобках. 12. Если длина L >10, то удаляется подстрока в [] скобках. 13. Если длина L >12, то удаляется подстрока до первой открывающейся скобки. 14. Если длина L кратна 4, то выделяется подстрока после последнего

Пробела.

    15. Если длина L >5, то удаляются все точки. 16. Если длина L четная, то выделяется подстрока до первого пробела. 17. Если длина L четная, то удаляется подстрока до первого пробела. 18. Если длина L четная, то выделяется подстрока со второго пробела. 19. Если длина L нечетная, то выделяется подстрока после первого пробела. 20. Если длина L нечетная, то удаляется подстрока со второго пробела. 21. Если длина L кратна 3, то удаляется каждый 3-й символ. 22. Если длина L четная, то удаляется каждый 2-й символ. 23. Если длина L нечетная, то удалить средние 3 символа. 24. Если длина L четная, то выделяется подстрока до последнего пробела. 25. Если длина L нечетная, то выделяется подстрока от последней цифры. 26. Если длина L=15, то удаляются все символы кроме A - Z. 27. Если длина L делится на 5, то удаляется все символы кроме a - z. 28. Если длина L четная и >=10, то удаляются все пробелы. 29. Если длина L нечетная и 30. Если длина L >5 и - Контрольные вопросы 1. Как объявить динамическую строку в С++? 2. Какие вы знаете функции работы со строками? 3. Как определяются строки при передаче в функцию в качестве фактических параметров? 4. Поясните механизм перегрузки операций для объектов данного класса.

Похожие статьи




Лабораторная работа № 4. Класс "Динамическая строка" и перегрузка операций - Технология разработки программного обеспечения систем управления

Предыдущая | Следующая