Основы алгоритмизации и программирования. Лекция 12

Содержание

Слайд 2

Мем в начале

Мем в начале

Слайд 3

Содержание лекции Стандартный класс string. Методы работы со строками Перечисления Структуры Вопросы из теста

Содержание лекции

Стандартный класс string. Методы работы со строками
Перечисления
Структуры
Вопросы из теста

Слайд 4

Класс string Стандартный C++ включает в себя новый класс, называемый string.

Класс string

Стандартный C++ включает в себя новый класс, называемый string. Этот

класс во многом улучшает традиционный строкой тип, используемый в C:
Не нужно заботиться о создании массива нужного размера
Освобождает от управления памятью
Позволяет использовать перегруженные операции (например, s1+s2)
Слайд 5

Класс string string word_1("Hello"); string word_2 = "World"; string message; message

Класс string

string word_1("Hello");
string word_2 = "World";
string message;
message = word_1;
cout << "Message:

" << message << endl; // Message: Hello
message = message + ", User"; // message += ", User"
cout << message << endl; // Hello, User
message = word_1 + ", " + word_2;
cout << message << endl; // Hello, World
word_1.swap(word_2);
cout << "Word 1: " << word_1 << "\nWord 2: " << word_2 << endl;
// Word 1: World // Word 2: Hello
Слайд 6

