<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [

  <!ENTITY kappname "&rocs;">
  <!ENTITY package "kdeedu">
  <!ENTITY % addindex "IGNORE">
  <!ENTITY % Ukrainian "INCLUDE">
]>
<book id="rocs" lang="&language;">

<bookinfo>
<title
>Підручник з &rocs;</title>
<authorgroup>
<author
><personname
> <firstname
>Tomaz</firstname
> <surname
>Canabrava</surname
> </personname
> <email
>tomaz.canabrava@gmail.com</email
> </author>
<author
><personname
> <firstname
>Andreas</firstname
> <surname
>Cord-Landwehr</surname
> </personname
> <email
>cordlandwehr@googlemail.com</email
> </author>

<othercredit role="translator"
><firstname
>Юрій</firstname
><surname
>Чорноіван</surname
><affiliation
><address
><email
>yurchor@ukr.net</email
></address
></affiliation
><contrib
>Переклад українською</contrib
></othercredit
> 
</authorgroup>

<copyright
><year
>2009</year
><holder
>Tomaz Canabrava</holder
></copyright>
<copyright
><year
>2011-2012</year
><holder
>Andreas Cord-Landwehr</holder
></copyright>

<date
>27 травня 2012 року</date>
<releaseinfo
>1.7 &kde; 4.9</releaseinfo>

<legalnotice
>&FDLNotice;</legalnotice>

<abstract>
<para
>&rocs; — інструмент побудови та перегляду графів, створений для KDE. </para>
</abstract>

<keywordset>
<keyword
>KDE</keyword>
<keyword
>kdeedu</keyword>
<keyword
>математика</keyword>
<keyword
>математика</keyword>
<keyword
>графи</keyword>
<keyword
>вузол</keyword>
<keyword
>ребро</keyword>
</keywordset>

</bookinfo>

<chapter id="introduction">
<title
>Вступ</title>
<para
>У цьому розділі наведено короткий огляд можливостей &rocs;. Користувачам, які хочуть негайно перейти до навчання принципам роботи у &rocs;, ми пропонуємо перейти до читання розділу <xref linkend="introduction-nutshell"/>, користуючись настановами розділу <xref linkend="scripting"/> щодо написання скриптів. </para>

<sect1 id="introduction-goals">
<title
>Мета, цільова аудиторія програми та процес роботи з нею</title>
<para
>&rocs; — комплексне середовище розробки для теорії графів, призначене для всіх, хто цікавиться розробкою та аналізом алгоритмів, пов’язаних з графами. Це зокрема</para>
<itemizedlist>
    <listitem
><para
>викладачі, які хочуть продемонструвати роботу алгоритмів, пов’язаних з графами, студентам,</para
></listitem>
    <listitem
><para
>студенти, які бажають краще зрозуміти теорію і розібратися у роботі алгоритмів,</para
></listitem>
    <listitem
><para
>та всі, хто цікавиться структурами даних та алгоритмами.</para
></listitem>
</itemizedlist>

<para
>Для всіх цих користувачів у &rocs; передбачено простий у користуванні редактор графів, списків та ієрархій, потужний рушій обробки скриптів Qt Script для виконання алгоритмів та декілька допоміжних інструментів для налаштування ваших структур даних для імітацій та експериментів. </para>

<para
>Зазвичай, спочатку слід створити граф у візуальному редакторі графів. Ви можете зробити це або вручну, тобто додаванням вузлів та з’єднуванням цих вузлів, або за допомогою одного з допоміжних алгоритмів (якщо такі визначено у додатку поточної структури даних), пункти яких можна знайти у меню <menuchoice
><guimenu
>Документ графу</guimenu
> <guimenuitem
>Інструменти</guimenuitem
> <guimenuitem
>Створити граф</guimenuitem
></menuchoice
>. Далі, ви також можете скористатися допоміжними інструментами меню <menuchoice
><guimenu
>Документ графу</guimenu
> <guimenuitem
>Інструменти</guimenuitem
> <guimenuitem
>Додавання значень</guimenuitem
></menuchoice
>. Нарешті, ви можете описати власний алгоритм мовою JavaScript і виконати його для щойно створеної структури даних. Зміни, внесені до вашого алгоритму, буде негайно відтворено на панелі візуального редактора графів. </para>

<screenshot>
<screeninfo
>Знімок вікна &rocs;.</screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="rocs-screenshot.png" format="PNG"/>
</imageobject>
<textobject>
<phrase
>Знімок вікна &rocs;.</phrase>
</textobject>
</mediaobject>
</screenshot>
</sect1>

<sect1 id="introduction-nutshell">
<title
>Ядро &rocs;</title>
<para
>У цьому розділі наведено стислий огляд основних елементів &rocs;. Надано пояснення щодо важливих понять структур даних, додатків структур та типів елементів. Ці знання є корисними для покращення розуміння принципів створення структур даних та внесення до них змін у &rocs;. </para>
<para
>Загалом, &rocs; працює з проектами: під час запуску &rocs; створюється порожній проект. Ви можете замінити цей порожній проект завантаженням або імпортуванням іншого проекту. Сам проект складається з <emphasis
>документів графів</emphasis
> та <emphasis
>скрипти</emphasis
>. </para>

<sect2>
<title
>Додатки документів графів та структур даних</title>
<para
>Документ графу відповідає вмісту панелі візуального редактора графів. Таким чином, документ графу може містити декілька структур даних одночасно, але використовувати лише один додаток обробки структури даних. Передбачено додатки обробки структур даних для декількох типів графів (загальні графи, лінійні списки, кореневі дерева). Додатки забезпечують доступ до додаткових функціональних можливостей певного типу графів. Серед цих можливостей автоматичне розташовування елементів графу, особливі набори піктограм або розширені набори функцій скриптів, якими можна скористатися у алгоритмах. Докладніший опис наведено у відповідному розділі підручника. Ви можете змінити додаток обробки структури даних для документа графу, але це може призвести до втрати даних (наприклад, ребра циклу загального графу не може бути додано до дерева, якщо перемкнетеся на використання додатка кореневого дерева). </para>
<para
>Документи графів є основою визначення типів вказівників та даних. </para>
</sect2>

