Міністерство освіти і науки України
Національний технічний університет
«Київський політехнічний інститут ім. Ігоря Сікорського»
Теплоенергетичний факультет
Кафедра автоматизації проектування енергетичних процесів і систем
Програмування алгоритмічних структур
ЗВІТ ДО
Розрахунково-графічної роботи
«Програмування циклічних алгоритмів»
Варіант № 11
Дата «24» листопада 2021
Мета: набуття практичних навичок розробки розгалужених та циклічних алгоритмів при створювання програмних проектів для розв’язання практичних завдань.
Завдання на розрахунково-графічну роботу (РГР).
1.Розробити алгоритми і написати програми мовою Java із застосуванням операторів циклів for, while, do while для розв’язання завдань, поданих в додатках 1, 2 відповідно до індивідуального варіанта. Варіант обрати за списком групи.
2.Розробити програмний проект в середовищі IntellijIDEA для реалізації написаних програм. Перевірити результати обчислень альтернативними розрахунками(наприклад, Excel, калькулятор, тощо).
3.Оформити РГР та вчасно надіслати викладачу на перевірку файл РГР та файл програми.
Вимоги до розв’язання завдання
Обидва завдання запрограмувати в одному класі, який має назву RgrTr11Petr. У назві класу зашифровано: Rgr–вид роботи; Tr11–номер групи; Petr–перші чотири літери прізвища автора (Петренко П.П.). У даному класі організувати п’ять методів: main, task11(для перетворення матриці до трикутникового вигляду), task12(для отримання значень невідомих змінних СЛАР), task13 (для виведення виводу результатів розрахунку завдання 1), task2(для рішення завдання 2). У методі main організувати:
-введення даних для завдання1(додаток1). Введення даних зробити за допомогою присвоєння;
-виклик методу task11, у який передати початкову розширену матрицю системи лінійних алгебраїчних рівнянь (СЛАР) та повернути трикутникову матрицю. У даному методі організувати прямий хід методу Гауса для розв’язання СЛАР. За необхідності програмування вкладених циклів, використовувати принаймні два різних оператори циклів–або for, або while, або do while;
-прийняти із методу task11 трикутникову матрицю;
-викликати метод task12, у який передати трикутникову матрицю та повернути вектор результатів розв’язання СЛАР. У даному методі організувати зворотний хід методу Гауса для розв’язання СЛАР. За необхідності програмування вкладених циклів, використовувати принаймні два різних оператори циклів–або for, або while, або do while;
-викликати три рази task13, в який передавати по черзі початкову матрицю, трикутникову матрицю, вектор результатів для виводу в консоль. Вивід має бути із заголовком: «Початкова матриця:», «Трикутникова матриця:» або «Вектор результатів:». Метод task13 зробити універсальним для виводу матриць і вектору. Виведення організувати за допомогою метода System.out.printf форматованого виводу значень. Для дробових чисел–небільше 3 знаків після коми. Цілі числа виводити без коми та нулів після коми;
-введення даних для завдання2(додаток2), розрахунки зробити для трьох різних варіантів вхідних даних, що обирає користувач та вводить з клавіатури (всього має бути 3 варіанти вхідних даних та 3 варіанти результатів розрахунків). Введення даних зробити за допомогою методів класу Scanner;
-виклик методу task2, у якому організувати всі розрахунки завдання2 та організувати повернення результатів в main;
-виведення вхідних даних та результатів розрахунку завдання2. Виве-дення організувати за допомогою метода System.out.printf форматованого виводу значень. Для дробових чисел–не більше 3 знаків після коми.
Короткий опис рішення завдання разом із скриншотом варіанту завдання
Завдання 1
У методі main створюємо двовимірний масив для виведення розширеної матриці та використаємо початкову ініціалізацію. Організовуємо такі методи task11(алгоритм вирішення матриці методом Гауса), task12(для отримання значень невідомих змінних СЛАР), task13(для виведення виводу результатів розрахунку завдання 1), task2(для рішення завдання 2).
У методі task11 створюємо новий двовимірний масив, у який передаємо початкову розширену матрицю. Циклом while() занулимо стовпчики під головною діагоналлю. Для цього створимо змінну n, яка відповідає за номер рядка. Створюємо вкладений цикл for() і проходитимемо по рядках. За допомогою ітерації n++ переходитимемо на наступний рядок. Так ми скопіювали початкову матрицю у нову. Тепер виконаємо метод Гауса. Змінна coeff обчислює наш коефіцієнт, на який множимо елемент головної діагоналі. Таким чином ми занулимо стовпці.
У методі task12 створюємо новий одновимірний масив для виведення вектора результатів. Даний масив буде заповнюватись ззаду. Беремо елемент розширеної матриці, віднімаємо від нього суму знайдених х і ділимо на невідомий.
У методі task13 виводимо початкову, трикутникову матрицю як двовимірний масив і вектор результатів як одновимірний масив циклами for(). Вивід має бути із заголовком: «Початкова матриця:», «Трикутникова матриця:» та «Вектор результатів:». Повертаємо масиви в main(). Виведення організувати за допомогою метода System.out.printf форматованого виводу значень. Для дробових чисел–небільше 3 знаків після коми. Цілі числа виводимо без коми та нулів після коми.
Завдання 2
У main за допомогою Scanner() вводимо певне число. У методі task2 виведемо чи є воно степенем числа 3. Використаємо цикл while(). Якщо введено число ділиться на 3 без остачі, то виводимо True. Якщо ділення з остачею, то виводимо False. Виведення організувати за допомогою метода System.out.printf форматованого виводу значень. Для дробових чисел–не більше 3 знаків після коми.
/
Завдання 2
/
Код програми:
package com.company;import java.util.Scanner;import java.lang.Math;public class RgrTr15Tymk { public static void main(String[] args) { double[][] array = {{1, -3, -8, -5, 10, 86.3}, {-6, 2, 0, 7, 8, -0.8}, {-1, 5, -9, 6, 5, 126.8}, {-10, 8, -3, 10, 8, 31.6}, {-4, -4, -3, -3, -7, -75.7}}; double[][] triangulMatrix = task11(array); double[] vectorMatrix = task12(triangulMatrix); /////Task 1///// System.out.println("-----Task_1-----"); System.out.println("Початкова матриця:"); task13(array); System.out.println("Трикутникова матриця:"); task13(triangulMatrix); System.out.println("Вектор результатів:"); task13(vectorMatrix); /////Task 2///// System.out.println("-----Task_2-----"); Scanner scan = new Scanner(System.in); for( int i = 0; i < 3; i++) { System.out.printf("Введемо х:\n"); int x = scan.nextInt(); if (task2(x)) System.out.println("True"); else System.out.println("False"); } } public static double[][] task11(double[][] array){ double[][] newArray = new double[array.length][array[0].length]; int n = 0; while (n < array.length){ for (int j = 0; j < array[n].length; j++) newArray[n][j] = array[n][j]; n++; } double coeff; int m = 0; while(m < newArray.length - 1){ for (int i = m + 1; i < newArray.length; i++) { coeff = newArray[i][m]/newArray[m][m]; for (int j = m; j < newArray[i].length; j++) newArray[i][j] -= newArray[m][j] * coeff; } m++; } return newArray; } public static double[] task12(double[][] arr){ double[] vector = new double[arr.length]; int i = arr.length - 1; while(i >= 0){ double sum = 0; for (int j = 0; j < arr[0].length - 1; j++) sum += arr[i][j] * vector[j]; vector[i] = (arr[i][arr.length] - sum)/arr[i][i]; i--; } return vector; } public static void task13(double[][] array) { for (int i = 0; i < array.length; i++) { System.out.print("|"); for (int j = 0; j < array[0].length; j++) { if (array[i][j] % 1 == 0) System.out.format(" %4.0f\t ", array[i][j]); else System.out.format(" %4.1f\t ", array[i][j]); } System.out.println("|"); } } public static void task13(double[] array){ System.out.printf("|"); for (int i = 0; i < array.length; i++) System.out.printf("\t%.2f" , array[i]); System.out.printf("\t|\n"); } public static boolean task2(int x) { while(x % 3 == 0) x /= 3; return x == 1; }}
Результати рішення програми
/ /
Блок-схема алгоритму до завдання 2
/
Висновок: У результаті створення лабораторної роботи написано програму мовою Java із застосуванням операторів циклів for, while, do while для розв’язання завдань, розроблено програму розрахунку матриці методом Гауса, виведено трикутникову матрицю та вектор результатів. Створено метод для виведення числа, яке є степенем числа 3.