Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

УМП Информационные технологии

.pdf
Скачиваний:
24
Добавлен:
11.05.2015
Размер:
1.4 Mб
Скачать

Таблица 14 Варианты индивидуальных заданий

Задание

1.Класс, реализующий операции с комплексными числами (z=x+iy). Вычислять модуль комплексного числа.

2.Класс, хранящий вершины треугольника (x1, y1; x2, y2 и x3, y3) и производящий вычисление длин его сторон, а также определяющий прямоугольный он или нет.

3.Класс для рисования кругов (хранить радиус R и координаты x,y центра). Вычислять площадь круга и длину окружности.

4.Класс для работы с секундомером. Хранить время и отсчитанное число секунд. Считать секунды до нажатия клавиши, результат переводить в минуты и часы.

5.Класс, хранящий две строки символов s1 и s2. Создать метод, производящий посимвольное сравнение строк и возвращающий строку несовпадений символов.

6.Класс, хранящий 8 бит информации (флагов) в виде битовых полей. Выполнять поразрядное отрицание "~" хранимого байта, а также операции поразрядное И "&", ИЛИ "|" и исключающее ИЛИ "^" с вводимым байтом.

7.Класс, хранящий два целых аргумента (месяц m и день d) и вычисляющий количество дней, прошедших с начала года.

8.Класс, хранящий три целых аргумента (часы h, минуты m и секунды s) и вычисляющий количество секунд, прошедших с начала дня.

9.Класс, хранящий вектор в трехмерном пространстве (x, y, z) и вычисляющий модуль этого вектора.

10.Класс, хранящий дату дня рождения (месяц m и день d) и вычисляющий количество дней, оставшихся до дня рождения от текущей даты (m1, d1)

11.Класс, хранящий координаты точки (x,y) на плоскости. Написать метод, определяющий, в каком квадранте находится точка.

12.Класс, хранящий строку s1 символов. Создать метод, производящий посимвольное сравнение s1 c вводимой строкой s2 и возвращающий строку совпадающих символов, если они есть.

13.Класс, хранящий дату рождения человека. Написать метод, вычисляющий число прожитых дней.

14.Класс, хранящий 8 бит информации – байт флагов b1. Создать методы, выполняющие поразрядный сдвиг влево "<<" и поразрядный сдвиг вправо ">>" на заданное число позиций N. Производить проверку условия N<8.

15.Класс, хранящий (часы h, минуты m и секунды s) и вычисляющий количество секунд, оставшихся до конца суток.

16.Класс, хранящий вектор - пару точек пространства (x1, y1, z1 и x2, y2, z2) и вычисляющий площадь треугольника с вершинами в этих точках и начале координат.

17.Класс, для операций с точками в пространстве (хранить x, y, z - координаты). Вычислять расстояние до начала координат.

18.Класс для хранения координат вершин вектора на плоскости (x1, y1 и x2, y2). Вычислить длину этого вектора и его координаты.

19.Класс, хранящий фамилию, имя и отчество человека. Написать метод вывода на экран полной информации и сокращенной – в формате «Фамилия И. О.».

20.Класс, хранящий две строки символов s1 и s2 разной длины. Создать метод, выводящий на экран наибольшую из них и вычисляющий количество символов в каждой.

21.Класс, хранящий параметры сфер в пространстве (радиус R и координаты центра – x, y, z). Написать метод, определяющий пересекается ли заданная сфера с другой – координаты которой (R2, x2, y2, z2).

22.Класс для хранения координат прямоугольных «окон» на экране (хранить координаты левого верхнего и правого нижней вершин x1, y1 и x2, y2). Вычислять площадь окна.

71

10.4. Наследование

Наследование – это механизм создания нового класса на основе ранее созданного. Наследование имеет смысл, если множество разнородных объектов имеют общие характеристики или функции. Рассмотрим пример классов для работы с графическими примитивами (прямая линия, эллипс, прямоугольник и пр.). Для любых графических объектов тип, цвет и толщина линии, координаты описываются одинаково на уровне языка программирования и логически относятся к одной категории – свойства графического примитива. Поэтому эти элементы целесообразно выделить в отдельный класс – базовый и на основе него создавать новые классы – дочерние для более детального описания линии, эллипса и прямоугольника.