<sect2>
<title
>Структури даних</title>
<para
>Структури даних є основою всіх дій, які може виконувати &rocs;. Ви можете додати одну або декілька структур до документа графу, додати елементи даних (вузли, значення) та вказівники до структури. Також можна вносити зміни до структур даних за допомогою скриптів. Доступ до структур даних зі скриптів здійснюється за допомогою унікальної назви структури даних. Вибір поточного додатка обробки структури даних дещо обмежує можливість внесення змін до структур даних (наприклад, у дереві не може міститися циклів). Додаток обробки структури даних визначається на рівні документа, який містить відповідну структуру даних. </para>
</sect2>

<sect2>
<title
>Типи вказівників</title>
<para
>За допомогою типів вказівників ви можете визначити різноманітні вказівники, які використовуватимуться у структурах даних. Кожен тип вказівника має особливий формат компонування (зокрема колір). Доступ до вказівника певного типу можна легко отримати за допомогою скрипту. Типовими випадками використання вказівників може бути реалізація метаребер у ваших структурах даних, які візуалізуватимуть зв’язки між елементами даних (наприклад візуалізуватимуть зацікавленість у спілкуванні). Крім того, якщо вашим скриптам потрібно ідентифікувати ребра певного типу (наприклад, ребра та перехресті дерева у алгоритмі пошуку вглибину), типи вказівників можуть бути чудовим способом реалізації ідентифікації. </para>
</sect2>

<sect2>
<title
>Типи даних</title>
<para
>У декількох задачах обробки структур даних набір елементів даних має бути поділено на групи різних типів (наприклад, у задачах з кластеризації та покриття). Типи можуть бути корисними для виконання алгоритмів, у яких для визначення певного типу використовується тип елемента структури даних (наприклад, у алгоритмі пошуку у ширину). Якщо вам потрібно саме це, скористайтеся визначенням типів даних. Кожному типу даних відповідає власна піктограма. Доступ до певних типів даних можна зовсім просто здійснювати зі скриптів. </para>
</sect2>

<sect2>
<title
>Динамічні властивості</title>
<para
>У кожного елемента даних та вказівника є дві властивості: <literal
>name</literal
> і <literal
>value</literal
>. Розширити перелік властивостей елемента даних або вказівника можна за допомогою додавання <emphasis
>динамічних властивостей</emphasis
>. Кожна динамічна властивість визначається назвою і може містити довільний рядок даних. Додати динамічну властивість можна за допомогою діалогових вікон <guilabel
>Властивості даних</guilabel
> та <guilabel
>Властивості вказівника</guilabel
>, доступ до яких здійснюється за допомогою контекстних меню відповідних елементів, або функцій скриптів, описаних у розділі <xref linkend="scripting-data-structure"/>. </para>
</sect2>
</sect1>

<sect1 id="introduction-tutorial">
<title
>Покрокові настанови</title>
<para
>У цьому розділі наведено опис прикладу проекту з метою ознайомлення з деякими найважливішими функціональними можливостями &rocs;. Метою є створення графу і скрипту, за допомогою яких може бути проілюстровано простий алгоритм «наближеного» розв’язання для задачі <emphasis
>мінімального вершинного покриття</emphasis
>. Задача мінімального вершинного покриття полягає у відшуканні підмножини вузлів графу, C, мінімального розміру, такої, що кожне ребро графу з’єднано принаймні з одним вузлом у C. Відомо, що ця задача є NP-повною. Ми намагатимемося проілюструвати спосіб відшукання наближення, кількість вузлів у якому не буде перевищувати подвоєну кількість вузлів у мінімальному покритті, за допомогою пошуку відповідностей у вказаному графі (надалі використовуватимемо загальні терміни алгоритмів для графів: граф називатимемо структурою даних, вузли — елементами даних, ребра — вказівниками). </para>
<para
>Нашою метою буде візуалізації зв’язку між відповідностями і мінімальним вершинним покриттям. Для цього ми визначимо два типи вказівників: один для показу відповідних ребер і ще один для показу звичайних ребер; а також два типи даних, за допомогою яких відрізнятимемо вузли, що належать до C, і вузли, що не належать до C. </para>

<sect2>
<title
>Створення графу</title>
<para
>У додатку графів &rocs; передбачено допоміжний інструмент для створення графів. Викликати його можна за допомогою пункту меню <menuchoice
><guimenu
>Документ графу</guimenu
> <guisubmenu
>Інструменти</guisubmenu
> <guimenuitem
>Створення графу</guimenuitem
></menuchoice
>. Створимо «Випадковий граф» з 30 вузлами, 90 ребрами та породжувачем 1 (породжувач впливає на послідовність псевдовипадкових чисел, на основі якої створюється граф; використання одного породжувача декілька разів призведе до повторного створення тих самих графів). Крім того, внесемо зміни до назви графу за допомогою панелі структури даних: назвемо граф <literal
>testgraph</literal
>. </para>
</sect2>

<sect2>
<title
>Створення типів</title>
<para
>Скористаємося кнопкою <guibutton
>Властивості документа</guibutton
> на панелі структури даних для відкриття діалогового вікна властивостей для типів даних і вказівників поточного документа графу. Додамо новий тип даних з назвою «C». Цей тип даних автоматично отримає ідентифікатор <literal
>1</literal
>. Виберемо для цього типу даних піктограму із зображенням сервера. Далі, перемкнемося на сторінку типів вказівників і додамо новий тип вказівника з назвою «matching» (відповідність). Цей тип автоматично отримає ідентифікатор <literal
>1</literal
>. Визначимо для нього синій колір. </para>
</sect2>

