Массивы структур
Представьте список гор, у каждой из которых есть название и высота. Одна гора — это одна структура. Чтобы хранить их несколько, вы уже знаете, что использовать: массив. Структура — такой же тип, как и любой другой, поэтому можно сделать массив структур:
#include <stdio.h>
typedef struct {
char name[20];
int height;
} Mountain;
int main(void) {
Mountain mountains[3] = {
{"Everest", 8849},
{"K2", 8611},
{"Lhotse", 8516}
};
for (int i = 0; i < 3; i++) {
printf("%-8s %5d м\n", mountains[i].name, mountains[i].height);
}
return 0;
}Программа выведет:
Everest 8849 м
K2 8611 м
Lhotse 8516 мКаждый элемент массива записывается как отдельная структура в фигурных скобках, а элементы разделяются запятыми, как в любом массиве. mountains[0] — вся первая гора, Эверест. mountains[i].name читается слева направо: сначала берём элемент i массива, затем его поле name.
Типичная ошибка — поменять порядок и написать mountains.name[i]. Это значит «поле name массива mountains», но у массива нет полей, только элементы:
main.c:16:42: error: member reference base type 'Mountain[3]' is not a structure or union
16 | printf("%-8s %5d м\n", mountains.name[i], mountains[i].height);
| ~~~~~~~~~^~~~~~В сообщении сказано, что то, что стоит перед точкой, типа Mountain[3] (массив из трёх гор), не является структурой. (Union, «объединение» — это нечто похожее на структуру, чем этот курс не пользуется.)
Как в уроке «Строки», printf в цикле задаёт ширину каждого столбца, чтобы столбцы выстраивались ровно. %-8s выводит текст в столбце шириной 8 символов с выравниванием по левому краю (это делает -), а %5d выводит число в столбце шириной 5 символов с выравниванием по правому краю. Для десятичных чисел %6.2f означает 2 знака после запятой и общую ширину 6 символов.
Вместо того чтобы писать в цикле количество 3, можно поручить вычисление программе, как с любым массивом: const int COUNT = sizeof(mountains) / sizeof(mountains[0]); Размер всего массива, делённый на размер одного элемента, — это количество элементов, какими бы ни были сами элементы.
Задание
- 1
Программа выводит только первый товар в корзине. Замените
printfцикломfor, который выводит каждый товар так же. Программа выведет:Bread 32.50 x 2 Milk 24.90 x 3 Apples 8.50 x 6 - 2
Ниже цикла выведите, сколько стоит вся корзина. Для каждого товара умножьте цену на количество и сложите результаты; это можно сделать в том же цикле или в новом. Выведите результат с 2 знаками после запятой:
Итого: 190.70.