Создадим базовый класс CPos, содержащий общую для графических объектов информацию, а на основе CPos можно построить дочерние классы для более детальной работы с графическими объектами, используя механизм наследования.

#define MAX_SIZE 1024

class CPos { protected:

CPos() {} // конструктор по умолчанию

CPos(int x1, int y1, int x2, int y2) // конструктор с параметрами { SetParam(x1,y1,x2,y2); }

~CPos() {} // деструктор public:

void SetParam(int x1, int y1, int x2, int y2);

protected:

// левая верхняя точка графического объекта

int X1, Y1;

int X2, Y2;

// правая нижняя точка графического объекта

};

 

void CPos::SetParam(int x1, int y1, int x2, int y2)

{if(x1 >= 0 && x1 <= MAX_SIZE) X1 = x1; if(y1 >= 0 && y1 <= MAX_SIZE) Y1 = y1; if(x2 >= 0 && x2 <= MAX_SIZE) X2 = x2; if(y2 >= 0 && y2 <= MAX_SIZE) Y2 = y2;

}

Создадим дочерний класс с именем CLine для работы с линией на основе базового CPos. Для этого после имени дочернего класса CLine ставится символ «:», а затем пишется имя базового класса CPos с указанием уровня доступа:

class CLine : public CPos

{ public:

CLine() {}

CLine(int x1,int y1, int x2, int y2) {SetParam(x1,y1,x2,y2);} ~CLine() {}

void Draw()

{ printf("Рисование линии от (%d, %d) до (%d, %d)\n", X1, Y1, X2, Y2); }

};

Уровень наследования public определяет доступ класса CLine ко всем переменным и функциям класса CPos, которые не являются частными (private). Переменные X1, Y1, X2 и Y2 описаны в разделе protected для возможности их использования в методе Draw() дочернего класса CLine, но они недоступны извне.

Метод Draw() предназначен для визуализации графического объекта, но, изучение графических библиотек не входит в данный курс, и программирование ведется на уровне консольных приложений, в методе Draw() выводится текст, а не рисунок.

Метод SetParam(int, int, int, int) задания координат графического объекта целиком находится в базовом классе CPos и по мере необходимости используется в дочернем классе

CLine.

В классе CLine два конструктора, при создании объекта line1 (экземпляра) класса CLine, выполняется сначала конструктор по умолчанию CPos() базового класса, а затем тело конструктора дочернего – CLine().

72

CLine* line1 = new CLine(); // динамический объект типа CLine CLine line2(10,10,20,20); // статический объект типа CLine

В случае вызова конструктора с параметрами CLine(int, int, int, int) для создания экземпляра line2, выполняется конструктор по умолчанию CPos() базового класса, а затем тело конструктора CLine(int, int, int, int) дочернего класса, в котором выполняется функция SetParam(int, int, int, int) для записи значений координат графического объекта.

Использовать только конструктор по умолчанию не всегда удобно. Можно указать явно, какой конструктор базового класса вызывать из конструктора класса-потомка:

class CLine : public CPos { public:

CLine() : CPos() {}

CLine(int x1,int y1, int x2, int y2) : CPos(x1,y1,x2,y2) {} ~CLine() {}

void Draw()

{ printf("Рисование линии от (%d, %d) до (%d, %d)\n", X1, Y1, X2, Y2); }

};

Теперь конструктор CLine() будет вызывать конструктор CPos() базового класса, а конструктор с параметрами CLine(int, int, int, int) будет вызывать конструктор CPos(int, int, int, int). При этом функция SetParam() в теле конструктора CLine(int, int, int, int) не нужна,

т.к. необходимая инициализация переменных будет выполнена при вызове конструктора с параметрами CPos(int, int, int, int) базового класса.