<sect2>
<title
>Алгоритм</title>
<para
>Нарешті, нам слід реалізувати алгоритм апроксимації. Для цього ми скористаємося таким кодом: </para>
<programlisting
>var E = testgraph.list_edges(); // набір необроблених ребер
var C = new Array();            // відповідні ребра
while (E.length 
> 0) {
    var e = E[0];        // беремо перше ребро e={u,v}
    var u = e.start();
    var v = e.end();
    e.set_type(1);        // зробити ребро відповідним ребром
    E.shift();            // вилучити e (тобто E[0]) зі списку ребер
    C.push(u);            // додати u до C
    C.push(v);            // додати v до C

    // позначити u,v як вузли у C
    u.set_type(1);
    v.set_type(1);

    // вилучити з E всі ребра з кінцями в u або v
    var adjacent = u.adj_edges();
    for (var i=0; i &lt; adjacent.length; i++) {
        var index = E.indexOf(adjacent[i]); // визначити індекс
        if (index!=-1) {
            E.splice(index, 1); // вилучити його, якщо знайдено
        }
    }
    var adjacent = v.adj_edges();
    for (var i=0; i &lt; adjacent.length; i++) {
        var index = E.indexOf(adjacent[i]); // визначити індекс
        if (index!=-1) {
            E.splice(index, 1); // вилучити його, якщо знайдено
        }
    }
}
output("Vertex Cover contains " + C.length + " nodes.");
</programlisting>
</sect2>

<sect2>
<title
>Виконання алгоритму</title>
<para
>Нарешті, алгоритм слід виконати. Для цього ми розпочнемо його виконання натисканням кнопки <guibutton
>Виконати</guibutton
> на панелі керування скриптами. </para>
</sect2>
</sect1>
</chapter>

<chapter id="user-interface">
<title
>Інтерфейс користувача &rocs;</title>

<sect1 id="user-interface-all">
<title
>Загальні елементи інтерфейсу користувача</title>
<para
>Інтефейс користувача програми поділено на декілька логічних частин, як це показано на наведеному нижче знімку. </para>
<screenshot>
    <screeninfo
>Елементи графічного інтерфейсу &rocs;.</screeninfo>
    <mediaobject>
    <imageobject>
    <imagedata fileref="rocs-interfaces.png" format="PNG"/>
    </imageobject>
    <textobject>
    <phrase
>Елементи графічного інтерфейсу &rocs;.</phrase>
    </textobject>
    </mediaobject>
</screenshot>
<variablelist>
<varlistentry>
    <term
>Візуальний редактор графів</term>
    <listitem
><para
>Це панель, за допомогою якої ви можете створювати структури даних або вносити змінні до структур даних. Відкрити контекстні меню панелі, елементів даних та вказівників можна за допомогою клацання правою кнопкою миші. Ви можете скористатися інструментами <emphasis
>панелі візуального редактора графів</emphasis
> для внесення змін до елементів панелі візуального редактора графів.</para
></listitem>
</varlistentry>
<varlistentry>
    <term
>Панель візуального редактора графів</term>
    <listitem
><para
>Цими інструментами можна скористатися для внесення змін до структур даних на панелі візуального редактора графів. Використання кнопок <guibutton
>Додати дані</guibutton
> і <guibutton
>Додати з’єднання</guibutton
> для створення нових елементів даних додає нові елементи даних або нові вказівник, відповідно, до поточної позначеної структури даних на <emphasis
>віджеті властивості графів</emphasis
>. Зауважте, що для інструментів <guibutton
>Додати дані</guibutton
> і <guibutton
>Додати з’єднання</guibutton
> передбачено контекстні меню для вибору типу даних або типу вказівника нових створених елементів. Докладніше про це можна дізнатися з розділу <xref linkend="user-interface-toolbars"/>. </para
></listitem>
</varlistentry>
<varlistentry>
    <term
>Властивості графу</term>
    <listitem
><para
>За допомогою верхньої частини вікна ви можете вибрати поточний документа графу, відкрити діалогове вікно налаштовування та додати нові структури даних до поточного документа графу (тобто панелі показу графу). Нижче ви можете вибрати поточну структуру даних. Там же ви можете внести зміни до переліку показаних властивостей (назв, значень, об’єктів) елементів даних та вказівників натисканням відповідних кнопок. Натисканням назв типів даних та вказівників ви можете отримати доступ до діалогових вікон налаштовування. Докладніше про це можна дізнатися з розділу <xref linkend="user-interface-graph-properties"/>. </para
></listitem>
</varlistentry>
<varlistentry>
    <term
>Редактор скриптів</term>
    <listitem
><para
>У полі цього текстового редактора ви можете створювати скрипти алгоритмів у спосіб, описаний у розділі <xref linkend="scripting"/>. Ви можете працювати одночасно над декількома алгоритмами: для цього достатньо відкрити або створити декілька вкладок скриптів за допомогою головного меню програми. Якщо зміни, внесені на якійсь із вкладок це не збережено, програма показуватиме невеличкий символ диска на заголовку цієї вкладки. </para
></listitem>
</varlistentry>
<varlistentry>
    <term
>Панель діагностичних повідомлень та виведення даних</term>
    <listitem
><para
>До цього поля програма виводитиме діагностичні повідомлення або дані, виведені скриптом, залежно від вибору параметра виведення даних. Якщо під час виконання скрипту станеться помилка, програма негайно перемкнеться у режим діагностичних повідомлень. Крім того, серед діагностичних повідомлень будуть і всі повідомлення, виведені скриптом під час виконання. </para
></listitem>
</varlistentry>
<varlistentry>
    <term
