Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №7.doc
Скачиваний:
8
Добавлен:
12.11.2019
Размер:
150.53 Кб
Скачать

Лабораторная работа № 7 Обработка строк с использованием множественного типа данных

Задание: составить программу заданной обработки массива слов. В процессе обработки использовать множественных тип данных. Заполнение исходных данных – с клавиатуры. Исходный и обработанный массив выводить на экран.

Теоретический материал

Строковый тип данных занимает промежуточное положение между простыми и структурированными типами данных. С одной стороны, данные строкового типа имеют структуру (строка, по сути, – это последовательность символов). С другой стороны, строковый тип, как все простые типы, является стандартным, а ни один структурированный тип не является стандартным. Кроме того, над строками можно выполнять некоторые действия, которые допустимы для данных простых типов и недопустимы для структурированных типов данных. Например, строку s можно ввести с клавиатуры или вывести на экран с помощью стандартных процедур ввода-вывода cin >> s и cout << s. В то же время, если описать переменную s как массив символов, то для ввода (или вывода) необходимо организовывать цикл, в котором стандартные процедуры ввода-вывода будут применяться к элементу массива s, т.  е. cin >> s[i] или cout s[i].

Значениями строковых переменных могут быть последовательности различной длины (от нуля до 255 символов, длине 0 соответствует пустая строка).

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

string s;

Такое описание будет означать, что для переменной s в памяти зарезервировано место под 255 символов (т.  е. максимальная длина строки). Если же максимально возможное значение строковой переменной меньше (например, имя человека обычно содержит не более 20 символов), то можно ограничить длину строки, сэкономив тем самым оперативную память:

String name[20];

Стандартные процедуры и функции для работы со строками приведены ниже.

Функции

strcat(str1, str2)

присоединяет к строке str1 копию строки str2.

strncat(str1, str2, count)

присоединяет не более count символов из строки s2 к строке s1.

strcpy(str1, str2)

копирует содержимое строки str2 в строку str1.

strncpy(str1, str2, count)

копирует не более count символов из строки str2 в str1.

strcmp(str1, str2)

сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее следующим образом от результата сравнения. Меньше нуля - str1 меньше str2, нуль - str1 равен str2, больше нуля - str1 больше str2.

strncmp(str1, str2, count)

Сравнивает ограниченное количество символов.

stricmp(str1, str2)

Сравнивает строки c учетом регистра (только для латиницы)

strlen(str)

возвращает количество символов в строке

strupr(str)

преобразует символьную строку в строку верхнего регистра

strlwr(str)

преобразует символьную строку в строку нижнего регистра

strstr(str1, str2)

осуществляет поиск подстроки str2 в строке str1

strchr(ch, str)

возвращает указатель на первое вхождение символа ch в str

strrchr(ch, str)

находит последнее вхождение символа сh в строку str

Еще один тип данных, который потребуется при выполнении лабораторной работы, – множество. Множество – это структурированный тип данных, представляющий набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое.

Для задания типа-множества следует использовать зарезервированные слово set. С++ set (множество) - это ассоциативный контейнер STL, хранящий отсортированный набор уникальных объектов. Сортировка осуществляется с использованием функции сравнения Compare (по умолчанию, в качестве функции сравнения, ипользуется std::less<Key>).:

set<Key, Compare, Alloc> <имя множества>

Пример (требуется подключить библиотеку <set>):

set<int> digits;

Функции

begin()

возвращает итератор на первый элемент множества.

clear()

удаляет все элементы из множества.

count(const key_type& key)

возвращает количество вхождений ключа в множество, то есть всегда 0 или 1.

empty()

возвращает истину, если в множестве нет элементов, иначе ложь.

end()

возвращает итератор на место после последнего элемента множества.

erase(iterator pos)

удаляет элемент в позиции pos.

erase(iterator start, iterator end)

удаляет элементы между start и end.

erase(const key_type& key)

удаляет все элементы, имеющие значение, равное key. Возвращает количество удаленных элементов

find( const key_type& key )

возвращает итератор на ключ или итератор на конец множества, если ключ не найден.

insert(iterator pos, const T& val)

вставляет val перед элементом в позиции pos (где pos на самом деле просто совет, куда нужно поставить val, так как множества и карты упорядочены), и возвращает итератор на этот элемент.

insert(input_iterator start, input_iterator end)

вставляет значения из диапазона от start до end.

insert(const T& val)

вставляет val, но только если val еще нет в множестве. Возвращаемое значение - итератор на вставленный элемент и булевская величина, показывающая, была ли вставка. Если величина ложна, то итератор указывает на присутствующий в множестве элемент.

lower_bound( const key_type& key )

возвращает итератор на первый элемент, больший либо равный key.

max_size()

возвращает максимальное количество элементов, которое может содержать множество.

size()

возвращает количество элементов в текущем множестве.

upper_bound( const key_type& key )

возвращает итератор на первый элемент множества со значением, большим key.

Пример:

set<int> s;

for(int i = 1; i <= 100; i++) {

s.insert(i); // добавим сто первых натуральных чисел

}

s.insert(42); // ничего не произойдёт ---

// элемент 42 уже присутствует в множестве

for(int i = 2; i <= 100; i += 2) {

s.erase(i); // удалим чётные числа

}

// set::size() имеет тип unsigned int

int N = int(s.size()); // N будет равно 50

У set нет понятия «индекс элемента», единственный способ просмотреть данные, содержащиеся в set, заключается в использовании итераторов:

for(set<int>::const_iterator it =s.begin(); it != s.end(); it++) {

cout << *it << ' ';

}

Запись строк в множество:

set<char> charSet;

const char* s = "Hello There";

for( int i=0; i < strlen(s); i++ ) {

charSet.insert( s[i] );

}

символы в множестве: " HTehlor"