В рассматриваемой задаче, класс CPos является вспомогательным, при этом нет необходимости создавать его экземпляр для непосредственной работы с ним. Поэтому целесообразно защитить его от возможности создания, поместив конструкторы данного класса в раздел protected. Такие классы называются абстрактными классами, т.е. они не могут существовать как самостоятельные объекты, а служат для создания новых, дочерних классов. Public- функции абстрактных классов CPos можно вызывать, например, через объект класса-потомка CLine:

CLine line;

line.SetParam(10,10,20,20); // вызов метода абстрактного класса CPos line.Draw();

Для работы с другими графическими примитивами (прямоугольником и эллипсом) подобным образом можно создать дочерние классы от CPos, отличающиеся друг от друга реализацией функции Draw():

class CRect : public CPos { public:

CRect() : CPos() {}

CRect(int x1,int y1, int x2, int y2) : CPos(x1,y1,x2,y2) {} ~CRect() {}

void Draw()

{ printf("Рисование прямоугольника (%d, %d):(%d, %d)", X1, Y1, X2, Y2); }

};

class CEllipse : public Cpos { public:

CEllipse() : CPos() {}

CEllipse(int x1,int y1, int x2, int y2) : CPos(x1,y1,x2,y2) {} ~CEllipse() {}

void Draw()

{ printf("Рисование эллипса (%d, %d):(%d, %d)", X1, Y1, X2, Y2); }

};

Множественное наследование

У каждого из представленных дочерних классов CLine, CRect и CEllipse имеется один базовый класс CPos. Вместе с тем язык С++ предоставляет возможность создавать дочерние

73

классы на основе нескольких базовых, что приводит к концепции множественного

наследования.

Реализуем концепцию множественного наследования, создав иерархию классов в соответствии с Рис. 21, добавив еще один абстрактный класс с именем CProp, который будет отвечать за свойства графических примитивов: толщину и цвет линии:

СPos СProp

СLine СRect СEllipse

Рис. 21. Множественное наследование

#define MAX_WIDTH 4 #define MAX_COLOR 15

class CProp { protected:

CProp() {}

CProp(int wdt, int clr) {SetProperty(wdt,clr);} ~CProp();

public:

void SetProperty(int wdt, int clr)

{if(wdt >= 0 && wdt <= MAX_WIDTH) width = wdt; if(clr >= 0 && clr <= MAX_COLOR) color = clr; }

protected:

int width, color;

};

Теперь дочерние классы CLine, CRect и CEllipse можно образовывать от двух базовых CPos и CProp, которые являются не связанными друг с другом. Для того чтобы построить класс на основе двух базовых они указываются друг за другом через запятую.

class CLine : public CPos, public CProp

{ public:

CLine() : CPos(), CProp() {}

CLine(int x1, int y1, int x2, int y2, int w, int clr) : CPos(x1, y1, x2, y2), CProp(wdt, clr) {}

~CLine() {} void Draw()

{printf("Рисование линии (%d, %d) : (%d, %d),", X1, Y1, X2, Y2); printf(" толщина линии %d, цвет %d\n", width, color); }

};

Конструктор CLine(int, int, int, int, int, int) класса CLine вызывает конструкторы двух базовых классов, которые перечислены через запятую с указанием в них конкретных переменных. Работа с функциями класса CLine через его представитель имеет следующий вид:

CLine line;

// вызов метода абстрактного класса CProp

line.SetProperty(1,0);

line.SetParam(10,10,20,20);

// вызов метода абстрактного класса CPos

line.Draw();

 

Дружественные классы и функции

Классы и функции, объявленные как дружественные к базовым классам, получают доступ к свойствам и методам, объявленным не только как public и protected, но и как private. Для объявления дружественного класса используется ключевое слово friend, за которым следует имя класса. Следующий пример демонстрирует объявление дружественного класса

CRect классам CPos и CProp:

class CRect; // прототип описания (идентификатор) класса

class CPos

