Итоги
В этом уроке вы узнали, что:
- Структура объединяет связанные значения, даже разных типов, в одно целое. Её определение перечисляет её поля и заканчивается на
};, точка с запятой обязательна. - Переменная типа структуры создаётся со значениями в фигурных скобках, в порядке полей:
struct product bread = {"Bread", 32.5, 2};. - К полю обращаются через точку,
bread.price, и используют его как обычную переменную. Текст копируют в поле черезstrcpy, потому что массиву нельзя присвоить значение через=. typedef struct { ... } Product;даёт типу имяProduct, и можно писатьProduct bread. В этом курсе структуры записываются так.- Массив структур,
Product cart[3], хранит в каждом элементе структуру:cart[i].name. Ширины вроде%-8sи%6.2fвыравнивают столбцы таблицы. - Поле может быть массивом или другой структурой, и тогда точки и скобки соединяются в цепочку:
eva.birthday.year,eva.points[0]. - Структура, переданная в функцию, копируется, как и структура, присвоенная через
=. Изменения копии не меняют оригинал. Структуры нельзя сравнивать через==; сравнивайте их поля. - Через указатель,
Product *item, функция меняет оригинал:item->count— то же самое, что(*item).count, а вызывают её с&milk.const Product *itemподходит для функции, которая только читает. - Функция может вернуть структуру и так отдать сразу несколько значений.
Это была последняя новая тема курса. В следующем уроке, итоговом проекте, вы шаг за шагом напишете одну большую программу и используете всё, что узнали: переменные, условия, циклы, массивы, строки, функции, указатели и структуры.
Но сначала потренируйтесь со структурами на небольшом задании: список для чтения.
Задание
- 1
Выше
mainопределите черезtypedefструктуруBookс тремя полями: названиеtitle(массив из 30 символов) и два целых числа: количество страницpagesи количество уже прочитанных страницpages_read. Вmainсоздайте массивbooksс тремя книгами:The Hobbit— 310 страниц, из них прочитано 120;Matilda— 240 страниц, ни одной не прочитано; иMomo— 300 страниц, прочитаны все. Затем выведите книги циклом, по одной в строке, в видеThe Hobbit: 120/310. - 2
Между структурой и
mainнапишите функциюvoid read_pages(Book *book, int count), которая прибавляетcountкpages_readкниги, но не больше, чем страниц в книге: если результат большеpages, она записывает вpages_readзначениеpages. Вmainперед циклом вызовите её дважды:read_pages(&books[0], 250)иread_pages(&books[1], 35). Тогда программа выведетThe Hobbit: 310/310,Matilda: 35/240иMomo: 300/300.