Olej писал(а):
2-й транш
и всё те же "
Простые переменные":
3-й транш:
агрегированные переменные.
Во многих источниках их называют составные переменные - массивы, структуры, объединения, перечисления...
На мой вкус это неправильно. О массивах и структурах правильнее говорить что это
способы агрегирования более простых типов в более сложные. Например, в массив могут объединяться объекты типа "структура массивов структур" и т.д.
И тогда естественным образом решаются все вопросы ... такие как многомерные массивы и т.д.
А вот union и enum - это совсем другого ... ранга понятия - гораздо менее значимые.
И дальше, при таком подходе, очень простым получается переход (точнее расширение) от struct к class (что по существу есть одно и то же) и к ООП.
P.S. Вообще то, typedef + struct + class в C++ - это явно "масло масляное", нагромождение
эквивалентных понятий ... И это всё произошло только из-за требований синтаксической совместимости C++ с C.
Позже в Go, те же авторы C,
всё это объединили в одном определении type - новый тип однозначно определяет и его структуризацию, и допустимые с ним операции, и методы этого типа.
Но вернёмся к задачам...
агрегированные переменные.
Хотелось в задачах выразить только какие-то не самые тривиальные случаи ... всё остальное в учебниках описано.
Пока очень немного...
Все примеры и архивы со временем планируется дополнить.
1. массивы функций.
Объект данных "функция" можно определить как и любую другую переменную, присваивать ей значения, агрегировать в массивы или встраивать в структуры... Здесь важно обратить внимание на то, что есть
тип функции? ... для дозволенного присвоения.
Эти понятия - это основы функционального программирования ... в сторону которого и был расширен синтаксис C++ стандартом C++11.
1.a. тот же пример, но расширен типом функций,
возвращающих структуру (struct).
Опыт общения показывает, что многие слабо представляют что происходит, когда функция возвращает структурный тип данных... так же мало, впрочем, как и на случай когда функция
получает параметром структуру (или объект класса).
2. Структуры и классы (для меня это одно и то же)...
2.1. Определить структуру (!) с элементами разной длины (особенно несовпадающих длин с границами выравнивания: 3, 5, 7...).
Проследить общий размер экземпляра структуры, сумму длин полей, их смещения.
2.2.1. Определить
структуру для определения 2D-точки плоскости.
Написать программу, содержащую:
- функцию вывода координат 2D в собственном формате;
- функцию расстояния между двумя 2D точками;
... программа выводит длину вектора к 2D точке от начала координат [0,0].
2.2.2. Определить
класс 2D точки.
Определить конструкторы.
Нужен ли деструктор?
Переопределить операции:
- присвоения =
- вывода <<
- расстояние между 2-мя 3D: -
- сдвига (сумирование) +
- другие полезные операции (==, !=, ...)
2.2.3. Определить класс 2D точки ... но не как п.2.2.2 на основе структуры, а
наследованием комплексного шаблонного типа.
2.2.3. То же. что п.2.2.3, но на базе типа pair<> из STL.
2.3. из п.2.2.1 определить тип данных (структуру)
треугольника.
Вводить вершины треугольника, а выводить его периметр.
2.4.1. Определить
структуру (!) для определения 3D-точки плоскости, определение в виде 3-х координатного массива.
Сделать функции:
- форматирования координат точки;
- покоординатный вывод значений;
- покоординтеная установка значений;
- ... и ряд других полезных операций (==, !=, ...)
Код: Выделить всё
точка [1:1:1]
расстояние от [0:0:0] = sqrt( 1 + 1 + 1 ) = 1.73
2.4.1 Переписать п.2.4.1 как
класс (!).
Определить конструкторы.
Нужен ли деструктор?
Переопределить операции:
- вывода <<
- расстояние между 2-мя 3D: -
- сдвига (сумирование) +
- другие полезные операции (==, !=, ...)
Очень много любопытного можно ... подобрать так прямо под ногами