- •Экзамен 374 Предварительные рассуждения Вступительное слово
- •Исторические факты
- •Начнем!
- •Проба пера
- •Открытие сохраненного проекта
- •Вывод данных
- •Типы данных
- •Хороший стиль программирования
- •Переменные и константы
- •Практический пример
- •Ввод данных
- •Например:
- •Пример:
- •Арифметические операции с числами
- •Литералы
- •Некоторые примеры
- •Домашнее задание
- •Напишите программу, которая вводит число из трех цифр, разделяет число на отдельные цифры и печатает их отдельно друг от друга с тремя пробелами между ними. Преобразование типов
- •Перечисляемые типы
- •Типичная ошибка
- •Хороший стиль программирования
- •Типичная ошибка
- •Выражения
- •Оператор if
- •Структура программы
- •Логические операции
- •Структура множественного выбора switch
- •Практический пример
- •Цикл for
- •Практический пример
- •Цикл do-while
- •Домашнее задание
- •Вызов функции
- •Прототипы функций
- •Разбор программы
- •Область видимости
- •Аргументы по умолчанию
- •Встраивание
- •Перегрузка функций
- •Учебный пример перегруженных функций. Иллюстрация перегрузки
- •Результат работы программы
- •Практические примеры
- •Домашнее задание
- •Примеры домашней работы урока 1 Пример №1
- •Как работает программа
- •Пример №2
- •Как работает программа
- •Примеры домашних работ на создание функций Пример №1
- •Как работает программа
- •Пример №2
- •Как работает программа
- •Массивы
- •Объявление массивов
- •Примеры использования массивов
- •Программа 1
- •Программа 2
- •Обратите внимание!
- •Типичная ошибка программирования
- •Типичная ошибка программирования
- •Программа 3
- •Типичная ошибка программирования
- •Замечание по технике программирования
- •Программа 4
- •Программа 5
- •Программа нахождения минимального и максимального элементов массива
- •Сортировка массивов
- •Домашнее задание
- •Что такое указатели?
- •За кулисами...
- •Как работать с указателями?..
- •Зачем нужны указатели?
- •Указатели и Массивы.
- •Примеры задач
- •Пример 1
- •Пример 2
- •Пример 3
- •Указатели - аргументы функций.
- •Ссылочные параметры
- •Примеры решения задач
- •Домашнее задание
- •Операторы свободной памяти new и delete
- •Функции работы со строками из библиотеки обработки строк
- •Пример 1.
- •Пример2
- •Пример 3
- •Пример задачи на новый материал
- •Домашнее задание
- •Двухмерные массивы, как частный случай многомерных массивов
- •Программа.
- •Результаты работы программы.
- •Многомерные динамические массивы
- •Пример на многомерные динамические массивы
- •Домашнее задание
- •Рекурсия
- •Рекурсии или итерации
- •Указатели на функции
- •Пример №1
- •Результат выполнения программы:
- •Пример №2
- •Результат выполнения программы
- •Пример №3
- •Результаты выполнения программы
- •Определения структур
- •Пример #1 на использование структур
- •Пример #2 на использование структур
- •Оператор указателя на структуру
- •Домашнее задание
- •Тест по c Группа ___________________ф. И. О. ______________________
- •Объектно-ориентированное программирование.
- •Наследование (Inheritance).
- •Инкапсуляция (Encapsulation).
- •Определение класса
- •Конструкторы и деструкторы Инициализация объектов класса: конструкторы
- •Основное назначение конструкторов - инициализация объектов.
- •Использование конструкторов с аргументами по умолчанию
- •Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
- •Использование деструкторов
- •Когда вызываются конструкторы и деструкторы.
- •Домашнее задание
- •Конструктор копирования
- •Синтаксис конструктора копирования
- •Памятка
- •Пример использования конструктора копирования.
- •Перегруженные конструкторы
- •Экскурс в историю
- •Послесловие к примеру
- •Маленькое замечание
- •Домашнее задание
- •Создание класса ''строка''
- •Перегрузка операций.
- •Общие принципы перегрузки операторов.
- •Преобразования, определяемые классом
- •Пример строкового класса с перегруженными операторами
- •Домашнее задание
- •Дружественные функции (Friend Functions)
- •Пример строкового класса с перегруженными операторами и дружественными функциями
- •Перегрузка операторов new и delete
- •Перегрузка оператора индексирования
- •Класс вектор. Часть1.
- •Класс вектор. Часть 2.
- •Класс вектор. Часть 3.
- •Домашнее задание
- •Наследование (Inheritance). Часть 1.
- •Наследование (Inheritance). Часть 2.
- •Множественное наследование (multiple inheritance)
- •Пример множественного наследования
- •Домашнее задание
- •Статические члены данных
- •Раннее и позднее связывание
- •Виртуальные функции
- •Пример.
- •Абстрактные классы
- •Виртуальный базовый класс
- •Практический пример
- •Домашнее задание
- •Потоки ввода-вывода.
- •Iostream.H: stream - поток, "I" - сокр. Input - ввод, "o" - сокр. Output - вывод.
- •Предопределенные потоки.
- •Операции помещения в поток и извлечения из потока.
- •Файловый ввод-вывод с применением потоков.
- •Конструкторы файловых потоков.
- •Функции для открытия и закрытия файлов.
- •Функции для обмена с потоками.
- •Часто применяемые функции потока.
- •Ввод/вывод массива в/из файл(-а).
- •Практический пример: перекодировка файла.
- •Домашнее задание
- •Немного о файлах...
- •И снова файлы...
- •Пример "Телефонная книга"
- •Файл abonent.H
- •Форматирование данных при обменах с потоками.
- •Состояние потока.
- •Использование аргументов командной строки.
- •Ввод/вывод в с.
- •Домашнее задание
- •Определение шаблонов функций
- •Переопределение шаблонов функций
- •Шаблоны классов
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Введение
- •Обработка исключительных ситуаций
- •Практический пример
- •Программа
- •Домашнее задание
- •Экзамен
Класс вектор. Часть 2.
Итак, Вы уже познакомились с интерфейсом класса ВЕКТОР. Теперь рассмоторим реализацию класса.
#include <iostream.h>
#include <math.h>
#include "Vector.h"
Vector::Vector()
{ // Конструктор по умолчанию
int n;
cout << "Input array size:\t";
cin >> n; // Запрос размерности вектора
while(n <= 0) // Проверка корректности ввода
{
cout << "Input array size:\t";
cin >> n;
}
size = n;
vect = new double[size]; // Создание вектора заданной длины
}
Vector::Vector(int n)
{
size = n;
vect = new double[size]; // Создание вектора заданной длины
}
Vector::Vector(const double* v, int n)
{
size = n;
vect = new double[size];
for(int i = 0; i < size; i++)// Копирование элементов переданного массива
vect[i] = v[i]; // в компоненты вектора
}
Vector::Vector(const Vector& v)
{ // Конструктор копирования
size = v.size;
vect = new double[size];
for(int i = 0; i < size; i++)
vect[i] = v.vect[i];
}
Vector::~Vector()
{ // Деструктор
delete [] vect;
}
Vector& Vector::operator = (const Vector& v)
{ // Перегруженный оператор присваивания
if(&v == this) // Проверка на присваивание объекта
return *this; // самому себе
// Если передан другой объект, то копируем его
delete [] vect;
size = v.size;
vect = new double[size];
for(int i = 0; i < size; i++)
vect[i] = v.vect[i];
return *this;
}
istream& operator >> (istream& is, Vector& v)
{ // Ввод компонент вектора с клавиатуры
for(int i = 0; i < v.size; i++)
{
cout << "Input vect[" << i << "]:\t";
is >> v.vect[i];
}
return is;
}
ostream& operator << (ostream& os, Vector& v)
{ // Вывод вектора на экран
os << "Vector: (";
for(int i = 0; i < v.size; i++)
{
os << v.vect[i];
if(i == v.size - 1)
os << ")\n";
else
os << ", ";
}
return os;
}
double Vector::operator ! ()
{ // Перегруженный оператор ! для
// вычисления длины вектора
double n = 0.0;
for(int i = 0; i < size; i++)
n += vect[i] * vect[i];
return sqrt(n);
}
Vector& Vector::operator ++ ()
{ // Увеличение всех компонент вектора
// на единицу (префикс)
for(int i = 0; i < size; i++)
vect[i]++;
return *this;
}
Vector& Vector::operator -- ()
{ // Уменьшение всех компонент вектора
// на единицу (префикс)
for(int i = 0; i < size; i++)
vect[i]--;
return *this;
}
Vector Vector::operator ++ (int n) // n - фиктивный параметр
{ // Увеличение всех компонент вектора
// на единицу (постфикс)
Vector temp(*this); // Создание временного объекта и
// инициализация его текущим объектом
// (объектом, для которого вызвалась функция)
for(int i = 0; i < size; i++)// Увеличение компонент вектора на единицу
vect[i]++; // (для текущего объекта)
return temp; // Возврат временного объекта
}
Vector Vector::operator -- (int n) // n - фиктивный параметр
{ // Уменьшение всех компонент вектора
// на единицу (постфикс)
Vector temp(*this); // Создание временного объекта и
// инициализация его текущим объектом
// (объектом, для которого вызвалась функция)
for(int i = 0; i < size; i++)// Уменьшение компонент вектора на единицу
vect[i]--; // (для текущего объекта)
return temp; // Возврат временного объекта
}
double& Vector::operator [] (int n)
{ // Перегруженный оператор индексации
// для проверки выхода за границы массива
if(n < 0) // В случае если индекс меньше нуля,
// то возвращаем нулевой элемент массива
{
cout << "Index of array too small:\tuse zeroth element\n";
return vect[0];
}
else if(n > size - 1) // В случае если индекс больше индекса
// последнего элемента массива,
// то возвращаем последний элемент массива
{
cout << "Index of array too big:\tuse last element\n";
return vect[size - 1];
}
else
return vect[n]; // Возврат заданного элемента массива
}
Vector& Vector::operator + ()
{ // Перегруженный унарный +
return *this;
}
Vector Vector::operator - ()
{ // Перегруженный унарный -
Vector temp(*this); // Создание временного объекта и
// инициализация его текущим объектом
// (объектом, для которого вызвалась функция)
for(int i = 0; i < size; i++)
temp.vect[i] = -vect[i];
return temp; // Возврат временного объекта
}
Vector Vector::operator + (const Vector& v)
{ // Сложение двух векторов с помощью
// перегруженного оператора бинарный +
if(size == v.size) // Если размерности векторов совпадают
{
Vector temp(size); // Создание временного объекта
for(int i = 0; i < size; i++)
temp.vect[i] = vect[i] + v.vect[i];
return temp; // Возврат временного объекта
}
else // Если размерности векторов не совпадают
{
cout << "Different arrays sizes !!!\nArray is truncating...\n";
// Урезаем размерность большего вектора
int s = (size < v.size) ? size : v.size;
Vector temp(s); // Создание временного объекта
for(int i = 0; i < s; i++)
temp.vect[i] = vect[i] + v.vect[i];
return temp; // Возврат временного объекта
}
}
Vector Vector::operator + (double d)
{ // Сложение вектора с числом
Vector temp(*this); // Создание временного объекта и
// инициализация его текущим объектом
// (объектом, для которого вызвалась функция)
for(int i = 0; i < size; i++)
temp.vect[i] += d;
return temp; // Возврат временного объекта
}
Vector& Vector::operator += (const Vector& v)
{ // Перегруженный оператор +=
// для сложения двух векторов
*this = *this + v; // Вызов функции this-<operator=(this-<operator+(v));
return *this;
}
Vector& Vector::operator += (double d)
{ // Перегруженный оператор +=
// для сложения вектора с числом
*this = *this + d; // Вызов функции this-<operator=(this-<operator+(d));
return *this;
}
Vector Vector::operator - (const Vector& v)
{ // Вычитание двух векторов с помощью
// перегруженного оператора бинарный -
if(size == v.size) // Если размерности векторов совпадают
{
Vector temp(size); // Создание временного объекта
for(int i = 0; i < size; i++)
temp.vect[i] = vect[i] - v.vect[i];
return temp; // Возврат временного объекта
}
else // Если размерности векторов не совпадают
{
cout << "Different arrays sizes !!!\nArray is truncating...\n";
// Урезаем размерность большего вектора
int s = (size < v.size) ? size : v.size;
Vector temp(s); // Создание временного объекта
for(int i = 0; i < s; i++)
temp.vect[i] = vect[i] - v.vect[i];
return temp; // Возврат временного объекта
}
}
Vector Vector::operator - (double d)
{ // Вычитание числа из вектора
Vector temp(*this); // Создание временного объекта и
// инициализация его текущим объектом
// (объектом, для которого вызвалась функция)
for(int i = 0; i < size; i++)
temp.vect[i] -= d;
return temp; // Возврат временного объекта
}
Vector& Vector::operator -= (const Vector& v)
{ // Перегруженный оператор -=
// для вычитания двух векторов
*this = *this - v; // Вызов функции this-<operator=(this-<operator-(v));
return *this;
}
Vector& Vector::operator -= (double d)
{ // Перегруженный оператор -=
// для вычитания числа из вектора
*this = *this - d; // Вызов функции this-<operator=(this-<operator-(d));
return *this;
}
double Vector::operator * (const Vector& v)
{ // Умножение двух векторов с помощью
// перегруженного оператора бинарное *
double n = 0.0;
if(size == v.size) // Если размерности векторов совпадают
{
for(int i = 0; i < size; i++)
n += vect[i] * v.vect[i]; // Вычисляем произведение
return n; // Возвращаем произведение
}
else // Если размерности векторов не совпадают
{
cout << "Different arrays sizes !!!\nArray is truncating...\n";
// Урезаем размерность большего вектора
int s = (size < v.size) ? size : v.size;
for(int i = 0; i < s; i++)
n += vect[i] * v.vect[i]; // Вычисляем произведение
return n; // Возвращаем произведение
}
}
Vector Vector::operator * (double d)
{ // Умножение вектора на число
Vector temp(*this); // Создание временного объекта и
// инициализация его текущим объектом
// (объектом, для которого вызвалась функция)
for(int i = 0; i < size; i++)
temp.vect[i] *= d;
return temp; // Возврат временного объекта
}
Vector& Vector::operator *= (double d)
{ // Перегруженный оператор *=
// для умножения вектора на число
*this = *this * d; // Вызов функции this-<operator=(this-<operator*(d));
return *this;
}
int Vector::GetSize()
{ // Функция, возвращающая размерность вектора
return size;
}