>Керування</term>
    <listitem
><para
>На цій панелі розташовано елементи керування виконанням скриптів. Ви можете наказати програмі виконати скрипт, відкритий у редакторів скриптів, натисканням кнопки <guiicon
>Пуск</guiicon
>. Якщо виконання скрипту ще не завершено, його можна зупинити натисканням кнопки <guiicon
>Стоп</guiicon
>. Зауважте, що у відповідь на натискання кнопки <guibutton
>Один крок</guibutton
> програма виконає скрипт до певного наступного ключового слова (див. розділ <xref linkend="scripting"/>). </para
></listitem>
</varlistentry>
</variablelist>
</sect1>

<sect1 id="user-interface-toolbars">
<title
>Панелі інструментів</title>
<para
>На панелі візуального редактора графів передбачено декілька панелей інструментів, за допомогою яких ви зможете отримувати доступ до можливостей програми у одне клацання кнопкою миші. За типових налаштувань буде показано такі панелі інструментів:</para>
<itemizedlist>
    <listitem
><para
>Головна панель інструментів</para
></listitem>
    <listitem
><para
>Панель інструментів вирівнювання</para
></listitem>
</itemizedlist>
<!--  -->
<sect2 id="user-interface-toolbars-main">
<title
>Головна панель інструментів</title>
<para
>На <emphasis
>головній панелі інструментів</emphasis
> буде показано вказані нижче кнопки дій. Натискання кнопки дії, означатиме, що вказівник миші виконуватиме відповідну дію на панелі візуального редактора графів:</para>
<itemizedlist>
<listitem
><para
><guilabel
>Пересунути</guilabel
>: щоб позначити елементи, натисніть ліву кнопку миші на порожньому місці на графі, утримуйте кнопку натисненою і рухом вказівника миші створіть прямокутник, у якому міститимуться елементи даних та/або вказівники. Якщо треба позначити окремий елемент, просто клацніть лівою кнопкою миші на цьому елементі. Якщо ви наведете вказівник миші на позначений елемент або набір елементів, натиснете і утримуватимете натисненою ліву кнопку миші, а потім почнете рухати вказівник, разом з ним почнуть рухатися позначені елементи. Пересунути позначені елементи можна також за допомогою клавіш зі стрілочками.</para
></listitem>
<listitem
><para
><guilabel
>Додати дані</guilabel
>: клацніть у довільній точці панелі візуального редактора, щоб створити новий вузол, який належатиме поточній позначеній структурі даних. Якщо ви продовжите утримувати кнопку миші, програма покаже контекстне меню, за допомогою якого ви зможете вибрати тип даних нового елемента (якщо передбачено різні типи даних елементів).</para
></listitem>
<listitem
><para
><guilabel
>Додати з’єднання</guilabel
>: наведіть вказівник миші на позицію першого вузла, натисніть і утримуйте натисненою ліву кнопку миші, перетягніть вказівник до позиції другого вузла, до якого має прямувати вказівник/ребро. Виконати цю дію можна буде, лише якщо у поточному графі можливе додавання такого ребра (наприклад, у незорієнтованому графі не можна додавати декілька ребер між двома вузлами). Якщо ви утримуватимете натисненою кнопку миші і далі, програма покаже контекстне меню, за допомогою якого можна буде вибрати тип вказівника (якщо типи вказівників передбачено поточним типом графу).</para
></listitem>
<listitem
><para
><guilabel
>Вилучити</guilabel
>: клацніть на елементі графу, щоб його вилучити. Якщо ви вилучите вузол, всі ребра, які з ним з’єднано, також буде вилучено.</para
></listitem>
<listitem
><para
><guilabel
>Масштаб</guilabel
>: наведіть вказівник на панель візуального редактора, натисніть і утримуйте натисненою ліву кнопку миші, перетягніть вказівник так, щоб у отриманому прямокутнику містилися всі потрібні вам елементи, відпустіть кнопку миші. Панель візуального редактора буде масштабовано відповідно до вказаного вами прямокутника. Збільшити або зменшити масштаб можна за допомогою прокручування коліщатка миші. Подвійне клацання лівою кнопкою миші відновлює початковий масштаб.</para
></listitem>
</itemizedlist>
<screenshot>
<screeninfo
>Головна панель інструментів.</screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="rocs-toolbar-main.png" format="PNG"/>
</imageobject>
<textobject>
<phrase
>Головна панель інструментів.</phrase>
</textobject>
</mediaobject>
</screenshot>
</sect2>

<sect2 id="user-interface-toolbars-alignment">
<title
>Панель інструментів вирівнювання</title>
<para
>Крім того, ви можете додати відкрити додаткову <emphasis
>панель вирівнювання</emphasis
>. Натискання кнопки дії на цій панелі призведе до негайного виконання дії над поточними позначеними вузлами.</para>
<itemizedlist>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsaligntop.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Вгору</guilabel
>: вирівняти елементи даних за вертикальною позицією найвищого з них. Змінено буде лише вертикальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignvmiddle.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Центр</guilabel
>: вирівняти елементи даних за вертикальною позицією середнього значення вертикальних координат всіх позначених елементів даних. Змінено буде лише вертикальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignbottom.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Основа</guilabel
>: вирівняти елементи даних за вертикальною позицією найнижчого з них. Змінено буде лише вертикальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignleft.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Ліворуч</guilabel
>: вирівняти вузли на горизонтальною позицією найлівішого елемента даних. Змінено буде лише горизонтальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignhmiddle.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Центр</guilabel
>: вирівняти вузли на горизонтальною позицією найвищого елемента даних. Змінено буде лише горизонтальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignright.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Праворуч</guilabel
>: вирівняти вузли на горизонтальною позицією найправішого елемента даних. Змінено буде лише горизонтальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsaligncircle.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Коло</guilabel
>: розташувати елементи даних на колі з діаметром, рівним максимальній відстані між елементами даних. Елементи даних на колі буде розташовано у такому самому порядку, у якому їх видно з центра мас елементів даних.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsaligntree.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Мінімізувати кількість перетинів ребер</guilabel
>: застосувати алгоритм Фругтермана-Рейнґольда для мінімізації (наближено) кількості з’єднань, що перетинаються.</para
></listitem>
</itemizedlist>
<screenshot>
<screeninfo
>Панель інструментів вирівнювання.</screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="rocs-toolbar-alignment.png" format="PNG"/>
</imageobject>
<textobject>
<phrase
>Панель інструментів вирівнювання.</phrase>
</textobject>
</mediaobject>
</screenshot>
</sect2>
</sect1>

