/*
    Хоть язык C и не является объектно-ориентированным, некоторые зачатки подходов ООП в нём тоже есть
    Например, структуры языка C являются примером Абстракции

    Для работы со структурами мы обычно писали функции так, что каждая из этих функций принимает на вход первым аргументом указатель на наш объект.
    Такой подход НЕ является примером Инкапсуляции, так как структура и функции для работы с ней являются независимыми друг от друга.
    При желании или по ошибке можно первым аргументом в эти функции передать вообще объект другого типа.

    

    Эта программа написана на языке C, для компиляции используйте gcc:
        gcc 00book.c

    Функции в этом примере делают следующее:

        make_discount  сделать скидку на книгу, но цена на книгу не может упасть ниже 0.
        print_book     напечатать информацию о книге на экран
*/

#include <stdio.h>


struct book 
{
    char title[100];
    float price;
    int pages;
};
typedef struct book Book;


void make_discount(Book* pb, int discount) 
{
    if (pb->price > discount)
        pb->price -= discount;
    else
        pb->price = 0;
}

void print_book(const Book* pb) 
{
    printf("%s, price = %.2f, pages = %i\n", pb->title, pb->price, pb->pages);
}



int main() 
{
    Book b = {"War and Peace", 1700, 900};

    print_book(&b);
    make_discount(&b, 500);
    print_book(&b);
}
