Структуры и функции
Структура может быть параметром функции. Вместо трёх параметров для названия, цены и количества функция получает один товар:
#include <stdio.h>
typedef struct {
char name[20];
double price;
int count;
} Product;
double line_total(Product item) {
return item.price * item.count;
}
int main(void) {
Product milk = {"Milk", 24.9, 3};
printf("%s: %.2f\n", milk.name, line_total(milk));
return 0;
}Программа выведет:
Milk: 74.70Определение Product должно стоять выше функции, потому что функция использует этот тип. Поэтому структуры обычно определяют в самом начале программы, сразу под строками #include.
Когда вы вызываете line_total(milk), параметр item получает копию всей структуры: все её поля, включая текст в name. Это то же самое, что с параметром int, и не так, как с массивом, который функция получает без копирования. Поэтому, когда функция меняет свой параметр, она меняет только копию:
#include <stdio.h>
typedef struct {
char name[20];
double price;
int count;
} Product;
void sell_one(Product item) {
item.count--;
printf("В функции: %d\n", item.count);
}
int main(void) {
Product milk = {"Milk", 24.9, 3};
sell_one(milk);
printf("В main: %d\n", milk.count);
return 0;
}Программа выведет:
В функции: 2
В main: 3Функция продала одну упаковку молока, но только из своей копии: у milk в main по-прежнему 3. В следующем упражнении вы увидите, как функция может изменить оригинал. Для функций, которые только читают структуру, как line_total, копия не мешает.
Присваивание одной структуры другой через = тоже копирует. После Product copy = milk; у переменной copy есть собственные название, цена и количество, и изменение copy.count не меняет milk. Копируется даже массив name внутри, хотя сам по себе массив присвоить нельзя. А вот сравнивать две структуры через == нельзя: milk == copy заканчивается ошибкой invalid operands to binary expression ('Product' and 'Product'). Вместо этого сравнивайте нужные поля, например milk.price == copy.price, а названия — через strcmp.
Задание
- 1
Вместо комментария напишите функцию
double area(Room room), которая возвращает площадь комнаты: её ширину, умноженную на длину. - 2
В цикле выведите площадь каждой комнаты рядом с её названием, с 2 знаками после запятой, и получайте её из вашей функции
area. Программа выведетKitchen: 13.50 м²,Bedroom: 14.00 м²иHallway: 9.00 м².