Структуры внутри структур
Поле структуры может быть любого типа, в том числе массивом или другой структурой. Вы уже делали так с каждым char name[20]: это массив внутри структуры. Массив чисел работает так же. А если несколько значений внутри структуры связаны между собой, как день, месяц и год даты, из них можно сделать отдельную структуру:
typedef struct {
int day;
int month;
int year;
} Date;
typedef struct {
char name[20];
Date birthday;
int points[3];
} Player;У Player, игрока баскетбольной команды, есть имя, день рождения типа Date и очки за три последние игры. Date нужно определить выше Player: компилятор читает программу сверху вниз, и когда он дойдёт до поля birthday, ему уже должен быть известен Date.
Когда вы создаёте игрока, у внутренней структуры и у внутреннего массива есть свои фигурные скобки:
Player eva = {"Eva", {14, 3, 2011}, {12, 8, 15}};Чтобы добраться до внутреннего значения, соедините точки и квадратные скобки в цепочку и читайте её слева направо. eva.birthday — целая дата Date, поэтому eva.birthday.year — её год. eva.points — массив, поэтому eva.points[0] — его первый элемент:
printf("%s родилась в %d году.\n", eva.name, eva.birthday.year);
printf("Очки в первой игре: %d\n", eva.points[0]);Программа выведет:
Eva родилась в 2011 году.
Очки в первой игре: 12По внутреннему массиву можно пройти циклом, как по любому другому массиву:
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += eva.points[i];
}
printf("Очков всего: %d\n", sum);Программа выведет:
Очков всего: 35Если пропустить звено цепочки, как в eva.year, компилятор сообщит, что у Player нет поля year. Он прав: год — это поле дня рождения Евы, а не самой Евы.
main.c:17:50: error: no member named 'year' in 'Player'Задание
- 1
Героиня игры Zara делает три шага вправо. Ниже
printfприбавьте3кxеё позиции:x— полеposition, которое само является полемzara. Затем выведите её позицию какПозиция: 5, 5, взяв оба числа из полей. - 2
Zara собрала монеты на трёх уровнях игры, и они лежат в массиве
coins. В концеmain(передreturn 0;) сложите их циклом и выведитеМонеты: 21.