Ввод/вывод int main() { string full_name, address; cout getline(cin, full_name); cout

Ввод/вывод

int main() {
string full_name, address;
cout << "Enter your name:

";
getline(cin, full_name);
cout << "Your full name: " << full_name << endl;
cout << "Enter address (use $ to finish): " << endl;
getline(cin, address, '$');
cout << "Your address: " << address << endl;
}
Слайд 7

Поиск объектов класса string string text = "Lorem ipsum dolor sit

Поиск объектов класса string

string text = "Lorem ipsum dolor sit amet,

consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
int n = text.find("elit");
cout << "Word `elit` in text: " << n << endl; // 51
int m = text.find_first_of("abcde");
cout << "First letter from `abcde`: " << m << endl; // 3
int k = text.find_first_not_of("abcdeL");
cout << "First letter not from `abcdeL`: " << k << endl; // 1
Слайд 8

Модификация объектов класса string string text = "Hello, cruel world"; text.erase(6,

Модификация объектов класса string

string text = "Hello, cruel world";
text.erase(6, 6);
cout <<

text << endl; // Hello, world
text.replace(7, 5, "Username");
cout << text << endl; // Hello, Username
text.insert(text.size(), "!");
cout << text << endl; // Hello, Username!
text.append("!!");
cout << text << endl; // Hello, Username!!!
Слайд 9

Пример string text = "Lorem ipsum dolor sit amet, consectetur adipiscing

Пример

string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,

sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
int x = text.find(" ");
while (x != -1) {
text = text.replace(x, 1, "_");
x = text.find(" ");
}
cout << text << endl;
// Lorem_ipsum_dolor_sit_amet,_consectetur_...
Слайд 10

Сравнение объектов класс string string name_1 = "Ivan"; string name_2 =

Сравнение объектов класс string

string name_1 = "Ivan";
string name_2 = "Mikhail";
cout <<

(name_1 > name_2) << endl; // 0
cout << (name_1 < name_2) << endl; // 1
cout << name_1.compare(name_2) << endl; // -1
cout << name_2.compare(name_1) << endl; // 1
string name_3 = "Alex";
string name_4 = "Alexander";
cout << (name_3.compare(0, 4, name_4, 0, 4)) << endl; // 0
Слайд 11

Доступ к символам int main() { string message = "Hello, world!";

Доступ к символам

int main() {
string message = "Hello, world!";
cout

<< "message[12] = " << message.at(12) << endl; // !
cout << "message[12] = " << message[12] << endl; // !
cout << "Length: " << message.length() << endl;
// Length: 13
cout << "Size: " << message.size() << endl;
//Size: 13
}
Слайд 12

Структуры Структура – это объединение простых переменных различных типов (int, float

Структуры

Структура – это объединение простых переменных различных типов (int, float и

т.д.).
Переменные, входящие в состав структуры называются полями структуры.
Синтаксис структур фактически идентичен синтаксису классов. Основное отличие: структуры используются для объединения данных, а классы – в качестве объединения данных и функций.
Слайд 13

Простая структура struct Human { string name; int age; float weight;

Простая структура

struct Human {
string name;
int age;
float weight;
};

Human student;
student.name

= "Test Student";
student.age = 18;
student.weight = 70.5;
cout << "Name: " << student.name
<< endl;
cout << "Age: " << student.age
<< " years" << endl;
cout << "Weight: " << student.weight
<< " kg" << endl;
// Name: Test Student
// Age: 18 years
// Weight: 70.5 kg
Слайд 14

Определение структуры Важно: определение структуры не создает никаких переменных, а лишь задает внутреннюю организацию структурных переменных.

Определение структуры

Важно: определение структуры не создает никаких переменных, а лишь задает

внутреннюю организацию структурных переменных.
Слайд 15

Определение структурной переменной Пример: Human student; Под структурную переменную выделяется столько

Определение структурной переменной

Пример:
Human student;
Под структурную переменную выделяется столько памяти, сколько достаточно

для хранения всех ее полей.
В некотором приближении, можно считать структуру новым типом данных. Одна из целей C++ - сделать работу с пользовательскими типами данных максимально простой.
Слайд 16

Доступ к полям структуры Для доступа к полям используется операция точки

Доступ к полям структуры

Для доступа к полям используется операция точки (операция

доступа к полю структуры):
student.name = "Test Student";
cout << "Name: " << student.name << endl;
Слайд 17

Инициализация полей структуры int main() { Human student{"Test Student", 18, 70.5};

Инициализация полей структуры

int main() {
Human student{"Test Student", 18, 70.5};
cout

<< "Name: " << student.name << endl;
cout << "Age: " << student.age << " years" << endl;
cout << "Weight: " << student.weight << " kg" << endl;
// Name: Test Student
// Age: 18 years
// Weight: 70.5 kg
Human copy_of_student;
copy_of_student = student;
// cout ...
}
Слайд 18

Инициализация полей структуры Human student{"Test Student"}; cout cout cout // Test

Инициализация полей структуры

Human student{"Test Student"};
cout << student.name << endl;
cout <<

student.age << endl;
cout << student.weight
<< endl;
// Test Student
// 0
// 0

struct Human {
string name;
int age = 18;
float weight = 0;
};
Human student{"Test Student"};
cout << student.name << endl;
cout << student.age << endl;
cout << student.weight
<< endl;
// Test Student
// 18
// 0

Слайд 19

Вложенные структуры struct Distance { int m; int cm; }; struct

Вложенные структуры

struct Distance {
int m;
int cm;
};
struct Room {
Distance

width;
Distance height;
};

int main() {
Room kitchen;
kitchen.width.m = 2;
kitchen.width.cm = 22;
kitchen.height.m = 5;
kitchen.height.cm = 55;
}

Слайд 20

Вложенные структуры int main() { Room kitchen{{2, 22}, {5, 55}}; cout

Вложенные структуры

int main() {
Room kitchen{{2, 22}, {5, 55}};
cout <<

"Width: " << kitchen.width.m << " m «
<< kitchen.width.cm << " cm\n";
cout << "Height: " << kitchen.height.m << " m «
<< kitchen.height.cm << " cm\n";
// Width: 2 m 22 cm
// Height: 5 m 55 cm
}
Слайд 21

Структуры и функции void print_distance(Distance dist) { cout } int main()

Структуры и функции

void print_distance(Distance dist) {
cout << dist.m << "

m " << dist.cm << " cm\n";
}
int main() {
Distance width{1, 10};
print_distance(width);
}
Слайд 22

Вопрос void double_distance(Distance dist) { dist.m *= 2; dist.cm *= 2;

Вопрос

void double_distance(Distance dist) {
dist.m *= 2;
dist.cm *= 2;
if

(dist.cm > 100) {
dist.m++;
dist.cm -= 100;
}
}
int main() {
Distance width{1, 10};
double_distance(width);
print_distance(width); // ?
}
Слайд 23

Исправленный вариант #1 void double_distance(Distance& dist) { dist.m *= 2; dist.cm

Исправленный вариант #1

void double_distance(Distance& dist) {
dist.m *= 2;
dist.cm *=

2;
if (dist.cm > 100) {
dist.m++;
dist.cm -= 100;
}
}
int main() {
Distance width{1, 10};
double_distance(width);
print_distance(width); // 2 m 20 cm
}
Слайд 24

Указатели и структуры Distance* width, dist{10, 99}; width = &dist; print_distance(*width);

Указатели и структуры

Distance* width, dist{10, 99};
width = &dist;
print_distance(*width); // 10 m

99 cm
(*width).m = 1; // dist.m = 1
(*width).cm = 10; // dist.cm = 10
print_distance(*width); // 10 m 99 cm
width->m = 5;
width->cm = 55;
print_distance(*width); // 5 m 55 cm
Слайд 25

Исправленный вариант #2 void double_distance(Distance* dist) { dist->m *= 2; dist->cm

Исправленный вариант #2

void double_distance(Distance* dist) {
dist->m *= 2;
dist->cm *=

2;
if (dist->cm >= 100) {
dist->m++;
dist->cm -= 100;
}
}
int main() {
Distance dist{10, 99};
double_distance(&dist);
print_distance(dist); // 2 m 20 cm
}
Слайд 26

Исправленный вариант #2.1 void double_distance(Distance* dist) { dist->m *= 2; dist->cm

Исправленный вариант #2.1

void double_distance(Distance* dist) {
dist->m *= 2;
dist->cm *=

2;
if (dist->cm >= 100) {
dist->m++;
dist->cm -= 100;
}
}
int main() {
Distance* width;
width->m = 1; width->cm = 10;
double_distance(width);
print_distance(*width); // 2 m 20 cm
}
Слайд 27

Структуры и функции Distance add(Distance dist_1, Distance dist_2) { Distance sum;

Структуры и функции

Distance add(Distance dist_1, Distance dist_2) {
Distance sum;
sum.m

= dist_1.m + dist_2.m; sum.cm = dist_1.cm + dist_2.cm;
if (sum.cm >= 100) {
sum.m++; sum.cm -= 100;
}
return sum;
}
int main() {
Distance width{1, 10};
Distance d_1{1, 99};
Distance d_2{2, 2};
print_distance(add(d_1, d_2)); // 4 m 1 cm
}
Слайд 28

Функции в структурах struct Distance { int m; int cm; void

Функции в структурах

struct Distance {
int m;
int cm;
void print()

{
cout << m << " m " << cm << " cm\n";
}
void scale(float coef) {
m *= coef; cm *= coef;
if (cm >= 100) {
m++; cm -= 100;
}
};
};
Слайд 29

Функции в структурах struct Distance { int m; int cm; void

Функции в структурах

struct Distance {
int m; int cm;
void print()

{/* ... */};
void scale(float coef) {/* ... */};
};
int main() {
Distance dist{1, 10};
dist.print();
dist.scale(2);
dist.print();
}
Слайд 30

Функции в структурах struct Distance { int m; int cm; void

Функции в структурах

struct Distance {
int m; int cm;
void print();

void scale(float coef);
};
void Distance::print() {
cout << m << " m " << cm << " cm\n";
}
void Distance::scale(float coef) {
m *= coef; cm *= coef;
if (cm >= 100) {
m++;
cm -= 100;
}
}
Слайд 31

Функции в структурах struct Distance { int m; int cm; void

Функции в структурах

struct Distance {
int m; int cm;
void print();

void scale(float coef);
};
void Distance::print() {
cout << this->m << " m " << this->cm << " cm\n";
}
void Distance::scale(float coef) {
this->m *= coef; this->cm *= coef;
if (this->cm >= 100) {
this->m++;
this->cm -= 100;
}
}
Слайд 32

Функции в структурах struct Distance { int m; int cm; void

Функции в структурах

struct Distance {
int m; int cm;
void print();

void scale(float coef);
};
int main() {
Distance dist{1, 10};
dist.print();
dist.scale(2);
dist.print();
}
Слайд 33

this #1

this #1

Слайд 34

this #2

this #2

Слайд 35

Массивы структур int main() { Distance distances[5]; for (int i=0; i

Массивы структур

int main() {
Distance distances[5];
for (int i=0; i <

5; i++) {
cout << "Enter distance" << endl;
cin >> distances[i].m >> distances[i].cm;
}
for (int i=0; i < 5; i++) {
distances[i].print();
}
}
Слайд 36

Перечисления Перечисления используются в тех случаях, когда переменные создаваемого типа могут

Перечисления

Перечисления используются в тех случаях, когда переменные создаваемого типа могут принимать

заранее известное конечное (и, как правило, небольшое) множество значений.
Перечисления обычно считаются гораздо менее полезными по сравнению со структурами и используются относительно редко.
Слайд 37

Перечисления enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; int

Перечисления

enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
int main()

{
days_of_week day_1, day_2;
day_1 = Mon;
day_2 = Fri;
cout << "Difference in days: " << day_2 - day_1 << endl;
// Difference in days: 4
if (day_1 > day_2)
cout << "Monday before Friday" << endl;
else
cout << "Friday before Monday" << endl;
// Friday before Monday
}
Слайд 38

Перечисления

Перечисления

Слайд 39

Примеры перечислений enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

Примеры перечислений

enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
enum

months {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
enum suit {clubs = 1, diamonds, hearts, spades};
Слайд 40

Пример вопроса на экзамене Объекты класса string: Заканчиваются нулевым символом Могут

Пример вопроса на экзамене

Объекты класса string:
Заканчиваются нулевым символом
Могут быть скопированы с

операцией присваивания
Не требуют управления памятью
Не имеют методов класса
Слайд 41

Пример вопроса на экзамене

Пример вопроса на экзамене

Слайд 42

Пример задачи на экзамене Прочитать из стандартного ввода заранее неизвестное число

Пример задачи на экзамене

Прочитать из стандартного ввода заранее неизвестное число строк.

Поместить их в массив и найти самую длинную и самую короткую строку.