Розробка додатку для обробки матриць

Узнать стоимость написания работы

МІНІСТЕРСТВО ОСВІТИ І НАУКИ

НАЦІОНАЛЬНИЙ ТРАНСПОРТНИЙ УНІВЕРСИТЕТ

КАФЕДРА ІНФОРМАЦІЙНИХ СИСТЕМИ І ТЕХНОЛОГІЇ

Курсова робота

з дисципліни «Крос-платформне програмування»

на тему:

«Розробка додатку для обробки матриць»

Виконав студент: Гульшін О.В.

Група: КН-4-1

Прийняв: Сватко В.В.

Київ 2016

Зміст

ВСТУП 3

1. ТЕОРЕТИЧНА ЧАСТИНА 4

1.1 Основні апаратні та програмні платформи 4

1.2 Стан корпоративного програмного середовища типовою організації.. 6

1.3 Крос-платформні технології 6

2. РОЗРОБКА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ 10

2.1 Бібілотека Juce 10

2.2. Підтримувані компілятори 12

2.3. Отримання і типи ліцензій 12

2.4 Клас Label 13

2.5 Клас TextEditor 15

2.6 Клас TexButton 16

2.7 Клас ComboBox 18

3. ДЕМОНСТРАЦІЯ РОБОТИ ПРОГРАМИ 20

ВИСНОВКИ 24

СПИСОК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ 25

ДОДАТОК А 26


Вступ

Кросплатформність - здатність програмного забезпечення працювати більш ніж на одній платформі або операційній системі.

Звичайно, буде неправильним сказати, що кожен додаток має бути сумісним з великою кількістю різних платформ. Тим не менш, кросплатформні програми існують і продовжують з'являтися. Вже одне це говорить про те, що ринок має потребу в подібному ПЗ. Спробуємо розібратися детальніше в деяких особливостях, пов'язаних з його проектуванням, а також у принциповому питанні, чи має взагалі сенс страждати над кросплатформністю розробки.

Отже, які переваги кросплатформних додатків перед тими, які можуть запускатися тільки на одній платформі? По-перше, програми, які володіють такою корисною властивістю, як кросплатформність, більш стійкі на ринку програмного забезпечення. Зараз набирають популярності програми, які вміють працювати під основними "китами" світу операційних систем: Windows, Linux, FreeBSD і MacOS. Серед програм для кінцевих користувачів на вершинах хіт-парадів софта стоять Mozilla Firefox, OpenOffice.org, Opera тощо. Список великий, і кожного дня він поповнюється новими учасниками. У світлі цих фактів розробникам, які дивляться в майбутнє і не бачать його без своїх, безсумнівно, дуже потрібних і якісних продуктів, варто подумати про кросплатформність. Це більш ніж актуально для того, хто розробляє програмне забезпечення для станцій-серверів або корпоративних користувачів. Що стосується корпоративної сфери, тут дуже популярні два слова: Java і .NET. Як відомо, це архітектури, які за своєю природою спираються на поняття кросплатформності. Звичайно, ніхто не забороняє створювати корпоративні додатки під одну платформу, але вартість їх, як правило, обґрунтовано нижча.

Моє завдання полягає у створенні кросплатформенного додатка. Бібліотека Juce дозволяє писати код один раз і запускати проект на декількох ОС таких як: Мас OS X, Windows, Linux, iOS, Android.


ТЕОРЕТИЧНА ЧАСТИНА

1.1. Основні апаратні та програмні платформи.

В даний час апаратні і програмні платформи та технології стрімко розвиваються, безперервно з'являються все нові і нові можливості. У той же час, очевидна тенденція до інтероперабельності (interoperability) платформ та сумісності технологій.

Зростання комп'ютерних та інформаційних технологій за порівняно недовгий час, що минув з моменту появи перших комп'ютерів (кінець 1940х рр.) Був неймовірно стрімким і поки не проявляє ніякої тенденції до уповільнення. Вважається, що кожні 10 років відбувається повна зміна технологій у цих областях. В результаті неймовірно велике число апаратних і програмних технологій і платформ, які, здавалося б, ще недавно були самими передовими і повсюдно використовуваними, в даний час залишилося лише в пам'яті тих, кому з ними довелося працювати. Нові покоління розробників програмного забезпечення, як правило, не знають навіть техніки і технологій десятирічної давності (а якщо і знають, то тільки зі спеціальних курсів ВНЗ), оскільки стан справ в галузі комп'ютерних та інформаційних технологій встигло повністю помінятися кілька разів за ці роки. Такі стрімкі зміни, до речі, роблять дуже нестійким комп'ютерний бізнес: на наших очах багато фірм- виробників обладнання або програмного забезпечення, що мали, здавалося б, надстійке становище на ринку, в лічені роки програвали конкуренцію і іноді повністю зникали, а на їх місці з'являлися нові "зірки". Так, наприклад, всього кілька років тому сталося з однією з найбільших в комп'ютерному світі фірмою DEC, довгі роки в значній мірі визначала шляхи розвитку обчислювальної техніки і програмного забезпечення, і зуміла побудувати цілком самобутню "цивілізацію" комп'ютерних і програмних рішень - фірми вже більше не існує, а про її супербренд PDP, VAX і відповідне програмне забезпечення пам'ятають дуже деякі. Враховуючи все сказане, представляється практично недоцільним давати докладний огляд апаратних і програмних архітектур, наявних в даний час - їх термін життя досить малий. Обмежимося тому лише дуже схематичним викладом основних платформ, з якими доводиться мати справу сучасному розробнику. Досить умовно можна класифікувати основні зустрічаються в наш час апаратні платформи наступним чином.

• Платформи на базі процесорів Intel і їх аналогів (AMD).

• Високопродуктивні сервера і робочі станції SUN (на базі процесорів SunSparc).

• Високопродуктивні сервера HP (на базі RISC-процесорів).

• Платформи Apple.

Архітектура процесора: RISC або CISC?

У 80-х роках минулого століття була запропонована архітектура процесора зі скороченим набором машинних команд (RISC - Reduced Instruction Set Computer). Дейв Паттерсон і Карло Секуін сформулювали чотири основних принципи архітектури RISC:

1. Будь-яка операція повинна виконуватися за один такт, незалежно від її типу.

2. Система команд повинна містити мінімальну кількість найбільш часто використовуваних найпростіших інструкцій однакової довжини.

