11.12 Структуры
TODO объединить со следующим практикумом (успели только половину)
Зачем? Разве нельзя всё смоделировать массивами?
Описание структуры struct ярлык {поля);
Описание переменной типа struct ярлык: struct ярлык переменная.
Написать функцию, которой передаётся переменная типа структура, и возвращает она переменную типа структура - Внутри функции перебить поля передаваемой переменной
- Вернуть перебитую переменную
- Посмотреть адреса (минимум три разных)
- Посмотреть sizeof (выравнивание)
Массив и структуры — составные типы данных. Чем принципиально int a[3] отличается от struct {int a0; int a1; int a2;} a?
Написать функцию float distance(struct dot a, struct dot b), рассчитывающую расстояние между двумя точками
Массивы структур
Задать массив из трёх dot с координатами x, y. Ввести 3 точки, среди всех пар найти самую удалённую друг от друга
Ввести N, затем N точек. Вывести максимальное расстояние TODO вот тут сильно затупили — многие не смогли написать вложенный цикл
Указатель на структуру
Зачем нужен указатель на структуру?
Процедура «ввод точки», которая возвращает результат scanf() Использование «a->b» вместо (*a).b
Кстати, а зачем?
TODO отсюда пришлось бежать бегом
Задать структуру triangle, в которой хранятся три точки и площадь треугольника. Написать функцию ввода, которая заполняет указатель на треугольник введенными данными, а так же вычисляет и записывает площадь по формуле Герона.
Указатель на структуру и malloc / calloc
Если структур планируется много, локально их заводить нельзя. Надо malloc() или calloc(), а потом free()
Простейший пример
Переписать ввод треугольника так, чтобы он возвращал указатель на созданный треугольник (или NULL, если ввод неудачен)
Структуры и typedef
Что означают эти записи?
struct dottype {int x; int y;};
struct dottype {int x; int y;} dot;
struct {int x; int y;} dot;
Общий вид typedef
typedef описание константа_типа
Конструкция описание константа_типа в точности совпадает с описанием переменной, но typedef в начале делает констунту_типа типом
Переделать одно из упражнений выше в typedef
Переделать упражнение с треугольником в typedef
Не создавайте typedef-ы для ссылочных типов! В первую очередь — на структуры! Можно на функцию — но она сама по себе и так ссылочный тип.
Д/З (можно делать)
TODO В будущем году добавить заданий
Написать функцию ldiv_t lcms(int a, int b), которая вычисляет наименьшее общее кратное для целых a и b по формуле через наибольший общий делитель, а наибольший общий делитель — по алгоритму Евклида с остатком от деления с обязательным использованием функции из семейства div(). Функция также вычисляет сумму всех промежуточных результата деления (которое в нормальном случае в алгоритме Евклида не используется). Возвращает структуру ldit_t, в которой поле quot равно НОК, а rem — сумме частных.
Описание структур ldiv_t
60 32
Последовательность пар «частное остаток_от_деления» для чисел 60 и 32 : 1 28, 1 4, 7 0; НОК = a*b/НОД
480 9
Вводить точки (пары вещественных чисел в формате чиcло:число) — вершины многоугольника без самопересечений. Для представления точек использовать структуру dot из практикума.. Окончание ввода — EOF. Вывести YES, если этот многоугольник — выпуклый, NO в противном случае. Если какие-то точки лежат на одной прямой — многоугольник не выпуклый.
Подсказка: все вершины можно не хранить, достаточно проверять, что поворот между тремя соседними (включая начало) всегда происходит в одну сторону (то есть все углы имеет одинаковый знак согласно Atan2)
Генератор многоугольников (на Python)
520:257 317:335 142:326 106:149 208:48 411:45
- →
YES
253:40 469:64 487:195 419:193 421:306 285:342 101:317 77:202 126:62
- →
NO
