Тема: мова програмування Java і середовище програмування Eclipse.
Мета: ознайомити учнів з:
По завершенню вивчення учень:
Обладнання: комп’ютери зі встановленими ОС та інтегрованим середовищем програмування Eclipse, (дана) інструкція.
Структура уроку
Хід уроку
1. Організаційний момент
Привітання з учнями. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання. Оголошення теми й мети уроку.
2. Актуалізація опорних знань
Дати означення понять, які виділені жирним шрифтом.
Алгоритм — це запис скінченої послідовності вказівок, виконання яких призводить до розв'язання певної задачі.
Вказівка (алгоритму) — це спонукальне речення, що вказує, яку дію має виконати виконавець алгоритму.
Виконавець (алгоритму) — це жива істота (людина або тварина) або автоматичний пристрій (робот, електронна обчислювальна машина тощо), спроможна діяти відповідно з алгоритмом.
Система вказівок виконавця — це множина (сукупність) всіх вказівок, які може виконувати даний виконавець.
Середовище виконання алгоритму — об'єкти, з якими працює виконавець у процесі виконання алгоритму.
Властивості алгоритму: дискретність, визначеність, виконуваність, скінченність, результативність, масовість, ефективність.
Дискретність (латинською discretus — розділений, розривний) алгоритму означає, що виконання алгоритму зводиться до виконання окремих дій (кроків) у певній послідовності. Причому, кожну вказівку алгоритму виконують за скінченний проміжок часу.
Визначеність (однозначність) означає, що алгоритм однозначно визначає порядок дій виконавця, результат цих дій і не потребує додаткового тлумачення.
Виконуваність означає, що алгоритм, призначений для певного виконавця, може містити лише вказівки, які входять до системи вказівок цього виконавця.
Скінченність означає, що виконання алгоритму закінчиться після скінченної (можливо, досить великої) кількості кроків і за скінченний час для довільних вхідних даних.
Результативність алгоритму означає, що після закінчення виконання алгоритму обов’язково:
або одержують розв'язок-результат відповідно до поставленої мети;
Масовість алгоритму означає, що алгоритм можна застосувати до цілого класу однотипних задач, для яких спільними є умова та хід розв’язування та які відрізняються лише початковими (вхідними) даними. Наприклад, алгоритмом дій, складеним для одного касира, можуть успішно скористатися всі касири супермаркету. А програмою пошуку коду і підрахунку суми вартостей товарів, придбаних покупцем, — усі комп'ютери супермаркету
Ефективність алгоритму описує час виконання і об'єм ресурсів, необхідних для виконання алгоритму: чим менше часу (часова ефективність) і ресурсів (просторова ефективність), тим ефективність вища.
3. Вивчення нового матеріалу
У театрі хід подій на сцені попередньо визначено у найдрібніших деталях:
Відхід від цього у театрі — імпровізація акторів — інколи сприяє успіху вистави. Але імпровізації у технологічних процесах, до яких належить і обчислювальні, призводить до збоїв і аварій.
Робота комп'ютера полягає у виконанні програми — набору певних дій у певному порядку. Програма є алгоритмом дій комп’ютера, записаним зрозумілою для нього мовою.
Щоб задати комп'ютеру послідовність дій, потрібно задати послідовність двійкових кодів відповідних вказівок. Писати такі програми — дуже складна й марудна справа.
Простіше писати програму деякою мовою, наближеною до природної людської мови, а переклад у машинні коди доручити комп'ютеру. Так з'явилися мови, призначені спеціально для написання програм — мови програмування, що на відміну від розмовної мови не допускають двозначностей чи вільного тлумачення.
Мова програмування (англійською programming language) — це система позначень для опису алгоритмів та структур даних.
Java — це об'єктно-орієнтована мова програмування.
Об'єктно-орієнтовані мови програмування описують сукупності об'єктів, що взаємодіють між собою. Об'єкт має властивості (змінні) та методи — дії, які об'єкт може виконувати. Кожний об’єкт є представником певного класу. Інакше кажучи, набір властивостей та поведінку (сукупність методів) об’єкта описують у класі, на основі якого створено об’єкт. Навіть найпростіша програма мовою Java має містити принаймні один клас.
У мові Java, як і в багатьох інших мовах програмування, для створення програми пишуть вихідний код, потім компілюють його. Компілятор перевіряє відповідність коду синтаксичним правилам мови. Початковою метою мови Java, було надання можливості для програмістів писати одну програму, яка могла б працювати на будь-якій платформі. Цю мету можна висловити такими словами: «Write once, run anywhere» — «Написати один раз, виконувати будь-де».
При написанні коду на ПК під керуванням ОС Windows створюють файл з розширенням java. Після компілювання цього файлу компілятор створює файл з розширенням class. Для роботи на інших платформах достатньо відкомпілювати вихідний код з бібліотеками, специфічними для цієї платформи.
Для створення програм мовою Java будемо використовувати вільно поширюване багатоплатформне інтегроване середовище програмування (IDE) Eclipse. Використання інтегрованого середовища програмування приховує більшість рутинних технічних подробиць роботи з мовою програмування Java, надає інструменти для прискорення та покращення роботи і просто є зручнішим способом розробки програм.
Спочатку середовище Eclipse було розроблене для мови Java. Нині існують розширення для підтримки інших мов: C, C++, Perl, PHP, JavaScript, Python, Ruby тощо.
Робочий простір Eclipse IDE
Після запуску середовища Eclipse буде запропоновано вказати теку для робочого простору (workspace).
Workspace — це тека, в якій буде збережено всі налаштування середовища.
Її рекомендують розташувати у теці, відмінній від директорії з встановленим IDE.
Першим кроком для написання програми є створення проекту Java.
Алгоритм створення Java-проекту
Використати вказівку меню File / New / Project...
У вікні діалогу New Project вибрати Java / Java Project і натиснути кнопку Next.
У вікні діалогу New Java Project ввести назву проекту (наприклад, my) і натиснути кнопку Next.
Залишити налаштування як усталено й натиснути Finish.
Основне вікно програми Eclipse
має такі складові:
головне меню;
панель інструментів;
панель для редагування файлів (Editors);
панель для перегляду структур;
панель вибору активної проекції.
Views — перегляди або представлення — панель для перегляду структур: список ваших проектів, файлова структура проекта, структура вихідного файлу, класу.
Perspectives — проекції — це набір представлень, панелей інструментів і редакторів, їхнє розташування в основному вікні. При відкриванні проекції буде відкрито налаштовані для неї інструменти, редактори та представлення.
NetBeans — інше інтегроване середовище програмування, придатне для наочного програмування інтерфейсу з використанням JDK. При ОС Linux завантажують файл з розширенням sh. Для встановлення ПЗ потрібно виконати такі вказівки Терміналу (описано для версії 12.3).
cd Завантаження chmod +x Apache-NetBeans-12.3-bin-linux-x64.sh sudo ./Apache-NetBeans-12.3-bin-linux-x64.sh
Для можливості використання мови програмування може знадобитися такий рядок:
netbeans_jdkhome="/usr/lib/jvm/java-11-openjdk-amd64"
у файлі netbeans.conf. Редагування файлу можна почати, виконавши під обліковим записом з адміністративними правами таку вказівку Терміналу.
sudo nano /usr/local/netbeans-12.3/netbeans/etc/netbeans.conf
Зручно використовувати також online середовища програмування, які не вимагають встановлення програмного забезпечення.
Виконання програми мовою Java. Програму, написану мовою високого рівня, до яких належить Java, так званий вихідний модуль ("сирець"), не можна одразу виконати. Її спочатку треба скомпілювати, тобто перевести у послідовність машинних вказівок — об'єктний модуль. Але і його, як правило, не можна одразу виконанити. Об'єктний модуль потрібно ще скомпонувати з бібліотеками використаних у модулі функцій і дозволити перехресні посилання між частинами об'єктного модуля, отримавши в результаті завантажувальний модуль — повністю готову до виконання програму.
Головна особливість технології Java — програму компілюють у машинні вказівки не якогось конкретного процесора, а так званої віртуальної машини Java (Java Virtual Machine, JVM).
Віртуальна машина Java — це сукупність вказівок з системою їх виконання.
Віртуальна машина Java повністю стекова, їй не потрібні складна адресація осередків пам'яті й велика кількість регістрів. Тому вказівки JVM короткі, більшість із них має довжину 1 байт. Ось чому вказівки JVM називають байт-кодами (bytecodes), хоча є зустрічаються вказівки довжиною 2 і 3 байти. Середня довжина вказівки становить 1,8 байти. Повний опис вказівок і будови JVM подано у специфікації віртуальної машини Java (Virtual Machine Specification, VMS).
Динамічне компонування (dynamic binding) — підключення всіх використовуваних стандартних функцій до програми лише на етапі її виконання без включення до байт-кодів — інша особливість Java. Вона істотно зменшує об'єм скомпільованої програми.
Принцип Java "Write once, run anywhere" — "Написано одного разу, виконується будь-де" — полягає у наступному. Переклад програми байт-кодами не залежить від типу процесора чи архітектури комп'ютера. Його можна виконати один раз відразу після написання програми. Немає потреби перекомпілювати програму під різні платформи. Байт-коди записують в одному або декількох файлах. Їх можна зберігати у зовнішній пам'яті або передавати мережею. Це зручно завдяки невеликому розміру файлів із байт-кодами. Байт-код можна виконувати на будь-якому комп'ютері, що має JVM.
Інтерпретація байт-кодів та динамічне компонування значно уповільнюють виконання програм. Це неістотно у випадку передавання байт-коду мережею — мережа повільніша за будь-яку інтерпретацію. Але в інших випадках бажано використати потужний комп'ютер. Тому постійно йде удосконалення інтерпретаторів у бік збільшення швидкості інтерпретації. Розроблено JIT-компілятори (Just-In-Time), що запам'ятовують вже інтерпретовані ділянки коду в машинних вказівках процесора і які виконують ці ділянки при повторному обігу, наприклад у циклах. Корпорація Sun Microsystems розробила технологію HotSpot і включає її у свою віртуальну машину Java.
Найбільшу швидкість може дати лише спеціалізований процесор. Наприклад, компанія Sun Microsystems випустила мікропроцесори picoJava, що працюють на системі команд JVM. Є Java-процесори інших фірм. Ці процесори безпосередньо виконують байт-коди.
При виконанні програм Java на інших процесорах потрібна ще інтерпретація команд JVM у команди конкретного процесора, а значить, потрібна програма-інтерпретатор. Причому для кожного типу процесорів та кожної архітектури комп'ютера потрібно написати свій інтерпретатор. Це завдання вже вирішено практично всім комп'ютерних платформ. Для найпоширеніших платформ є кілька втілень JVM різних фірм. Зростає кількість операційних систем та систем керування базами даних, що включають втілення JVM у своє ядро. Створено і спеціальну операційну систему JavaOS, яку застосовують в електронних пристроях. У більшість браузерів вбудовано віртуальну машину Java. Операційна система Andriod містить віртуальну машину Java під назвою Dalvik, яка працює на ядрі Linux.
Крім JVM для виконання байт-кодів на комп'ютері ще потрібно мати набір функцій, які викликають з байт-кодів і динамічно компонують з ними. Цей набір оформлено як бібліотеки класів Java з одного чи кількох пакунків. Кожну функцію можна записати байт-кодами. Її зберігають на конкретному комп'ютері, тому її доцільно записати в системі вказівок саме цього комп'ютера й уникнути інтерпретації байт-кодів. Такі функції, написані найчастіше мовою C/C++ і скомпіловані під певну платформу, називають "рідними" методами (native methods). Застосування "рідних" методів прискорює виконання програми.
JDK (Java Development Kit) — набір необхідних програмних інструментів для повного циклу роботи з мовою програмування Java: компіляції, інтерпретації, налагодження, що включає бібліотеку класів, і містить таке:
Корпорація Oracle, що купила фірму Sun Microsystems — творця технології Java, — безкоштовно поширює свій варіант JDK. Великою популярністю користується JDK корпорації IBM.
JRE — мінімальний набір програм та пакунків класів, достатній для виконання байт-кодів.
У тому числі інтерпретатор java (у попередніх версіях — полегшений інтерпретатор jre) та бібліотеку класів. Це частина JDK, що не містить компіляторів, налагоджувачів та інших засобів розробки. Саме Oracle JRE або його аналог, створений іншими фірмами, присутні у тих браузерах, які вміють виконувати програми мовою Java, в операційних системах та системах керування базами даних.
Хоча JRE входить до складу JDK, корпорація Oracle розповсюджує цей набір окремим файлом.
Компіляція і виконання програм без середовищ програмування:
Файли буде взято з поточної теки, якщо не вказано інший шлях (перед назвою файлів). Після компіляції будуть створені файли з розширенням class з тими самими назвами, що файли з кодом програми. Це розширення не потрібно вказувати при запуску програми на виконання.
І компіляцію, і виконання можна здійснити з додатковими параметрами, опис яких можна отримати виконанням таких вказівок:
javac -help
java -help
Навіть після встановлення JDK змінна середовища PATH може не містити шлях до бібліотеки javac. У цьому випадку потрібно знайти розташування бібліотеки javac засобами ОС (наприклад, /usr/lib/jvm/jdk-16.0.1/bin) і:
або явно вказувати шлях у вказівці компілювання, наприклад, таким чином
/usr/lib/jvm/jdk-16.0.1/bin/javac назви_файлів_через_пробіли
або змінити значення змінної середовища PATH, наприклад, таким чином
export PATH=$PATH:/usr/lib/jvm/jdk-16.0.1/bin
На ПК може бути попередньо встановлена бібліотека java версії, ранішої від використаної для компілятора javac. У цьому випадку можна отримати повідомлення, схоже на таке:
Error: LinkageError occurred while loading main class java.lang.UnsupportedClassVersionError: has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 55.0
Версії бібліотек (з поточної теки) можна встановити, виконавши такі вказівки Терміналу:
javac -version
java -version
Щоб упоратися з цією проблемою, достатньо вказувати шлях до бібліотеки java потрібної версії. Наприклад, таким чином.
/usr/lib/jvm/jdk-16.0.1/bin/java назви_класів_через_пробіли
Створення виконуваного файлу jar у середовищі Термінала Linux (командного рядка Windows) здійснюють виконанням вказівки такого вигляду:
jar cf назва_результату.jar назва_джерела.java
Назва файлу не з поточної теки повинна містити шлях до неї. Якщо шлях до файлу jar не відомий системі, цей шлях потрібно вказати. Наприклад, таким чином.
/usr/lib/jvm/jdk-16.0.1/bin/jar cf назва_результату.jar назва_джерела.java
4. Інструктаж з ТБ
5. Закріплення вивченного матеріалу
Завдання 1. Створити й виконати програму, яка виведе повідомлення: «Ура! Запрацювала моя перша програма!», використавши застосунок Hello World середовища програмування Eclipse.
Вказівки до виконання
У середовищі Eclipse обрати Create a Hello World aplication.
Використати вказівку меню Window / Perspective / Open Perspective / Java Browsing, якщо це можливо, інакше — Window / Perspective / Open Perspective / Оther...,
у вікні Open Perspective вибрати Java Browsing і натиснути кнопку OK.
Використати вказівку меню File / New / Java Project.
Ввести назву проекту HelloWorld і натиснути кнопку Finish.
Використати вказівку меню File / New / Class.
Ввести HelloWorld для назви класу, встановити прапорець, щоб створити метод Main, а потім натисність кнопку Finish.
Редактор Java автоматично відкриє показ нового класу.
У коді методу Main додати такий оператор:
System.out.println("Ура! Запрацювала моя перша програма!");
Зберегти зміни, використавши вказівку меню File / Save або натиснувши клавіші Ctrl + S.
Примітка Набираючи текст, можна помітити такі можливості редактора Eclipse.
Автоматичне дописування коду. Функція дописування коду видає контекстно залежний список варіантів, з якого можна здійснити вибір. При введенні лівої круглої дужки ( або подвійних лапок редактор автоматично вставляє до них відповідно праву круглу дужку та подвійні лапки, що завершують виділення частини тексту.
Перевірка синтаксису. При збереженні коду його компілюють у фоновому режимі і перевіряють на наявність синтаксичних помилок. Як усталено, синтаксичні помилки буде підкреслено червоною лінією, а ліворуч на полях з'явиться мітка — на червоному крузі білий знак ×. Інші помилки буде позначено на полях символом електричної лампочки. Це ті проблеми, які редактор може виправити за програміста.
Клацнути правою кнопкою миші в провіднику пакетів і вибрати у контекстному меню Run As / Java Application або натиснути відповідну кнопку на панелі інструментів.
Дочекатися появи на консолі такого тексту:
Ура! Запрацювала моя перша програма!
6. Підбиття підсумків уроку
Виставлення оцінок.
7. Домашнє завдання
Вивчити навчальний матеріал уроку. Встановити JDK, середовища
Eclipse і
NetBeans.
Ознайомитися з описом мови Java, щоб виробити загальне уявлення про можливості цієї мови програмування.
Клас — це конструкція, передбачена мовою програмування, для об'єднання ряду даних (змінних, можливо, різних типів) в одне ціле. Крім власне даних, класи зазвичай включають методи (підпрограми), можуть включати блоки (сукупність операторів, записаних у фігурних дужках {}) та інші (внутрішні) класи.
— див. приклад програмної реалізації поняття класу у розв'язанні такої задачі: знайти об'єми двох прямокутних коробок з відомими габаритами (довжинами сторін). У цьому і наступному прикладах код потрібно зберігати у файлі з назвою Main.java або відповідним чином змінити назву класу, а перший рядок повинен містити опис пакету:
package назва_пакету;
Метод у мові java — частина коду в описі класу, що має свою назву й містить опис дій, які може виконати представник класу.
Поняття методу є аналогом підпрограми, функції чи процедури в інших мовах програмування. Назву методу використовують для звердення до методу з інших частин програми.
Оголошення та визначення методу має такий вигляд:
тип_повернення назва_методу (список_параметрів) { вказіка1; //тіло методу вказіка2; … вказікаn; }
Тип повернення — це тип величини — результату застосування методу. Якщо метод нічого не повертає, то вказують ключове слово void.
Виклик методу здійснюють так:
об'єкт.метод(список_параметрів)
або
об'єктна_змінна.метод(список_параметрів)
— див. нову редакцію розглянутої вище програми обчислення об'ємів коробок з прикладом опису методу.
У поданих прикладах використано модифікатори доступу.
Модифікатори доступу полів (властивостей) чи методів можуть бути такими:
private — закритий (клас або член класу), протилежність модифікатору public. Доступний лише з коду в тому самому класі;
protected — доступний з будь-якого місця у поточному класі чи пакеті або у похідних класах. Навіть якщо вони перебувають в інших пакетах.
Відсутність модифікатора у поля або методу класу передбачає застосування до нього модифікатора як усталено. Такі поля або методи видно в усіх класах у поточному пакеті.
Крім звичайних методів і полів клас може мати статичні (static) поля і методи. Наприклад, головний клас програми має саме такий метод main.
public static void main (String () arg);
Слово static в оголошенні змінної чи методу означає, що метод належить класу, а не представнику класу (об'єкту). Відповідні (статичні) члени класу можна використовувати без створення представників класу. Статичні змінні подібні глобальним змінним, тобто вони досяжні з довільного місця коду.
Слово void в оголошенні методу означає, що метод нічого не повертає. Для отримання результату його застосування слово void потрібно замінити типом даних і додати у код методу вказівку return з назвою об'єкта вказаного в оголошенні типу.
@Override — анотація-маркер в описі класу, яку застосовують до методу, що перевизначає метод батьківського класу. Анотація-маркер @Override перевіряє, чи перевизначено метод. Викликає помилку
компіляції, якщо метод не знайдено у батьківському класі або інтерфейсі.
Коментарі використовують для того, щоб полегшити сприйняття програми й іншим людям, й автору — через значний проміжок часу після створення програми. Компілятор нехтує ними, тому на об'єм скомпільованої програми вони не впливають. У мові Java є такі три типи коментарів:
Oднорядкові — все, що розташовано в рядку тексту програми після двох похилих рисок (//) компілятор сприймає як коментар:
// це коментар
System.out.println("Вивчаємо коментарі"); // виведення рядка тексту на екран
Багаторядкові — все, що розташовано в тексті програми між парами символів /* і */ компілятор сприймає як коментар. Такий чином зручно вилучати з виконуваного коду оператори при пошуку помилок у створеній програмі. Вкладення багаторядкового коментаря в інший багаторядковий коментар заборонено.
/* Це багаторядковий коментар System.out.println("Це не буде виведено на екрані"); System.out.println("І це також не буде виведено на екрані"); */ System.out.println("А це буде виведено");
Для автоматичної генерації документації — все, що розташовано в тексті програми між групами символів /** і */ компілятор сприймає як коментар — повідомлення про класи та методи, їх призначення, параметри. На його основі можна створити документацію щодо розроблених класів та їхніх методів. Така документація буде схожою на офіційну документацію щодо класів Java.
Назва | Довжина у байтах | Діапазон зміни |
---|---|---|
boolean | не визна- чено | {true, false} |
byte | 1 | −128..127 |
char | 2 | 0..216−1, тобто 0..65535 |
short | 2 | −215..215−1, тобто −32768..32767 |
int | 4 | −231..231−1, тобто −2147483648..2147483647 |
long | 8 | −263..263−1, тобто приблизно −9.2·1018..9.2·1018 |
float | 4 | −(2−2−23)·2127..(2−2−23)·2127, тобто приблизно −3.4·1038..3.4·1038 |
double | 8 | −(2−2−52)·21023..(2−2−52)·21023, тобто приблизно −1.8·10308..1.8·10308 |
Оголошення змінних розпочинають з обов'язкового вказання типу даних, після чого йде назва змінної. Оголошення змінної завершують крапкою з комою. Наприклад,
int k;
double salary;
char ourChar;
Назву змінної потрібно починатися з літери, далі — довільна послідовність літер і цифр. У Java використано кодування Unicode, тому змінні можна писати навіть кирилицею. Враховують регістр символів. Наприклад, K та k — це різні змінні. Не можна використовувати як назви зарезервовані слова. В одному рядку можна оголошувати декілька змінних:
int j,k,l,m,n;
Бажано давати змістовні назви змінним, бо це істотно полегшує роботу над текстом програми.
Ініціалізація змінної — надання початкових значень — може бути здійснена як при оголошенні, так і в подальшому.
Арифметичні оператори:
+ — додавання;Позначення | Опис |
---|---|
& | Логічне «і» (AND) |
| | Логічне «або» (OR) |
^ | Логічне виняткове «або» (XOR) |
|| | Коротке «або» |
&& | Коротке «і» |
! | Логічне заперечення «не» (NOT) |
&= | Логічне «і» з наданням значення |
|= | Логічне «або» з наданням значення |
^= | Виняткове «або» з наданням значення |
== | Рівність (еквівалентність) |
!= | Не рівність (нееквівалентність) |
?: | Тернарний if-then-else (якщо-тоді-інакше) |
A | B | A | B | A & B | A ^ B | !A |
---|---|---|---|---|---|
False | False | False | False | False | True |
True | False | True | False | True | False |
False | True | True | False | True | True |
True | True | True | True | False | False |
Наступна программа демонструє використання логічних булевих операторів.
class BoolLogic { public static void main(String args[]) { boolean a = true; boolean b = false; System.out.println(" a = " + a); System.out.println(" b = " + b); System.out.println(" a | b = " + a | b); System.out.println(" a & b = " + a & b); System.out.println(" a ^ b = " + a ^ b); System.out.println("!a & b | a & !b = " + !a & b | a & !b); System.out.println(" !a = " + !a); } }
У результаті її виконання на екран буде виведено такий текст:
a = true b = false a | b = true a & b = false a ^ b = true !a & b | a & !b = true !a = false
Оператор надання значення використовують при ініціалізації змінних та наданні значення обчисленого виразу:
int x = 5;
int k = x + 8;
У Java його можна використати й таким чином:
a = b = c = 100;
Ця можливість корисна при потребі надати одного й того самого значення багатьом змінним.
Оператор ?: має три операнди, може заміняти у певних випадках умовний оператор if … then … else … і має такий вигляд:
Вираз1 ? вираз2 : вираз3;
Розглянемо такий приклад:
int y = x==0 ? ++x : x;
Якщо x дорівнює 0, то його значення збільшують на 1 і надають у цього збільшеного значення. Інакше (якщо x відмінне від 0), то надають у значення x.
Пріоритет операторів
Блок або складений оператор — це довільна послідовність операторів, взятих у фігурні дужки. Блок визначає область використання змінних. Блок можна вкаласти всередину іншого блоку.
Умовний оператор (неповна форма)
if (умова) вказівка;
Якщо умова справджується (true), буде виконано вказівку, записану в операторі, інакше її не буде виконано. Якщо при справдженні умови необхідно виконати не один, а багато операторів, усіх їх розміщують у блоці:
if (умова) { оператор1; … операторn; }
Якщо необхідно здійснити певну дію і в разі не виконання умови, то застосовують умовний оператор у повній формі.
Умовний оператор (повна форма)
if (умова) оператор1 else оператор2;
Цикл while (перекладається як «доки») – це цикл з передумовою, тіло якого (вказівку) виконують, поки умова істинна. Якщо умова з самого початку хибна, то вказівку не буде виконано жодного разу. Загальний вигляд:
while (умова) оператор;
Якщо в циклі потрібно виконати кілька вказівок, необхідно створити з них блок, тобто записати між фігурними дужками. Інколи в дужках записують лише одну вказівку для кращого сприйняття коду.
while (умова) { оператор1; ... операторn }
Див. приклад з грою — вгадуванням числа від 0 до 10. Програма породжує випадкове число при кожному повторі циклу і пропонує вгадати його. Після вводу користувачем числа виводить відповідне повідомлення про результат гри і запрошення здійснити нову спробу. Якщо користувач вводить з клавіатури «Y» або «y», то гру буде продовжено, інакше її буде завершено.
Для породження випадкових чисел використано вбудований клас Random, що містить відповідні методи. Зокрема, у прикладі програми використано метод nextInt для породження випадкових чисел.
Для зчитування з клавіатури використано клас Scanner для зручного введення з клавіатури. Метод nextInt — для зчитування цілого числа, next — рядка тексиу з клавіатури.
Для того, щоб переконатися у збіганні рядків, використано метод equals з класу String.
Пояснимо зміст таких рядків:
import java.util.*; Random generator = new Random(); gn=generator.nextInt(10);
Необхідно мати генератор цілих випадкових чисел, який реалізовує класс Random у пакеті java.util. Для цього імпортовано відповідний клас. Далі в програмі створюємо змінну generator, яка вказуватиме на екземпляр класу random і дозволятиме звернення до методів даного класу.
new Random() — створено відповідний об'єкт. Для породження випадкових чисел використано метод nextInt() класу Random.
Цикл do while — цикл з післяумовою, що буде виконано хоча б один раз, має таку форму запису:
do вказівка while (умова);
У розглянутому прикладі програми з вгадуванням чисел природніше було б застосувати саме такий цикл (див. змінений код), бо необхідне хоча б одне виконання тіла циклу.
Цикл з лічильником for застосовують при необхідності виконати оператори певну кількість раз з одночасним збільшенням або зменшенням певної змінної (лічильника). Наприклад, для виведення на консолі у стовпчик чисел від 1 до 10 включно:
for (int i = 1; i <= 10; i++) {System.out.println(i);}
Цикл for each призначено для перебору елементів масиву (програмне втілення поняття послідовності) або подібних до масиву типів даних. Загальний вигляд циклу такий:
for (type var : arr) { //тіло циклу }
Наприклад, вивести елементи масиву а можна таким чином:
for (int element : a) System.out.println(element);
Оператор переривання виконання циклу break. При використанні вкладених циклів (один цикл в іншому) оператор break припинить цикл, у тілі якого його записано. Якщо його записано у внутрішньому циклі, то буде припинено виконання лише внутрішнього циклу, а зовнішній цикл буде виконано й надалі. Якщо потрібно повністю припинити виконання і внутрішнього, і зовнішнього циклів, то використовують оператор break з міткою - див. приклад програми, що виводить 2 числа, якщо використано оператор break з міткою і зациклюється, якщо використати оператор break без мітки.
Оператор припинення кроку (ітерації) continue переносить порядок виконання до заголовку оператора. Щоправда завжди уникнути використання вказівок break і continue.
Оператор вибору одного з багатьох варіантів switch дозволяє уникнути громіздких вкладень if … else … . Наприклад, таким чином:
Scanner in = new Scanner(System.in); System.out.print("Введіть одне з таких чисел: 1, 2, 3, 4."); int choice = in.nextInt(); switch (choice) { case 1: {System.out.print("Введено 1."); break;} case 2: {System.out.print("Введено 2."); break;} case 3: {System.out.print("Введено 3."); break;} case 4: {System.out.print("Введено 4."); break;} default:{System.out.print("Не те…"); break;} }
Одновимірний (лінійний) масив — втілення у мові програмування поняття послідовності, члени якої занумеровано цілими числами. Формат оголошення масиву такий:
тип_елементів назва_масиву[];
Існує також інша форма оголошення масиву:
тип_елементів[] назва_масиву;
Перед роботою з масивом, необхідно виділити під нього пам'ять за допомогою операції new:
назва_масиву = new тип_елементів [кількість_елементів];
або зразу однією вказівкою:
тип_елементів назва-масиву[] = new тип_елементів [кількість_елементів];
Наприклад,
int month_days[] = new int[12];
Таким чином описують виділення пам'яті під масив і ініціалізації елементів масиву нулями. В подальшому можна напряму звертатися до елементів масиву, вказуючи індекс у квадратних дужках. Нумерацію елементів у масиві в java починають з нуля.
public class DaysOfMonth { public static void main(String[] args) { int month_days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; System.out.println("Травень має "+month_days[4]+" день"); } }
Результат виконання:
Травень має 31 день
Багатовимірні масиви — втілення у мові програмування поняття таблиці (двовимірний масив) чи тензора. Робота з багатовимірним масивом схожа на роботу з одновимірним. Відмінність лише в тому, що використовують додаткові квадратні дужки для інших індексів. Переважно використовують дво- і тривимірні масиви, які можна оголосити таким чином:
int a[][] = new int[2][3]; // створення масиву 4×5 int b[][][] = new int[2][3][4]; // створення масиву 5×5×5
Як і у випадку з одновимірним масивом є можливість ініціалізації масиву при його оголошенні. Наприклад, таким чином:
int[][] Array={{5, 6, 1, 3}, {3, 4, 2, 1}, {1, 2, 2, 2} };
Рядок (тексту) — це втілення у мові програмування поняття послідовності символів.
Цю послідовність у тексті прогами записують між подвійними лапками: "Це рядок". Рядок може бути порожнім, тобто не містити жодного символа: "". Для запису спеціальних символів використовують зворотню похилу риску "\" (backslash). Наприклад, "\" - це лапки". Найчастіше це застосовують для запису ознаки кінця рядка:
System.out.println("Це перший рядок тексту, \nа це другий рядок тексту.");
Зберігати великі об'єми текстових даних радять зберігати і маніпулювати з ними не у класі String, а у класах StringBuilder або StringBuffer.
Kонкатенація — це поєднання (злиття) двох рядків в один. Наприклад, результат у двох наступних вказівок один в і той самий:
String str = "Це рядок";
String str = "Це"+" рядок";
При використанні конкатенації рядків з іншими типами даних відбувається автоматичне зведення до типу String
String str = "цифра " + 5; //результат "цифра 5"
Також з'єднання двох рядків можна здійснити за допомогою методу concat:
String strEnd =" та вставайте";
String str = "Поховайте".concat(strEnd);
Метод length визначає довжину рядка:
String str = "Це рядок";
int j = str.length();
int k = "Це рядок".length();
Метод substring(j, k) використовують для отримання частину рядка довжини k, починаючи з символа j.
Наприклад, змінити рядок "Hello" на "Help!" можна таким чином:
String s = "Hello";
s = s.substring(0,3) + "p!";
Порівняння рядків здійснюють за допомогою методу equals: s1.equals(s2) повертає true, якщо s1 і s2 збігаються, інакше — false. Замість змінних (s1, s2) можна записувати рядкові сталі. Метод equals порівнює рядки з урахуванням регістру символів. Для того, щоб не враховувався регістр при порівнянні, використовують метод equalsIgnoreCase.
"Hello".equalsIgnoreCase("hello").
Примітка. Не використовуйте оператор ==, щоб перевірити рядки на збіг. Таким чином лише буде перевірено, чи рядкам відповідає та сама адреса у пам’яті.
Зведення до типу. Інколи потрібно звести тип String до інших типів і навпаки. Для таких випадків слугують, наприклад, методи parse*. Тут зірочкою * позначено клас, до якого належить метод, що перетворює рядок s типу String на представника цього класу — див. приклади застосування:
byte b = Byte.parseByte(s); Short sh = Short.parseShort(s); int i = Integer.parseInt(s); s = Integer.toString(i); long l = Long.parseLong(s); s = Long.toString(l); float f = Float.parseFloat(s); s = Float.toString(f); double d = Double.parseDouble(s); s = Double.toString(d); boolean b = Boolean.parseBoolean(s);
Тут у другому стовпчику подано обернені перетворення числа у рядок.
Методи String
Для кожного методу вказано тип результату повернення, назву методу, тип і приклад назви аргумента (аргументів), опис дії):
char charAt(int index) — повертає char значення за вказаним індексом;
int codePointAt(int index) — повертає символ (Unicode code point) за вказаним індексом;
int codePointBefore(int index) — повертає символ (Unicode code point) перед вказаним індексом;
int codePointCount(int beginIndex, int endIndex) — повертає кількість кодових точок Unicode у зазначеному інтервалі в рядку;
int compareTo(String anotherString) — порівнює два рядки лексикографічно;
int compareToIgnoreCase(String str) — порівнює два рядки лексикографічно, ігноруючи різницю в регістрах літер;
String concat(String str) — приєднує зазначений рядок str в кінець рядка;
boolean contains(CharSequence s) — повертає true, тільки якщо рядок містить зазначену послідовність значень char;
boolean contentEquals(CharSequence cs) — порівнює рядок із зазначеною послідовністю символів (CharSequence);
boolean endsWith(String suffix) — перевіряє чи рядок закінчується зазначеним суфіксом;
boolean equals(Object anObject) — порівнює рядок із зазначеним об'єктом;
boolean equalsIgnoreCase(String anotherString) — порівнює рядок з іншим рядком, ігноруючи регістр;
byte[] getBytes() — кодує рядок у послідовність байт використовуючи символьний набір (charset) як усталено, результат зберігають у новому байтовому масиві;
byte[] getBytes(Charset charset) — кодує рядок у послідовність байт використовуючи наданий символьний набір (charset), результат зберігається у новий байтовий масив;
byte[] getBytes(String charsetName) — кодує рядок у послідовність байт використовуючи названий символьний набір, результат зберігається у новому байтовому масиві;
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) — копіює символи з рядка у символьний масив;
int hashCode() — повертає ХЕШ-код рядка;
int indexOf(int ch) — повертає індекс першого входження зазначеного символу в рядок;
int indexOf(int ch, int fromIndex) — повертає індекс символу у рядку починаючи пошук із зазначеного індексу;
int indexOf(String str) — повертає індекс першого знаходження підрядка у рядку;
int indexOf(String str, int fromIndex) — повертає індекс в рядку підрядка, починаючи пошук із зазначеної позиції;
boolean isEmpty() — повертає true, тільки тоді, якщо довжина(length()) становить 0;
int lastIndexOf(int ch) — повертає індекс останнього входження зазначеного символу в рядку;
int lastIndexOf(int ch, int fromIndex) — повертає індекс останнього входження зазначеного символу, шукаючи його із зазначеної позиції в рядку;
int lastIndexOf(String str) — повертає індекс останнього входження зазначеного підрядка;
int lastIndexOf(String str, int fromIndex) — повертає індекс останнього входження зазначеного підрядка, шукаючи його із зазначеного індексу у рядку;
int length() — повертає довжину даного рядка;
boolean matches(String regex) — говорить чи відповідає даний рядок заданому регулярному виразу;
String replace(char oldChar, char newChar) — повертає новий рядок заміняючи усі входження символу (oldChar) в рядку на новий символ (newChar);
String replace(CharSequence target, CharSequence replacement) — заміняє в рядку підрядок target новою послідовністю replacement;
String replaceAll(String regex, String replacement) — заміняє кожен підрядок в рядку, що співпадає з регулярним виразом (regex) новим підрядком (replacement);
String replaceFirst(String regex, String replacement) — заміняє перший підрядок, що відповідає заданому регулярному виразу на підрядок для заміни;
String[] split(String regex) — розбиває рядок за певним правилом поданим у регулярному виразі;
String[] split(String regex, int limit) — розбиває рядок за певним правилом поданим у регулярному виразі;
boolean startsWith(String prefix) — перевіряє чи поточний рядок починається з заданого префікса;
String substring(int beginIndex) — повертає підрядок, починаючи з вказаної позиції включно;
String substring(int beginIndex, int endIndex) — повертає підрядок, починаючи з вказаної позиції beginIndex включно і до позції endIndex невключно;
char[] toCharArray() — перетворює рядок у новий символьний масив;
String toLowerCase() — перетворює усі символи рядка у нижній регістер використовуючи locale правило по замовчуванню;
String toLowerCase(Locale locale) — перетворює усі символи рядка у нижній регістр використовуючи правило Locale;
String toUpperCase() — конвертує всі символи рядка у верхній регістер використовуючи locale правило по замовчуванню;
String toUpperCase(Locale locale) — перетворює усі символи рядка у верхній регістер використовуюче правило подане у Locale;
String trim() — повертає копію рядка усуваючи пробіли спереду і ззаду рядка;
static String valueOf(boolean b) — повертає рядкове представлення аргументу boolean типу;
static String valueOf(char c) — повертає рядкове представлення char аргументу;
static String valueOf(char[] data) — повертає рядкове представлення масиву типу char;
static String valueOf(double d) — повертає рядкове представлення double аргументу;
static String valueOf(float f) — повертає рядкове представлення float аргументу;
static String valueOf(int i) — повертає рядкове представлення int аргументу;
static String valueOf(long l) — повертає рядкове представлення аргументу типу long;
static String valueOf(Object obj) — повертає представлення об'єкту у вигляді рядка;
StringBuilder — аналог класу String, призначений для роботи з великими рядками, які потрібно часто змінювати, — див. приклади використання:
створення (оголошення) об’єкту sb :
StringBuilder sb = new StringBuilder();
додавання sb_end до sb за допомогою методу append (якщо змінна sb_end не є послідовністю символів, її значення буде зведено до типу String):
sb.append(add_end);
видалення з sb символів, починаючи зі значення номеру від j0 до j1 (тип int) включно:
sb.delete(j0,j1)
видалення з sb символу з номером j (тип int):
deleteCharAt(j)
вставлення у sb перед символом з номером j (тип int) sbinsert (при потребі sbinsert буде зведено до типу String):
sb.insert(j,sbinsert)
зміна порядку слідування символів у sb:
sb.reverse
перетворення sb на рядок типу String:
sb.toString
передавання даних з sb у рядок my_string:
String my_string = sb.toString();
Конструктори StringBuilder:
StringBuilder() — cтворює порожній об'єкт StringBuilder з ємністю 16 (порожніх елементів);
StringBuilder(CharSequence cs) — створює об'єкт StringBuilder, що містить таку саму кількість символів, що й CharSequence, та ще 16 порожніх елементів у кінці;
StringBuilder(int initCapacity) — cтворює порожній об'єкт StringBuilder із заданою ємністю;
StringBuilder(String s) — cтворює об'єкт StringBuilder, ініціалізований заданим рядком String, та додатково 16 порожніми елементами наприкінці;
Методи класу StringBuilder, пов’язані з довжиною і ємністю (відсутні для класу String):
void setLength (int newLength) — встановлення довжину послідовності симовлів. Якщо нова довжина (newLength) менша ніж поточна length(), символи, які виходять за межі даної довжити буде відкинуто. Якщо newLength більша ніж length(), то наприкінці послідовності буде додано порожні символи (null);
void ensureCapacity (int minCapacity) — ґарантування того, що ємність не менша від вказаного мінімуму.
Введення/виведення текстових даних з використанням інтерфейсу командного рядка (консолі) та файлі подано окремим описом. Немає нагальної потреби (особливо при першому знайомстві) читати весь опис. Достатньо ознайомитися з такими розділами:
Поданих у них прикладах коду є все, щоб виконати завдання навчальної програми.
Відеоуроки
Текст упорядкувала Толкачова Ірина Юріївна, вчитель середньої загальноосвітньої школи № 35 Святошинського району міста Києва, під час виконання випускної роботи на курсах підвищення кваліфікації з 03.10.2016 по 07.10.2016.