Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемЗоя Манихина
1 Д.з. на 3 марта Язык С++ - занятие 51
2 Задача 4: top class stack { … int & top() { return stk[size -1 ]; } … }; // Пример вызова: stack s; … s.top() = 5; s.top()++; Язык С++ - занятие 52
3 Задача 5: product // Доп. поля int prod; // Произведение без 0 int num_zero; // Кол-во нулей … stack() : // Инициализация num_zero(0), prod(1), … {} void push(int i) { stk[size++] = i; if (i == 0) { num_zero++; } else { prod *= i; } } int pop() { int res = stk[--size]; if (res == 0) { num_zero--; } else { prod /= res; } return res; } int product() { if (num_zero == 0) { return 0; } else { return prod; } } Язык С++ - занятие 53
4 Д.з. на 10 марта Язык С++ - занятие 54
5 Задача 1: ромб class rhomb { protected: int x, y; // Координаты центра int h, w; // Половина ширины public: // и половина высоты rhomb(int x_, int y_, int h_, int w_); virtual void draw(); virtual ~rhomb() {} }; // Вспомогательная функция, // рисует отрезок void draw_line(int x1, int y1, int x2, int y2) { cout
6 Задача 1: ромб - продолжение class crossed_rhomb : public rhomb { public: crossed_rhomb(int x_, int y_, int h_, int w_); void draw(); }; crossed_rhomb::crossed_rhomb( int x_, int y_, int h_, int w_) : rhomb(x_, y_, h_, w_) {} void crossed_rhomb::draw() { // "Унаследованное" изображение rhomb::draw(); // Еще линии draw_line(x + h, y, x - h, y); draw_line(x, y - h, x, y + h); } // Пример вызова: // Так мы проверим, что виртуальная // функция вызывается правильно rhomb* p = new crossed_rhomb(30, 40, 10, 5); p->draw(); Типичные ошибки: Нет virtual square : public rhomb.. draw(); Типичные ошибки: Нет virtual square : public rhomb..">
7 Задача 3: список struct list { int val; list* next; list(int val_, list* next_) : val(val_), next(next_) {} }; void print(list* p) { while (p != 0) { cout val next; } } // Добавление list* newel = new list; newel->val = v; newel->next = first; first = newel; Или можно короче first = new list(v, first);
8 Задача 3: список (продолжение) void add(list* & p, int v) { p = new list(p, v); } // Пример вызова list* first = 0; for (int i = 0; i
9 Еще про наследование Язык С++ - занятие 59
10 Когда используется то, что функция виртуальная? 1. Доступ через указатель time* p; if (…) p = new time(8, 30); else p = new time_with_sec(8, 30, 15); p->print(); // Тип неизвестен 2. Доступ через параметр- ссылку void my_print(time& t) { cout
11 Когда используется то, что функция виртуальная? (Продолжение) 4. Метод в базовом классе class time { … void my_print() { cout
12 Можно ли конструктор обьявлять virtual? Нет! Когда нужна виртуальная функция? Неизвестен тип обьекта: … p->print(); // На что указывает p? Для конструктора: time t; p = new time(); Тип всегда известен (Но есть понятиевиртуальный конструктор – но это просто такой прием программирования) Язык С++ - занятие 412
13 Можно ли деструктор обьявлять virtual? Да, и почти всегда надо! class shape {... }; class strange_shape : public shape { int* p; stange_shape() { p = new int [100000];... } ~strange_shape() { delete [] p; } }; // Если деструктор // не виртуальный: shape* p;... p = new strange_shape();... delete p; // Вызывается дестр-р // shape, а не strange_shape! // Утечка памяти! Язык С++ - занятие 413
14 Виртуальные деструкторы - продолжение А как правильно? В определении класса shape:... virtual ~shape() {} … Правило: Есть производные классы лучше определить в базовом классе деструктор (даже пустой), и объявить его виртуальным. или, другими, словами, Не имеет смысл определять виртуальный деструктор, только если для класса вообще не предполагается определять производные классы. Язык С++ - занятие 414
15 Исключения Язык С++ - занятие 515
16 Проблемы с обработкой ошибок: int pop() { return stk[--size]; //А если стек } // пуст?! // Вариант с проверкой if (size == 0) {... сообщить об ошибке … } return stk[--size]; 1. cout
17 Обработка ошибок с помощью исключений int stack::pop() { if ( size
18 Что можно бросать как исключение? Выражение может быть любого типа throw "Ошибка!"; throw 56; throw time(14, 30); Обычно используют специальные классы. throw my_exception(…какая-то информация об ошибке…); Есть стандартные классы Например, throw std::bad_alloc(); (Подробно, наверное, проходить не будем).
19 Подробнее о том, как ловить исключения (catch блоки) catch блоков может быть несколько try { … } catch (char* s) { … обработка ошибок для строк … } catch (int i) { … обработка ошибок для int … } Порядок имеет значение! try { … } catch (time* p1) { … } catch (time_with_sect* p2) { … никогда не будет выполняться ! … } catch (…) - ловит все catch (…) { здесь обрабатываем все ошибки }
20 throw умеет выходить из нескольких функций int stack::pop() { if ( size
21 Что происходит в момент вызова throw? 1. Выходим из функций и блоков, в которых мы находимся … … пока не найдем try блок с подходящим нам catch блоком 2. После этого выполняется catch блок 3. (Если вообще не нашли подходящего try блока – аварийное завершение программы). 4. Важно: При выходе из функций и блоков вызываются все необходимые деструкторы
22 Константы Язык С++ - занятие 522
23 Как определять целые константы? const int n = 100; Можно использовать в массивах, switch и т.д. int a[n]; Язык С++ - занятие 423
24 enum enum {a, b, c, d}; a=0, b=1, c=2, d=3 enum {a,b,c=10,d,e}; a=0, b=1, c=10,d=11,e=12 enum { n = 100 }; можно задавать имя: enum scale {do, re, mi, fa, sol, la, si}; // do do_ ! Язык С++ - занятие 424
25 Константные обьекты const double pi = ; const time lunch_time(12, 50); const int a[9] = {7, 9, 11, 13, 15, 19, 22, 28, 48}; Мы обещаем не менять объект Компилятор нас проверит (не даст нам менять) Если мы очень захотим, мы сможем обойти Иногда компилятор будет запрещать что-то сделать потому что это может привести к изменению const Компилятор может что-то оптимизировать Может быть, разместит в особой памяти Может быть, подставит при компиляции значение i += a[ 2 ]; i += 11 ; Язык С++ - занятие 525
26 Константы и указатели const int* p; Нельзя менять место, на которое указывает указатель *p = 5;// Ошибка int* const p; Нельзя переставлять указатель на другое место *p = 5;// OK p = &i;// Ошибка const int* const p; Ничего нельзя.. Язык С++ - занятие 526
27 Константы и указатели - продолжение const int* p; означает: «Обещаем не менять *p с помощью p». int i; const int* p = &i;// ОК? *p = 5;// Так ошибка i = 5;// А так? // OK! А так можно писать? const int i = 100; int* p = &i; Нет! (Иначе *p = 5; - плохо, испортим константу) На константные переменные могут указывать только const указатели. Язык С++ - занятие 527
28 Немного о файлах Язык С++ - занятие 528
> i; while (f >> i) // Пока нет ошибки // Запись ofstream f1("klm.htm"); f1 c; // Пропускает пробелы и т.д. f.get(c); while (f.get(c)) Запись строк и символов: 'A' – символ "abc" - " title="Файлы и символы #include // Чтение ifstream f("abc.htm"); int i; f >> i; while (f >> i) // Пока нет ошибки // Запись ofstream f1("klm.htm"); f1 c; // Пропускает пробелы и т.д. f.get(c); while (f.get(c)) Запись строк и символов: 'A' – символ "abc" - " class="link_thumb"> 29 Файлы и символы #include // Чтение ifstream f("abc.htm"); int i; f >> i; while (f >> i) // Пока нет ошибки // Запись ofstream f1("klm.htm"); f1 c; // Пропускает пробелы и т.д. f.get(c); while (f.get(c)) Запись строк и символов: 'A' – символ "abc" - строка "c:\\temp\\abc.htm" Внутри строки: \ \\ Язык С++ - занятие 429 > i; while (f >> i) // Пока нет ошибки // Запись ofstream f1("klm.htm"); f1 c; // Пропускает пробелы и т.д. f.get(c); while (f.get(c)) Запись строк и символов: 'A' – символ "abc" - "> > i; while (f >> i) // Пока нет ошибки // Запись ofstream f1("klm.htm"); f1 c; // Пропускает пробелы и т.д. f.get(c); while (f.get(c)) Запись строк и символов: 'A' – символ "abc" - строка "c:\\temp\\abc.htm" Внутри строки: \ \\ Язык С++ - занятие 429"> > i; while (f >> i) // Пока нет ошибки // Запись ofstream f1("klm.htm"); f1 c; // Пропускает пробелы и т.д. f.get(c); while (f.get(c)) Запись строк и символов: 'A' – символ "abc" - " title="Файлы и символы #include // Чтение ifstream f("abc.htm"); int i; f >> i; while (f >> i) // Пока нет ошибки // Запись ofstream f1("klm.htm"); f1 c; // Пропускает пробелы и т.д. f.get(c); while (f.get(c)) Запись строк и символов: 'A' – символ "abc" - ">
30 Задачи на 24 марта Язык С++ - занятие 530
31 Задачи на 24 марта 1.Проверять в конструкторе time корректность параметров. (Например, time t(25, 1); - параметры неправильные). Об ошибке сообщать с помощью исключения. Привести пример обработки этого исключения. 2. Определить структуру (или класс) «двоичное дерево». а. Ввести последовательность чисел, пока не будет введен 0, и создать из них упорядоченное двоичное дерево (дерево поиска). б. Напечатать все числа в вершинах дерева. 3. * В упорядоченном двоичном дереве найти наименьшее положительное число. (Желательно, чтобы программа работала быстро, не перебирая все элементы. Но, если не получится, можно использовать любой алгоритм) 4. Прочитать файл "abc.htm" и сосчитать, сколько в нем символов не считая символов между. Например, если файл содержит: abc fg jk то надо напечатать 7 Язык С++ - занятие 531
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.