| Друзья шаблона класса |
| Примеры отчетов |
| next C++ |
| Ссылки |
| Улучшения языка C |
| Классы |
| Перегрузка функций и операций |
| Шаблоны |
| Наследование |
| Исключительные ситуации |
| STL |
| Курсовая работа |
| Вопросы к экзамену |
Лабораторные работы
Задание 2
Конструктор: Rational(a,b)
Операции:
x+y, x-y, x*y, x/y,
x+=y, x-=y, x*=y, x/=y,
x>y, x<y, x>=y, x<=y, x==y, x!=y
!x (x равно нулю)
где x,y - рациональные числа или long
(определить преобразование long->Rational)
вывод, ввод в виде 3/5
Методы:
long getp(); (числитель)
long getq(); (знаменатель)
Конструктор: Vector(x,y)
Операции:
a+b, a-b,
a+=b, a-=b,
a*b (скалярное произведение),
a==b, a!=b
!a (a является нулевым вектором),
a/z, z*a ("масштабирование" вектора)
где a,b - вектора, z - double
вывод, ввод в виде (1.4,-2.5)
Методы:
double getx();
double gety();
Конструктор: Complex(a,b)
Операции:
x+y, x-y, x*y, x/y,
x+=y, x-=y, x*=y, x/=y,
x==y, x!=y,
!x (x равно 0)
где x,y - комплексные числа или double
(определить преобразование double->Complex)
вывод, ввод в виде 1.5+2.2i
Методы:
double getReal(); (реальная часть)
double getImaginary(); (мнимая часть)
Конструктор: Polar(r,phi)
Операции:
x+y, x-y,
x+=d, x-=d (поворот вектора на d градусов),
x*=d, x/=d (увеличение/уменьшение вектора в d раз),
d*x (увеличенный в d раз вектор x, x не изменять!),
x==y, x!=y,
!x (x является нулевым вектором)
где x,y - вектора в полярных координатах, d - double
вывод, ввод в виде (5.1,30.5)
Методы:
double getLength();
double getAngle();
Конструктор: Rect(l,t,r,b)
Операции:
x*y (пересечение, функция),
x+y ("объединение", охватывающий прямоугольник минимального размера, функция),
x*=y (заменить пересечением)
x+=y (расширить x, заменив охватывающим)
x==y, x!=y,
x<=y (x полностью лежит в y), x>=y (наоборот, y в x),
!x (x является результатом пересечения прямоугольников, не имеющих общих точек)
где x,y - прямоугольники
вывод, ввод в виде [0,5,40,20]
Методы:
int getLeft();
int getTop();
int getRight();
int getBottom();
Конструктор: Set32() (первоначально пустое)
Операции:
x*y (пересечение), x*=y,
x+y (объединение), x+=y,
x+=z (включение числа z в множество),
x-y (разность множеств), x-=y,
x-=z (исключение числа z из множества),
x==y, x!=y,
x<=y (x подмножество или равно y, x ⊆ y), x>=y (x ⊇ y),
z<=x (проверка вхождения числа z в множество x, z ∈ x), x>=z (x ∋ z),
!x (x - пустое множество, x ≡ ∅)
где x,y - множества, z - целое число от 0 до 31
вывод, ввод в виде {1,2,5}
Конструктор: Segment(a,b)
Операции:
x*y (пересечение),
x+y ("объединение", охватывающий отрезок минимального размера),
x==y, x!=y,
x<=y (x полностью лежит в y), x>=y (наоборот, y в x),
!x (x является результатом пересечения отрезков, не имеющих общих точек)
x+=d (сдвинуть правый край отрезка на d),
x-=d (сдвинуть левый край отрезка на d),
x>=d, d<=x (проверка попадания числа d в отрезок x)
где x,y - отрезки, d - double
вывод, ввод в виде [0,5.5]
Методы:
double getLeft();
double getRight();
Конструктор: Angle(g[,m[,s]])
Операции:
x+y, x-y, (увеличить/уменьшить угол на соответствующий угол)
x+=y, x-=y,
z*x, x/z, (увеличить/уменьшить угол в z раз)
x*=z, x/=z,
x==y, x!=y,
!x (x равен нулю)
где x,y - углы, z - целое число >=1
вывод, ввод в виде 5^16'25"
Методы:
int getGrad(); [0..359]
int getMin(); [0..59]
int getSec(); [0..59]
Конструктор: Vector(x,y,z)
Операции:
a+b, a-b,
a+=b, a-=b,
a*b (скалярное произведение),
a==b, a!=b
!a (a является нулевым вектором),
a/z, z*a ("масштабирование" вектора)
где a,b - вектора, z - double
вывод, ввод в виде (1.4,-2.5,3.1)
Методы:
double getx();
double gety();
double getz();
Конструктор: Date(y,m,d)
Операции:
x+z, z+x (добавить к дате число дней z),
x+=z,
x-z (убавить дату на число дней z),
x-=z,
x-y (количество дней между датами),
x==y, x!=y, x<=y, x<y, x>=y, x>=y,
++x, --x, x++, x--,
где x,y - даты, z - целое число
вывод, ввод в виде 31/12/2004
Методы:
int getYear(); [1..2999]
int getMonth(); [1..12]
int getDay(); [1..31]
Конструктор: Length(y[,f[,i[,p]]])
Операции:
x+y, x-y, (увеличить/уменьшить длину на соответствующую длину)
x+=y, x-=y,
z*x, x/z, (увеличить/уменьшить длину в z раз)
x*=z, x/=z,
x==y, x!=y, x<y, x>y, x<=y, x>=y,
!x (x равна нулю)
где x,y - длины, z - целое число >=1
вывод, ввод в виде 5.2.4.30
Методы:
int getYard(); [0..oo]
int getFoot(); [0..2]
int getInch(); [0..11]
int getPoint(); [0..71]
Конструктор: Rational(a,b)
Операции:
x+y, x-y, x*y, x/y,
x+=y, x-=y, x*=y, x/=y,
x>y, x<y, x>=y, x<=y, x==y, x!=y
!x (x равно нулю)
где x,y - рациональные числа или long
(определить преобразование long->Rational)
вывод, ввод в виде 3/5
Методы:
long getp(); (числитель)
long getq(); (знаменатель)
Конструктор: Complex(a,b)
Операции:
x+y, x-y, x*y, x/y,
x+=y, x-=y, x*=y, x/=y,
x==y, x!=y,
!x (x равно 0)
где x,y - комплексные числа или double
(определить преобразование double->Complex)
вывод, ввод в виде (1.5,2.2)
Методы:
double getReal(); (реальная часть)
double getImaginary(); (мнимая часть)
Конструктор: Length(m[,y[,f[,i]]])
Операции:
x+y, x-y, (увеличить/уменьшить длину на соответствующую длину)
x+=y, x-=y,
z*x, x/z, (увеличить/уменьшить длину в z раз)
x*=z, x/=z,
x==y, x!=y, x<y, x>y, x<=y, x>=y,
!x (x равна нулю)
где x,y - длины, z - целое число >=1
вывод, ввод в виде 2m 5y 2f 4i
Методы:
int getMile(); [0..∞]
int getYard(); [0..1759]
int getFoot(); [0..2]
int getInch(); [0..11]
Конструктор: Polar(r,phi)
Операции:
x+y, x-y,
x+=d, x-=d (поворот вектора на d градусов),
x*=d, x/=d (увеличение/уменьшение вектора в d раз),
d*x (увеличенный в d раз вектор x, x не изменять!),
x==y, x!=y,
!x (x является нулевым вектором)
где x,y - вектора в полярных координатах, d - double
вывод, ввод в виде 5.1@30.5
Методы:
double getLength();
double getAngle();
Конструктор: Set32() (первоначально пустое)
Операции:
x*y (пересечение), x*=y,
x+y (объединение), x+=y,
x+=z (включение числа z в множество),
x-y (разность множеств), x-=y,
x-=z (исключение числа z из множества),
x==y, x!=y,
x<=y (x подмножество или равно y, x ⊆ y), x>=y (x ⊇ y),
z<=x (проверка вхождения числа z в множество x, z ∈ x), x>=z (x ∋ z),
!x (x - пустое множество, x ≡ ∅)
где x,y - множества, z - целое число от 0 до 31
вывод, ввод в виде (1 2 5)
Конструктор: Time(h[,m[,s]])
Операции:
x+y, x-y, (увеличить/уменьшить время на соответствующий время)
x+=y, x-=y,
z*x, x/z, (увеличить/уменьшить время в z раз)
x*=z, x/=z,
x==y, x!=y, x<y, x>y, x<=y, x>=y,
!x (x равно нулю)
где x,y - время, z - целое число >=1
вывод, ввод в виде 5:16:05
Методы:
int getHour(); [0..∞]
int getMin(); [0..59]
int getSec(); [0..59]
Конструктор: Segment(a,b)
Операции:
x*y (пересечение),
x+y ("объединение", охватывающий отрезок минимального размера),
x+=y, x*=y,
x==y, x!=y,
x<=y (x полностью лежит в y), x>=y (наоборот, y в x),
!x (x является результатом пересечения отрезков, не имеющих общих точек)
x>=d, d<=x (проверка попадания числа d в отрезок x)
где x,y - отрезки, d - double
вывод, ввод в виде [0,5.5]
Методы:
double getLeft();
double getRight();
Конструкторы: String(char * =""), копий
Операции:
x+y, x+=y,
x=y,
x[i],
x>y, x<y, x>=y, x<=y, x==y, x!=y,
!x (x - пустая строка)
где x,y - строка или char *
вывод, ввод в виде "te\"xt"
Методы:
int length();
const char *c_str(); (строка)
Не применять if(this==&other) в присваивании, см. примеры перегрузки
Конструктор: Vector(n), копий
Операции:
x+y, x+=y,
x=y,
x[i],
x==y, x!=y,
где x,y - векторы
вывод, ввод в виде {1.0,2.0,3.5}
Методы:
int size();
Не применять if(this==&other) в присваивании, см. примеры перегрузки
Конструктор: Rect(l,t,r,b)
Операции:
x*y (пересечение, функция),
x+y ("объединение", охватывающий прямоугольник минимального размера, функция),
x+=y (расширить x, заменив охватывающим)
x*=y (заменить пересечением)
x==y, x!=y,
x<=y (x полностью лежит в y), x>=y (наоборот, y в x),
!x (x является результатом пересечения прямоугольников, не имеющих общих точек)
где x,y - прямоугольники
вывод, ввод в виде [0 5 40 20]
Методы:
int getLeft();
int getTop();
int getRight();
int getBottom();
Конструктор: Vector(x,y,z)
Операции:
a+b, a-b,
a+=b, a-=b,
a*b (скалярное произведение),
a==b, a!=b
!a (a является нулевым вектором),
a/z, z*a ("масштабирование" вектора)
где a,b - вектора, z - double
вывод, ввод в виде (1.4 -2.5 3.1)
Методы:
double getx();
double gety();
double getz();
Конструктор: Time(h[,m[,s]])
Операции:
x+y, x-y, (увеличить/уменьшить время на соответствующий время)
x+=y, x-=y,
++x, --x, x++, x-- (изменить время на секунду)
z+x, x+z, x-z, (изменить время на z секунд)
x+=z, x-=z,
x==y, x!=y, x<y, x>y, x<=y, x>=y,
!x (x равно нулю)
где x,y - время, z - целое число >=1
вывод, ввод в виде 5:16:05
Методы:
int getHour(); [0..23]
int getMin(); [0..59]
int getSec(); [0..59]
Конструктор: Vector(x,y)
Операции:
a+b, a-b,
a+=b, a-=b,
a*b (скалярное произведение),
a==b, a!=b
!a (a является нулевым вектором),
a/z, z*a ("масштабирование" вектора)
где a,b - вектора, z - double
вывод, ввод в виде (1.4 -2.5)
Методы:
double getx();
double gety();
Конструктор: Vector(n), копий
Операции:
x+y, x+=y,
x=y,
x[i],
x==y, x!=y,
где x,y - векторы
вывод, ввод в виде (1.0 2.0 3.5)
Методы:
int size();
Не применять if(this==&other) в присваивании, см. примеры перегрузки
Конструктор: String(char * =""), копий
Операции:
x+y, x+=y,
x=y,
x[i],
x>y, x<y, x>=y, x<=y, x==y, x!=y,
!x (x - пустая строка)
где x,y - строка или char *
вывод, ввод в виде 'te''xt' //апострофы удваиваются
Методы:
int length();
const char *c_str(); (строка)
Не применять if(this==&other) в присваивании, см. примеры перегрузки
Vector a(0,0),b(1.5,0.3);
cout<<"Введите вектор a:"<<endl;
cin>>a;
//нужно ввести (1.2,3.2) вместе со скобками и запятой
cout<<a<<" + "<<b<<" = "<<(a+b)<<endl;
// печатается (1.2,3.2) + (1.5,0.3) = (2.7,3.5)
II. Реализовать main c тестами
(создание объектов и выполнение действий с ними)Для вариантов 8,11,14,17,23 можно хранить все значения в виде одного числа: время в секундах, длина в дюймах и т.д.
Например, для класса Time
class Time {
int sec;
public:
Time(int h=0, int m=0, int s=0):sec(h*3600+m*60+s){}
Методы для чтения отдельных составляющих
int getHour() const { return sec/3600; }
int getMin() const { return sec/60%60; }
int getSec() const { return sec%60; }
Операции можно определять в одну строку:
Time& operator+=(Time t) { sec+=t.sec; return *this; }
Time& operator*=(int z) { sec*=z; return *this; }
Другим способом является хранение отдельных полей, но для вычислений определить два метода - получение значений полей в виде одного числа и разбиения числа на несколько полей. Этот способ подходит для варианта 10, где формулы занимают несколько строк:
class Date {
int day,month,year;
int toJDN() const;
void fromJDN(int JDN);
public:
Date(int y=0, int m=0, int d=0):day(d),month(m),year(y){}
int getDay() const { return day; }
...
Операции также можно определять почти в одну строку:
Date& operator+=(int d) {
fromJDN(toJDN()+d);
return *this;
}
int operator-(const Date& y) const { return toJDN()-y.toJDN();