3. Операції обробки даних реалізуються тільки у форматі "регістр-регістр" (операнди вибираються з оперативних регістрів процесора, і результат операції записується також у регістр; а обмін між оперативними регістрами й пам'яттю виконується тільки за допомогою команд читання / запису).

4. Склад системи команд повинен бути "зручний" для компіляції операторів мов високого рівня

Творці RISC-процесорів взяли набір з дуже простих найбільш часто використовуваних команд, які виконуються швидко, і об'єднали його з такими технологіями, як конвеєрна обробка. В результаті вийшов процесор, який має кращу продуктивність для більшості додатків і теоретично коштує менше, оскільки сам він невеликий і його виробництво обходиться дешевше. За аналогією процесори традиційної архітектури стали називати CISC - Complex Instruction Set Computer.

У список основних постачальників RISC-систем входять компанії Hewlett-Packard (РА- RISC), Sun Microsystems Computers (SPARC), Digital Equipment (Alpha), Silicon Graphics - модуль MIPS (R210000) і союз IBM і Motorola (PowerPC).

З іншого боку, сімейство Pentium компанії Intel продовжує реалізацію більш традиційної обчислювальної архітектури з повним набором машинних команд (CISC). CISC-процесори містять в сотні разів більше команд, ніж RISC-процесори, і використовують від 8 до 12 способів адресації пам'яті в порівнянні з 2-3 способами в RISC. Проте технічні відмінності між RISC і CISC в останні роки стають все менш чіткими, особливо в тому, що стосується загальної продуктивності систем. Одна архітектура запозичує хороші ідеї в іншої. Раніше RISC-процесори визначалися як мікропроцесори з кількістю команд менше 128, зараз же вони мають 200 команд - порівняйте з набором з 300 і більше команд в CISC. Сьогодні CISC-процесори використовують конвейеризації та інші сучасні технології. Обидва табори застосовують велику кеш-пам'ять для підвищення продуктивності.

Основні програмні платформи можна класифікувати умовно наступним чином:

• Платформи Microsoft (Windows NT / ХР /Windows 7 /...)

• Платформи на базі Unix. Останнім часом серед версій Unix найбільш популярний Linux різних модифікацій. До версій Unix відносяться і системи Solaris (для платформ Sun), а також вельми своєрідний "гібрид" Unix і Windows для платформ Apple - Мас OS.

Слід зазначити, що операційні системи Unix та створений навколо них універсум програмних продуктів, ідей і технологій, є одними з чи не найбільш "довгоживучих" в світі програмного забезпечення. Перша система Unix, практично нічим принципово не відрізняється від її сучасних "клонів", була створена більше ЗО років тому!

1.2 Стан корпоративного програмного середовища типовою організації

В даний час спостерігається тенденція до уніфікації програмних і апаратних платформ, що використовуються в типових конфігураціях.

• Основна маса комп'ютерів базується на платформі Intel або AMD, менше на Compaq, Sun і т.п.

• Використовувані операційні системи MS Windows, Linux, інші UNIX-подібні ОС. Основна операційна система, встановлена на робочих місцях користувачів - MS Windows. Більшість серверів працює також під Windows. Часка серверів працює під Linux або іншими UNIX-подібними ОС.

• Основне офісне програмне забезпечення - MS Office.

• Основна поштова програма MS Outlook, MS Outlook Express або спеціальний поштовий клієнт (популярність набирає Mozilla Thunderbird).

• Основний інтернет-браузер MS Internet Explorer (зараз набирає популярність браузер Mozilla Firefox, іноді використовується браузер Opera).

• Основна система документообігу працює на основі Windows і MS Exchange.

• Основний Web-сервер Apache або IIS на платформі UNIX або Windows.

• Основна корпоративна СУБД MS SQL Server або Oracle, також додатково використовується MS Access або інші СУБД, але виключно як локальні. У малих компаніях бувають популярними MySQL і PostgreSQL [1].

1.3 Крос-платформні технології

Крос-платформні технології забезпечують спільну експлуатацію різних апаратних і програмних платформ в інтересах організацій-споживачів.

Основні архітектури програмного забезпечення

Автономні (standalone) програми:

Такими можуть бути, як правило, сервісні програми, системні утиліти, текстові та графічні редактори, компілятори, досить прості корпоративні програми. Розвинена корпоративна інформаційна система, як правило, не може складатися з окремих, не пов'язаних між собою компонентів.

Дволанкова архітектура "клієнт-сервер"

Ця архітектура набула поширення з початку 1990-х років на тлі зростання ринку персональних комп'ютерів і зниження попиту на мейнфрейми. В архітектурі "клієнт- сервер" програмне забезпечення розділене на дві частини - клієнтську частину і серверну частину. Завдання клієнтської-частини (програми-клієнта) полягає у взаємодії з користувачем, передачі запиту користувача серверу, отримання запиту від серверної частини (програми-сервера) і подання його в зручному для користувача вигляді. Програма- сервер же обробляє запити клієнта і видає відповіді. Класичні приклади: Web-технології (клієнт-браузер, сервер-Web-cepBep), робота з розподіленими СУБД (клієнт - спеціальна програма, сервер - сервер бази даних). Розвиток архітектури "клієнт-сервер", а особливо поява сучасних графічних інтерфейсів, призвело спочатку до появи різновиду архітектури клієнт-сервер, званої "архітектура з товстим клієнтом". Тут логіка представлення даних і бізнес-логіка розміщуються на клієнті, який (скажімо, в випадку, коли сервером є СУБД) спілкується з логікою зберігання та накопичення даних на сервері, використовуючи мову структурованих запитів SQL. Проте необхідність установки "товстих клієнтів", що вимагають значної кількості спеціальних бібліотек та спеціальної настройки оточення, на велике число користувальницьких комп'ютерів з різними операційними середовищами , як правило викликає масу проблем. Як альтернатива тому виникла також дволанкова архітектура "з тонким клієнтом". При цьому в ідеалі програма-клієнт реалізує лише графічний інтерфейс користувача (GUI) і передає / приймає запити, а вся бізнес-логіка виконується сервером. В ідеалі клієнтом є просто інтернет-браузер, який є в стандартній операційному середовищі будь-якого користувача комп'ютера і не вимагає спеціального налагодження, встановлення спеціалізованого ПЗ і т.п. На жаль, така схема теж не вільна від недоліків, хоча б вже тому, що серверу доводиться брати на себе іноді не властиві для нього функції реалізації бізнес-логіки додатка (наприклад, серверу СУБД доводиться виконувати розрахунки!)

Багатоланкова (multitiered) архітектура

Початок процесу розвитку корпоративного програмного забезпечення в багатоланковій архітектурі було покладено ще в рамках технології "клієнт/сервер". У них поряд з клієнтською частиною програми та сервером баз даних з'явилися сервери додатків (Application Servers). В ідеалі:

• програма-клієнт реалізує GUI, передає запити серверу додатків і приймає від нього відповідь,

• сервер додатків реалізує бізнес-логіку і звертається із запитами до сервера "третього рівня" (наприклад, сервера бази даних за даними),

• сервер третього рівня обслуговує запити сервера додатків.

Програма-клієнт, таким чином, може бути "тонкою". Переваги такої архітектури очевидні:

• зміни на кожному з ланок можна здійснювати незалежно;

• знижуються навантаження на мережу, оскільки ланки не обмінюються між собою великими обсягами інформації;

• забезпечується масштабування і проста модернізація обладнання та програмного забезпечення, що підтримує кожна з ланок, у тому числі оновлення серверного парку і термінального обладнання, СУБД і т.д.;

• Додатки можуть створюватися на стандартних мовах третього або четвертого покоління (Java, C/C + +).

Наступний логічний крок - подальше збільшення числа ланок, причому зростає не тільки за рахунок розбиття, коли "стає більш тонкою" кожна з відомих технічних ланок, але вся бізнес-модель будується як багатоланкова. Сучасні корпоративні програмні системи являють собою, як правило, складні системи взаємодіючих між собою на різних рівнях компонентів, кожні з яких можуть бути клієнтами для одних компонентів і серверами для інших.

Основною проблемою систем, заснованих на дволанковій архітектурі "клієнт- сервер", або тим більше на багатоланковій архітектурі, є те, що від них вимагається мобільність в якомога ширшому класі апаратно-програмних середовищ. Навіть якщо обмежитися UNIX-орієнтованими локальними мережами, в різних мережах застосовується різна апаратура та протоколи зв'язку. Спроби створення систем, що підтримують всі можливі протоколи, призводить до їх перевантаження мережевими деталями на шкоду функціональності. Ще більш складний аспект цієї проблеми пов'язаний з можливістю використання різних представлень даних в різних вузлах неоднорідною локальної мережі. У різних комп'ютерах може існувати різна адресація, подання чисел, кодування символів і т.д. Це особливо істотно для серверів високого рівня: телекомунікаційних, обчислювальних, баз даних.

Спільним рішенням проблеми мобільності такого роду систем є використання технологій, що реалізують протоколи віддаленого виклику процедур (RPC - Remote Procedure Call) стандартизованим і платформно-незалежним способом. При використанні таких технологій звернення до сервісу в віддаленому вузлі виглядає як звичайний виклик процедури (методів віддалених об'єктів). Засоби RPC, в яких, природно, міститься вся інформація про специфіку апаратури локальної мережі та мережевих протоколів, переводить виклик в послідовність мережевих взаємодій. Тим самим, специфіка мережного середовища і протоколів прихована від прикладного програміста.

При виклику віддаленої процедури, програми RPC виробляють перетворення форматів даних клієнта в проміжні машинно-незалежні формати, і потім перетворення у формати даних сервера. При передачі відповідних параметрів виробляються зворотні перетворення. Таким чином, якщо система реалізована на основі стандартного пакета RPC, вона може бути легко перенесена в будь-яку відкриту середу.


2. РОЗРОБКА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ

2.1 Бібілотека Juce

Як відомо, C + + - мова кросплатформна на рівні компіляції, тобто програма для якої- небудь операційної системи, написана на ній, може бути відкомпільована і запущена в інший без будь-яких модифікацій (або з мінімальними змінами) вихідних текстів. Однак вищесказане відноситься лише для програм. Функції інтерфейсів прикладного програмування (application programming interface, АРІ) для створення графічних додатків різняться для різних операційних систем. У той же час графічний інтерфейс користувача (graphic user interface, GUI) вже давно став стандартом де-факто принаймні для прикладних програм.

Тому програміст, який планує створювати свої продукти для різних платформ, повинен визначитися з інструментом для розробки переносимого графічного інтерфейсу. В даний час бібліотек, що надають таку можливість, існує досить багато: Qt, GTK, Motiff, Tk, U + + та інші. До їхнього числа відноситься і Juce (Jules 'Utility Class Extensions) - кроссплатформена бібліотека для створення додатків під Linux, Windows, Мас OS X, iOS і Android.

Подібно багатьом іншим кросплатформним бібліотекам (Qt, GTK, U + + та ін), Juce є універсальною, тобто надає не тільки засоби для розробки графічного інтерфейсу користувача (GUI toolkit), але і набір класів для різних потреб (робота з графікою, звуком, мережею, XML і т.п.). За рахунок цього розробники можуть створювати за допомогою Juce додатки різної спрямованості без використання додаткових бібліотек. Саме це і є основною метою Juce і визначає ряд особливостей, що виділяють її серед інших універсальних GUI toolkit'oB. На відміну від тих же Qt і GTK кросплатформеність Juce досягається за рахунок промальовування власних оригінальних елементів інтерфейсу користувача з застосуванням низькорівневих системних функцій замість використання "рідних" компонентів / віджетів для кожної платформи (рис. 2.1). Навіть заголовок і рамку вікна Juce за замовчуванням малює самостійно, хоча можна програмно переключитися на стандартне обрамлення вікон

Рис. 2.1- Оригінальний зовнішній вигляд віджетів в демонстраційній програмі Juce Demo,
що входить в постачання бібліотеки (версія 1.53)

Подібний підхід можна розглядати і як перевага, і як недолік бібліотеки. З одного боку, цим досягається попіксельна ідентичність інтерфейсів додатків на всіх підтримуваних платформах, а для Linux - вирішення проблеми множинної залежності. З іншого боку, Juce не дуже підходить для додатків, інтегрованих в ту чи іншу графічну середу, оскільки принципово не може емулювати зовнішній вигляд системних компонентів / віджетів. Тим самим, основна мета Juce - створення програм з оригінальним зовнішнім виглядом, не залежних від зовнішніх бібліотек.

Втім, Juce надає можливість за вибором програміста використання елементів оформлення цільової операційної системи (заголовок вікна, системні діалоги).

Спочатку Juce була розроблена як частина кроссплатформеного аудіо-редактора та MIDI-секвенсеру Tracktion, випущеного Raw Materia! Software в 2002 році, і лише в 2004 році була опублікована як самостійний інструмент розробки. До цих пір основна ніша Juce - написання додатків для роботи зі звуком. Бібліотека включає в себе підтримку відтворення звуку через аудіо і MIDI інтерфейси, поліфонічні синтезатори, розуміє файли розповсюджених аудіоформатів (таких як WAV, AIFF, FLAC і Vorbis). Починаючи з версії 2.0 включена підтримка відтворення MP3 і WMA. Однак Juce містить достатньо засобів для розробки і інших програм будь-якого ступеня складності.

2.2 Підтримувані компілятори

Офіційно підтверджена правильна робота Juce з наступними компіляторами:

1. для операційної системи Linux це g++, що входить до складу GCC, починаючи з версії 3.3;

GCC - це вільно доступний оптгшізуючий компілятор для мов С, С + +, Ada 95, а також Objective С. Його версії застосовуються для різних реалізацій Unix (а також VMS, OS / 2 і інших систем PC), і дозволяють генерувати код для безлічі процесорів.

2. для операційних систем лінійки Windows це Microsoft Visual Studio (починаючи з версії Visual С + + 6; підтримка Visual С + + 2010 введена, починаючи з версії Juce 1.52). Бібліотека Juce забезпечує взаємну сумісність програм, зібраних для Windows ХР, Vista і Windows 7;

3. для Мас OS X це GCC, що входить до складу інструменту розробки XCode (для OS X 10.4 або більш пізньої);

Xcode - програма для розробки додатків під OS X і iOS, розроблена компанією Apple. Поставляється безкоштовно на установчому диску OS Xразом з операційною системою, але встановлюється користувачем вручну. Остання версія - 4.4.1, не підтримується старими версіями OS X. Останню версію Xcode можна безкоштовно завантажити на сайті для розробників Apple.

4. для створення нативних додатків iPhone і iPad також використовується XCode;

5. для розробки під Android необхідні Ant, Eclipse і Android NDK 5 версії (при зборці проектів Juce за допомогою 6 і 7 версій виникає помилка зв'язування, linker error). Хоча можливість створення Android-додатків і була включена в Juce, починаючи з версії бібліотеки 1.53, робота над її вдосконаленням ще триває.

2.3 Отримання і типи ліцензій

Права на бібліотеку Juce належать компанії Raw Material Software (http://www.rawmaterialsoftware.com/juce.php), розташованої у Великобританії.

Juce випускається під двома типами ліцензій:

1. GNU Public License, що дає право розробникам безкоштовно отримувати, розповсюджувати бібліотеку, використовуючи останню для створення виключно Open-Source додатків;

2. Комерційної - для створення закритих додатків. Комерційна ліцензія на бібліотеку не включає обмежень на число місць розробників, зайнятих у проекті, і не передбачає надання технічної підтримки: для останньої необхідно укладати окремі контракти. На момент написання курсу вартість однієї ліцензії становила 399 евро для країн Європейського союзу.

2.4 Клас Label

Клас Label використовується в основному для відображення різних пояснювальних написів, як з можливістю їх редагування користувачем, так і без. Приклади виведення текстів за допомогою цього компонента ми бачили в попередніх лекціях, починаючи з найпростіших програм. Мабуть, це один з найбільш часто використовуваних компонентів.

Можливість редагування написи ярлика задається методом void Label :: setEditable (bool editOnSingleClick, bool editOnDoubleClick = false, bool lossOfFocusDiscardsChanges = false). У випадку, якщо параметр lossOfFocusDiscardsChanges приймає значення true, то клацання мишею де-небудь під час редагування ярлика, скасовує внесені до тексту зміни.

Текст, що відображається компонентом класу Label, має тип рядка String і задається в конструкторі Label:: Label (const String & componentName = String :: empty, const String & labelText = String :: empty), де componentName - назва ярлика, необхідне для потреб налагодження, a labelText - відображається напис. Крім того, задати текст ярлика можна за допомогою функції void Label :: setText (const String & newText, bool

broadcastChangeMessage), де newText - новий текст. Другий параметр необхідний для генерації повідомлення про ізмненія тексту ярлика (у тому випадку, якщо він приймає значення true), проте в більшості випадків йому можна присвоїти значення false.

Отримати поточний текст ярлика можна за допомогою методу const String Label :: getText (bool returnActiveEditorContents = false) const. Приймається параметр необхідний лише в тому випадку, якщо ярлик знаходиться в стадії редагування тексту користувачем. Якщо параметр приймає значення true, функція повертає текст, що відображається ярликом на момент її виклику. У тому випадку, якщо параметр приймає значення false, функція поверне текст не раніше, ніж користувач закінчить його набір і натисне клавішу <ENTER>. У тому випадку, якщо можливість редагування написи заборонена, що приймається функцією параметр неважливий.

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

Label * pWorkersLabel = new Label ("WorkersLabel");

String sWorkers = String (T ("Число робочих:")) + = String (iWorkers); pWorkersLabel-> setText (sWorkers, false);

Лістинг 2.1. Приклад перетворення цілочисельний змінної для виведення інформації в текстовий напис

Кожен ярлик має наступні колірні характеристики: колір кордону, колір фону і колір тексту, що відображається. Той чи інший колір задається методом, спадкоємною класом Label від Component, void Component :: setColour (int colourld, const Colour & colour). Перший параметр, що приймається функцією, показує, який саме колір (межі, фону або тексту) ярлика слід змінити, а другий задає власне цей колір.

Значення ID кольору можна задавати за допомогою елементів нумерованого списку, що входить до складу класу Label: enum Colourlds {backgroundColourld = 0x1000280, textColourld = 0x1000281, outlineColourld = 0x1000282 (колір фону, тексту і зовнішнього кордону написи, відповідно).

Крім того, оформлення написи можна змінити, задавши характеристики шрифту, Font. Новий шрифт ярлика задається методом void Label :: setFont (const Font & newFont). Отримати поточний шрифт напису можна за допомогою функції const Font & Label :: getFont () const throw ().

Вирівнювання тексту напису щодо меж компонента здійснює його метод void Label :: setJustificationType (const Justification & justification). Характер вирівнювання задається об'єктом класу Justification, який включає в себе нумерований список (Лістинг 2.2).

enum

{

left = 1, right = 2, horizontallyCentred = 4, top = 8,

bottom = 16, verticallyCentred = 32, horizontallyJustified = 64, centred = 36, centredLeft = 33, centredRight = 34, centredTop = 12, centredBottom = 20, topLeft = 9, topRight = 10, bottomLeft = 17, bottomRight = 18

}

Лістинг 2.2 Характер вирівнювання тексту напису щодо меж компонента.

2.5 Клас TextEditor

У більшості GUI framework-ів є окремі компоненти або віджети для створення однорядкового і многострочного полів введення (наприклад, класи QLineEdit і QTextEdit в Qt). У бібліотеці Juce для цих цілей використовується один і той же клас, TextEditor, зовнішній вигляд і поведінку примірників якого може значно відрізнятися, в залежності від налаштувань, що задаються програмістом.

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

Введення тексту користувачем у віджеті TextEditor може здійснюватися як в один рядок, так і в кілька рядків. Режим введення задається методом void TextEditor :: setMultiLine (bool shouldBeMultiLine, bool shouldWordWrap = true). Цю функцію необхідно викликати відразу ж після оголошення об'єкта класу TextEditor (втім, якщо ви хочете отримати однорядкове поле введення, то її можна не викликати). Якщо перший з її параметрів приймає значення false, то віджет приймає вид однорядкового поля введення, а якщо true, то з'являється можливість вводити кілька рядків. Якщо значення другого параметра дорівнює true, то в віджеті перенесення рядків буде здійснюватися автоматично по досягненні його краю при наборі тексту. В іншому випадку перенесення рядка буде здійснюватися виключно після натискання клавіші <ENTER>.

Текст, що знаходиться в віджеті, повертає метод const String TextEditor:: getText () const. Новий текст в ньому задає функція void TextEditor :: setText (const String & newText, bool sendTextChangeMessage = true). Вона очищає поле введення і вставляє в віджет текст newText. У тому випадку, якщо параметр sendTextChangeMessage приймає значення true, то надсилається повідомлення про зміну тексту всім слухачам (listeners) поля введення.

Для приміщення тексту в область віджету, крім методу setText, можна скористатися функцією void TextEditor :: insertTextAtCaret (const String & textToInsert), яка вставляє текст textToInsert на поточній позиції курсору. У випадку, якщо якась ділянка тексту був виділений, то при виклику функції він замінюється на рядок-параметр. Цим можна скористатися для програмного видалення будь-якого ділянки тексту: викликати спочатку функцію-член void TextEditor :: setHighlightedRegion (const Range <int> & newSelection), щоб виділити ділянку тексту, а потім - метод insertTextAtCaret з путой рядком (String :: empty) як параметр.

Як правило, натискання користувачем клавіші <ENTER> на клавіатурі означає завершення введення рядка і перехід на нову. Проте в деяких випадках потрібна інша реакція на натискання цієї клавіші. За допомогою функції void TextEditor :: setReturnKeyStartsNewLine (bool shouldStartNewLine) можна змінити поведінку текстового поля введення на натискання клавіші <ENTER>. Якщо параметр shouldStartNewLine приймає значення false, то натискання на клавішу не приводить до переходу на новий рядок, а повідомлення про цю подію буде оброблено в слухачі поля введення (TextEditor :: Listener). У випадку, якщо поле введення є однорядковим, метод setReturnKeyStartsNewLine можна не викликати.

Виклик методу void TextEditor :: setReadOnly (bool shouldBeReadOnly) з параметром true встановлює режим, який дає можливість тільки перегляду тексту, але не редагування його користувачем. У разі необхідності змінити текст, його можна передати віджет програмно, наприклад, функцією setText.

У випадку, якщо об'єкт класу TextEditor використовується як однорядкове поле введення, можна включити режим введення пароля. Цей режим встановлюється в конструкторі компонента TextEditor :: TextEditor (const String & componentName = String :: empty, juce_wchar passwordCharacter = 0). У випадку, якщо другий параметр приймає значення, відмінне від нуля, то все вводяться користувачем символи будуть заміщатися яким-небудь іншим. Параметр passwordCharacter, власне, і містить код заміщує символу. Детальніше з використанням TextEditor в якості поля введення пароля можна познайомитися на прикладі, наведеному нижче.

У випадку, якщо ви використовуєте об'єкт класу TextEditor в якості многострочного поля введення, який відображається текст може перевищувати розміри віджета. При цьому перегляд тексту можливий за допомогою смуг прокрутки. Для їх автоматичного відображення необхідно викликати метод void TextEditor :: setScrollbarsShown (bool shouldBeEnabled) з параметром true. Якщо товщина смуг прокрутки по замовчуванню вас з яких-небудь причин не влаштовує, її можна задати програмно викликом функції void TextEditor :: setScrollBarThickness (int newThicknessPixels), де параметр - товщина використовуваних смуг прокрутки в пікселях.

2.6 Клас TextButton

Кнопки представляють, мабуть, одну з найбільш часто використовуваних груп віджетів. Базовим класом для них є Button, якому успадковують класи кнопки з текстом TextButton (приклад її використання розглядався нами в "Розробка власних компонентів" і

багатьох наступних розділах), кнопки зі стрілкою ArrowButton, кнопок із зображеннями (ImageButton, DrawableButton і ShapeButton), кнопки панелі інструментів (ToolbarItemComponent), а також ряд компонентів, які мають за своїми функціями лише непряме відношення до кнопок: гіперпосилання (HyperlinkButton), прапорець (ToggleButton), який розглядався нами в "Компоненти введення і відображення текстової, цифрової та ієрархічної інформації. Компоненти відображення стану "і вкладка (TabBarButton).

TextButton - це кнопка зі стандартними (для Juce) формою і фоном і відображається на поверхні рядком тексту. Кнопка TextButton може працювати в двох режимах: проста керуюча кнопка (включено за замовчуванням) і кнопка з фіксацією натиснутого стану. Для включення останнього режиму необхідно викликати метод void Button :: setClickingTogglesState (bool shouldToggle) throw () з параметром true. Крім того, можливе використання набору кнопок з фіксацією натиснутого стану, де в натиснутому (on) стані може перебувати одна і тільки одна кнопка. Для створення подібної групи використовують методи void Button :: setToggleState (bool shouldBeOn, bool sendChangeNotification) для завдання режиму фіксації і void Button :: setRadioGroupId (int newGroupId) для включення кнопок в єдину групу шляхом завдання загального ID. Використання цих методів абсолютно ідентично такому у ToggleButton "Компоненти введення і відображення текстової, цифрової та ієрархічної інформації. Компоненти відображення стану".

Слід зауважити, що, на відміну від інших бібліотек для побудови графічного інтерфейсу користувача, в Juce кнопка в натиснутому стані змінює тільки колір фону. Кольори кнопки в натиснутому (on) і отжатом (off) стані визначаються значеннями ідентифікаторів кольору перечислимого типу enum TextButton :: Colourlds:

• buttonColourld - колір фону кнопки в ненажатом стані;

• buttonOnColourld - колір фону кнопки в натиснутому стані;

• textColourOffld - колір тексту кнопки в ненажатом стані;

• textColourOnld - колір тексту кнопки в натиснутому стані.

Задати необхідне значення кольору фону або тексту кнопки можна викликом методу void Component:: setColour (int colourld, const Colour & colour), передавши як параметр один з ідентифікаторів Colourlds.

Основна властивість з точки зору зовнішнього вигляду кнопки з текстом - це, звичайно ж, напис. Для роботи з нею клас TextButton включає два методи, успадковані від класу Button:

• void Button :: setButtonText (const String & newText змінює напис на кнопці на newText

• const String Button :: getButtonText () const- повертає текст, що відображається на кнопці.

2.7 Клас ComboBox

Клас ComboВох надає користувачу можливість вибору одного елемента зі списку. Відображення всього списку (розкриття) відбувається тільки на деякий проміжок часу, для того, щоб користувач міг зробити вибір, після чого список повертається в своє початкове положення.

Щоб додати новий елемент у список, використовується метод void ComboBox :: addltem (const String & newItemText, int newltemld), де newItemText - текст нового елементу списку, a newltemld - індекс, з яким він буде асоціюватися. Зверніть увагу, що значення індексу не повинно бути рівним нулю.

Звернення до елементів списку здійснюється за їх індексах. Отримати індекс елемента списку, який вибрав користувач, можна за допомогою методу int ComboBox :: getSelectedld () const throw (). Число елементів списку дозволяє отримати функція int ComboBox :: getNumltems () const throw ().

У попередніх прикладах ми використовували віджети класу ComboBox, які надавали користувачеві можливість вибору значень зі списку, що не не дозволяли редагувати відображуваний текст. Можна зробити так, щоб текст, що відображається в випадаючому списку міг бути змінений користувачем. Для установки віджета в цей режим викликається метод void ComboBox :: setEditableText (bool isEditable), де isEditable - прапор включення / відключення режиму редагування. Якщо він приймає значення true, то подвійне клацання мишею покаже текстовий редактор (у полі відображення тексту списку з'явиться курсор, а поточний елемент списку буде виділений). Замість подвійного клацання можна викликати редактор програмно за допомогою методу void ComboBox :: showEditor ().

На жаль, на відміну від інших інструментів для побудови графічного інтерфейсу користувача, наприклад, Qt, в Juce користувач не може сам додавати елементи в список. Це відображає позицію творця бібліотеки, Julian Störer, який пише: "Я ніколи не відчував необхідності змінювати або видаляти елементи списку. Компонент графічного інтерфейсу - це не місце для зберігання і маніпулювання списками даних. У прийнятому дизайні" модель - вистава "випадає список - це просто спосіб відображення вашого набору елементів. Коли ваш набір змінюється, ви повинні очистити і заново згенерувати вміст вашого списку, щоб відобразити нові елементи ".

Для того, щоб очистити список, що випадає, необхідно викликати метод void ComboBox :: clear (bool dontSendChangeMessage = false), де dontSendChangeMessage - прапор відправки повідомлення про зміну списку. У випадку, якщо список буде очищений, це повідомлення буде все одно відправлено, навіть в тому випадку, якщо параметр dontSendChangeMessage прийме значення true.


3.ДЕМОНСТРАЦІЯ РОБОТИ ПРОГРАМИ

В головному вікні програми (Рис. 3.1) ми можемо бачити слайдери для вибору розмірності вхідної матриці, кнопки «Genarate» для генерації випадкової матриці і «Enter» для введення матриці з клавіатури, а також елемент керування вибору зі списку «СотЬоВох» для вибору дії над матрицею.

Рис. 3.1 - Головне вікно програми


Щоб згенерувати випадкову матрицю необхідно встановити за допомогою слайдерів розмірність і натиснути кнопку «Genarate» (Рис. 3.2).

Рис. 3.2 - Згенерована випадкова матриця.

Щоб виконати будь-яку дію над матрицею необхідно натиснути на елемент керування «ComboВох» і вибрати що потрібно(див. Рис. 3.3).

Рис. 3.3 - Транспонування матриці

Якщо вибрати дію множення матриць то з’явится вікно введення другої матриці(див. Рис. 3.4).

Рис. 3.4 - Вікно вводу матриці для перемноження матриць

Після вводу матриці у вікні відобразиться результуюча матриця(див. Рис. 3.5).

Рис. 3.5 - Перемноження матриць


ВИСНОВКИ

Подібно багатьом іншим кросплатформним бібліотекам (Qt, GTK, U + + та ін), Juce є універсальною, тобто надає не тільки засоби для розробки графічного інтерфейсу користувача (GUI toolkit), але і набір класів для різних потреб (робота з графікою, звуком, мережею, XML і т.п.). За рахунок цього розробники можуть створювати за допомогою Juce додатки різної спрямованості без використання додаткових бібліотек. Саме це і є основною метою Juce і визначає ряд особливостей, що виділяють її серед інших універсальних GUI toolkit'oB. На відміну від тих же Qt і GTK кросплатформеність Juce досягається за рахунок промальовування власних оригінальних елементів інтерфейсу користувача з застосуванням низькорівневих системних функцій замість використання "рідних" компонентів / віджетів для кожної платформи (рис. 2.1). Навіть заголовок і рамку вікна Juce за замовчуванням малює самостійно, хоча можна програмно переключитися на стандартне обрамлення вікон.

Програміст, який планує створювати свої продукти для різних платформ, повинен визначитися з інструментом для розробки переносимого графічного інтерфейсу. В даний час бібліотек, що надають таку можливість, існує досить багато: Qt, GTK, Motiff, Tk, U + + та інші. До їхнього числа відноситься і Juce (Jules 'Utility Class Extensions) - кроссплатформена бібліотека для створення додатків під Linux, Windows, Мас OS X, iOS і Android.

За допомогою кросплатформенної бібліотеки Juce було розроблено додаток для обробки матриць який має можоивість працювати на декількох ОС без серйозних зусиль. Він допоможе виконати деякі дії над матрицями, стати своєрідним калькулятором матриць.


СПИСОК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ

1. Разработка кроссплатформенных приложений с использованием Juce / Андрей Кузнецов - Електронна книга.

2. Нестандартные GUI-тулкиты. Часть 5: Знакомство с Juce / Есилевский С - Open Source - 2010. - №72. - С. 12-15

СПИСОК ВИКОРИСТАНИХ ІНТЕРНЕТ-РЕСУРСІВ

1. НОУ ИНТУИТ | Учебный курс | Кросс-платформенные и многозвенные технологии: - Режим доступу: http://www.intuit.ru/studies/courses/571/ /427/lecture/9703

2. Кросплатформність: - Режим доступу: http://studopedia.net/

/5 7014_krosplatformnist.html

3. Крос-платформне програмування: - Режим доступу: http://5fan.ru/ /wievjob.php?id=69070

4. НОУ ИНТУИТ | Учебный курс | Разработка кроссплатформенных приложений с использованием Juce: - Режим доступу:

http://www.intuit.ru/studies/courses/2338/638/info


ДОДАТОК А

Файл NewComponent.cpp

/*

This is an automatically generated GUI class created by the Introjucer!

Be careful when adding custom code to these files, as only the code within the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded and re-saved.

Created with Introjucer version: 3.1.0

The Introjucer is part of the JUCE library - "Jules' Utility Class Extensions Copyright 2004-13 by Raw Material Software Ltd.

*/

//[Headers] You can add your own extra header files here... //[/Headers]

#include "NewComponent.h" //[MiscUserDefs] You can add your own user definitions and misc code here... //[/MiscUserDefs]

//==============================================================================

NewComponent::NewComponent ()

{

addAndMakeVisible (label = new Label ("new label",

TRANS("Enter the dimension of the matrix:"))); label->setFont (Font (18.00f, Font::plain)); label->setDustificationType (Justification::centredLeft); label->setEditable (false, false, false);

label->setColour (Label::textColourId, Colours::gold); label->setColour (TextEditor::textColourId, Colours::chocolate); label->setColour (TextEditor::backgroundColourld, Colour (0x00000000));

addAndMakeVisible (textButton = new TextButton ("new button")); textButton->setButtonText (TRANS(“Generate")); textButton->addListener (this);

addAndMakeVisible (textButton2 = new TextButton ("new button")); textButton2->setButtonText (TRANS("Enter")); textButton2->addListener (this);

addAndMakeVisible (label2 = new Label ("new label",

TRANS("label text")));

label2->setFont (Font (17.00f, Font::plain));

label2->setJustificationType (Justification::centred); label2->setEditable (false, false, false);

label2->setColour (Label::textColourId, Colours::blue); label2->setColour (TextEditor:itextColourld, Colours::black); label2->setColour (TextEditor::backgroundColourld, Colour (0x00000000)); label2->setText("",dontSendNotification);

//label2->setBorderSize(BorderSize(l));

label22 = new Label(" Label", "First matrix:");

addAndMakeVisible(label22);

label22->setFont (Font (16.00f, Font::plain))j label22->setJustificatlonType (Justification::centredLeft); label22->setEditable (false, false, false);

label22->setColour (Label:itextColounld, Colours::blue); label22->setColour (TextEditor::textColourId, Colours::black); label22->setColour (TextEditor::backgroundColourId, Colour (0x00000000))

label33 = new Label(" Label", "Second matrix:"); addAndMakeVisible(label33);

label33->setFont (Font (16.00f, Font::plain)); label33->set3ustificationType (Justification::centredLeft); label33->setEditable (false, false, false);

label33->setColour (Label::textColourId, Colours::darkred); label33->setColour (TextEditor::textColourId, Colours::black); label33->setColour (TextEditor::backgroundColourld, Colour (0x00000000))

label44 = new Label(" Label", "Result matrix:"); addAndMakeVisible(label44);

label44->setFont (Font (16.00f, Font::plain)); label44->setJustificationType (Justification::centredLeft); label44->setEditable (false, false, false);

label44->setColour (Label::textColourId, Colours::green); label44->setColour (TextEditor::textColourId, Colours::black); label44->setColour (TextEditor::backgroundColourld, Colour (0x00000000))

addAndMakeVisible (label3 = new Label ("new label",

TRANS("label text")));

label3->setFont (Font (17.00f, Font::plain)); label3->setJustificationType (Justification::centred); label3->setEditable (false, false, false);

label3->setColour (Label::textColourId, Colours::darkred); label3->setColour (TextEditor::textColourId, Colours::black); label3->setColour (TextEditor::backgroundColourld, Colour (0x00000000));

addAndMakeVisible (label4 = new Label ("new label",

TRANS("label text")));

label4->setFont (Font (16.00f, Font::plain)); label4->setJustificationType (Justification::centred); label4->setEditable (false, false, false); label4->setColour (Label::textColourId, Colours::green); label4->setColour (TextEditor::textColourId, Colours::black); label4->setColour (TextEditor::backgroundColourld, Colour (0x00000000)); addAndMakeVisible(label4);

addAndMakeVisible (comboBoxActions = new ComboBox ("new combo box")); comboBoxActions->setEditableText (false);

comboBoxActions->setJustificationType (Justification::centredLeft); comboBoxActions->setTextWhenNothingSelected (String::empty); comboBoxActions->setTextWhenNoChoicesAvailable (TRANS("(no choices)")); comboBoxActions->addListener (this);

comboBoxActions->addItem ("Select the action!", 1);

comboBoxActions->addItem ("Transposition", 2);

comboBoxActions->addItem ("Determinant", 3);

comboBoxActions->addItem ("The main diagonal", 4);

comboBoxActions->addItem ("Secondary diagonal", 5);

comboBoxActions->addItem ("Max", 6);

comboBoxActions->addItem ("Min", 7);

comboBoxActions->addItem ("Matrix multiplication in number", 8);

comboBoxActions->addItem ("Matrix multiplication", 9);

comboBoxActions->addItem ("Adding matrix", 10);

comboBoxActions-saddltem ("Subtract of matrix", 11);

comboBoxActions->setSelected!d (1);

comboBoxActions->setWantsKeyboardFocus (false);

addAndMakeVisible (slider = new Slider ("new slider"));

slider >setRange (1, 8, 1);

slider->setSliderStyle (Slider::LinearHorizontal);

slider->setTextBoxStyle (Slider::TextBoxLeft, false, 40, 20);

slider->addListener (this);

addAndMakeVisible (slider2 = new Slider ("new slider"));

slider2->setRange (1, 10, 1);

slider2->setSliderStyle (Slider::LinearHorizontal);

slider2->setTextBoxStyle (Slider::TextBoxRight, false, 40, 20);

slider2->addListener (this);

//[UserPreSize]

//[/UserPreSize]

setSize (480, 600);

//[Constructor] You can add your own custom stuff here.. //[/Constructor]

NewComponent::~NewComponent()

{

//[Destructor_pre]. You can add your own custom destruction code here.. //[/Destructor_pre]

label = nullptr; textButton = nullptr;

textButton2 = nullptr;

label2 = nullptr;

label3 = nullptr;

label4 = nullptr;

comboBoxActions = nullptr;

slider = nullptr;

slider2 = nullptr;

//[Destructor]. You can add your own custom destruction code here.. //[/Destructor]

//===========================================================

void NewComponent::paint (Graphics& g)

{

//[UserPrePaint] Add your own custom painting code here..

//[/UserPrePaint]

g.fillAll (Colours::white);

g.setColour (Colour (0xa40a89b6));

g.fillRect (0, 0, 480, 800);

g.setColour (Colours::black);

g.setFont (Font (15.00f, Font::plain));

g.drawText (CharPointer_UTF8 ("\xd1\x85"),

216, 44, 17, 30,

Justification::centred, true);

//[UserPaint] Add your own custom painting code here.. //[/UserPaint]

void NewComponent::resized()

{

label->setBounds (104, 16, 244, 24);

textButton->setBounds (112, 88, 102, 24);

textButton2->setBounds (234, 88, 102, 24);

label2->setBounds (16, 128, 192, 192);

label3->setBounds (240, 128, 192, 192);

label4->setBounds (100, 385, 300, 192);

comboBoxActions->setBounds (128, 336, 192, 24);

slider->setBounds (234, 48, 110, 24);

slider2->setBounds (104, 48, 110, 24);

label22->setBounds (70,115,100,24);

label33->setBounds (290,115,100,24);

label44->setBounds (200,360,100,24);

//[UserResized] Add your own custom resize handling here.. //[/UserResized]

void NewComponent::buttonClicked (Button* buttonThatWasClicked)

{

//[UserbuttonClicked_Pre]

//[/UserbuttonClicked_Pre]

if (buttonThatWasClicked == textButton)

{

//[UserButtonCode_textButton] -- add your button handler code here..

//[/UserButtonCode_textButton]

comboBoxActions->setVisible(true);

label4->setText("",dontSendNotification);

label3->setText("",dontSendNotification);

comboBoxActions->setSelectedId(l);

s="";

n=slider2->getValue();

m=slider->getValue();

masl=new int* [n];

for (int j=0; j<n; j++)

masl[j]=new int[m];

for (int i=0; i<n; i++)

{

for (int j=0; j<m; j++)

{

masl[i][j]=rand()%19+10; s+=(String)mas1[i][j]+" ";

}

s+="\n";

}

//AlertWindow::showMessageBox(AlertWindow::AlertIconType::InfoIcon, s, "");

label2->setText(s,NotificationType(0));

//label4->setText(s,NotificationType(0));

}

else if (buttonThatWasClicked == textButton2)

{

//[UserButtonCode_textButton2] -- add your button handler code here.. //[/UserButtonCode_textButton2]

comboBoxActions->setVisible(true);

label2->setText("",dontSendNotification);

label3->setText("",dontSendNotification);

label4->setText("",dontSendNotification);

comboBoxActions->setSelectedId(l);

int i=0,]=0,k=0,*v;

//String et; n=slider2->getValue();

m=slider->getValue();

v=new int [(n)*(m)];

mas1=new int* [n];

for (int 3=0; j<m; j++)

mas1[j]=new int[m]j

for (i=0; i<n; i++)

{

for (j=0; j<m; j++)

{

et="Enter the element

["+(String)(i+l)+"]["+(String)(j+l)+"]";

AlertWindow w ("First Matrix",

et,

AlertWindow::NoIcon);

w.addTextEditor ("text", "text field:");

w.addButton ("Enter!", 1, KeyPress (KeyPress::returnKey, 0, 0));

//w.addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey, 0, 0));

if (w.runModalLoop() != 0) // is they picked 'ok'

{

v[k]=w.getTextEditorContents ("text").getlntValueQ;

k++;

}

}

}

s="";k=0;

for (int i=0; i<n; i++)

{

for (int j=0; j<m; j++)

{

Mas1[i][j]=v[k];

s+=(String)mas1[i][j]+" ";

k++;

}

s+="\n";

}

label2->setText(s,dontSendNotification)

}

//[UserbuttonClicked_Post]

//[/UserbuttonClicked_Post]

void NewComponent::comboBoxChanged (ComboBox* comboBoxThatHasChanged)

{

//[UsercomboBoxChanged_Pre]

//[/UsercomboBoxChanged_Pre]

label4->setColour(Label::textColourId,Colours::green);

if (comboBoxThatHasChanged == comboBoxActions)

{

String st="";

//[UserComboBoxCode_comboBoxActions] -- add your combo box handling code here.

void NewComponent::comboBoxChanged (ComboBox* comboBoxThatHasChanged)

{

//[UsercomboBoxChanged_Pre]

//[/UsercomboBoxChanged_Pre]

label4->setColour(Label::textColourId,Colours::green);

if (comboBoxThatHasChanged == comboBoxActions)

{

String st="";

//[UserComboBoxCode_comboBoxActions] -- add your combo box handling code here.

//[/UserComboBoxCode_comboBoxActions]

label4->setText("",dontSendNotification);

label3->setText("",dontSendNotification);

if (comboBoxActions->getSelectedId()==2)

{

if (n==m)

{

label4->setText("",dontSendNotification);

for (int i=0; i<n; i++)

{

for (int j=0; j<m; j++)

{

st+=(String)mas1[j][i]+" "j

}

st+="\n";

}

label4->setText(st,NotificationType(0));

}

Else

{

label4->setColour(Label::textColourId, Colours::red);

label4->setText("Matrix must besquare!",NotificationType(0));

}

}

else if (comboBoxActions->getSelectedId()==3)

{

if (n==m)

{

int l;

double d;

double sum11=1, sum12=0, sum21=1, sum22=0;

// находим детерминант

for (int i=0;i<n;i++)

{

Sum11=l; l=2*n-1-i; sum21=1;

for (int j=0; j<n; j++)

{

sum21*=mas1[j][l%n]; i--;

sum11*=mas1[j][(j+i)%(n)];

}

sum22+=sum21;

sum12+=sum11;

}

d=sum12-sum22;

label4->setText("Determinant is: "+(String)d,dontSendNotification);

}

Else

{

label4->setColour(Label::textColourId, Colours::red);

label4->setText("Matrix must be square!",dontSendNotification);

}

}

else if (comboBoxActions->getSelectedId()==4)

{

s="The main diagonal is:\n";

int j;

if (n==m)

{

for (int i=0; i<n; i++)

{

j=i;

s+=(String)mas1[i][j]+"";

}

label4->setText(s,dontSendNotification);

}

Else

{

label4->setColour(Label::textColourId, Colours::red);

label4->setText("Matrix must be square!",dontSendNotification);

}

}

else if (comboBoxActions->getSelectedid()==5)

{

s="The second diagonal is:\n";

int j;

if (n==m)

{

for (int i=0; i<n; i++)

{

j=m-1-i;

s+=(String)mas1[i][j]+"";

}

label4->setText(s,dontSendNotification);

}

Else

{

label4->setColour(Label::textColourId; Colours::red);

label4->setText("Matrix must be square!",dontSendNotification);

}

}

else if (comboBoxActions->getSelectedid()==6)

{

int max;

max=mas1[0][0];

for (int i=0; i<n; i++)

for (int j=0; j<m; j++)

{

if (mas1[i][j]>max)

{

max=mas1[i][j];

}

}

label4->setText("Max element is "+(String)max,dontSendNotification);

}

else if (comboBoxActions->getSelectedid()==7)

{

int min;

min=mas1[0][0];

for (int i=0; i<n; i++)

for (int j=0; j<m; j++)

{

if (mas1[i][j]<min)

{

min=mas1[i][j];

}

}

label4->setText("Min element is "+(String)minjdontSendNotification);

}

else if (comboBoxActions->getSelectedid()==8)

{

#if JUCE_M0DAL_L00PS_PERMITTED

AlertWindow w ("Matrix multiplication in number"., " ",

AlertWindow::NoIcon);

w.addTextEditor ("text", "enter the number", "text field:");

w.addButton ("OK", 1, KeyPress (KeyPress::returnKey, 0, 0));

w.addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey, 0, 0));

if (w.runModalLoop() != 0) // is they picked 'ok'

{

s="

int a = w.getTextEditorContents ("text").getlntValue();

for (int i=0; i<n; i++)

{

for (int j=0; j<m; j++)

{

s+=(String)(mas1[i][j]*a)+" ";

}

s+="\n";

}

//label3->setText("Matrix multiplication \nin number"+a,dontSendNotification);

label4->setText(s,dontSendNotification);

}

#endif

}

else if (comboBoxActions->getSelectedid()==9)

{

if (n==m)

{

int i=0, j=0, k=0, *v;

v=new int [(n)*(m)];

mas2=new int* [m];

for (int j=0; j<n; ]++)

mas2[j]=new int[n];

for (i=0; i<m; i++)

{

for (j=0; j<n; j++)

{

et="Enter the element ["+(String)(i+1)+"]["+(String)(j+1)+"]

AlertWindow w ("Second Matrix", et, AlertWindow::NoIcon);

w.addTextEditor ("text", "text field:");

w.addButton ("Enter!", 1, KeyPress (KeyPress::returnKey, 0, 0));

//w.addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey, 0, 0));

if (w.runModalLoopQ != 0) // is they picked 'ok'

{

v[k]=w.getTextEditorContents ("text").getIntValue();

k++;

}

}

}

s="";

k=0;

for (int i=0; i<m; i++)

{

for (int j=0; j<n; j++)

{

mas2[i][j]=v[k];

s+=(String)mas2[i][j]+" ";

k++;

}

s+="\n";

}

label3->setText(s,dontSendNotification);

int **resultat;

resultat= new int* [n];

for (int i=0; i<n; i++)

resultat[i]=new int [n];

for(int i=0; i<n; i++)

{

for(int j=0; j<n; j++)

{

resultat[i][j] = 0;

for (int s=0; s<m; s++)

{

resultat[i][j] += mas1[i][s] * mas2[s][j];

}

}

s=" ";

for(int i=0; i<n; i++)

{

for(int j=0; j<nj j++)

{

s+=(String)resultat[i][j]+"";

}

s+="\n";

}

label4->setText(sJdontSendNotification);

}

Else

{

label4->setColour(Label::textColourId, Colours::red);

label4->setText("Matrix must be square!",dontSendNotification);

}

}

else if (comboBoxActions->getSelectedid()==10)

int i=0; j=0; k=0; *v;

v=new int [(n)*(m)];

mas2=new int* [m];

for (int j=0; j<n; j++)

mas2[j]=new int[n];

for (i=0j i<m; i++)

{

for (j=0J j<nj j++)

{

et="Enter the element ["+(String)(i+1)+"]["+(String)(j+1)+"]";

AlertWindow w ("Second Matrix", et, AlertWindow::NoIcon);

w.addTextEditor ("text", "", "text field:");

w.addButton ("Enter!", 1, KeyPress (KeyPress::returnKey, 0, 0))

//w.addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey, 0, 0));

if (w.runModalLoop() != 0) // is they picked 'ok'

{

v[k]=w.getTextEditorContents ("text").getIntValue();

k++j

}

}

}

s="";

k=0;

for (int i=0; i<m; i++)

{

for (int j=0; j<n; j++)

{

mas2[i][j]=v[k];

s+=(String)mas2[i][j]+" ";

k++;

}

s+="\n";

}

label3->setText(s,dontSendNotification);

int **resultat;

resultat= new int* [n];

for (int i=0; i<n; i++)

resultat[i]=new int [n];

for(int i=0; i<n; i++)

{

for(int j=0; j<m; j++)

{

resultat[i][j] = mas1[i][j] + mas2[i][j];

}

for(int i=0; i<n; i++)

{

for(int j=0; j<nj j++)

{

s+=(String)resultat[i][j]+" ";

}

s+="\n";

}

label4->setText(s,dontSendNotification);

}

else if (comboBoxActions->getSelectedid()==11)

{

int i=0,j=0,k=0,*v;

v=new int [(n)*(m)];

mas2=new int* [m];

for (int j=0; j<nj j++)

mas2[j]=new int[n];

for (i=0; i<m; i++)

{

for (j=0; j<n; 3++)

{

et="Enter the element ["+(String)(i+1)+"]["+(String)(j+1)+"];

AlertWindow w ("Second Matrix", et, AlertWindow::NoIcon);

w.addTextEditor ("text", "text field:");

w.addButton ("Enter!", 1, KeyPress (KeyPress::returnKey, 0, 0)) ;

//w.addButton ("Cancel", 0, KeyPress (KeyPress:rescapeKey, 0, 0));

if (w.runModalLoopQ != 0) // is they picked 'ok'

{

v[k]=w.getTextEditorContents ("text").getlntValue();

k++;

}

}

}

s=" "; k=0;

for (int i=0; i<m; i++)

{

for (int j=0; j<n; j++)

{

mas2[i][j]=v[k]; s+=(String)mas2[i][j]+" ";

k++;

}

s+="\n";

}

label3->setText(s,dontSendNotification);

int **resultat;

resultat= new int* [n];

for (int i=0; i<n; i++)

resultat[i]=new int [n];

for(int i=0; i<n; i++)

{

for(int j=0; j<m; j++)

{

resultat[i][j] = mas1[i][j] - mas2[i][j]j

}

}

S=" ";

for(int i=0; i<n; i++)

{

for(int j=0; j<n; j++)

{

s+=(String)resultat[i][j]+'

}

s+="\n";

}

label4->setText(s,dontSendNotification);

}

Else

{

}

}

//[UsercomboBoxChanged_Post]

//[/UsercomboBoxChanged_Post]

void NewComponent::sliderValueChanged (Slider* sliderThatWasMoved)

{

//[UsersliderValueChanged_Pre]

//[/UsersliderValueChanged_Pre]

if (sliderThatWasMoved == slider)

{

//[UserSliderCode_slider] -- add your slider handling code here.. //[/UserSliderCode_slider]

}

else if (sliderThatWasMoved == slider2)

{

//[UserSliderCode_slider2] -- add your slider handling code here.. //[/UserSliderCode_slider2]

}

//[UsersliderValueChanged_Post]

//[/UsersliderValueChanged_Post]

//[MiscUserCode] You can add your own definitions of your custom methods or any other code here...

//[/MiscUserCode] //==============================================================================

#if 0

/*-- Introducer information section --

This is where the Introjucer stores the metadata that describe this GUI layout, so make changes in here at your peril!

BEGIN_JUCER_METADATA

<JUCER_C0MP0NENT documentType="Component" className="NewComponent" componentName=‘‘" parentClasses="public Component" constructorParams="" variablelnitialisers=""

snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330" fixedSize="0" initialWidth="480" initialHeight="800">

<BACKGROUND backgroundColour="ffffffff">

<RECT pos="0 0 480 800" fill="solid: a40a89b6" hasStroke="0"/>

<TEXT pos="216 44 17 30" fill="solid: ff000000" hasStroke="0" text="&#1093;"

fontname="Default font" fontsize="15" bold="0" italic="0" justification="36"/> </BACKGROUND>

<LABEL name="new label" id="24282a319fc042c9” memberName="label" virtualName="" explicitFocusOrder="0" pos="104 16 244 24" edTextCol="ff000000" edBkgCol="0" labelText="Enter the dimension of the matrix:" editableSingleClick="0"

editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font" fontsize="16" bold="0" italic="0" justification="33"/>

<TEXTBUTTON name="new button" id="60cff13b583f3fd5" memberName="textButton" virtualName="" explicitFocusOrder="0" pos="112 88 102 24" buttonText="Generate"

connectedEdges="0" needsCallback="l" radioGroupId="0"/>

<TEXTBUTTON name="new button" id="826a9c298ad0f65" memberName="textButton2" virtualName="" explicitFocusOrder="0" pos="234 88 102 24" buttonText="Enter"

connectedEdges="0" needsCallback="l” radioGroupId="0"/>

<LABEL name="new label" id="803ba30b619bdlf9" memberName="label2" virtualName="" explicitFocusOrder=“0" pos="16 128 192 192" textCol="ffffffff" edTextCol="ff000000" edBkgCol="0" labelText="" editableSingleClick="0" editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font" fontsize="18" bold="0" italic="0" justification="33"/>

<LABEL name="new label" id="a4a0358b6688f7ab" memberName="label3" virtualName="" explicitFocusOrder="0" pos="240 128 192 192" textCol="ffffffff"

edTextCol="ff000000" edBkgCol="0" labelText=" " editableSingleClick=”0" editableDoubleClick="0" focusDiscandsChanges="0" fontname="Default font" fontsize="18" bold="0" italic="0" justification="33"/>

<LABEL name="new label" id="3a35aa5d592bd77d" memberName="label4" virtualName="" explicitFocusOrder="0" pos="128 377 192 192" textCol="ffffffff" edTextCol="ff000000" edBkgCol="0" labelText="" editableSingleClick="0" editableDoubleClick="0" focusDlscardsChanges="0" fontnarre="Default font" fontslze="18" bold="0" italic="0" justification="33"/>

<COMBOBOX name="new combo box" id="36bb5f7a3cfd6832" memberName="comboBoxActions" vlrtualName="" explicitFocusOnder="0" pos="128 336 192 24" editable="0" layout="33" ltems="" textWhenNonSelected="" textWhenNoItems="(no choices)"/» <SLIDER name="new slider" id="f96bf18c02d2adef" memberName="slider" virtualName="" expllcitFocusOrder="0" pos="234 48 110 24" min="0" max="10" int="0" style="LlnearHorizontal" textBoxPos="TextBoxLeft" textBoxEditable="l" textBoxWidth="40" textBoxHeight="20" skewFactor="l"/>

<SLIDER name="new slider" id="996fd041a6da90e7" memberName="slider2"

virtualName="" explicitFocusOrder="0" pos="104 48 110 24" min="0" max="10" int="0" style="LinearHorizontal" textBoxPos="TextBoxRight" textBoxEditable="l" textBoxWidth="40" textBoxHeight="20" skewFactor="l"/>

</3UCER_C0MP0NENT>

END_3UCER_METADATA

*/

#endif

//[EndFile] You can add extra defines here...

//[/EndFile]

Источник: портал www.KazEdu.kz

Другие материалы

Каталог учебных материалов

Свежие работы в разделе

Наша кнопка

Разместить ссылку на наш сайт можно воспользовавшись следующим кодом:

Контакты

Если у вас возникли какие либо вопросы, обращайтесь на email администратора: admin@kazreferat.info