<sect1 id="user-interface-graph-properties">
<title
>Панель властивостей графу</title>
<para
>За допомогою верхньої частини панелі можна вибрати поточний документ графу. Нижче передбачено можливість створення структур даних та налаштовування вже створених структур даних. </para>

<sect2 id="user-interface-graph-properties-document">
<title
>Вибір документа та доступ до його властивостей</title>
<para
>За допомогою верхньої частини панелі ви можете вибрати поточний документ графу. Документ графу відповідає зображенню на панелі візуального редактора графів. Щоб створити новий документ графу або додати вже створений документ до проекту, скористайтеся пунктами меню <menuchoice
><guimenu
>Проект</guimenu
> <guimenuitem
>Створити документ графу</guimenuitem
></menuchoice
> та <menuchoice
><guimenu
>Проект</guimenu
> <guimenuitem
>Імпортувати граф &rocs;</guimenuitem
></menuchoice
>. Крім того, ви можете імпортувати документи графів зі сторонніх програм (докладніше про це можна дізнатися з розділу <xref linkend="import-export"/>). Доступ до властивостей документа графу можна отримати за допомогою натискання кнопки <guibutton
>Властивості</guibutton
>. </para>
</sect2>

<sect2 id="user-interface-graph-properties-datastructure-create">
<title
>Створення структур даних</title>
<para
>Додати нову структуру даних можна вставленням ідентифікатора (без пробілів та символів кирилиці) з наступним натисканням кнопки <guibutton
>Додати</guibutton
>. Вказаний ідентифікатор потім буде використано для доступу до структури даних з алгоритмів. </para>
</sect2>

<sect2 id="user-interface-graph-properties-datastructure-config">
<title
>Налаштовування структур даних</title>
<para
>Всі доступні структури даних з поточного документа графу буде показано у списку вибору. Після вибору одної зі структур буде показано налаштування відповідної структури даних: </para>
    
<itemizedlist>
    <listitem
><para
><guibutton
>Вилучити</guibutton
>: вилучити структуру даних. </para
></listitem>
    <listitem
><para
><guilabel
>Назва</guilabel
>: ідентифікатор структури даних. Цей ідентифікатор буде використано для доступу до структури у ваших алгоритмах. </para
></listitem>
    <listitem
><para
><guilabel
>Параметри показу</guilabel
>. Нижче буде показано всі типи даних та вказівників структури даних. Натисканням пункту назви можна відкрити діалогові вікна налаштовування відповідних типів. Крім того, натисканням відповідних кнопок можна керувати видимістю елементів даних та вказівників, назв та значень елементів відповідного типу. </para
></listitem>
</itemizedlist>
</sect2>

<sect2 id="user-interface-graph-properties-datastructure-individual">
<title
>Налаштовування параметрів додатка структур даних</title>
<para
>Кожен з додатків структур даних може додавати пункти до діалогового вікна налаштовування структури даних. Для стандартного додатка структури даних передбачено такі пункти: </para>
    
<sect3>
<title
>Додаток графів</title>
<para
>Скористайтеся пунктом <guilabel
>Тип графу</guilabel
> для вибору типу графу. Призначення цих типів є таким: </para>
<itemizedlist>
    <listitem
><para
><guilabel
>Зорієнтований граф</guilabel
>: граф з зорієнтованими ребрами, у якому не передбачено можливості визначення декількох орієнтованих ребер між двома вузлами. </para
></listitem>
    <listitem
><para
><guilabel
>Незорієнтований граф</guilabel
>: граф без орієнтації ребер, у якому не передбачено можливості визначення декількох ребер між двома вузлами. </para
></listitem>
    <listitem
><para
><guilabel
>Зорієнтований мультиграф</guilabel
>: граф з зорієнтованими ребрами, у якому передбачено можливість визначення декількох орієнтованих ребер між двома вузлами. </para
></listitem>
    <listitem
><para
><guilabel
>Незорієнтований мультиграф</guilabel
>: граф без орієнтації ребер, у якому передбачено можливість визначення декількох ребер між двома вузлами. </para
></listitem>
</itemizedlist>
</sect3>

<sect3>
<title
>Додаток «кореневого дерева»</title>
<para
>Позначенням пункту властивості <guilabel
>Показувати всі вказівники</guilabel
> можна наказати програмі показати всі вказівники між вузлами дерева. Якщо пункт не буде позначено, кратні вказівники між вузлами буде спрощено до одинарних. </para>
</sect3>

</sect2>
</sect1>
</chapter>

<chapter id="scripting">
<title
>Написання та виконання алгоритмів у &rocs;</title>