{ protected: CPos() {}

CPos(int x1, int y1, int x2, int y2) { SetParam(x1,y1,x2,y2); } ~CPos() {}

74

public:

friend CRect; //объявление дружественного класса void SetParam(int x1, int y1, int x2, int y2);

private:

int X1, Y1; int X2, Y2;

};

class CProp

{ protected: CProp() {}

CProp(int wdt, int clr) {SetProperty(wdt,clr);} ~CProp();

public:

friend CRect; //объявление дружественного класса void SetProperty(int wdt, int clr);

private:

int width, color;

};

Впервой строке листинга использован прототип описания класса CRect, который сообщает компилятору о том, что такой класс есть, но его описание будет дано ниже.

Врезультате использования спецификатора friend частные элементы X1, Y1, X2, Y2, width и color классов CPos и CProp оказываются доступными только одному производному классу CRect и никакому другому, что обеспечивает их лучшую защиту по сравнению с уровнем доступа protected.

Дружественными можно объявлять не только классы, но и отдельные функции классов. Рассмотрим пример, в котором для класса CEllipse свойства X1, Y1, X2, Y2, width и color будут доступны только дружественной функции Draw().

class CPos; // идентификатор класса

class CEllipse { public:

CEllipse () {} ~CEllipse () {}

void Draw(CPos* pos);

};

class CPos { public:

CPos() {} ~CPos() {}

friend void CEllipse::Draw(CPos* pos); //объявление дружественного метода private:

int X1, Y1; int X2, Y2;

};

void CEllipse::Draw(CPos* pos)

{ printf("Рисование эллипса (%d, %d):(%d, %d)", pos->X1, pos->Y1, pos->X2, pos->Y2); printf(" толщина линии %d, цвет %d\n", width,

color);}

Благодаря тому, что функция Draw() является дружественной классу CPos, она может получать доступ к частным элементам этого класса через переданный ей указатель на объект класса CPos.

Виртуальные функции

Функция-член класса может содержать спецификатор virtual. Такая функция называется виртуальной.

Если некоторый класс содержит виртуальную функцию, а производный от него класс содержит функцию с тем же именем и типами формальных параметров, то обращение к этой функции для объекта производного класса вызывает функцию, определённую именно в производном классе. Функция, определённая в производном классе, вызывается даже при

75

доступе через указатель или ссылку на базовый класс. В таком случае говорят, что функция производного класса подменяет функцию базового класса. Если типы функций различны, то функции считаются разными, и механизм виртуальности не включается. Ошибкой является различие между функциями только в типе возвращаемого значения.

//абстрактный базовый класс «Животные» class Animal

{ public:

char *Title; //кличка животного

Animal(char *t) { Title=t; } //простой конструктор virtual void speak(void)=0; //чистая виртуальная функция

};

//класс лягушка

class Frog: public Animal { public:

Frog(char *Title): Animal(Title) {};

virtual void speak(void) { cout<<Title<<" говорит "<<"ква-ква"<<endl; };

};

//класс собака

class Dog: public Animal { public:

Dog(char *Title): Animal(Title) {};

virtual void speak(void) { cout<<Title<<" говорит "<<"гав-гав"<<endl;};

};

//класс кошка

class Cat: public Animal { public:

Cat(char *Title): Animal(Title) { };

virtual void speak(void) { cout<<Title<<" говорит "<<"мяу-мяу"<<endl;};

};

//класс лев

class Lion: public Cat

{ public:

Lion(char *Title): Cat(Title) {};

virtual void speak(void) { cout<<Title<<" говорит "<<"ррр-ррр"<<endl;};

//virtual int speak(void)

//{ cout<<Title<<" говорит "<<"ррр-ррр"<<endl; return 0; };

//virtual void speak(int Х)

//{ cout<<Title<<" говорит "<<"ооа-ооу"<<endl; };

};

В качестве базового класса создан абстрактный класс Animal. Он имеет единственное свойство Title, описывающий кличку животного. В нем есть единственная чистая виртуальная функция speak(), которая описывает, какие звуки издает животное. Из этого класса выведены все остальные. Кроме одного. Класс Lion порожден от класса Cat (ведь львы это тоже кошки). Это сделано для демонстрации тонкостей применения виртуальных функций.

