Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы ОФК. Начало.doc
Скачиваний:
30
Добавлен:
23.03.2015
Размер:
986.11 Кб
Скачать

Компіляція й виконання проекту

Завдяки функції середовища IDE "Compile on Save" не потрібно компілювати вручну для виконання. При збереженні вихідного файлу Java у середовищі IDE виконується автоматична компіляція.

Для виконання програми:

• виберіть команду "Run" > "Run Main Project" (F6).

На екрані повинні з'явитися повідомлення, подібні наведеним нижче.

Рис. 1.4 Інформація про хід компіляції й запуск у вихідній консолі

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

Розробка й розгортання додатка

Після розробки й тестування додатка для підготовки його до розгортання можна використовувати команду "Clean and Build". При використанні цієї команди у середовищі IDE автоматично запускається сценарій збирання, що виконує наступні дії:

• видалення попередньо скомпільованих файлів і інших результатів збирання;

• повторна компіляція додатка й формування файлу JAR, що містить скомпільовані файли.

Для виконання додатка:

• виберіть "Run" > "Clean and Build Main Project" (Shift+F11).

Для перегляду результатів процесу збирання можна відкрити вікно "Files" і розгорнути вузол "HelloWorldApp". Компілюємий файл байтового коду HelloWorldApp.class перебуває в підузлі build/classes/helloworldapp. Архів, що розгортається, JAR, що містить HelloWorldApp.class, перебуває у вузлі dist.

У мові Java використовують керуючу послідовність − символ зворотної косої риси, після якої йде один керуючий символ. У таблиці наведені керуючі послідовності, що застосовуються в мові Java.

Символ

Що означає

\a

дзвінок

\b

повернення на один символ назад

\f

переведення на нову сторінку

\n

переведення на новий рядок

\r

повернення до початку рядка

\t

горизонтальна табуляція

\v

вертикальна табуляція

\’

лапки

\”

подвійні лапки

\\

зворотна коса риса

\?

знак питання

\u

початок кодування символу Unicode

ПРАКТИЧНА ЧАСТИНА.

Завдання.

  1. Розробити консольний додаток з теоретичної частини.

  2. Вивести на консоль наступний набір символів:

1

1 2 3

1 2 3 4 5

1 2 3 4 5 6 7

Контрольні питання.

  • Яка загальна структура програми?

  • Які елементи візуального інтерфейсу доступні розроблювачам?

  • Як вивести інформацію на консоль?

Лабораторна робота № 2.

Тема: Алгоритмізація та виконання керуючих структур мови Java.

Мета: Використання елементів організації розгалуження мови Java.

Короткі теоретичні відомості

Складений оператор

Відповідно до синтаксису мови Java у багатьох конструкціях може стояти тільки один оператор, але часто зустрічається ситуація, коли треба використовувати послідовність із декількох операторів.

Складений оператор - блок коду між фігурними дужками {}:

Є два загальноприйнятих способи форматування тексту з використанням фігурних дужок.

У першому з них дужки пишуть друг під другом, а текст, що перебуває між ними, зрушують на 1-2 символу вправо (зрідка - більше). Приклад:

оператор

{

послідовність простих або складених операторів

}

У другому, більше розповсюдженому, відкриваючу фігурну дужку пишуть на тім же рядку, де повинен починатися складений оператор, без переносу його на наступний рядок. А закриваючу дужку пишуть під першим словом. Приклад:

оператор{

послідовність простих або складених операторів

}

Саме такий спосіб установлений за замовчуванням у середовищі NetBeans. Для установки такого способу форматування вихідного коду варто перейти в меню Tools/Options, вибрати Editor/Indentation, після чого в діалоговій формі, що з'явилася, відзначити галочкою пункт Add New Line Before Brace.

Після фігурних дужок за правилами Java, як і в /C++, ставити символ ";" не треба.

Умовний оператор if

В умовного оператора if є дві форми: if і if- else.

По-англійському if означає "якщо", else - "у противному випадку". Таким чином, ці оператори можуть бути переведені як "якщо...те..." і "якщо...то...у противному випадку...".

Перша форма:

if(умова)

оператор1;

Якщо умова дорівнює true, виконується оператор1. Якщо ж умова==false, в операторі не виконується ніяких дій.

Друга форма:

if(умова)

оператор1;

else

оператор2;

У цьому варіанті оператора if якщо умова==false, то виконується оператор2.

Зверніть особливу увагу на форматування тексту. Не розташовуйте всі частин оператора if на одному рядку - це характерно для новачків!

