середу, 30 березня 2016 р.

C++ концепція класів та об’єктів

Роблю виклад книги по програмуванню: Siddhartha Rao Sams Teach Yourself C++ in One Hour a Day (Seventh Edition).

Нехай ми пишемо програму, котра моделює людину, яка є індивідуумом зі своїми рисами та якостями: ім’ям, датою народження, місцем народження, статтю та іншим. Людина може виконувати конкретні дії: говорити, працювати, ходити та інші.
Таким чином, перша частина інформації - це дані про людину, а друга частина інформації - її дії (функції).
Щоб програмно змоделювати людину, потрібна конструкція, котра групує атрибути, що описують людину (дані), та дії, котрі людина може виконувати (це методи, що подібні до функцій), використовуючи доступні атрибути.
Така конструкція називається клас (class).

Оголосимо взірець класу, котрий моделює людину:

class Human
{
    // Атрибути даних:
    string Name;
    string DateOfBirth;
    string PlaceOfBirth;
    string Gender;

    // Методи:
    void Talk(string TextToTalk);
    void IntroduceSelf();
    void Walk();
};


Очевидно, що метод IntroduceSelf() використовує метод void Talk() і деякі з атрибутів даних, котрі згруповані в конструкції class Human.

Всі атрибути даних та методи є членами класу Human.

Одне лише оголошення класу не матиме впливу на виконання програми.
Реальний предмет класу, який можна використовувати для виконання у ході програми - це об’єкт.
Для використання засобів класу створюється екземпляр об'єкта цього класу, що дозволяє отримати доступ до його методів та атрибутів.
Наприклад, оголошуємо об’єкт Tom класу Human, як локальну змінну:

Human Tom; // екземпляр класу Human

Також можемо зарезервувати місце для екземпляру класу Human у динамічній пам’яті, використавши оператор new:

Human* pAnotherHuman = new Human(); // розподіл динамічної пам’яті для об’єкта класу Human
delete pAnotherHuman; // звільнення пам’яті, зайнятої об’єктом класу Human

Об’єкт Tom має такий атрибут, як DateOfBirth(), до якого можна звернутись, використавши оператор точки (.) (dot operator):

Tom.DateOfBirth = "1970";

Зауважимо, що даний атрибут DateOfBirth буде виконуваним тільки тоді, коли створено об’єкт. Оператор точки (.) дозволяє нам звертатись не тільки до атрибутів класу, а також і до його методів, таких, як IntroduceSelf():

Tom.IntroduceSelf(); 

Якщо у вас є вказівник pTom на екземпляр класу Human, то для доступу до його членів можна використати оператор вказівника (->), або оператор непрямого доступу (*) для посилання на об’єкт із наступним оператором точки:

Human* pTom = new Human();
(*pTom).IntroduceSelf(); 

Якщо об’єкт було створено у динамічній пам’яті із використанням оператора new , або якщо у вас є вказівник на готовий об’єкт, то для доступу до його атрибутів і функцій можна використати оператор вказівника (->):

Human* pTom = new Human();
pTom->DateOfBirth = "1970";
pTom->IntroduceSelf();
delete pTom; 

//Альтернативно при наявності вказівника:
Human Tom;
Human *pTom = &Tom; // Присвоїти адресу, використавши оператор посилання &
pTom->DateOfBirth = "1970"; // еквівалентно Tom.DateOfBirth = "1970";
pTom->IntroduceSelf();  // еквівалентно Tom.IntroduceSelf();
 
Нижче подаю готову для компіляції форму класу Human із ключовими словами private та public:

Listing 9.1 Готовий для компіляції клас Human
------------------------------------------------------------

#include
#include
using namespace std;

class Human //Лінія 4.
{
private:
   string Name;
   int Age;

public:
   void SetName (string HumansName)
   {
      Name = HumansName;
   }

   void SetAge(int HumansAge)
   {
      Age = HumansAge;
   }

   void IntroduceSelf() // Лінія 21.
   {
      cout << "I am " << Name << " and am ";
     cout << Age << " years old" << endl;
   }
}; // Лінія 26.
 
int main()
{
   // Constructing an object of class Human with attribute Name as "Adam"
   Human FirstMan; // Лінія 31.
   FirstMan.SetName("Adam");
   FirstMan.SetAge(30);

   // Constructing an object of class Human with attribute Name as "Eve"
   Human FirstWoman; // Лінія 36.
   FirstWoman.SetName("Eve");
   FirstWoman.SetAge (28);
   
   FirstMan.IntroduceSelf();
   FirstWoman.IntroduceSelf(); //Лінія 41.
}

------------------------------------------------------------


Результат:

I am Adam and am 30 years old
I am Eve and am 28 years old


Аналіз

Лінії 4-26 демонструють створення дуже простого класу С++.
Клас має дві закриті (private) змінні: одна Name типу string у лінії 7, а інша Age типу int у лінії 8, а також кілька відкритих (public) функцій (їх називають методами): SetName(), SetAge() та IntroduceSelf() у лініях 11,16 та 21, котрі використовують закриті змінні.
Лінії 31 та 36 функції int main() створюють два об’єкти класу Human. Наступні лінії встановлюють значення змінних-членів об’єктів FirstMan та FirstWoman. використовуючи методи SetName() та SetAge(), котрі є методами доступу (accesor metod). Зверніть увагу, що в лініях 40 та 41 виклик метода цих двох об’єктів дозволив створити дві різних лінії у виведенні, котрі використовують змінні-члени (member variable), значення котрих були встановлені вище.

неділю, 27 березня 2016 р.

Пакетне зменшення розмірів зображень при допомозі ImageMagick

Вам потрібно зменшити розміри кількох сотень зображень?
То не є проблема, якщо ми використаємо ImageMagick

Для початку, ми відкриємо Термінал та створимо теку our_images, у яку завантажимо ті зображення:
mkdir our_images

Потім виконаємо команду, схожу на ось цю:
cd our_images
for i in `ls`; do convert -resize 37.5% -quality 65 $i new_name_images_$i; done


Пояснення:
1. Я встановив значення зміни розмірів зображень -resize 37.5%, а ви його змініть на таке, яке вам потрібне.
2. я встановив значення якості -quality 65. Ви його теж можете змінити. 
3. new_name_images - це нова назва змінених зображень.