Во всех производных классах описана собственная замещающая виртуальная функция speak(), которая печатает на экран, какие же звуки издает конкретное животное. Объявим в основном теле программы массив animals[4] указателей типа Animal*. И сразу же создадим динамические объекты классов, которыми заполним массив указателей. А в цикле for() по указателю будем просто вызывать виртуальную функцию speak() для экземпляров класса.

int main ()

{ //объявим массив указателей на базовый класс Animal //и сразу его заполним указателями, создавая объекты

Animal *animals[4] = { new Dog("Бобик"), new Cat("Мурка"), new Frog("Кермит"),

new Lion("Кинг") }; // cписок животных

76

for(int k=0; k<4; k++) animals[k]->speak();

return 0;

}

В описании класса Lion содержится сразу три виртуальной функции speak(), правда две из них имеют типичные ошибки и закомментированы. Рассмотрим их.

Во второй функции speak() класса Lion производится попытка соорудить виртуальную замещающую функцию с другим типом возвращаемого значения (функция возвращает тип int вместо типа void, который был у функции speak() в базовом классе). Компилятор выдаст сообщение об ошибке:

Error: animals.cpp(42,25):Virtual function 'Lion::speak()' conflicts with base class 'Cat'.

Третья (ошибочная) функции speak() класса Lion не определяется компилятором как ошибка, на сей раз он выдаст предупреждение (и программа будет работать!). Это тот самый случай, когда объявляется замещающая виртуальная функция с тем же самым типом возвращаемого значения, но с другим набором параметров. И, раз в данном классе нет идентично определенной виртуальной функции, то по указателю вызывается виртуальная функция speak() из базового класса Cat.

10.5. Перегрузка операторов

Классы в языке С++ предоставляют возможность переопределять работу некоторых операторов таких как «=», «+», «*», «new», «delete», «==», «>», «<» и др. Это дает возможность упрощать текст программы и повышать качество программирования. Преимущества от перегрузки операторов удобно продемонстрировать при работе со строками, которые в базовом языке С++ представляют собой массивы символов и операции присваивания, добавления и сравнения строк становятся сложными. Зададим класс TString, в котором будут описаны алгоритмы обработки строковой информации.

#define MAX_LENGTH 1024

class TString

{ public:

TString() { buff[0]='\0'; }

TString(const char* str) { strcpy(buff,str); } ~TString() {}

char* Get() { return buff; }

void Set(const char* str) { strcpy(buff,str); }

void operator = (const char* str) { strcpy(buff,str); }

private:

char buff[MAX_LENGTH];

};

В данном классе описано два конструктора для возможности создания пустой и некоторой начальной строк. Кроме того, задано два метода: Get() и Set(), через которые осуществляется доступ к массиву buff[], являющимся частным свойством класса.

TString str; str.Set(“Hello World”); printf(“%s”,str.Get());

Перегрузка оператора выполняется с помощью ключевого слова operator, за которым следует символ оператора, затем в круглых скобках аргументы. Пример перегрузки оператора «=» для присваивания строки показан на листинге выше.

Обратите внимание, что перед оператором ставится возвращаемый им тип, в данном случае void. После перегрузки оператора присваивания с классом TString становятся возможны следующие действия:

TString str;

77

str = “Hello World”;

Здесь при выполнении операции присваивания активизируется алгоритм, записанный в теле оператора «=», а именно функция strcpy(), в которой указатель str указывает на строку символов, стоящих справа от оператора присваивания.

Особенностью перегрузки данного оператора является то, что он будет работать только в том случае, когда его правый аргумент является массивом символов, и не будет выполняться в случае присваивания одного класса TString другому:

TString str, dst(“Hello”);

str = dst; // код в этой строке работать не будет

