Структуры - введение в объектно-ориентированное программирование

Упражнения на проектирование структуры “Point”

Создайте структуру Point, определите для нее конструктор, необходимые арифметические операции, операции ввода-вывода, операцию сравнения “меньше”. У структуры Point два поля: x и y.

A: Самая дальняя точка

Программа получает на вход число N, далее координаты N точек. Выведите координаты точки, наиболее удаленной от начала координат.

Для решения этой задачи напишите метод dist, который возвращает расстояние от точки до начала координат.

Решение предполагается примерно таким:

int main() {
    int n;
    cin >> n;
    Point ans;
    for (int i = 0; i < n; i++) {
        Point p;
        cin >> p;
        if (p.dist() > ans.dist())
            ans = p;
    }
    cout << ans << endl;
}
Ввод Вывод
2
1 2
2 3
2 3

B: Центр масс

Выведите координаты центра масс данного множества точек (учтите, что это —два действительных числа).

Определите операции сложения точек, умножения точки на число, деления точки на число.

Ввод Вывод
2
1 2
2 3
1.5 2.5

C: Диаметр множества

Выведите диаметр данного множества – максимальное расстояние между двумя данными точками.

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

Ввод Вывод
3
1 1
1 0
0 0
1.4142135623731

D: Сортировка

Определите для точек оператор сравнения “<”, сравнивающую точки по значению расстояния от начала координат. Отсортируйте данные точки в порядке возрастания расстояния от начала координат используя функцию sort из файла algorithm.

Ввод Вывод
3
1 0
-1 -1
0 0
0 0
1 0
-1 -1

E: Максимальный периметр

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

Для нахождения периметра треугольника напишите отдельную функцию double Perimeter(Point A, Point B, Point C).

Ввод Вывод
4
0 0
0 1
1 0
1 1
3.41421356237309

F: Максимальная площадь

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

Для нахождения площади треугольника напишите отдельную функцию double Area(Point A, Point B, Point C).

Ввод Вывод
4
0 0
0 1
1 0
1 1
0.5

Упражнения на проектирование структуры “Fraction”

Структура Fraction должна иметь два поля: числитель a и знаменатель b. Оба поля должны быть типа int.

Для структуры Fraction определите конструкторы, которые могут принимать следующие виды параметров:

У каждой дроби существует единственное каноническое представление. Каноническое представление: это такое представление \(\frac{a}{b}\), что \(b>0\), \( (a, b) = 1\). Структура должен иметь метод reduce, который приводит дробь к каноническому представлению. После каждой операции с дробями (в том числе и в конструкторе) необходимо вызывать метод reduce для сокращения дроби.

Необходимо определить вывод дроби в формате a/b в каноническом представлении, если же дробь является целым числом, то просто значение этого числа.

G: Метод reduce и вывод дроби

Необходимо реализовать следующую функциональность структуры:

  1. Метод reduce.
  2. Конструкторы Fraction(), Fraction(int), Fraction(int, int). Конструктор должен вызывать метод reduce.
  3. Вывод дроби.

На проверку необходимо сдать только реализацию класса, то есть решение не должно содержать функцию main. Если что-то непонятно — смотрите протокол проверки.

H: Считывание дроби

Реализовать считывание дроби из потока istream, перегрузив оператор считывания >>. При считывании дробь имеет один из двух форматов: либо целое число, либо два целых числа через дробную черту без пробелов, при этом только числитель может иметь знак “-”.

I: Сравнения

Определите операторы <, <=, >, >=, ==, !=. Сравнения необходимо реализовать для типов int, double, Fraction, при этом значение типа Fraction может быть как правым, так и левым операндом.

J: Сложение

Определите оператор сложения + так, чтобы можно было складывать:

K: Вычитание

Определите оператор вычитания.

L: Умножение и деление

Определите операторы умножения и деления.

M: Операторы присваивания

Определите операторы +=, -=, *=, /= для случая, когда правый операнд имеет тип Fraction или int.

Пример определения оператора:

Fraction & operator+= (Fraction &, Fraction)