Приклад:

if(a<b)

a=a+1;

else if(a==b)

a=a+1;

else{

a=a+1;

b=b+1;

};

Із цього правила є виключення: якщо підряд іде велика кількість операторів if, що вміщаються в один рядок, для підвищення читаності програм буває доцільно не переносити інші частини операторів на окремі рядки.

Треба відзначити, що в операторі if в області виконання, яка знаходиться після умови, а також в області else, повинен стояти тільки один оператор, а не послідовність операторів. Тому запис оператора у вигляді

if(умова)

оператор1;

оператор2;

else

оператор3;

неприпустима. У таких випадках застосовують складений оператор, обмежений фігурними дужками. Між ними, як ми знаємо, може стояти довільне число операторів:

if(умова){

оператор1;

оператор2;

}

else

оператор3;

Якщо ж ми напишемо

if(умова)

оператор1;

else

оператор2;

оператор3;

- ніякої діагностики помилки компілятор не видасть! Оператор3 у цьому випадку ніякого відношення до умови else мати не буде - подібне форматування тексту призведе до логічної помилки. При наступному форматуванні тексту програми, еквівалентному попередній при компіляції, уже більш очевидно, що оператор3 не відноситься до частини else:

if(умова)

оператор1; ставився

else

оператор2;

оператор3;

Для того, щоб оператор3 відносився до частини else, варто використовувати складений оператор:

if(умова)

оператор1;

else{

оператор2;

оператор3;

};

У випадку послідовності операторів типу:

if(умова1)if(умова2)оператор1 else оператор2;

наявний else відноситься до останнього if, тому краще відформатувати текст:

if(умова1)

if(умова2)

оператор1;

else

оператор2;

Таким чином, якщо писати відповідні if і else друг під другом, логіка роботи програми стає очевидною.

Приклад неправильного стилю оформлення:

if(умова1)

if(умова2)

оператор1;

else

оператор2;

Цей стиль підштовхує до логічної помилки при читанні програми. Людина, що читає таку програму (як і той, хто її писав), буде думати, що оператор2 виконується, якщо умова1==false, тому що здається, що він ставиться до першого if, а не до другого. Треба відзначити, що сама можливість такої помилки пов'язана з непродуманістю синтаксису мови Java. Для правильної роботи потрібно переписати цей фрагмент у вигляді

if(умова1){

if(умова2)

оператор1;

};

else оператор2;

Щоб уникати такого роду проблем, використовуйте опцію Reformat code ("переформатувати код") зі спливаючого меню, викликуваного у вихідному коді клацанням правої кнопки миші.

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

if(умова)

оператор1;

оператор2;

замість

if(умова)

{оператор1;

оператор2;

};

