Скачать презентацию Cтроки класса string Cтроки класса string Скачать презентацию Cтроки класса string Cтроки класса string

prog_lk7_new.pptx

  • Количество слайдов: 56

Cтроки класса string Cтроки класса string

Cтроки класса string • В современном стандарте C++ определен класс с функциями и свойствами Cтроки класса string • В современном стандарте C++ определен класс с функциями и свойствами (переменными) для организации работы со строками #include • Для работы со строками также нужно подключить стандартный namespace: using namespace std;

Основные возможности класса string: • Инициализация массивом символов (строкой встроенного типа) или другим объектом Основные возможности класса string: • Инициализация массивом символов (строкой встроенного типа) или другим объектом типа string. Встроенный тип не обладает второй возможностью; • Копирование одной строки в другую. Встроенный тип функция strcpy(); • Доступ к отдельным символам строки для чтения и записи. Встроенный тип – используется операция взятия индекса или косвенная адресация с помощью указателя; • Сравнение двух строк на равенство. Встроенный тип функции семейства strcmp();

Основные возможности класса string: • Конкатенация (сцепление) двух строк, дающая результат либо как третью Основные возможности класса string: • Конкатенация (сцепление) двух строк, дающая результат либо как третью строку, либо вместо одной из исходных. Для встроенного типа применяется функция strcat(), чтобы получить результат в новой строке, необходимо последовательно задействовать функции strcpy() и strcat(), а также выделять память; • Встроенные средства определения длины строки (функции члены класса size() и length()). Узнать длину строки встроенного типа можно только вычислением с помощью функции strlen(); • Возможность узнать, пуста ли строка.

