Д.з. на 3 марта Язык С++ - занятие 51. Задача 4: top class stack { … int & top() { return stk[size -1 ]; } … }; // Пример вызова: stack s; … s.top() =

Презентация:



Advertisements
Похожие презентации
Д.з. 1. Задача 1: order // Вспомогательная функция: // Упорядочиваем два числа void order(int& x, int& y) { if (x > y) { int tmp = x; x = y; y = tmp;
Advertisements

Д.з. 1. Задача 3: список struct list { int val; list* next; list(int val_, list* next_) : val(val_), next(next_) {} }; void print(const list* p) { while.
Д.з. на 17 марта Язык С++ - занятие 61. Задача 2: фигуры // shape - общий интерфейс для // фигур class shape { protected: int x, y; public: shape(int.
Д.з. на 3 марта Язык С++ - занятие 41Д.з. на 3 марта Язык С++ - занятие 41.
Д.з Язык С++ - занятие 31. Задача 1: 1/1 + 1/3 + 1/5 … #include using namespace std; int main() { int n; cin >> n; double sum = 0;// Сумма for.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Д.з. на 31 марта Язык С++1Д.з. на 31 марта Язык С++1.
Наследование time time_with_sec В чем преимущества наследования? Наследование кода – поля, метод inc Появилось два класса с которыми точно можно обращаться.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Конструкторы и Деструкторы Конструкторы - функции, явно предназначенные для инициализации объектов Деструкторы - функция обратная конструктору для обеспечения.
Обработка исключений Основы метапрограммированияОбработка исключений Основы метапрограммирования.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
ООП Классы Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Д.з. на 7 апреля Язык С++1. Задача 1: * и *= для rational class rational { int num, den; public: rational(int num_=0, int den_=1) : num(num_), den(den_)
Прикладное программирование кафедра прикладной и компьютерной оптики Наследование.
C++ - занятие Язык С++ - занятие 21. Какие типы вы бы использовали? age // возраст salary // зарплата за месяц (в рублях) grade// средний.
Транксрипт:

Д.з. на 3 марта Язык С++ - занятие 51

Задача 4: top class stack { … int & top() { return stk[size -1 ]; } … }; // Пример вызова: stack s; … s.top() = 5; s.top()++; Язык С++ - занятие 52

Задача 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

Д.з. на 10 марта Язык С++ - занятие 54

Задача 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

Задача 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..

Задача 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);

Задача 3: список (продолжение) void add(list* & p, int v) { p = new list(p, v); } // Пример вызова list* first = 0; for (int i = 0; i

Еще про наследование Язык С++ - занятие 59

Когда используется то, что функция виртуальная? 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

Когда используется то, что функция виртуальная? (Продолжение) 4. Метод в базовом классе class time { … void my_print() { cout

Можно ли конструктор обьявлять virtual? Нет! Когда нужна виртуальная функция? Неизвестен тип обьекта: … p->print(); // На что указывает p? Для конструктора: time t; p = new time(); Тип всегда известен (Но есть понятиевиртуальный конструктор – но это просто такой прием программирования) Язык С++ - занятие 412

Можно ли деструктор обьявлять 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

Виртуальные деструкторы - продолжение А как правильно? В определении класса shape:... virtual ~shape() {} … Правило: Есть производные классы лучше определить в базовом классе деструктор (даже пустой), и объявить его виртуальным. или, другими, словами, Не имеет смысл определять виртуальный деструктор, только если для класса вообще не предполагается определять производные классы. Язык С++ - занятие 414

Исключения Язык С++ - занятие 515

Проблемы с обработкой ошибок: int pop() { return stk[--size]; //А если стек } // пуст?! // Вариант с проверкой if (size == 0) {... сообщить об ошибке … } return stk[--size]; 1. cout

Обработка ошибок с помощью исключений int stack::pop() { if ( size

Что можно бросать как исключение? Выражение может быть любого типа throw "Ошибка!"; throw 56; throw time(14, 30); Обычно используют специальные классы. throw my_exception(…какая-то информация об ошибке…); Есть стандартные классы Например, throw std::bad_alloc(); (Подробно, наверное, проходить не будем).

Подробнее о том, как ловить исключения (catch блоки) catch блоков может быть несколько try { … } catch (char* s) { … обработка ошибок для строк … } catch (int i) { … обработка ошибок для int … } Порядок имеет значение! try { … } catch (time* p1) { … } catch (time_with_sect* p2) { … никогда не будет выполняться ! … } catch (…) - ловит все catch (…) { здесь обрабатываем все ошибки }

throw умеет выходить из нескольких функций int stack::pop() { if ( size

Что происходит в момент вызова throw? 1. Выходим из функций и блоков, в которых мы находимся … … пока не найдем try блок с подходящим нам catch блоком 2. После этого выполняется catch блок 3. (Если вообще не нашли подходящего try блока – аварийное завершение программы). 4. Важно: При выходе из функций и блоков вызываются все необходимые деструкторы

Константы Язык С++ - занятие 522

Как определять целые константы? const int n = 100; Можно использовать в массивах, switch и т.д. int a[n]; Язык С++ - занятие 423

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

Константные обьекты 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

Константы и указатели const int* p; Нельзя менять место, на которое указывает указатель *p = 5;// Ошибка int* const p; Нельзя переставлять указатель на другое место *p = 5;// OK p = &i;// Ошибка const int* const p; Ничего нельзя.. Язык С++ - занятие 526

Константы и указатели - продолжение 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

Немного о файлах Язык С++ - занятие 528

Файлы и символы #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

Задачи на 24 марта Язык С++ - занятие 530

Задачи на 24 марта 1.Проверять в конструкторе time корректность параметров. (Например, time t(25, 1); - параметры неправильные). Об ошибке сообщать с помощью исключения. Привести пример обработки этого исключения. 2. Определить структуру (или класс) «двоичное дерево». а. Ввести последовательность чисел, пока не будет введен 0, и создать из них упорядоченное двоичное дерево (дерево поиска). б. Напечатать все числа в вершинах дерева. 3. * В упорядоченном двоичном дереве найти наименьшее положительное число. (Желательно, чтобы программа работала быстро, не перебирая все элементы. Но, если не получится, можно использовать любой алгоритм) 4. Прочитать файл "abc.htm" и сосчитать, сколько в нем символов не считая символов между. Например, если файл содержит: abc fg jk то надо напечатать 7 Язык С++ - занятие 531