Вместе с тем такая запись вполне логична и естественна и желательно чтобы ее можно было использовать. Это достигается путем добавления в класс TString еще одной реализации перегрузки оператора присваивания, следующим образом:

void operator = (const char* str) { strcpy(buff,str); } void operator = (TString & str) { strcpy(buff, str.Get()); }

В итоге, при реализации строки

str = dst;

будет вызываться второй вариант перегрузки оператора присваивания. Причем компилятор сам определит, какой из вариантов перегрузки вызывать в каждом конкретном случае.

В представленном примере перегрузки аргументом является ссылка на класс TString, а не представитель этого класса. Это сделано, для того чтобы при реализации оператора присваивания не происходило копирование класса TString при передаче аргумента и (см. § 4.1), таким образом, экономилась память ЭВМ и увеличивалась скорость работы.

Следующим шагом оптимизации работы со строками выполним перегрузку оператора добавления одной строки другой, которая будет определяться символом «+». Желательно использовать для вызова оператора «+» запись вида

str = str + “ добавление”;

Но здесь используется сразу два оператора: присваивания и добавления. Поэтому для реализации такой конструкции необходимо, чтобы оператор добавления «+» возвращал сформированную строку оператору присваивания. Следовательно, описание оператора добавления в классе TString должно выглядеть так:

char* operator + (const char* str) { return strcat(buff,str); } char* operator + (TString& str) { return strcat(buff, str.Get()); }

Наконец, последним шагом выполним перегрузку условного оператора сравнения двух строк между собой. Реализация этого оператора очевидна и выглядит следующим образом:

bool operator == (const char* str)

{if( strcmp(str,buff) == 0) return true; else return false; }

bool operator == (TString str)

{if( strcmp(str.Get(),buff) == 0) return true; else return false; }

В результате получаем следующее описание класса TString:

class TString