<para
>У &rocs; використовується рушій обробки скриптів QtScript, який працює з одним з діалектів JavaScript. Це означає, що всі алгоритми, які ви створюватимете, має бути написано мовою JavaScript. У цьому підручнику немає опису принципів роботи та способів написання скриптів JavaScript, хоча тут ви знайдете опис способів доступу до структур даних, елементів даних та вказівників ваших структур даних за допомогою рушія обробки скриптів. Оскільки ви не використовуватимете об’єкт основної структури даних напряму, працюючи з об’єктом, що надається поточним використаним додатком структури даних, функціональні можливості структури даних розширюються відповідним додатком, отже вам слід ознайомитися з відповідними функціональними можливостями. Зокрема, у додатках структур даних використовуються загальні терміни теорії (вузли (nodes) та ребра (edges) у графах, листя (leafs) і корені (roots) у деревах тощо). </para>
<para
>Важливо розуміти, що зміни, внесені рушієм для обробки скриптів, безпосередньо відтворюються у властивостях панелі візуального редактора графів. Отже, скрипти безпосередньо змінюють структури даних. </para>

<sect1 id="scripting-data-structure">
<title
>Елементи основної структури даних</title>
<para
>Кожен додаток надає доступ до особливого набору функцій та властивостей для структури даних та її елементів. Крім того, кожен додаток надає доступ до властивостей та функцій, які визначаються для основної структури даних. Отже, описи з цього розділу стосуються до всіх додатків структур даних. </para>
<sect2
><title
>Властивості основної структури даних</title>
<para
>Структури даних ідентифікуються за назвами. Припустимо, вами створено структуру даних з назвою <literal
>testgraph</literal
>, тоді ви зможете отримати доступ до структури даних за її ідентифікатором. Наприклад, щоб отримати масив з усіма елементами даних у вказаній структурі даних, ви можете вписати до вашого скрипту інструкцію <literal
>testgraph.list_nodes();</literal
>. </para>

<sect3>
<title
>Властивості і функції основної структури даних</title>
<para
>Кожна структура даних <literal
>testgraph</literal
> має такі властивості, які можна читати або записувати за допомогою <literal
>testgraph.властивість</literal
>: </para>
<programlisting
>string name  // ідентифікація структури даних
</programlisting>
</sect3>
</sect2>

<sect2>
<title
>Властивості та функції основного елемента даних</title>
<para
>Кожен з елементів даних має такі властивості, які можна прочитати або записати </para>
<programlisting
>double x      // координата поточної позиції за x
double y      // координата поточної позиції за y
double width  // розмір
string value  // значення
string name   // назва
string color  // колір у HEXA
</programlisting>
<para
>Крім того, доступ до всіх динамічних властивостей елемента даних можна отримати за їхніми назвами. </para>

<para
>Для кожного об’єкта елемента даних передбачено такі методи: </para>
<programlisting
>int type();                         // тип даних елемента даних
int set_type(int);                  // встановлення типу даних елемента даних
void add_property(string name, string value);      // додати динамічну властивість із вказаною назвою і значенням до елемента даних
array adj_data();                   // список сусідніх даних
array adj_pointers();               // список сусідніх вказівників
array input_pointers();             // список вхідних вказівників
array output_pointers();            // список вихідних вказівників
array loop_pointers();              // список вказівників, що є замкненими циклами
array connected_pointers(target);   // список вказівників, що вказують на «target»
void self_remove();                 // вилучення цього елемента даних
</programlisting>
</sect2>

<sect2>
<title
>Властивості та функції основного вказівника</title>
<para
>Кожен з вказівників має такі властивості, які можна прочитати або записати </para>
<programlisting
>string color  // колір у HEXA
string value  // значення
string name   // назва
double width  // ширина
string style  // значення з набору: dot, dash, dash dot, solid
</programlisting>
<para
>Крім того, доступ до всіх динамічних властивостей вказівника можна отримати за їхніми назвами. </para>

