МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Керуючі структури та масиви у Java
Методичні вказівки
до виконання лабораторної роботи №3
з курсу “Об’єктно-орієнтоване програмування”
для студентів базового напрямку
6.0804 “Комп’ютерні науки”
ЗАТВЕРДЖЕНО
на засіданні кафедри “Системи автоматизованого проектування” Протокол № 1від 30.08.2010
ЛЬВІВ 2010 Мова програмування Java. Методичні вказівки до виконання лабораторної роботи №3 “Керуючі структури та масиви у Java” з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”.
Укладачі: Каркульовський В.І., доцент, к.т.н.
Керницький А.Б., ст.викл., др.інж.
Відповідальний за випуск:
Рецензенти:
1. МЕТА РОБОТИ
Одержати навики побудови алгоритмів лінійних обчислювальних процесів, навчитися складати алгоритми та програмувати процеси з розгалуженням, циклами, ітераційними циклами за допомогою мови Java. Одержати навички роботи із масивами.
2.ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. ОПЕРАТОРИ МОВИ JAVA
Будь-який алгоритм, призначений для виконання на комп’ютері, можна розробити, використовуючи лише лінійні обчислення, розгалуження і цикли.
Записати його можна у різних формах: у вигляді блок-схеми, на псевдокоді, на звичайній мові тощо.
Будь-яка мова програмування повинна мати свої методи запису алгоритмів. Вони називаються операторами (statements) мови. Мінімальній набір операторів повинен містити оператор для запису лінійних обчислень, умовний оператор для запису розгалужень і оператор циклу.
Звичайно склад операторів мови програмування є ширшим: для зручності записи алгоритмів у мову включаються декілька операторів циклу, оператор варіанта, оператори переходу, оператори описування об’єктів.
Набір операторів мови Java включає:
оператори описування змінних та інших об’єктів;
оператори-вирази;
оператори присвоювання;
умовний оператор if;
три оператори циклу while, do-while, for;
оператор варіанта switch;
Оператори переходу break, continue і return;
блок {};
порожній оператор —крапка з комою.
Тут наведений не весь набір операторів Java, він буде доповнюватися у процесі виконання наступних лабораторних робіт.
У мові Java відсутній оператор goto. Будь-який оператор закінчується крапкою з комою. Можна поставити крапку з комою у кінці будь-якого виразу, і він стане оператором (expression statement). Але це має зміст тільки для операцій присвоювання, інкрементування, декрементування і виклику методів. У решті випадків це не має змісту, тому що обчислене значення виразу буде втрачено.
Лінійне виконання алгоритму забезпечується послідовним записом операторів. Перехід із рядка на рядок у вихідному тексті не має жодного значення для компілятора, він здійснюється тільки для наочності і читабельності тексту.
2.1.1. Блок
Блок складається з нуля або декількох операторів з метою використання їх як один оператор у тих місцях, де за правилами мови можна записати лише один оператор. Наприклад, {х = 5; у = ?;}. Можна записати і порожній блок, просто пару фігурних дужок {}.
Блоки операторів часто використовуються для обмеження області дії змінних і просто для легшого читання тексту програми.
2.1.2. Оператори присвоювання
Крапка з комою у кінці будь-якої операції присвоювання перетворює її в оператор присвоювання. Побічна дія операції — присвоювання стає в операторі основним.
Різниця між операцією і оператором присвоювання носить лише теоретичний характер. Присвоювання частіше застосовується як оператор, а не як операція.
2.1.3. Умовний оператор
Умовний оператор (if-then-else statement) у мові Java записується так:
if (логічний вираз) оператор1 else оператор2
і діє наступним чином. Спочатку обчислюється логічний вираз. Якщо результат true, то діє оператор1 і на цьому дія умовного оператора завершується, оператор2 не діє, далі буде виконуватися наступний за if оператор. Якщо результат false, то діє оператор2, при цьому оператор1 взагалі не виконується.
Умовний оператор може бути скороченим (if-then statement):
if (логвир) оператор1
і у випадку false не виконується нічого.
Синтаксис мови не дозволяє записувати декілька операторів ні у гілці then, ні у гілці else. При необхідності створюється блок операторів у фігурних дужках. "Code Conventions" рекомендує завжди використовувати фігурні дужки і розташовувати оператор у декількох рядках з відтступами, як у наступному прикладі:
if (а < х) {
х = а + b; } else {
х = а - b;
}
Це полегшує додавання операторів у кожну гілку при зміні алгоритму.
Дуже часто одним із операторів є знову умовний оператор, наприклад:
if (n == 0) {
sign = 0;
} else if (n < 0) {
sign = -1;
} else {
sign = 1;
}
При цьому може виникнути така ситуація ("dangling else"):
int ind = 5, х = 100;
if (ind >= 10) if (ind <= 20) x = 0; else x = 1;
Чи збереже змінна х значення 100 чи стане рівною 1? Тут необхідно вольове рішення, і спільне для більшості мов, у тому числі і Java. Правило таке: гілка else відноситься до найближчої зліва умови if, що не має своєї гілки else. Тому у даному прикладі змінна х залишиться рівною 100. Змінити цей порядок можна за допомогою блоку:
if (ind > 10) {if (ind < 20) x = 0; else x = 1;}
Рекомендується не використовувати складні вкладені умовні оператори. Перевірка умов займає багато часу. По можливості краще скористатися логічними операціями, наприклад, у даному прикладі можна написати
if (ind >= 10 && ind <= 20) х = 0; else х = 1;
У лістинзі 2.1 обчислюються корені квадратного рівняння ах2 + bх + с = 0 для любих коэфіцієнтів, в тому числі і нульових.
Лістинг 2.1. Обчислення коренів квадратного рівняння
class QuadraticEquation{
public static void main(String[] args){
double a = 0.5, b = -2.7, с = 3.5, d, eps=1e-8;
if (Math.abs(a) < eps)
if (Math.abs(b) < eps)
if (Math.abs(c) < eps) // Усі коефіцієнти рівні нулю
System.out.println("Розв’язок —будь-яке число");
else
System.out.println("Розв’язків немає");
else
System.out.println("xl = x2 = " +(-c / b) ) ;
else { // Коефіцієнти не рівні нулю
if((d = b**b - 4*a*c)< 0.0){ // Комплексні корені
d = 0.5 * Math.sqrt(-d) / a;
a = -0.5 * b/ a;
System.out.println("xl = " +a+ " +i " +d+
",x2 = " +a+ " -i " +d);
} else {
// Дійсні корені
d =0.5 * Math.sqrt(d) / a;
a = -0.5 * b / a;
System.out.println("x1 = " + (a + d) + ", x2 = " +(a - d));
}
}
}
}
У даній програмі використані методи обчислення модуля abs() і квадратного кореня sqrt() з дійсного числа із вбудованого в Java API класу Math. Оскільки всі обчислення з дійсними числами виконуються наближено, ми вважаємо, що коефіцієнт рівняння дорівнює нулю, якщо його модуль менший за 0,00000001. Необхідно звернути увагу на те, як у методі println() використовується з’єднання рядків (конкатенація), і на те, як операція присвоювання при обчисленні дискримінанта вкладена у логічний вираз.
Для того, щоби вводити коефіцієнт а, b і с прямо з клавіатури потрібно користуватися методом System. in. read (byte [ ] bt). Слід мати на увазі, що цей метод записує введені цифри у масив байтів bt у кодуванні ASCII, у кожний байт по одній цифрі. Масив байтів потім необхідно перетворити у дійсне число, наприклад, методом Double(new String(bt)).doubleValue(). Крім того, потрбіно опрацювати виключні ситуації, які можуть виникнути при введенні.
2.1.4. Оператори циклу
2.1.4.1. Оператор while
Основний оператор циклу — оператор while — виглядає так:
while (логвир) оператор
Спочатку обчислюється логічний вираз логвир; якщо його значення true, то виконується оператор, що утворює цикл. Потім знову обчислюється логвир і діє оператор, і так доти, поки не отримається значення false. Якщо логвир з самого початку дорівнює false, то оператор не буде виконуватися жодного разу. Попередня перевірка забезпечує безпеку виконання циклу, дозволяє уникнути переповнення, ділення на нуль та інші неприємності. Тому оператор while є основним, а у деяких мовах і єдиним оператором циклу.
Оператор у циклі може бути і порожнім, наприклад, наступний фрагмент коду:
int i = 0;
double s = 0.0;
while ((s += 1.0 / ++i) < 10);
обчислює суму членів гармонійного ряду доти, поки вона досягне значення 10. Такий стиль характерний для мови С. Не варто ним захоплюватися.
Можна організувати і нескінчений цикл:
while (true) оператор
Звичайно, із такого циклу потрібно передбачити певний вихід, наприклад, оператором break, як у лістинзі 2.2. У протилежному випадку програма зациклиться, і її прийдеться завершувати виконанням <Ctrl>+<Alt>+<Del>.
Якщо у цикл потрібно включити декілька операторів, то необхідно створити блок операторів {}.
2.1.4.2. Оператор do-while
Другий оператор цикла — оператор do-while — має вигляд do оператор while (логвир)
Спочатку виконується оператор, а потім відбувається обчислення логічного виразу логвир. Цикл виконується, поки логвир залишається рівним true.
У циклі do-while перевіряються умови продовження, а не завершення циклу.
Суттєва різниця між цими двома операторами циклу тільки у тому, що у циклі do-while оператор обов’язково виконується хоча б один раз.
Наприклад, нехай задана певна функція f(x), що має на відрізку [0; b] рівно один корінь. У лістинзі 2.3 наведена програма, яка обчислює цей корінь наближено методом ділення пополам (бісекції, дихотомії).
Лістинг 2.5. Знаходження кореня нелінійного рівняння методом бісекції
class Bisection {
static double f(double x){
return x*x*x - 3*x*x +3; // Або щось інше
}
public static void main(String[] args){
double a = 0.0, b = 1.5, c, y, eps = 1e-8;
do{
c = 0.5 *(a + b); y = f(c);
if (Math.abs(y) < eps) break;
// Корінь знайдено. Виходимо із циклу
//Якщо на кінцях відрізка [а; c] функція має різні знаки:
if (f (a) * y < 0.0) b = c;
// Значить, корінь тут. Переносимо точку b в точку c
//В противному випадку:
else a = c;
// Переносимо точку а в точку с
// Продовжуємо, доки відрізок [а; b] не стане малим
} while (Math. abs (b -a) >= eps);
System.out.println("x = " +c+ ", f(" +c+ ") = " +y) ;
}
}
Клас Bisection складніший за попередні приклади: у ньому крім методу main () є ще метод обчисленя функції f(x). Тут метод f() дуже простий: він обчислює значення многочлена і повертає його в якості значення функції, причому все це виконується одним оператором:
return вираз
У методі main() є’явився ще один новий оператор break, який просто закінчує виконання циклу, якщо програма наштовхнулася на наближене значення кореня. Можна помітити появу модифікатора static в оголошенні метода f(). Він необхідний тому, що метод f() викликється із статичнго метода main().
2.1.4.3. Оператор for
Третій оператор цикла — оператор for — виглядає наступним чином:
for (списокВир1; логВир; списокВир2) оператор
Перед виконанням циклу обчислюється список виразів списокВир1. Це нуль або декілька виразів, перерахованих через кому. Вони обчислюються зліва направо, і у наступному виразі уже можна використовувати результат попереднього виразу. Як правило, тут задаються початкові значення змінних циклу.
Потім обчислюється логічний вираз логвир. Якщо він істинний, true, то діє оператор, потім обчислюються зліва направо вирази із списку виразів списокВир2. Далі знову перевіряється логвир. Якщо він істинний, то виконується оператор і списокВир2 і т. д. Як тільки логвир стане дорівнювати false, виконання циклу завершується, тобто виконується послідовність операторів:
списокВир1; while (логВир){
оператор
списокВир2; }
з тим виключенням, що, коли оператором в циклі являється оператор continue, то списокВир2 все-таки виконується.
Замість списокВир1 може стояти одне визначення змінних обов’язково з початковим значенням. Такі змінні діють лише у межах цього циклу.
Будь-яка частина оператора for може бути відсутня: цикл може бути пустим, вираз в заголовку теж, при цьому крапки з комою зберігаються. Можна задати нескінчений цикл:
for (;;) оператор
У цьому випадку у тілі циклу необхідно передбачити вихід.
Хоча в операторі for закладені великі можливості, використовується він, головним чином, для перерахувань, коли відомо їхня кількість, наприклад, фрагмент коду:
int s=0;
for (int k = 1; k <= N; k++) s += k * k;
// Тут змінна k вже невідома
обчислює суму квадратів перших N натуральних чисел.
2.1.5. Оператор continue і мітки
Оператор continue використовується тільки в операторах циклу. Він має дві форми. Перша форма складається тільки зі слова continue і здійснює негайний перехід до наступної ітерації циклу. У черговому фрагменті коду оператор continue дозволяє обійти ділення на нуль:
for (int i = 0; i < N; i++){
if (i == j) continue;
s += 1.0 / (i - j);
}
Друга форма містить мітку:
continue мітка
мітка записується, як і всі ідентифікатори, із літер Java, цифр і знака підкреслювання, але не вимагає жодного опису. Мітка ставиться перед оператором або відкриваючою фігурною дужкою і відокремлюється від них двокрапкою. Так виходить помічений оператор або помічений блок.
Мітка не вимагає опису і не може починатися з цифри.
Друга форма використовується тільки у випадку декількох вкладених циклів для негайного переходу до чергової ітерації одного із зовнішніх циклів, а саме, поміченого цикла.
2.1.6. Оператор break
Оператор break використовується в операторах циклу і операторі варіанта для негайного виходу із цих конструкцій.
Оператор break мітка
Наступна схема пояснює цю конструкцію.
Ml: { // Зовнішній блок
М2: { // Вкладений блок — другий рівень
М3: { // Третій рівень вкладеності...
if (щось трапилось) break M2;
// Якщо true, то тут нічого не виконується
}
// Тут теж нічого не виконується
}
// Сюди передається управління
}
Не варто захоплюватися оператором break з міткою.
2.1.7. Оператор варіанта
Оператор варіанта switch організовує розгалуження за декількома напрямками. Кожна гілка відмічається константою або константним виразом будь-якого цілого типу (крім long) і вибирається, якщо значення певного виразу співпадає з цією константою. Вся конструкція виглядає наступним чином.
switch (цілВир){
case констВир1: оператор1
case констВир2: оператор2
. . . . .
case констВирN: операторN
default: операторDef
}
Вираз в дужках цілвир може бути типу byte, short, int, char, але не long. Цілі числа або цілочисельні вирази, складені із констант, констВир теж не повинні мати тип long.
Оператор варіанта виконується таким чином. Усі константні вирази обчислюються заздалегідь, на етапі компіляції, і повинні мати різні значения. Спочатку обчислюється цілочисельний вираз цілвир. Якщо він співпадає з однією із констант, то виконується оператор, помічений цією константою. Потім виконуються ("fall through labels") усі наступні оператори, включаючи і операторDef, і робота оператора варіант завершується.
Якщо ж жодна константа не дорівнює значенню виразу, то виконується операторDef і всі наступні оператори. Тому гілка default повинна записуватися останньою. Гілка default може бути відсутня, тоді у цій ситуації оператор варіанта взагалі нічого не робить.
Таким чином, константи у варіантах case грають роль тільки міток, точок входу в оператор варіанта, а далі виконуються всі інші оператори в порядку їх запису.
Після виконання одного варіанта оператор switch продовжує виконувати всі інші варіанти.
Частіше за все необхідно "пройти" тільки одну гілку операторів. У такому випадку використовується оператор break, який зразу ж зупиняє виконання оператора switch. Може знадобитися виконати один і той самий оператор у різних гілках case. У цьому випадку ставимо декілька міток case підряд. Приклад.
switch(dayOfWeek){
case 1: case 2: case 3: case 4:case 5:
System.out.println("Week-day");, break;
case 6: case 7:
System.out.println("Week-end"); break;
default:
System.out.printlnt("Unknown day");
}
2.2. МАСИВИ
Як завжди у програмуванні масив — це сукупність змінних одного типу, що зберігаються у суміжних комірках оперативної пам’яті.
Масиви у мові Java відносяться до ссилочних типів і описуються своєрідно, але характерно для вказівникових типів. Опис відбувається у три етапи.
Перший етап — оголошення (declaration). На цьому етапі визначається тільки змінна типу посилання (reference) на масив, і містить тип масиву. Для цього записується ім’я типу елементів масиву, квадратними дужками вказується, що оголошується вказівник на масив, а не проста змінна, і перераховуються імена змінних типу посилання, наприклад,
double[] а, b;
Тут визначені дві змінні — вказівники а і b на масиви типу double. Можна поставити квадратні дужки і безпосередньо після імені. Це зручно робити серед визначень звичайних змінних:
int i = 0, ar[], k = -1;
Тут визначені дві змінні цілого типу i і k, і оголошено вказівник на цілочисельний масив аr.
Другий етап — визначення (installation). На цьому етапі вказується кількість елементів масиву (довжина), виділяється місце для масиву в оперативній пам’яті, змінна-вказівник одержує адресу масиву. Всі ці дії виконуються ще однією операцією мови Java — операцією new тип, що виділяє місце в оперативній пам’яті для об’єкта вказаного в операції типу і повертає в якості результату адресу цього місця. Наприклад,
а = new double[5];
b = new double[100];
ar = new int[50];
Індекси масивів завжди починаються з 0. Масив а складається із п’яти зміних а[0], а[1], , а[4]. Елемента а[5] у масиві немає. Індекси можна задавати будь-якими цілочисельними виразами, крім типу long, наприклад, a[i+j], a[i%5], a[++i]. Виконуюча система Java слідкує за тим, щоб значення цих виразів не виходили за межі довжини масиву.
Третій етап — ініціалізація (initialization). На цьому етапі елементи масиву отримують початкові значення. Наприклад,
а[0] = 0.01; а[1] = -3.4; а[2] = 2:.89; а[3] = 4.5; а[4] = -6.7;
for (int i = 0; i < 100; i++) b[i] = 1.0 /i;
for (int i = 0; i < 50; i++) ar[i] = 2 * i + 1;
Перші два етапи можна сумістити:
a = new double[5], b = new double[100];
int i = 0, ar[] = new int[50], k = -1;
Можна зразу задати і початкові значення, записавши їх у фігурних дужках через кому у вигляді констант або константних виразів. При цьому навіть необов’язково вказувати кількість елементів масиву, вона дорівнюватиме кількості початкових значень;
double[] а = {0.01, -3.4, 2.89, 4.5, -6.7};
Можна сумістити другий і третій етап:
а = new double[] {0.1, 0.2, -0.3, 0.45, -0.02};
Можна навіть створити безіменний масив, зразу ж використовуючи результат операції new, наприклад, наступним чином:
System.out.println(new char[] {'H', 'e', '1', '1', 'o'});
Вказівник на масив не є частиною описаного масиву, його можна перевказати на інший масив цого ж типу операцією присвоювання. Наприклад, після присвоювання а = b обидва вказівники а і b вказують на один і той самий масив із 100 дійсних змінних типу double і містять одну і ту ж адресу.
Вказівнику може присвоїти "порожнє" значення null, яке не вказує на жодну адресу оперативної пам’яті:
ar = null;
Після цього масив, на який вказував даний вказівник, втрачаєтьсяся, якщо на нього не було інших вказівників.
Крім простої операції присвоювання, із вказівниками можна виконувати ще порівняння на рівність, наприклад, а = b, і нерівність, а != b. При цьому співставляються адреси, що містяться у вказівниках, і можна взнати, чи не вказують вони на один і той самий масив.
Отже, масиви у Java завжди визначаються динамічно, хоча посилання на них задаються статично.
Крім посилання на масив, для кожного масиву автоматично визначається ціла константа з одним і тим самим іменем length. Вона дорівнює довжині масиву. Для кожного масиву ім’я цієї константи уточнюється іменем масиву через крапку. Так, після наших визначень, константа a.length дорівнює 5, константа b. length дорівнює 100, a ar.length дорівнює 50.
Останній елемент масиву а можна записати наступним чином: a [a. length - 1], передостанній — a [a. length - 2] тощо. Елементи масиву звичайно перебираються у циклі вигляду:
double aMin = a[0], aMax = aMin;
for (int i = 1; i < a.length; i++){
if <a[i] < aMin) aMin = a[i];
if (a[i] > aMax) aMax = a[i];
}
double range = aMax - aMin;
Тут обчислюється діапазон значень масиву.
Елементи масиву — це звичайні змінні свого типу, з ними можна виконувати всі операції, допустимі для цього типу:
(а[2] + а[4]) / а[0] тощо.
Масив символів у Java не є рядком, навіть якщо він закінчується нуль-символом ' \u0000'.
2.3. Багатовимірні масиви
Елементами масиву у Java можуть бути масиви. Можна оголосити:
char[] [] с;
що є еквівалентним
chart[] с[];
або
char с[][];
Потім визначаємо зовнішній масив:
с = new char[3][];
С — масив, який складається з трьох елементів-масивів. Тепер визначимо його елементи-масиви:
с[0] = new char[2];
с[1] = new char[4];
с[2] = new char[3];
Після цих визначень змінна с.length дорівнює 3, с[0] .length дорівнює 2,
c[l].length дорівнює 4 і с[2].length дорівнює 3.
Нарешті, задаємо початкові значення с [0] [0] = 'a', с[0][1] = 'r',
с[1][0] = 'г',с[1][1] = 'а',с[1][2] = 'у' тощо.
Двовимірний масив у Java не повинен бути прямокутним.
Опис можна скоротити:
int[] [] d = new int[3] [4];
А початкові значення задати наступним чином:
int[] [] d = {{I, 2, 3}, {4, 5, 6}};
У лістингу 2.6 наведено приклад програми, яка обчислює перші 10 рядків трикутника Паскаля, заносить їх у трикутний масив і виводить його елементи на екран.
Лістинг 2.6. Трикутник Паскаля
class PascalTriangle{
public static final int LINES = 10; // Так визначаються константи
public static void main(String[] args) {
int[][] p = new int [LINES] [];
p[0] = new int[1];
System. out. println (p [0] [0] = 1);
p[1] = new int[2];
p[1][0] = p[1][1] = 1;
System.out.println(p[1][0] + " " + p[1][1]);
for (int i = 2; i < LINES; i++){
p[i] = new int[i+1];
System.out.print((p[i][0] = 1) + " ");
for (int j = 1; j < i; j++)
System.out. print ( (p[i] [j] =p[i -1][j -1] + p[i-1][j]) + " ");
System. out. println (p [ i] [i] = 1);
}
}
}
3.КОНТРОЛЬНІ ЗАПИТАННЯ
Що називається алгоритмом?
Які засоби опису алгоритму?
Які властивості алгоритму?
Привести приклади лінійних алгоритмів.
Яка структура програми на мові Java?
Яку дію виконує оператор присвоювання?
Який оператор використовується для введення даних?
Який оператор використовується для виведення даних?
Навести приклади алгоритмів з розгалудженням.
Який оператор описує умовний перехід?
Навести приклади циклічних алгоритмів.
Яким оператором описується цикл «поки»?
Яким оператором описується цикл «до»?
Яким оператором описується цикл «для»?
Чим ітераційний цикл відрізняється від регулярного?
Який вид циклу найкраще описує ітераційний цикл?
Які задачі визначаються ітераційним циклом?
Приведіть приклади ітераційного циклу і його опису всіма трьома видами блок-схем .
Які оператори циклу раціонально використовувати при описі ітераційних циклів?
Чи можна описати ітераційний цикл, використовуючи оператор IF? Показати приклади.
4.ЛАБОРАТОРНЕ ЗАВДАННЯ
Розробити програму віднімання від деякого числа А послідовності n чисел b1, b2, ..., bn:
Розробити програму обчислення за формулою:
Розробити програму обчислення за формулою:
Розробити програму пошуку максимального елемента з послідовності, заданої у вигляді одновимірного масиву А = {a1, a2, ... , ak}.
Разробити програму визначення кількості однакових чисел в послідовності, заданої у вигляді одновимірного масиву А={a1, a2, . . . , ak}
Розробити програму підрахунку кількості однакових елементів в матриці B розмірністю n × m. Розмірність матриці вводиться з клавіатури.
Розробити програму обчислення кількості додатніх елементів з послідовності, заданої у вигляді одновимірного масиву А = {a1, a2, ... , ak}.
Розробити програму обчислення за формулою:
Задано натуральне число n і масив дійсних чисел a[1. .n]. Обчислити обернену величину добутку тих елементів масиву, для яких виконується умова i+1<ai<i!.
Задано натуральне число n, ціле x і масив цілих чисел a[1. .n]. Якщо в масиві є хоча б один елемент, рівний x, то одержати суму всіх елементів, що слідують за першим таким елементом; у противному випадку відповіддю повинно бути число -10.
Задано натуральне число n і масив дійсних чисел c[1. .n]. Крім того задан дійсн a і b. Чи вірно, що при 1( k (n-1 усякий раз, коли ck<a, виконано ck+1>b?
Задано натуральне число n і масив дійсних чисел x[1. .3n]. Обчислити суму елементів із xn+1,... , x3n, що перевершують по величині всі елементи x1, ... , xn.
Задано натуральне число n і масив дійсних чисел a[1. .n]. Визначити кількість повних квадратів.
Задано натуральне число n і масив дійсних чисел a[1..n]. Визначити добуток непарних елементів, розташованих після останнього від’ємного елемента.
Задано натуральне число n і масив дійсних чисел a[1..n]. З’ясувати, чи є він упорядкованим по зростанню.
Задано натуральне число n і масиви дійсних чисел a[1..n] і b[1. .m]. Визначити суму тих елементів масиву а, котрих немає в масиві b.
Задано натуральне число n і масив дійсних чисел a[1..n]. У даному масиві вибрати зростаючу послідовність максимальної довжини.
Задано натуральне число n і масив дійсних чисел a[1..n]. Визначити число m , що зустрічається в масиві найбільш часто. Якщо в масиві декілька чисел, що зустрічаються найбільш часто, кількість входжень яких збігаються, то вивести відповідне повідомлення
Дано натуральне число n і масив дійсних чисел a[1..n]. Одержати новий масив, викинувши із заданого всі елементи, рівні максимальному елементу масиву.
Задано натуральне число n і масив дійсних чисел a[1..n]. Якщо в результаті заміни від’ємних елементів масиву їхніми квадратами утвориться послідовність, що не убуває, то одержати суму елементів вихідного масиву; у противному випадку одержати їхній добуток.
Задано натуральне число n і масив дійсних чисел a[1..n]. Помножити на введене натуральне число всі елементи масиву з парними номерами, що передують першому елементу зі значенням максимального елемента масиву.
Задано натуральне число n і масив дійсних чисел a[1..n]. Якщо в масиві від'ємні і додатні елементи чергуються, то вивести масив. Інакше одержати новий масив із від'ємних елементів заданого масиву, зберігши порядок їх проходження.
Задано масив дійсних чисел a[1..20]. Перетворити його за правилом: більше з ai і ai+10 (i=1, ... , 10) прийняти в якості нового значення ai, а менше - у якості нового значення ai+10.
Задано натуральне число n і масив дійсних чисел a[1..n]. Одержати новий масив за правилом: якщо в заданому масиві жодне парне число не розташоване після непарного, то в новий масив занести усі від'ємні елементи, інакше - усі додатні. Порядок проходження елементів у новому масиві замінити на обернений.
Задано натуральне число n. Скільки різноманітних цифр зустрічається в його десятковому записі.
Задано натуральне число n і масив дійсних чисел a[1..n]. Знайти серед них два елементи, модуль різниці яких має найбільше значення.
Задано натуральне число n і масив цілих чисел a[1..n]. Одержати числа, узяті по одному з кожної групи рівних елементів.
Задано натуральне число n і масив цілих чисел a[1..n]. Визначити найбільший з елементів, що входять у масив по одному разу.
Задано масив дійсних чисел a[0. .5]. Одержати багаточлен шостого ступеня (x-a0)( x-a1) (x-a2) (x-a3) (x-a4)( x-a5).
Задано натуральне число n і масив дійсних чисел p[1. .n], дійсне число a. Для дійсного x заданий багаточлен P(x)=pnxn + pn-1xn-1+ ... +p0. Одержати багаточлен (x-a)P(x).
Задано натуральне число n і масив дійсних чисел a[1. .n]. Перетворити його, замінивши на обернений порядок проходження елементів, розташованих між мінімальним і максимальним елементом.
Задано натуральне число n і масив дійсних чисел a[1. .n], що належать інтервалу (0, 1]. Інтервал розбивається на 100 рівних частин. Обчислити p1, ... , p100 , де pk=mk/2000 , а mk -