Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського» Теплоенергетичний факультет
Кафедра автоматизації проектування енергетичних процесів і систем
ЗВІТ
з лабораторної роботи № 2
з дисципліни «Програмування алгоритмічних структур»
Тема «Програмування розгалужених алгоритмів»
Варіант № 13
Завдання на лабораторну роботу.1. Розробити блок-схеми алгоритмів і написати програми мовою Java іззастосуванням умовного оператора if та оператора вибору switch длярозв’язання завдань, поданих в табл. 1 – 4 відповідно до індивідуальноговаріанта. Варіант обрати за списком групи.2. Розробити програмні проекти в середовищі Intellij IDEA для реалізаціїнаписаних програм. Перевірити результати обчислень альтернативнимирозрахунками (наприклад, Excel, калькулятор, тощо).3. Зробити Звіт з лабораторної роботи та вчасно надіслати викладачу наперевірку.
//
Рисунок 1 Завдання 1
/ /
Рисунок 2 Завдання 2
/ /
Рисунок 3 Завдання 3
//
Рисунок 4 Завдання 4
Короткий опис рішення завдань
Завдання 1. Вхідні дані, які є аргументами, перевіряються наступним чином: в залежності від того, до якого проміжку відноситься значення змінної Х, визначається, за якою з трьох функцій буде вестися обчислення Y. Далі ми за допомогою класу Math та його методів виконуємо математичні операції згідно з функцією та повертаємо результат у вигляді дробової змінної типу Double.
Завдання 2. В другому методі аналогічно до першого завдання виконується перевірка вхідних даних. Відмінність полягає у тому, що в 2 завданні три параметра не є визначеними заздалегідь, а є динамічними. Тому перевірка та визначення певної функції ускладняються додатковими параметрами r, s.
Завдання 3. У третьому завданні треба знайти та порівняти площі двох кіл. Для знаходження площі використовуємо математичний метод Герона, який дає змогу обрахувати площу трикутника, знаючи його півпериметр та сторони. Оскільки дано тільки сторони трикутника, цей метод є єдиним можливим рішенням задачі. Отже, порівнюємо площі та повертаєм результат у вигляді повідомлення про те, який з трикутників має більшу площу.
Завдання 4. Щоб знайти всі числа, що є більшими за середнє арифметичне виразу, ділимо суму чисел на кількість доданків та отримаємо СА. Далі за допомогою циклу перевіряємо кожен доданок, чи більший його модуль за середнє арифметичне і, якщо так, додаємо його до списку чисел, які відповідають умові, та повертаємо список.
Блок-схема алгоритму для завдання 4
Код класу Lr21
Код класу Lr21
public class Lr21{ public static void main(String[] args) { //ЗАВДАННЯ 1
double x1, x2, x3; //подальші розрахунки ведуться за такими трьома значеннями Х x1 = -2.3; x2 = 0.6; x3 = 4.8; double result11 = task1(x1); double result12 = task1(x2); double result13 = task1(x3); //Виведення System.out.printf("\n*Завдання 1* \n\n1) Bхідні дані: \nx = %.1f \n", x1); System.out.printf("Результат роботи: \ny = %.4f \n", result11); System.out.printf("\n2) Bхідні дані: \nx = %.1f \n", x2); System.out.printf("Результат роботи: \ny = %.4f \n", result12); System.out.printf("\n3) Bхідні дані: \nx = %.1f \n", x3); System.out.printf("Результат роботи: \ny = %.4f \n", result13); //ЗАВДАННЯ 2
double[][] krs = { {1.33, 0.85, 3.5}, //Масив параметрів для різних розрахунків {0.9, 3.3, 1.2}, {1.57, 0.75, 2.15 } }; double[] x = {-2.3, 0.6, 4.8}; //подальші розрахунки ведуться за такими трьома значеннями Х і попередніми параметрами //Виведення System.out.printf("\n*Завдання 2* \n"); for(int i = 0; i < 3; i++) { System.out.printf("\nРозрахунки %d-%d виконуються з такими параметрами" + " k = %.2f, r = %.2f, s = %.2f\n", i*3 +1, i*3 + 3, krs[i][0], krs[i][1], krs[i][2]); for (int j = 0; j < 3; j++) { System.out.printf("%d) Вхідні дані:\nx = %.1f \n", i * 3 + j + 1, x[j]); System.out.printf("Результат роботи: \ny = %.4f \n\n", task2(x[j], krs[i][0], krs[i][1], krs[i][2])); } } }
public static double task1(double x) { double result; double a,b,z; //Значення a,b,z за Варіантом 13 a = 1.5; b = -1.7; z = 1.2; byte functionIndex = 0; //Перевірка значень для х мого варіанту та вибір функції за значенням х if (x < a) functionIndex = 1; else if (a <= x && x <= Math.pow(b, 2)) functionIndex = 2; else if (x > Math.pow(b, 2)) functionIndex = 3; switch (functionIndex) { case 1: result = x * Math.pow(Math.E, x) + (z + 7.7 * a * b * x); break; case 2: result = Math.tan(a * x + z) + Math.pow(Math.cos(b * x), 2); break; case 3: result = Math.log(Math.pow(Math.sin(a + b * x + z * Math.pow(x, 2)), 2)); break; default: System.out.println("Недопустимое значение х"); result = 0; break; } return result; } public static double task2(double x, double k, double r, double s) { double result; byte functionIndex = 0; //Перевірка значень для х мого варіанту та вибір функції за значенням х if (Math.cos(x) == Math.cos(r*s)) functionIndex = 1; else if (Math.cos(x) > Math.cos(r*s)) functionIndex = 2; else if (Math.cos(x) < Math.cos(r*s)) functionIndex = 3; switch(functionIndex) { case 1: result = Math.pow(x, 2) * Math.pow(Math.E, 2*k) + Math.log(Math.abs(r*x)); break; case 2: result = Math.cbrt(x*x) + Math.sqrt(Math.abs(k + r*s*x)); break; case 3: result = Math.atan(k*x + r*s); break; default: System.out.println("Недопустимое значение х"); result = 0; break; } return result; }}
Результат обчислень класу Lr21
///
Код класу Lr22
public class Lr22{ public static void main(String[] args) { //ЗАВДАННЯ 3 System.out.printf("\n*Завдання3*\n"); Scanner scanner = new Scanner(System.in); for(int i = 0; i < 3; i++)// { System.out.printf("\n%d) Введіть 3 сторони першого трикутниkа:\n", i+1); //Вводимо значення double[] sides1 = new double[3]; for (int j = 0; j < 3; j++) { sides1[j] = scanner.nextDouble(); } System.out.printf("\nВведіть 3 сторони другого трикутниkа:\n"); double[] sides2 = new double[3]; for (int j = 0; j < 3; j++) { sides2[j] = scanner.nextDouble(); } //Розрахунок та вивід System.out.println("Результат: \n" + task3(sides1[0], sides1[1], sides1[2], sides2[0], sides2[1], sides2[2])); } //ЗАВДАННЯ 4 System.out.printf("\n*Завдання4*\n"); double[][] xyz = { {3.2,-7,0.5}, //Масив вхідних даних для швидкого виведення {2.3, 3, 2.5}, {23, -34, 89.5} }; for(int i = 0; i < 3; i++) //Розрахунок і виведення { System.out.printf("\n%d) Вхідні дані: \nx = %.1f, y = %.1f, z = %.1f\nРезультат: ", i + 1, xyz[i][0], xyz[i][1], xyz[i][2]); Double[] results = task4(xyz[i][0], xyz[i][1], xyz[i][2]); for (int j = 0; j < results.length; j++) { System.out.printf(results[j].toString() + " "); } System.out.printf("\n"); } }
public static String task3 (double a1, double b1, double c1, double a2, double b2, double c2) { // Знаходимо площі за формулою Герона з допомогою півпериметра double p1 = (a1 + b1 + c1) / 2; double square1 = Math.sqrt(p1 * (p1 - a1) * (p1 - b1) * (p1 - c1)); double p2 = (a2 + b2 + c2) / 2; double square2 = Math.sqrt(p2 * (p2 - a2) * (p2 - b2) * (p2 - c2)); if (square1 == 0 || square2 == 0) return "Такого трикутника не існує!"; else if (square1 > square2) return "Площа першого трикутника із сторонами - "+a1+", "+b1+", "+c1+" більша!"; else return "Площа другого трикутника із сторонами - "+a2+", "+b2+", "+c2+" більша!"; }
public static Double[] task4(double x, double y, double z) { double average = (x + y + z) / 3; double[] xyz = {x,y,z}; ArrayList<Double> list = new ArrayList<Double>(); for(int i = 0; i< 3; i++) { if (Math.abs(xyz[i]) > Math.abs(average)) { list.add(xyz[i]); } } Double[] result = new Double[list.size()]; list.toArray(result); return result; }}
Результат обчислень класу Lr22
/
/
Висновки: Виконуючи роботу, отримано навички керування послідовністю кодом за допомогою таких керуючих систем, як if-else конструкції та switch-case конструкції. Виявлено, що найбільш зручним, лаконічним та зовнішньо приємним з цих конструкцій є використання switch конструкції.
За допомогою таких конструкцій було запрограмовано декілька розгалужених алгоритмів, в яких реалізовано перевірку вхідних значень та подальший хід програми в залежності від вхідних даних.