prog_lk7_new.pptx
- Количество слайдов: 56
Cтроки класса string
Cтроки класса string • В современном стандарте C++ определен класс с функциями и свойствами (переменными) для организации работы со строками #include
Основные возможности класса string: • Инициализация массивом символов (строкой встроенного типа) или другим объектом типа string. Встроенный тип не обладает второй возможностью; • Копирование одной строки в другую. Встроенный тип функция strcpy(); • Доступ к отдельным символам строки для чтения и записи. Встроенный тип – используется операция взятия индекса или косвенная адресация с помощью указателя; • Сравнение двух строк на равенство. Встроенный тип функции семейства strcmp();
Основные возможности класса string: • Конкатенация (сцепление) двух строк, дающая результат либо как третью строку, либо вместо одной из исходных. Для встроенного типа применяется функция strcat(), чтобы получить результат в новой строке, необходимо последовательно задействовать функции strcpy() и strcat(), а также выделять память; • Встроенные средства определения длины строки (функции члены класса size() и length()). Узнать длину строки встроенного типа можно только вычислением с помощью функции strlen(); • Возможность узнать, пуста ли строка.
Инициализация строк Задание пустой строки: string st 2; Задание инициализированной строки: string st 1( “Winter is comingn” );
Определение длины строки • Применяется к конкретной строке, для которой определяется размер: st. size(); cout <<“Длина строки ”<
#include
Проверка строки на пустоту • Исходная строка: string st 2; // пустая строка • Определение длины строки, если 0, значит строка пустая: if (!st 2. size()) cout<<“Строка пустая”; • Использование метода empty(): возвращает true, если строка пустая, и false в противном случае. if (st 2. empty()) cout<<“Строка пустая”;
#include
Определение совпадения строк string st 1 (“Hello!”); string st 2 (“Hello!”); … if (st 1==st 2) cout<<“Строки совпадают”;
include
Копирование строк осуществляется операцией присваивания: string st 1 (“Hello!”); string st 2; st 2=st 1; string st 3=st 2;
#include
Конкатенация строк Для конкатенации (объединения) строк используется оператор сложения + или оператор сложения с присваиванием += string st 1(“Winter is ”); string st 2(“comingn”); string st 3 = st 1+st 2; //получаем новую строку из двух предыдущих st 1+=st 2; //добавляем содержимое второй строки в конец первой
#include
Конкатенация строк Допускается объединение между собой не только объектов класса string, но и строк встроенного типа: char ch=‘, ‘; string st 1(“Hello”); string st 2(“Bro!”); string st 3 = st 1+ch+st 2+”n”; Результат: st 3 = “Hello, Bro!n”;
#include
Преобразование • Объекты встроенного типа возможно преобразовывать в объекты класса string: string s 1; char ch = “Hear me roarn”; s 1=ch;
Преобразование Функция c_str() возвращает указатель на символьный массив, который содержит в себе строку типа string в том виде, в котором она размещалась бы во встроенном строковом типе. string str 1; const char *str 2 = str 1. c_str();
Индексы К отдельным символам объекта string можно обращаться при помощи индексов: string str 1(“Valar Morghulis”); cout<
Пример Заменить в строке все пробелы на символы подчеркивания. string str (“Valar Morghulis and Valar Dohaeris”); int size = str. size(); for (int i=0; i
#include
Пример Для решения задачи можно воспользоваться функцией replace(); #include
#include
Указатели
Указатели • Указатель — это переменная, значением которой является адрес памяти, по которому хранится объект определенного типа (другая переменная). Пример: если ch — это переменная типа char, а p — указатель на ch, значит в p находится адрес, по которому в памяти компьютера хранится значение переменной ch.
Объявление тип *<имя переменной> Пример: int *p; //по адресу, записанному в переменной p, //будет хранится переменная типа int //т. е. p указывает на тип данных int
Примеры объявления char *p; int *k, j, *l; float *pf, f;
Операции над указателями & “взять адрес” * “значение, расположенное по данному адресу”
Операция & Возвращает адрес своего операнда: float a; //объявлена вещественная переменная a float *adr_a; //объявлен указатель на тип float adr_a = &a; //оператор записывает в переменную adr_a //адрес переменной a
Операция * разадресация Возвращает значение переменной, хранящееся в по заданному адресу, то есть выполняет действие, обратное операции &. float a; //объявлена вещественная переменная a float *adr_a; //объявлен указатель на тип float a = *adr_a; //оператор записывает в переменную a //вещественное значение, //хранящиеся по адресу adr_a
Примеры Пусть переменная b размещается по адресу 2000. b_addr = &b Этот оператор присваивания помещает в переменную b_addr адрес памяти переменной b, т. е. b_addr будет иметь значение 2000.
Примеры Если b_addr содержит адрес ячейки памяти переменной b, тогда y = *b_addr; поместит значение переменной b в переменную y
Примеры программ
//Программа 1 #include
//Программа 2 #include
//Программа 3 #include
Операции над адресами
Операции над адресами Над адресами в C++ определены следующие арифметические операции: • сложение и вычитание указателей с константой; • вычитание одного указателя из другого; • инкремент; • декремент.
Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти на столько байт, сколько занимает n переменных того типа, на который он указывает. Общая формула для вычисления значения указателя после выполнения операции p=p+n имеет вид :
=
+ n*<кол-во байт памяти базового типа указателя>
Пример В современных стандартах под char отводится 1 байт, под int 4 байта, под float – 4 байта, под double – 8 байт. Таким образом: 1) если P=0025 h и указывает на целое(int), то P=P+3=0031 h (0025 h+4 h=0029 h+4 h=002 Dh+4 h=0031 h) 2) если P=0025 h и указывает на символьный тип(char), то P=P+3=0028 h 3) если P=0025 h и указывает на float, то P=P+3=0031 h 4) если P=0025 h и указывает на double, то P=P+3=003 Dh
Вычитание двух указателей определяет, сколько переменных данного типа размещается между указанными ячейками. Эти операции применимы только к указателям одного типа и имеют смысл в основном со структурными типами данных, например с массивами.
Инкремент и декремент Инкремент увеличивает адрес на единицу и/или перемещает указатель к следующему элементу массива, а декремент уменьшает на единицу и/или перемещает к предыдущему элементу массива.
//Программа 4 #include
Указатели и массивы
Указатели и массивы • При создании любого массива в C++, вместе с ним естественным образом создаётся указатель. • Имя этого указателя совпадает с именем массива. • В появившемся указателе хранится адрес начального элемента массива. • Чтобы начало массива не было потеряно этот указатель является константным, т. е. его нельзя направить на какой то другой элемент массива или записать туда адрес другой переменной даже подходящего типа.
Пример int plus[10]; plus указатель на массив, точнее, на первый элемент массива
Указатели и массивы Получение адреса первого элемента массива: p 1=plus; и p 1=&plus[0]
Указатели и массивы • Т. к. в массиве все элементы располагаются в памяти последовательно, начав с указателя, направленного на начальный элемент, возможно обойти все элементы массива, смещая указатель на каждом шаге вправо на минимально возможную дистанцию (то есть, на соседний справа элемент подходящего типа). • Смещение указателя может производиться с помощью операторов инкремента и декремента, либо на произвольную величину.
Пример 6 ой элемент массива plus можно определить: plus[5] или *(p 1+5)
Пример Преимущество ис пользования второго варианта *(p 1+5) состоит в том, что арифме тические операции над указателями выполняются быст рее, если мы работаем с подряд идущими элементами массива. Если же выбор элементов массива случайный, то быстрее и более наглядна работа с индексами plus[5].
#include
Операции сравнения < > <= >= = == !=
Операции сравнения Если i указывает на пятый элемент массива, а j — на первый, то отношение i>j истинно. Любой указатель можно сравнивать на равенство с нулем. Данные утверждения верны, если речь идет об указателях, ссылающихся на один массив. В противном случае результат арифметических операций и операций отношения будет не определен.
Массивы указателей
Массивы указателей • Как и любые другие переменные, указатели можно группировать в массивы. • Объявление массива целочисленных указателей из десяти элементов: int *х[10]; • Присвоение адреса целочисленной переменной var третьему элементу массива: х[2] = &var; • Получение значения var: *х[2];