{ public:

TString() { buff[0]='\0'; }

TString(const char* str) { strcpy(buff,str); } ~TString() {}

char* Get() { return buff; }

void SetString(const char* str) { strcpy(buff,str); }

void operator = (const char* str) { strcpy(buff,str); } void operator = (TString& str) { strcpy(buff,str.Get()); }

78

char* operator + (const char* str) {return strcat(buff,str);} char* operator + (TString& str) { return strcat(buff, str.Get(); }

bool operator == (const char* str)

{if (strcmp(str,buff) == 0) return true; else return false; }

bool operator == (TString str)

{if (strcmp(str.Get(),buff) == 0) return true; else return false; }

private:

char buff[MAX_LENGTH];

};

который можно использовать следующим образом:

int main()

{TString str;

str = “Hello World”; string dst;

dst = dst + str;

if(str == dst) printf(“src is equal dst”); else printf(src is’nt equal dst”);

return 0;

}

10.6. Лабораторная работа № 12. Наследование

Продолжительность – 4 часа. Максимальный рейтинг – 8 баллов.

Цель работы

Научиться создавать классы-потомки на основе базовых классов и описывать их свойства и методы. Научиться применять конструкторы базового класса в соответствующих конструкторах наследуемых классов. Освоить умение работать с абстрактными классами, дружественными и виртуальными функциями и научиться перегружать операторы.

Закрепить навыки конструирования классов, выделения памяти под динамические объекты класса, освобождения памяти, обращения к их свойствам и методам.

Задание на лабораторную работу

1.Задать базовый класс и классы-потомки на его основе, реализующие операции с данными, в соответствии с индивидуальным заданием (Таблица 15). Если возможно,

реализовать множественное наследование.

2.В базовом классе обязательно создать конструктор_по_умолчанию и конструктор_с_параметрами, а также деструктор класса. Продемонстрировать применение в конструкторах классов-потомков соответствующих конструкторов базового класса.

3.Сделать базовый класс абстрактным. Продемонстрировать вызов методов абстрактного класса через объекты класса-потомка.

4.Продемонстрировать использование дружественной функции.

5.Продемонстрировать реализацию виртуальной функции в базовом классе и в классахпотомках.

6.Продемонстрировать перегрузку хотя бы одного оператора.

7.В отчете привести листинг программы, скриншоты тестирования программы, рисунок структуры класса. Листинг программы без комментариев не принимается.

Варианты индивидуальных заданий Внимание! Варианты индивидуальных заданий составлены таким образом, чтобы

продолжать выполнение индивидуального задания из предыдущей лабораторной работы ( Лабораторная работа № 11. Классы ). Рекомендуется выполнять тот же номер варианта индивидуального задания, что и в предыдущей работе (Таблица 14).

79

Таблица 15 Варианты индивидуальных заданий

Задание

1.Классы, реализующие операции с матрицами (3х3), составленными из комплексных чисел1. Написать метод, вычисления определителя.

2.Классы, производящие полный расчет треугольника1: вычисление длин его сторон, и углов между ними, а также определяющий, является ли треугольник равнобедренным, равносторонним и/или прямоугольным.

3.Классы для хранения массива из 10 окружностей1. Написать метод, выбирающий пары пересекающихся окружностей и вычисляющий площадь их пересечения.

4.Классы для работы с судейским секундомером1. Хранить время и отсчитанное число секунд для каждого круга (до 10) и для каждого спортсмена (до 10).

5.Классы для построчного сравнения1 двух файлов. Создать метод, определяющий, равны ли файлы и возвращающий файл несовпадений в противном случае.

6.Классы для хранения байта (в виде битовых полей)1. Создать такой метод, чтобы ноль перемещался от разряда к разряду слева направо.

7.Классы для планирования затрат на подарки к дням рождений1 ваших друзей. Задать Имена друзей, планируемые подарки, их стоимость и выводить оставшиеся в этом году дни рождения и объем необходимых средств.

8.Классы для работы с расписанием событий на день1 – ежедневник. Создать метод, выводящий на экран время, оставшееся до всех еще не прошедших событий.

9.Классы для задания прямой траектории в трехмерном пространстве1 по известному

направляющему вектору х и стартовой точке А. Создать метод, рассчитывающий, проходит ли траектория через введенную пользователем точку В.

10.Классы для хранения дней рождений1 всех студентов группы, и вычисляющий количество дней до ближайшего. Вычислите суммарный день рождения группы.

11.Классы для определения координат точки1, движущейся по Архимедовой спирали с постоянной скоростью. Написать метод, определяющий, в каком квадранте находится точка в заданный момент времени.

12.Классы для кодирования символьных строк1, последовательно заменяя каждый символ кодовой комбинацией. Создать метод, производящие закодировать и раскодировать строку по заданному шифру.

13.Классы для хранения дней рождений1 всех студентов группы, и вычисляющий количество дней прожитых каждым. Вычислите сколько дней прожила вся группа.

14.Классы для управления 4 однобайтными выходными портами микроконтроллера (МК) состояние порта хранить в виде битовых полей1. Создать метод, реализующий эффект «бегущего огонька» по всем портам микроконтроллера.

15.Классы для работы с расписанием занятий на неделю1. Создать метод, выводящий на экран время, оставшееся до всех еще не прошедших сегодня занятий.

16.Классы для описания движения метеорита в пространстве1, определить, на каком расстоянии он пройдет от Земли (начало координат).

17.Классы для описания движения планет в пространстве1 по эллиптической орбите вокруг Солнца (начало координат). Вычислять расстояния от Земли (ищи на третьей планете) до других планет Солнечной системы.

18.Классы, позволяющие определить, встретятся ли летящие из заданных точек по заданным векторами1 траекториям космические корабли и на каком минимальном расстоянии друг от друга они пролетят.

19.Классы для базы данных отдела кадров предприятия1. Обрабатывать информацию о должности, отделе, разряде и окладе сотрудника.

20.Классы для кодирования символьных строк1 последовательностью символов азбуки Морзе. Создать метод, позволяющий закодировать и раскодировать строку. Учитывать пробелы, концы слов.

1 На базе класса, разработанного в индивидуальном задании по предыдущей лабораторной работе.

80