Инициализация строк Задание пустой строки: string st 2; Задание инициализированной строки: string st 1( Инициализация строк Задание пустой строки: string st 2; Задание инициализированной строки: string st 1( “Winter is comingn” );

Определение длины строки • Применяется к конкретной строке, для которой определяется размер: st. size(); Определение длины строки • Применяется к конкретной строке, для которой определяется размер: st. size(); cout <<“Длина строки ”<

#include<iostream> #include<conio. h> #include<string. h> #include <locale> using namespace std; int i, n, b[10]; #include #include #include #include using namespace std; int i, n, b[10]; string st 1[10]; int main() { setlocale(LC_ALL, "rus"); cout << "Введите количество слов n="; cin >> n; cout << "n Введите слова, после каждого слова Enter: n"; for (i=0; i> st 1[i]; for (i=0; i

Проверка строки на пустоту • Исходная строка: string st 2; // пустая строка • Проверка строки на пустоту • Исходная строка: string st 2; // пустая строка • Определение длины строки, если 0, значит строка пустая: if (!st 2. size()) cout<<“Строка пустая”; • Использование метода empty(): возвращает true, если строка пустая, и false в противном случае. if (st 2. empty()) cout<<“Строка пустая”;

#include<iostream> #include<conio. h> #include<string. h> #include <locale> using namespace std; int main() { setlocale(LC_ALL, #include #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); string st 2; if (!st 2. size()) cout<<"Определение длины строки, строка пустая"; else cout<<"Определение длины строки, строка не пустая: "<

Определение совпадения строк string st 1 (“Hello!”); string st 2 (“Hello!”); … if (st Определение совпадения строк string st 1 (“Hello!”); string st 2 (“Hello!”); … if (st 1==st 2) cout<<“Строки совпадают”;

include<iostream> #include<conio. h> #include<string. h> #include <locale> using namespace std; int main() { setlocale(LC_ALL, include #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); cout<<"Пример 1n"; string st 1 ("Hello!"); string st 2 ("Hello!"); if (st 1==st 2) cout<<"Строки совпадают"; else cout<<"Строки не совпадают"; cout<

Копирование строк осуществляется операцией присваивания: string st 1 (“Hello!”); string st 2; st 2=st Копирование строк осуществляется операцией присваивания: string st 1 (“Hello!”); string st 2; st 2=st 1; string st 3=st 2;

#include<iostream> #include<conio. h> #include<string. h> #include <locale> using namespace std; int main() { setlocale(LC_ALL, #include #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); string st 1 ("Hello!"); string st 2; st 2=st 1; cout<<"Строка st 1="<

Конкатенация строк Для конкатенации (объединения) строк используется оператор сложения + или оператор сложения с Конкатенация строк Для конкатенации (объединения) строк используется оператор сложения + или оператор сложения с присваиванием += string st 1(“Winter is ”); string st 2(“comingn”); string st 3 = st 1+st 2; //получаем новую строку из двух предыдущих st 1+=st 2; //добавляем содержимое второй строки в конец первой

#include<iostream> #include<conio. h> #include<string. h> #include <locale> using namespace std; int main() { setlocale(LC_ALL, #include #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); string st 1("Winter is "); cout<<"Строка st 1="<

Конкатенация строк Допускается объединение между собой не только объектов класса string, но и строк Конкатенация строк Допускается объединение между собой не только объектов класса 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<iostream> #include<conio. h> #include<string. h> #include <locale> using namespace std; int main() { setlocale(LC_ALL, #include #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); char ch=', '; string st 1("Hello"); string st 2("Bro!"); string st 3 = st 1+ch+st 2+"n"; cout<<"Результат st 3="<

Преобразование • Объекты встроенного типа возможно преобразовывать в объекты класса string: string s 1; Преобразование • Объекты встроенного типа возможно преобразовывать в объекты класса string: string s 1; char ch = “Hear me roarn”; s 1=ch;

Преобразование Функция c_str() возвращает указатель на символьный массив, который содержит в себе строку типа Преобразование Функция c_str() возвращает указатель на символьный массив, который содержит в себе строку типа string в том виде, в котором она размещалась бы во встроенном строковом типе. string str 1; const char *str 2 = str 1. c_str();

Индексы К отдельным символам объекта string можно обращаться при помощи индексов: string str 1(“Valar Индексы К отдельным символам объекта string можно обращаться при помощи индексов: string str 1(“Valar Morghulis”); cout<

Пример Заменить в строке все пробелы на символы подчеркивания. string str (“Valar Morghulis and Пример Заменить в строке все пробелы на символы подчеркивания. string str (“Valar Morghulis and Valar Dohaeris”); int size = str. size(); for (int i=0; i

#include<iostream> #include<conio. h> #include<string. h> #include <locale> using namespace std; int main() { setlocale(LC_ALL, #include #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); string str ("Valar Morghulis and Valar Dohaeris"); cout<

Пример Для решения задачи можно воспользоваться функцией replace(); #include <algorithm> … replace(str. begin(), str. Пример Для решения задачи можно воспользоваться функцией replace(); #include … replace(str. begin(), str. end(), ‘ ’, ‘_’);

#include<iostream> #include<conio. h> #include<string. h> #include <locale> #include <algorithm> using namespace std; int main() #include #include #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); string str ("Valar Morghulis and Valar Dohaeris"); cout<

Указатели Указатели

Указатели • Указатель — это переменная, значением которой является адрес памяти, по которому хранится Указатели • Указатель — это переменная, значением которой является адрес памяти, по которому хранится объект определенного типа (другая переменная). Пример: если ch — это переменная типа char, а p — указатель на ch, значит в p находится адрес, по которому в памяти компьютера хранится значение переменной ch.

Объявление тип *<имя переменной> Пример: int *p; //по адресу, записанному в переменной p, //будет Объявление тип *<имя переменной> Пример: int *p; //по адресу, записанному в переменной p, //будет хранится переменная типа int //т. е. p указывает на тип данных int

Примеры объявления char *p; int *k, j, *l; float *pf, f; Примеры объявления char *p; int *k, j, *l; float *pf, f;

Операции над указателями & “взять адрес” * “значение, расположенное по данному адресу” Операции над указателями & “взять адрес” * “значение, расположенное по данному адресу”

Операция & Возвращает адрес своего операнда: float a; //объявлена вещественная переменная a float *adr_a; Операция & Возвращает адрес своего операнда: 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 размещается по адресу 2000. b_addr = &b Этот оператор присваивания помещает в переменную b_addr адрес памяти переменной b, т. е. b_addr будет иметь значение 2000.

Примеры Если b_addr содержит адрес ячейки памяти переменной b, тогда y = *b_addr; поместит Примеры Если b_addr содержит адрес ячейки памяти переменной b, тогда y = *b_addr; поместит значение переменной b в переменную y

Примеры программ Примеры программ

//Программа 1 #include <iostream> using namespace std; int main() { float x=7. 8, y; //Программа 1 #include using namespace std; int main() { float x=7. 8, y; float *k; //объявляется указатель на переменную типа float k=&x; //в переменную k помещается адрес переменной x y=*k; //значение переменной x помещается в переменную y printf("%f", y); return 0; }

//Программа 2 #include <stdio. h> #include <conio. h> #include <locale> using namespace std; int //Программа 2 #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); float x=10. 0, y; float *pf; pf=&x; //переменной pf присваивается адрес переменной x y=*pf; //переменной y присваивается значение переменной x printf ("Результаты: n"); printf ("x=%f y=%fn", x, y); while (!kbhit()); return 0; }

//Программа 3 #include <stdio. h> #include <conio. h> #include <locale> using namespace std; int //Программа 3 #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); int x=10; int *p; p=&x; printf ("Результаты: n"); printf ("%pn", p); //печать содержимого p printf ("%d, %dn", x, *p); //печать x и величины по адресу p while (!kbhit()); return 0; }

Операции над адресами Операции над адресами

Операции над адресами Над адресами в C++ определены следующие арифметические операции: • сложение и Операции над адресами Над адресами в C++ определены следующие арифметические операции: • сложение и вычитание указателей с константой; • вычитание одного указателя из другого; • инкремент; • декремент.

Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти на столько байт, сколько занимает n переменных того типа, на который он указывает. Общая формула для вычисления значения указателя после выполнения операции p=p+n имеет вид :

=

+ n*<кол-во байт памяти базового типа указателя>

Пример В современных стандартах под char отводится 1 байт, под int 4 байта, под Пример В современных стандартах под 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 <stdio. h> #include <conio. h> #include <locale> using namespace std; int //Программа 4 #include #include #include using namespace std; int main() { setlocale(LC_ALL, "rus"); double *p 1; float *p 2; int *i; printf ("Double: %p, float: %p, int: %pn", p 1, p 2, i); p 1++; //Увеличение значения адреса на 8 p 2++; //Увеличение значения адреса на 4 i++; //Увеличение значения адреса на 4 printf ("Double: %p, float: %p, int: %pn", p 1, p 2, i); while (!kbhit()); return 0; }

Указатели и массивы Указатели и массивы

Указатели и массивы • При создании любого массива в C++, вместе с ним естественным Указатели и массивы • При создании любого массива в C++, вместе с ним естественным образом создаётся указатель. • Имя этого указателя совпадает с именем массива. • В появившемся указателе хранится адрес начального элемента массива. • Чтобы начало массива не было потеряно этот указатель является константным, т. е. его нельзя направить на какой то другой элемент массива или записать туда адрес другой переменной даже подходящего типа.

Пример int plus[10]; plus указатель на массив, точнее, на первый элемент массива Пример int plus[10]; plus указатель на массив, точнее, на первый элемент массива

Указатели и массивы Получение адреса первого элемента массива: p 1=plus; и p 1=&plus[0] Указатели и массивы Получение адреса первого элемента массива: p 1=plus; и p 1=&plus[0]

Указатели и массивы • Т. к. в массиве все элементы располагаются в памяти последовательно, Указатели и массивы • Т. к. в массиве все элементы располагаются в памяти последовательно, начав с указателя, направленного на начальный элемент, возможно обойти все элементы массива, смещая указатель на каждом шаге вправо на минимально возможную дистанцию (то есть, на соседний справа элемент подходящего типа). • Смещение указателя может производиться с помощью операторов инкремента и декремента, либо на произвольную величину.

Пример 6 ой элемент массива plus можно определить: plus[5] или *(p 1+5) Пример 6 ой элемент массива plus можно определить: plus[5] или *(p 1+5)

Пример Преимущество ис пользования второго варианта *(p 1+5) состоит в том, что арифме тические Пример Преимущество ис пользования второго варианта *(p 1+5) состоит в том, что арифме тические операции над указателями выполняются быст рее, если мы работаем с подряд идущими элементами массива. Если же выбор элементов массива случайный, то быстрее и более наглядна работа с индексами plus[5].

#include <iostream> using namespace std; int main() { double mas[10]={1. 29, 3. 23, 7. #include using namespace std; int main() { double mas[10]={1. 29, 3. 23, 7. 98, 5. 54, 8. 32, 2. 48, 7. 1}; double *p 1; //Объявление указателя на double p 1=&mas[0]; //Присвоение указателю адреса нулевого элемента массива cout<<*p 1<

Операции сравнения < > <= >= = == != Операции сравнения < > <= >= = == !=

Операции сравнения Если i указывает на пятый элемент массива, а j — на первый, Операции сравнения Если i указывает на пятый элемент массива, а j — на первый, то отношение i>j истинно. Любой указатель можно сравнивать на равенство с нулем. Данные утверждения верны, если речь идет об указателях, ссылающихся на один массив. В противном случае результат арифметических операций и операций отношения будет не определен.

Массивы указателей Массивы указателей

Массивы указателей • Как и любые другие переменные, указатели можно группировать в массивы. • Массивы указателей • Как и любые другие переменные, указатели можно группировать в массивы. • Объявление массива целочисленных указателей из десяти элементов: int *х[10]; • Присвоение адреса целочисленной переменной var третьему элементу массива: х[2] = &var; • Получение значения var: *х[2];