Причому таку помилку час від часу допускають навіть досвідчені програмісти. Reformat code не допомагає - звичайно ця команда викликається після того, як програміст далеко пішов від проблемного місця, і перенос оператора під початок "if" не помічає. Для того, щоб гарантовано уникнути такої помилки, варто ЗАВЖДИ ставити фігурні дужки в тих місцях операторів Java, де по синтаксисі може стояти тільки один оператор. Звичайно, було б краще, щоб розроблювачі Java передбачили таку конструкцію як частина синтаксису мови. Можливо, у середовищі NetBeans надалі буде зроблена можливість в опціях редактора робити установку, що дозволяє автоматично створювати ці дужки. Точно так само, як автоматично створюється закриваюча кругла дужка в операторі if після того як ви набираєте if( .

Слід зазначити різні правила використання крапки з комою при наявності частини else у випадку використання фігурних дужок і без них:

if(i==0)

i++;

else

i--;

У другому випадку після дужок (перед else) крапка з комою не ставиться:

if(i==0){

i++;

}

else{

i--;

};

Неприємною проблемою, успадкованої в Java від мови C, є можливість використання оператора присвоювання "=" замість оператора порівняння "==". Наприклад, якщо ми використовуємо булеві змінні b1 і b2, і замість

if(b1==b2)

i=1;

else

i=2;

напишемо

if(b1=b2)

i=1;

else

i=2;

ніякої діагностики помилки видано не буде. Справа в тому, що за правилами C і Java будь-яке присвоювання розглядається як функція, що повертає як результат привласнене значення. Тому присвоювання b1=b2 поверне значення, що зберігається в змінній b2. У результаті оператор буде працювати, але зовсім не так, як очікувалося. Більше того, буде зіпсоване значення, що зберігається в змінній b1. Проблеми з помилковим написанням "=" замість "==" в Java набагато менш типові, чим в C/C++, оскільки вони виникають тільки при порівнянні булевої змінної з булевим значенням. Якщо ж оператор "=" ставиться замість "==" при порівнянні числовий змінної, відбувається діагностика помилки, тому що таке присвоювання повинне повертати число, а не булеве значення. Тверда типізація Java забезпечує підвищення надійності програм.

Оператори інкремента ++ і декремента -і

Оператор "++" називається інкрементним ("збільшуючим"), а "-і" декрементним ("зменшуючим"). У цих операторів є дві форми, постфіксна (найпоширеніша, коли оператор ставиться після операнда) і префіксна (використовується дуже рідко, у ній оператор ставиться перед операндом).

Для будь-якої числової величини x вираження x++ або ++x означає збільшення x на 1, а вираження x-- або -іx означає зменшення x на 1.

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

Наприклад, присвоювання j=i++ і j=++i дадуть різні результати. Якщо спочатку i=0, то перше присвоювання дасть 0, тому що i збільшиться на 1 після виконання присвоювання. А друге дасть 1, тому що спочатку виконається інкремент, і тільки потім буде обчислюватися вираження й виконуватися присвоювання. При цьому в обох випадках після виконання присвоювання i стане дорівнювати 1.

Оператор циклу for

for(блок ініціалізації; умова виконання тіла циклу; блок зміни лічильників)

оператор;

У блоці ініціалізації через кому перераховуються оператори завдання локальних змінних, область існування яких обмежується оператором for. Також можуть бути привласнені значення змінним, заданим поза циклом. Але ініціалізація може відбуватися тільки для змінних одного типу.

У блоці умови продовження циклу перевіряється виконання умови, і якщо воно виконується, іде виконання тіла циклу, у якості якого виступає оператор. Якщо ж не виконується - цикл припиняється, і йде перехід до оператора програми, що випливає за оператором for.

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

Приклад:

for(int i=1,j=5; i+j<100; i++,j=i+2*j){

...

};

Кожний із блоків оператора for є необов'язковим, але при цьому розділові ";" потрібно писати. Найбільш уживане використання оператора for - для перебору значень деякої змінної, що збільшуються або зменшуються на 1, і виконання послідовності операторів, що використовують ці значення. Змінна називається лічильником циклу, а послідовності операторів - тілом циклу.

Приклад1: Обчислення суми. Напишемо цикл, у якому виконується підсумовування всіх чисел від 1 до 100. Результат будемо зберігати в змінної result.

int result=0;

for(int i=1; i<=100; i++){

result=result+i;

};

Цикл (повторне виконання тих самих дій) виконується в такий спосіб:

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

Починається цикл. Спочатку виконується блок ініціалізації - лічильнику циклу i привласнюється значення 1. Блок ініціалізації виконується тільки один раз на самому початку циклу.

Починається перший крок циклу. Перевіряється умова виконання циклу. Значення i порівнюється з 100.

Оскільки порівняння 1<=100 повертає true, виконується тіло циклу. У змінної result зберігається 0, а значення i дорівнює 1, тому присвоювання result=result+i еквівалентно result=1. Таким чином, після першого кроку циклу в змінної result буде зберігатися значення 1.

Після виконання тіла циклу виконується секція зміни лічильника циклу, тобто оператор i++, що збільшує i на 1. Значення i стає рівним 2.

Починається другий крок циклу. Перевіряється умова виконання тіла циклу. Оскільки порівняння 2<=100 повертає true, іде чергове виконання тіла циклу, а потім - збільшення лічильника циклу.

Кроки циклу тривають доти, поки лічильник циклу не стане рівним 101. У цьому випадку умова виконання тіла циклу 101<=100 повертає false, і відбувається вихід із циклу. Останнє присвоювання result=result+i, проведене в циклі, це result=result+100.

Якби нам треба було підсумувати числа від 55 до 1234, у блоці ініціалізації i треба привласнити 55, а в умові перевірки поставити 1234 замість 100.

Приклад 2: обчислення факторіала.

double x=1;

for(i=1;i<=n;i++){

x=x*i;

};

Помітимо, що в наведених прикладах можна зробити деякі вдосконалення - оператори присвоювання записати в такий спосіб: result+=i; замість result=result+i; для першого приклада й x*=i; замість x=x*i; для другого. На початкових стадіях навчання так краще не робити, оскільки текст програми повинен бути зрозумілий програмістові - всі алгоритми повинні бути "прозорі" для розуміння.