- •Издано в рамках Инновационной образовательной программы ннгу: Образовательно-научный центр «Информационно-телекоммуникационные системы: физические основы и математическое обеспечение»
- •Глава 1. Основные понятия 13
- •Глава 3. Работа с числовыми данными 42
- •Глава 4. Операторы. Ключевые слова 52
- •Глава 5. Управление и циклы 64
- •Глава 6. Массивы 77
- •Глава 7. Функции 84
- •Глава 8. Символы и строки 102
- •Глава 9. Препроцессор 113
- •Глава 10. Указатели и ссылки 119
- •Глава 11. О файлах и командной строке 133
- •Глава 12. Работа с экраном дисплея 145
- •Глава 13. Внутреннее представление чисел 157
- •Глава 14. Структуры, перечисления, объединения 179
- •Глава 15. Классы 204
- •Глава 16. Программы из нескольких файлов 233
- •Глава 21. Шаблоны, исключения 321
- •Предисловие
- •Глава 1.Основные понятия
- •1.1.Элементы языка программирования
- •Алфавит
- •Лексемы
- •Выражения
- •Функции
- •Комментарии
- •1.2.Процесс создания программы
- •1.3.Первая программа Программа 1. Приветствие
- •1.4.Состав программы
- •Загрузка
- •Работа с окнами
- •Настройка среды
- •Указание каталогов библиотек
- •Подключение графической библиотеки
- •Назначение текущего каталога
- •Работа с блоками текста в редакторе
- •Выполнение программы
- •Отладка программ
- •Программа 2. Деление чисел
- •Синтаксические ошибки
- •Ошибки в процессе работы программы
- •Трассировка программ
- •Просмотр текущих значений выражений
- •Разработка консольных приложений
- •Программа 3. Hello
- •Выполнение и отладка программы
- •Файлы проекта
- •Автоматическая генерация кода
- •Особенности ввода и вывода
- •Глава 3.Работа с числовыми данными
- •3.1.Целые типы
- •Целые константы
- •Программа 4. Операции над целыми
- •3.2.Числа с плавающей точкой
- •Плавающие константы
- •3.3.Ввод и вывод чисел
- •Программа 5. Точность плавающих чисел
- •3.4.Логический тип и логические операции
- •3.5.Математические функции
- •Глава 4.Операторы. Ключевые слова
- •4.1.Операторы
- •Унарные операторы
- •Бинарные операторы
- •Оператор запятая
- •Условное выражение
- •Операторы присваивания
- •4.2.Приоритеты операторов
- •4.3.Ключевые слова
- •Продолжение таблицы 23. Ключевые слова стандарта языка Cи
- •4.4.Структура программы
- •Объявления переменных
- •Объявления и определения
- •Инструкции и блоки
- •4.5.Константы
- •Задачи 1-17 . Простейшие вычисления
- •Глава 5.Управление и циклы
- •5.1.Условный оператор
- •Программа 6. Максимальное из двух чисел
- •5.2.Операторы цикла
- •Цикл с предусловием while
- •Программа 7. Суммирование цифр целого
- •Цикл for
- •Программа 8. Поиск максимума и минимума
- •Цикл do-while
- •Программа 9. Вычисление квадратного корня
- •5.3.Переключатель
- •Программа 10. День недели
- •5.4.Операторы break и continue
- •Программа 11. Сумма положительных чисел
- •Задачи 18-52. Выбор и циклы
- •Глава 6.Массивы
- •6.1.Одномерные массивы
- •Программа 12. Проверка упорядоченности массива
- •6.2.Двумерные массивы
- •Программа 13. Подсчет выручки
- •Задачи 53-69. Одно- и двумерные массивы
- •Глава 7.Функции
- •7.1.Определение функции
- •7.2.Формальные параметры и фактические аргументы
- •Пpограмма.14. Степени целых чисел
- •7.3.Автоматические и статические переменные
- •Программа 15. Автоматические и статические переменные
- •7.4.Прототипы функций
- •7.5.Массивы как аргументы функций
- •7.6.Внешние переменные
- •Программа 16. Сортировка массива
- •7.7.Рекурсия
- •Программа 17. Рекурсивная печать целого
- •7.8.Перегруженные имена функций
- •Программа 18. Перегрузка функций
- •7.9.Аргументы функций по умолчанию
- •Программа 19. Аргументы по умолчанию
- •Задачи 70-96. Функции
- •Глава 8.Символы и строки
- •8.1.Символы
- •Символьные константы
- •Программа 20. Представления символов
- •Ввод и вывод символов
- •Программа 22. Печать текста по словам
- •8.2.Строки символов
- •Строковые константы
- •Ввод и вывод строк
- •Средства работы со строками
- •Программа 23. Реверсирование строк
- •Задачи 97-121. Символы и строки
- •Глава 9.Препроцессор
- •9.1.Директивы препроцессора
- •9.2.Макросы
- •Программа 24. Возможности препроцессора
- •Задачи 122-124. Макросы
- •Глава 10.Указатели и ссылки
- •10.1.Указатели и адреса
- •Программа 25. Расчет треугольника
- •10.2.Указатели и массивы
- •10.3.Адресная арифметика
- •10.4.Символьные указатели
- •10.5.Массивы указателей
- •Программа 26. Названия месяцев
- •10.6.Указатели на функции
- •Программа 27. Поиск максимума функции
- •10.7.Ссылки
- •Программа 28. Использование ссылок
- •10.8.Операторы new и delete
- •Программа 29. Выделение и освобождение памяти
- •Задачи 125-134. Указатели и ссылки
- •Глава 11.О файлах и командной строке
- •11.1.Знакомство с файлами
- •Программа 30. Копирование файлов
- •11.2.Командная строка
- •11.3.Перенаправление стандартного ввода и вывода на файл
- •11.4.Аргументы командной строки
- •Программа 31. Эхо аргументов командной строки
- •Программа 32. Печать строк, содержащих образец
- •Задачи 135-147. Файлы и командная строка
- •Глава 12.Работа с экраном дисплея
- •12.1.Текстовый режим
- •Программа 33. Российский флаг
- •12.2.Графический режим
- •Графические драйверы и режимы
- •Инициализация графики
- •Функции рисования
- •Программа 34. Звезда
- •Задачи 148-158. Работа с экраном
- •Глава 13.Внутреннее представление чисел
- •13.1.Двоичная система счисления
- •13.2.Беззнаковые целые
- •13.3.Двоичный дополнительный код
- •13.4.Двоичный код с избытком
- •13.5.Побитовые операторы
- •Программа 35. Побитовые операторы
- •13.6.Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8.Преобразование типов
- •Значения логических выражений
- •Арифметические преобразования
- •Преобразование при присваивании
- •Явное приведение типа
- •Задачи 159-166. Побитовые операторы
- •Глава 14.Структуры, перечисления, объединения
- •14.1.Объявление структур
- •14.2.Структуры и функции
- •14.3.Указатели на структуры
- •Программа 36. Точки и прямоугольники на экране
- •14.4.Массивы структур
- •Программа 37. Подсчет ключевых слов
- •14.5.Перечисления
- •Программа 38. Использование перечислений
- •14.6. Объединения
- •Программа 39. Внутреннее представление float
- •14.7.Битовые поля
- •14.8.О бинарных файлах
- •Программа 40. Анализ успеваемости
- •Задачи 167-174. Структуры
- •Глава 15.Классы
- •Программа 41. Время как структура
- •15.2.Встроенные функции
- •15.3.Классы. Скрытие данных
- •Программа 42. Класс дат
- •15.4.Конструкторы
- •Программа 43. Конструкторы в классе дат
- •15.5.Статические члены класса
- •Программа 44. Размер класса и объектов класса
- •15.6.Друзья класса
- •Программа 45. Статические члены и друзья класса
- •15.7.Копирование объектов класса
- •Программа 46. Копирование объектов
- •15.8.Управление доступом
- •Структуры и классы
- •Правила доступа
- •15.9.Ссылка на себя
- •Программа 47. Модификация дат
- •15.10.Деструкторы
- •Программа 48. Деструктор в классе дат
- •Программа 49. Многоугольники
- •Задачи 175-185. Работа с классами
- •Глава 16.Программы из нескольких файлов
- •16.1.Работа с проектами
- •16.2.Область действия имен
- •Программа 50. Глобальные и локальные имена
- •Статические имена
- •Программа 51. Сумматор чисел
- •16.3.Заголовочные файлы
- •Страж включения
- •Понятие стека
- •Программа 52. Реализация стека в виде массива
- •16.4.Пространства имен
- •Стандартные пространства имен
- •Задачи 186-189. Работа со стеком
- •Глава 17.Перегрузка операторов
- •Программа 53. Обыкновенные дроби
- •17.1.Правила перегрузки операторов
- •Программа 54. Комплексные числа
- •Задачи 190-196. Перегрузка операторов
- •Глава 18.Конструктор копирования и оператор присваивания
- •18.1.Проблемы при копировании
- •Программа 55. Вектора на плоскости
- •Задачи 197-198. Конструктор копирования
- •Глава 19.Ввод и вывод
- •19.1.Вывод
- •19.2.Ввод
- •19.3.Ввод и вывод определяемых пользователем типов
- •Программа 56. Перегрузка операторов ввода/вывода
- •19.4.Работа с файлами
- •Программа 57. Сравнение текстового и бинарного файлов
- •Задачи 199-202. Ввод и вывод
- •Глава 20.Взаимоотношения классов
- •20.1.Объекты как члены класса
- •20.2.Конструкторы встроенных типов
- •Программа 58. Личные данные
- •20.3.Наследование
- •Пример наследования
- •Программа 59. Наследование
- •Управление доступом при наследовании
- •Наследование и конструкторы
- •Программа 60. Производный класс личных данных
- •20.4. Виртуальные функции
- •Программа 61. Невиртуальные функции
- •Программа 62. Виртуальные функции
- •20.5.Абстрактные классы
- •Программа 63. Абстрактный класс фигур
- •Вызов виртуальных функций
- •20.6. Совместимость типов
- •20.7.Множественное наследование
- •Программа 64. Системы уравнений Класс алгебраических векторов Vector
- •Класс прямоугольных матриц
- •Объявление класса Matrix
- •Реализация класса Matrix
- •Класс систем линейных уравнений
- •Пример использования классов
- •Задачи 203-212. Наследование классов
- •Глава 21.Шаблоны, исключения
- •21.1.Шаблоны
- •21.2.Шаблоны функций
- •Программа 65. Объявление и определение шаблона функции
- •21.3.Классы и шаблоны
- •Программа 66. Шаблон классов векторов
- •Программа 67. Шаблон классов динамических массивов
- •21.4.Обработка исключений
- •Программа 68. Расчет нод
- •21.5.Стандартная библиотека шаблонов
- •Программа 69. Использование шаблона векторов
- •Литература
- •Предметный указатель
- •603950, Н. Новгород, пр. Гагарина, 23
- •603000, Н. Новгород, ул. Б. Покровская, 37.
Программа 55. Вектора на плоскости
В
данной программе используется графика
TC.
Разработаем класс, моделирующий вектора на плоскости. Под вектором будем понимать направленный отрезок, откладываемый от начала координат, рис.Error: Reference source not found.
В класс должны входить координаты конца вектора и строка с его именем. Предусмотрим в классе функции-операторы для сложения, вычитания векторов, получения противоположного вектора, умножения вектора на число и функцию изображения вектора. Функция изображения должна рисовать отрезок, стрелку, обозначающую конец вектора, и выводить имя вектора. При операциях над векторами следует формировать новое имя для результирующего вектора, например, имя для суммы векторов a и b должно быть a+b.
На рис.Error: Reference source not found показана математическая плоскость, вектор OM и стрелка на его конце. Для рисования лепестков стрелки нужно соединить точку M с точками M1 и M2. Если известны координаты x, y конца вектора, то координаты точек M1 и M2 можно вычислить по формулам:
Здесь l – длина лепестка стрелки, δ = α-β, γ = α+β, α – угол между вектором и осью x, β – угол отклонения лепестков стрелки от вектора.
При изображении вектора нужно принять некоторую точку экрана за начало отсчета. Сделаем координаты этой точки статическими членами класса. Кроме этого, статическими членами сделаем длину лепестка стрелки l и угол отклонения лепестка β.
Объявление класса поместим в заголовочном файле Bivect.h:
// Файл Bivect.h
#ifndef BIVECTH
#define BIVECTH
class Bivect
{
double x, y; // Координаты вектора
char *name; // Имя вектора
static int xc, yc; // Координаты центра экрана
static int l; // Длина лепестков стрелки
static double beta; // Угол отклонения в радианах
public:
Bivect () // Конструктор по умолчанию
{ x = 0; y = 0; name = 0;} // создает нулевой вектор без названия
Bivect (float x, float y, char *s); // Конструктор
Bivect(Bivect&); // Конструктор копирования
~Bivect() // Деструктор освобождает
{ delete[] name; } // память, занимавшуюся именем
// SetStaticParam: установка статических членов класса.
// Угол bt в градусах
static void SetStaticParam(int xci, int yci, int len, double bt);
Bivect& operator=(Bivect &a); // Оператор присваивания
Bivect operator+(Bivect &a); // Сумма
Bivect operator-(Bivect &a); // Разность
Bivect operator*(double); // Умножение вектора на число
friend Bivect operator*(double, Bivect&); // Умножение числа на вектор
Bivect operator-(); // Противоположный вектор
void Show(int color = 10); // Рисование вектора на экране
private:
void Arrow(); // Изображает стрелку на конце вектора
};
# endif
Функция Arrow(), которая делает необходимые вычисления и изображает лепестки стрелки, сделана закрытой, так как ее будет вызывать только метод класса Show().
Функция умножения числового коэффициента на вектор объявлена с ключевым словом friend (друг), чтобы она имела доступ к закрытым членам класса. Данная функция не может быть членом класса, так как ее первый аргумент не член класса.
Реализацию методов класса поместим в файл Bivect.cpp:
// Файл Bivect.cpp
# include "Bivect.h"
# include <graphics.h>
# include <string.h>
# include <math.h>
#include <stdlib.h>
Bivect::Bivect(float x0, float y0, char *nm) // Конструктор
{ // x0, y0 - координаты, nm - имя вектора
x = x0; y = y0;
name = new char[strlen(nm) + 1]; // Выделение памяти под имя
strcpy(name, nm); // Копирование имени
}
Bivect::Bivect(Bivect& b) // Конструктор копирования
{
x = b.x; y = b.y; // Копируем координаты
name = new char[strlen(b.name) + 1]; // Выделение памяти под имя
strcpy(name, b.name); // Копирование имени
}
// SetStaticParam: установка статических переменных класса.
// Угол bt задается в градусах
void Bivect::SetStaticParam(int xci, int yci, int len, double bt)
{
xc = xci; yc = yci; l = len;
beta = bt * M_PI / 180;
}
Bivect& Bivect::operator=(Bivect &b) // Оператор присваивания
{
if (this != &b){ // Если не присваивание самому себе
delete name; // Освобождение старой памяти
name = new char [strlen(b.name)+1]; // Выделение памяти под имя
if (name) // Если удалолсь выделить память
strcpy(name, b.name); // Копирование имени
x = b.x; // Присваивание координат
y = b.y;
}
return *this; // Возвращение обновленного вектора
}
Bivect Bivect::operator+(Bivect &b) // Суммирование векторов
{
// Временный массив для имени суммы
char *tmp = new char[strlen(name) + 2 + strlen(b.name)];
strcpy(tmp, name); // Формирование имени нового
strcat(tmp, "+"); // вектора из двух имен,
strcat(tmp, b.name); // соединенных знаком '+'
Bivect sum(x + b.x, y + b.y, tmp); // Создание нового вектора
delete[] tmp; // Удаление временной строки
return sum; // Возвращение созданного вектора
}
Bivect Bivect::operator-(Bivect &b) // Вычитание векторов
{
// Временный массив для имени разности
char *tmp = new char[strlen(name) + 2 + strlen(b.name)];
strcpy(tmp, name); // Формирование имени нового
strcat(tmp, "-"); // вектора из двух имен,
strcat(tmp, b.name); // соединенных знаком '-'
Bivect diff(x - b.x, y - b.y, tmp); // Создание нового вектора
delete[] tmp; // Удаление временной строки
return diff; // Возвращение созданного вектора
}
Bivect Bivect::operator*(float k) // Умножение вектора на число
{
char factor[10]; // Место для числового множителя
gcvt(k, 3, factor); // Преобразование числа в строку
// Память под имя произведения
char *tmp = new char[strlen(factor) + 2 + strlen(name)];
strcpy(tmp, factor); // Копируем сомножитель
strcat(tmp, " "); // Добавляем пробел
strcat(tmp, name); // Добавляем название вектора
Bivect prnmb(k * x, k * y, tmp); // Создание вектора-произведения
delete[] tmp;
return prnmb;
}
Bivect operator*(float k, Bivect& a) // Умножение числа на вектор
{
return a * k; // Используем оператор умножения вектора на число
}
Bivect Bivect::operator-() // Противоположный вектор
{
Bivect b; // Нулевой вектор без названия
return b - *this; // Из нулевого вектора вычитаем данный
}
void Bivect::Show(int color) // Функция рисования вектора на экране
{
int c = getcolor(); // Запоминаем текущий цвет рисования
setcolor(color); // Установить новый цвет рисования
line(xc, yc, xc + x, yc - y); // Рисуем отрезок
Arrow(); // со стрелкой
int xt = 2, yt = 2; // Нахождение отступа
if(x <= 0) xt = -6; // от конца вектора
if(y >= 0) yt = -10; // для вывода названия
outtextxy(xc + x + xt, yc - y + yt, name); // Вывод названия
setcolor(c); // Восстановление прежнего цвета рисования
}
// Round: округляет x до ближайшего целого
int Round(double x)
{
return x - int(x) > 0.5 ? int(x)+1: int(x);
}
void Bivect::Arrow() // Стрелка для вектора
{
double x1, y1, x2, y2;
double alpha = atan2(y, x);
double delta = alpha - beta;
double gamma = alpha + beta;
x1 = x - l * cos(delta); // Координаты конца
y1 = y - l * sin(delta); // первого лепестка
// Первая часть стрелки
line(Round(xc + x), Round(yc - y), Round(xc + x1), Round(yc - y1));
x2 = x - l * cos(gamma); // Координаты конца
y2 = y - l * sin(gamma); // второго лепестка
// Вторая часть стрелки
line(Round(xc + x), Round(yc - y), Round(xc + x2), Round(yc - y2));
}
Напишем небольшую программу для испытания разработанного класса, поместим ее в файле MnBivect.cpp:
// Файл MnBivect.cpp
# include "Bivect.h"
# include <conio.h>
// Определение статических членов класса Bivect
int Bivect::xc, Bivect::yc, Bivect::l;
double Bivect::beta;
void main()
{
int gd = DETECT, gm;
// Определение объектов класса Bivect
Bivect a(-80, 60, "a"), c, b(-100, -100, "b");
initgraph(&gd, &gm, "d:\\Programs\\BorlandC\\BGI");
// Установка значений статических переменных
Bivect::SetStaticParam(getmaxx() / 2, getmaxy() / 2, 12, 15);
line (10, getmaxy() / 2, getmaxx(), getmaxy() / 2); // Ось OX
line (getmaxx() / 2, 10, getmaxx() / 2, getmaxy()); // Ось OY
a.Show(GREEN); // Рисуем зелёный вектор a
getch();
b.Show(BLUE); // Рисуем синий вектор b
getch();
c = a + b; // Сумма векторов
c.Show(YELLOW); // Рисуем сумму a и b
getch();
c = a - b; // Разность векторов
c.Show(RED); // Рисуем разность a и b
getch();
c = -b; // Противоположный вектор
c.Show(WHITE); // Вектор, противоположный вектору b
getch();
a = -1.5 * a; // Изменение вектора a
a.Show();
getch();
closegraph(); // Переход в текстовый режим
}
Рис.78. Действия над векторами
