Что такое структура?
В этом уроке вы научитесь хранить связанные значения в одном месте. До сих пор в каждой переменной лежало одно значение, а в массиве — несколько значений одного типа. Но подумайте о товаре в магазине: у него есть название (текст), цена (десятичное число) и количество, то есть сколько штук вы покупаете (целое число). С тем, что вы знаете сейчас, понадобились бы три переменные:
char bread_name[20] = "Bread";
double bread_price = 32.5;
int bread_count = 2;Для одного товара это работает. Для десяти товаров понадобилось бы тридцать переменных, и только их имена подсказывали бы, какие из них связаны. Функции, которая выводит товар, понадобились бы три параметра. Массив тоже не поможет: все его элементы должны быть одного типа, а название, цена и количество — разных.
Эту задачу решает структура. Она объединяет несколько значений, даже разных типов, в одно целое. Сначала вы описываете, что лежит в структуре:
struct product {
char name[20];
double price;
int count;
};Это определение структуры. Ключевое слово struct говорит, что дальше идёт структура, а product — её имя. Внутри фигурных скобок находятся её поля: значения, которые есть у каждого товара. Каждое поле записывается как объявление переменной, с типом и именем, но без значения. Пишите определение выше main, как и функции, чтобы компилятор знал его до того, как вы им воспользуетесь.
Само определение не создаёт переменной и не хранит значений. Это как пустой бланк с полями «Название», «Цена» и «Количество»: он лишь говорит, что нужно заполнить. Он даёт вам новый тип, struct product, и вы можете создавать переменные этого типа так же, как переменные типа int:
struct product bread = {"Bread", 32.5, 2};Значения в фигурных скобках заполняют поля в том порядке, в котором их перечисляет определение: "Bread" попадает в name, 32.5 — в price, а 2 — в count. Это похоже на инициализацию массива, но значения могут быть разных типов.
Чтобы добраться до одного поля, напишите имя переменной, точку и имя поля: bread.price — это цена хлеба. Поле используется как обычная переменная своего типа. bread.name — строка, поэтому её выводят через %s; bread.price — double, поэтому %.2f:
#include <stdio.h>
struct product {
char name[20];
double price;
int count;
};
int main(void) {
struct product bread = {"Bread", 32.5, 2};
printf("%s: %.2f, штук: %d\n", bread.name, bread.price, bread.count);
return 0;
}Программа выведет:
Bread: 32.50, штук: 2printf не умеет выводить целую структуру сразу, как и целый массив. Выводите её поля по одному.
Самая частая ошибка — точка с запятой после закрывающей фигурной скобки. У функции её там нет, а у структуры она обязательна. Если пропустить её в программе выше, компилятор сообщит:
main.c:7:2: error: expected ';' after struct
7 | }
| ^
| ;
1 error generated.Первая строка говорит, где проблема: в строке 7, в столбце 2, сразу после }. Символ ^ указывает на это место, а ; под ним показывает, чего не хватает.
Задание
- 1
Выше
mainопределите структуруstruct petдля домашнего животного с тремя полями:name(массив из 20 символов,char),age(целое число,int) иweight(десятичное число,double). Не забудьте точку с запятой после}. - 2
В
mainвместо комментария создайте переменнуюrexтипаstruct petс именем"Rex", возрастом3и весом12.5. - 3
Ниже выведите одну строку о Rex:
Rex: возраст 3, вес 12.5 кг.Все три значения берите из полейrex, а вес выводите через%.1f.