<para
>Для кожного об’єкта вказівника передбачено такі методи: </para>
<programlisting
>int type();                         // тип вказівника
int set_type(int);                  // встановлення типу вказівника
void add_property(string name,      // додати динамічну властивість із вказаною назвою та значенням до елемента даних
node start();                       // початковий вузол вказівника
node end();                         // вузол призначення вказівника
void self_remove();                 // вилучення цього вказівника
</programlisting>
</sect2>
</sect1>

<sect1 id="scripting-plugin-graph">
<title
>Додаток графів</title>
<sect2>
<title
>Властивості і функції графу</title>

<sect3>
<title
>Структура графу</title>
<para
>Якщо вказано об’єкт структури даних типу «граф», ви зможете викликати такі функції роботи з елементами: </para>
<programlisting
>array list_nodes();                   // список всіх вузлів графу
array list_edges();                   // список всіх ребер графу
node add_node(name);                  // додавання нового вузла з його поверненням
edge add_edge(node from, node to);    // додати нове ребро з «from» до «to» з його поверненням
array overlay_edges(int overlayID);   // список всіх ребер у вказаному перекритті
edge add_overlay_edge(node from,
                      node to,
                      int overlayID); // додати ребро вказаного типу вказівника у вказаному перекритті
</programlisting>
</sect3>

<sect3>
<title
>Ребра графу</title>
<para
>Якщо вказано об’єкт структури даних типу «граф», ви зможете викликати такі функції роботи з вузлами графу, додатково до властивостей, що надаються елементами даних: </para>
<programlisting
>array adj_nodes();                    // список всіх сусідніх вузлів
array adj_edges();                    // список з’єднаних ребер
array input_edges();                  // список вхідних ребер
array output_edges();                 // список всіх вихідних ребер
array loop_edges();                   // список всіх циклічних ребер вузла
array connected_edges(node target);   // всі ребра, що з’єднують цей вузол з вузлом «target»
</programlisting>
</sect3>

<sect3>
<title
>Ребра графу</title>
<para
>Якщо вказано ребра структури даних типу «граф», доступними будуть лише властивості основної структури даних. </para>
</sect3>
</sect2>

<sect2>
<title
>Алгоритми структури графів</title>
<para
>Додаток графу надає доступ до деяких особливих функцій, якими можна скористатися з рушія роботи зі скриптами.</para>
<variablelist>
<varlistentry>
<term
>Обчислення найкоротшого маршруту</term>
<listitem>
    <para
>Обчислити найкоротший шлях між вузлами <emphasis
>початок</emphasis
> і <emphasis
>кінець</emphasis
>. Обидва вузли мають належати одному графу. Під час обчислення враховується те, чи є граф зорієнтованим.</para>
    <funcsynopsis>
    <funcprototype
><funcdef
>array <function
>dijkstra_shortest_path</function
></funcdef
> <paramdef
>node <parameter
><replaceable
>початок</replaceable
></parameter
></paramdef
> <paramdef
>node <parameter
><replaceable
>кінець</replaceable
></parameter
></paramdef
> </funcprototype>
    </funcsynopsis>
</listitem>
</varlistentry>
<varlistentry>
<term
>Найкоротші відстані</term>
<listitem>
    <para
>Обчислити найкоротший шлях між вузлами <emphasis
>початок</emphasis
> і всіма іншими вузлами графу. Під час обчислення враховується те, чи є граф зорієнтованим.</para>
    <funcsynopsis>
    <funcprototype
><funcdef
>array <function
>distances</function
></funcdef
> <paramdef
>node <parameter
><replaceable
>початок</replaceable
></parameter
></paramdef
> </funcprototype>
    </funcsynopsis>
</listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>

<sect1 id="scripting-plugin-linkedlist">
<title
>Додаток лінійних списків</title>
<sect2>
<title
>Властивості і функції лінійних списків</title>

<sect3>
<title
>Структура лінійного списку</title>
<para
>Якщо вказано об’єкт структури даних типу «лінійний список», ви зможете викликати такі функції роботи з елементами: </para>
<programlisting
>node begin();                           // повертає головний вузол лінійного списку
setBegin(node begin):                   // робить вузол begin початковим вузлом списку і перевпорядковує список
createNode();                           // створює новий вузол списку
</programlisting>
</sect3>

<sect3>
<title
>Вузли пов’язаних списків</title>
<para
>Якщо вказано об’єкт структури даних типу «лінійний список», ви зможете викликати такі функції роботи з вузлами графу, додатково до властивостей, що надаються елементами даних: </para>
<programlisting
>node front();                           // повертає попередник вузла
</programlisting>
</sect3>

<sect3>
<title
>Ребра лінійних списків</title>
<para
>Якщо вказано ребра структури даних типу «лінійний список», доступними будуть лише властивості основної структури даних. </para>
</sect3>
</sect2>
</sect1>

<sect1 id="scripting-plugin-rootedtree">
<title
>Додаток «кореневого дерева»</title>
<sect2>
<title
>Властивості і функції «кореневого дерева»</title>

<sect3>
<title
>Структура «кореневе дерево»</title>
<para
>Якщо вказано об’єкт структури даних типу «кореневе дерево», ви зможете виконувати читання або запис таких властивостей: </para>
<programlisting
>ShowAllPointers     // встановіть значення true, якщо слід показувати всі ребра, або false, якщо кратні ребра слід спрощувати
</programlisting>
<para
>Якщо вказано об’єкт структури даних типу «кореневе дерево», ви зможете викликати такі функції роботи з елементами: </para>
<programlisting
>node add_data(string name);         // додати вузол з вказаною назвою до дерева
void set_root_node(node root);      // зробити root кореневим вузлом дерева
node root_node();                   // повертає кореневий вузол дерева
</programlisting>
</sect3>

<sect3>
<title
>Вузли «кореневого дерева»</title>
<para
>Якщо вказано об’єкт вузла типу «кореневе дерево», ви зможете виконувати читання або запис таких властивостей: </para>
<programlisting
>int numberOfChilds                  // встановити кількість (дозволену) дочірніх вузлів цього вузла
node left_child                     // лише читання: вузол, який є лівим дочірнім
node right_child                    // лише читання: вузол, який є правим дочірнім
node node_parent                    // лише читання: вузол, який є батьківським
</programlisting>
<para
>Якщо вказано ребра структури даних типу «кореневе дерево», ви зможете викликати такі функції роботи з елементами: </para>
<programlisting
>node add_left_child(node child);    // додати лівий дочірній
node add_right_child(node child);   // додати правий дочірній
node add_child(node child, int i);  // додати дочірній вузол як i-ий дочірній вузол вузла
node add_node_parent(node child);   // додати батьківський вузол (буде успішним, лише якщо батьківського вузла ще не було)
node left_child();                  // повертає правий дочірній
node right_child();                 // повертає лівий дочірній
node child_at(int i);               // повертає i-ий дочірній вузол вузла
node node_parent();                 // повертає батьківський вузол вузла
</programlisting>
</sect3>

<sect3>
<title
>Ребра «кореневого дерева»</title>
<para
>Якщо вказано ребра структури даних типу «кореневе дерево», доступними будуть лише властивості основної структури даних. </para>
</sect3>
</sect2>
</sect1>

<sect1 id="scripting-controls">
<title
>Керування виконанням скриптів</title>
     

<sect2>
<title
>Включення файлів</title>
<para
>Ваші документи скриптів можуть включати інші скрипти. Така можливість може бути корисною для зменшення розмірів документів скриптів та полегшення читання скриптів. За допомогою пункту меню <menuchoice
><guimenu
>Документ скрипту</guimenu
> <guimenuitem
>Можливі включення</guimenuitem
></menuchoice
> ви можете отримати список файлів скриптів, вже включених до пакунка &rocs;, якими ви можете скористатися. Включити файл скрипту можна такою командою: </para>
<programlisting
>include_script(string path);            // відносний або абсолютний шлях до файла скрипту
</programlisting>
</sect2>

<sect2 id="scripting-output">
<title
>Дані, виведені скриптами</title>
<para
>Під час виконання алгоритму діагностичні повідомлення та повідомлення, виведені програмою, буде показано на панелі <emphasis
>Вивід повідомлень</emphasis
>. Якщо рушієм обробки скриптів буде виявлено синтаксичну помилку у вашому скрипті, відповідне повідомлення також буде показано серед діагностичних повідомлень. Зауважте, що всі повідомлення, виведені програмою, також буде показано і у списку діагностичних повідомлень (напівжирним шрифтом). </para>
<para
>Керувати текстом, який буде виведено скриптом, можна за допомогою таких функцій: </para>
<programlisting
>output(string message);            // виводить повідомлення до рядків виведення скрипту
debug(string message);             // виводить повідомлення до рядків діагностичних повідомлень
</programlisting>
</sect2>

<sect2 id="scripting-controlling">
<title
>Керування виконанням скриптів</title>
<para
>Передбачено різні режими виконання ваших скриптів. </para>
<para
>Керувати текстом, який буде виведено скриптом, можна за допомогою таких функцій: </para>
<itemizedlist>
    <listitem
><para>
        <inlinemediaobject
><imageobject>
        <imagedata fileref="rocs-control-engine-run.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Пуск</guilabel
>: виконати скрипт, аж до завершення його роботи.</para
></listitem>
    <listitem
><para>
        <inlinemediaobject
><imageobject>
        <imagedata fileref="rocs-control-engine-stop.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Стоп</guilabel
>: припинити виконання скрипту (доступне, лише якщо виконується скрипт).</para
></listitem>
    <listitem
><para>
        <inlinemediaobject
><imageobject>
        <imagedata fileref="rocs-control-engine-step.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Один крок</guilabel
>: виконати скрипт до завершення одного кроку. Крок завершується, коли скриптом викликається функція <literal
>interrupt()</literal
>:</para>
    <programlisting
>interrupt();    // завершує крок
    </programlisting>
    </listitem>
    <listitem
><para>
        <inlinemediaobject
><imageobject>
        <imagedata fileref="rocs-control-engine-debug.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Діагностика</guilabel
>: виконати скрипт у режимі діагностики. Програма відкриє діалогове вікно діагностики QtScript.</para
></listitem>
</itemizedlist>
</sect2>
</sect1>
</chapter>

<chapter id="import-export">
<title
>Імпортування та експортування</title>
<sect1 id="import-export-projects">
    <title
>Обмін проектами &rocs;</title>
    <para
>Проекти &rocs; можна імпортувати та експортувати у форматі файлів архівів <literal
>.tar.gz</literal
>. Такими архівами можна скористатися для обміну проектами, імпортування та експортування можна здійснювати за допомогою пунктів меню <menuchoice
><guimenu
>Файл</guimenu
> <guimenuitem
>Імпортувати проект</guimenuitem
></menuchoice
> та <menuchoice
><guimenu
>Файл</guimenu
> <guimenuitem
>Експортувати проект</guimenuitem
></menuchoice
>, відповідно. </para>
</sect1>

<sect1 id="import-export-graphs">
    <title
>Імпортування документів графів</title>
    <para
>У поточній версії &rocs; передбачено підтримку імпортування та експортування даних файлів у таких форматах:</para>
    <itemizedlist>
        <listitem
><para
>файли DOT, також відомі як файли Graphviz;</para
></listitem>
        <listitem
><para
>файли GML;</para
></listitem>
        <listitem
><para
>звичайні текстові файли.</para
></listitem>
    </itemizedlist>
    <para
>У поточній версії підтримка цих файлів є доволі обмеженою: передбачено підтримку лише основних значень. Імпортуються дані елементів та відповідні з’єднання, назви всіх елементів, значення та координати. </para>
</sect1>
</chapter>

<chapter id="credits">
<title
>Подяки і ліцензія</title>

<para
>&rocs; </para>
<para
>Авторські права на програму:</para>
<itemizedlist>
	<listitem
><para
>Авторські права на програму належать Ugo Sangiori (ugorox AT gmail.com), 2008</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Tomaz Canabrava (tcanabrava AT kde.org), 2008–2012</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Wagner Reck (wagner.reck AT gmail.com), 2008–2012</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Andreas Cord-Landwehr (cordlandwehr AT googlemail.com), 2011–2012</para
></listitem>
</itemizedlist>

<para
>Авторські права на документацію:</para>
<itemizedlist>
	<listitem
><para
>Авторські права на документацію належать &Anne-Marie.Mahfouf; &Anne-Marie.Mahfouf.mail;, 2009</para
></listitem>
	<listitem
><para
>Авторські права на документацію належать Tomaz Canabrava tcanabrava at kde dot org, 2009</para
></listitem>
	<listitem
><para
>Авторські права на документацію належать Andreas Cord-Landwehr (cordlandwehr AT googlemail.com), 2011–2012</para
></listitem>
</itemizedlist>

<para
>Переклад українською: Юрій Чорноіван <email
>yurchor@ukr.net</email
></para
> 
&underFDL; &underGPL; </chapter>

<appendix id="installation">
<title
>Встановлення</title>

<sect1 id="getting-rocs">
<title
>Як отримати &rocs;</title>
&install.intro.documentation; </sect1>

<sect1 id="compilation">
<title
>Збирання і встановлення</title>
&install.compile.documentation; </sect1>
</appendix>

&documentation.index;
</book>
<!--
Local Variables:
mode: sgml
sgml-minimize-attributes: nil
sgml-general-insert-case: lower
sgml-indent-step:0
sgml-indent-data:nil
End:
-->
