0.96M
Category: programmingprogramming

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

1.

Основы алгоритмизации и
программирования
Пашук Александр Владимирович
[email protected]

2.

Мем в начале

3.

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

4.

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

5.

Класс 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 << "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 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, 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 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 = "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!";
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 и т.д.).
• Переменные, входящие в состав структуры
называются полями структуры.
• Синтаксис структур фактически идентичен
синтаксису
классов.
Основное
отличие:
структуры используются для объединения
данных, а классы – в качестве объединения
данных и функций.

13.

Простая структура
struct Human {
Human student;
string name;
student.name = "Test Student";
int age;
student.age = 18;
float weight;
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;
Под структурную переменную выделяется столько
памяти, сколько достаточно для хранения всех ее
полей.
В некотором приближении, можно считать структуру
новым типом данных. Одна из целей C++ - сделать
работу с пользовательскими типами данных
максимально простой.

16.

Доступ к полям структуры
Для доступа к полям используется операция точки
(операция доступа к полю структуры):
student.name = "Test Student";
cout << "Name: " << student.name << endl;

17.

Инициализация полей
структуры
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 << 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 main() {
int m;
Room kitchen;
int cm;
};
kitchen.width.m = 2;
kitchen.width.cm = 22;
struct Room {
kitchen.height.m = 5;
Distance height;
kitchen.height.cm = 55;
};
Distance width;
}

20.

Вложенные структуры
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 << 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;
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 *= 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); // 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;
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;
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;
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 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 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 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 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 print();
void scale(float coef);
};
int main() {
Distance dist{1, 10};
dist.print();
dist.scale(2);
dist.print();
}

33.

this #1

34.

this #2

35.

Массивы структур
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 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 months {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug,
Sep, Oct, Nov, Dec};
enum suit {clubs = 1, diamonds, hearts, spades};

40.

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

41.

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

42.

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

43.

Мем в конце
English     Русский Rules