Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Теплоенергетичний факультет
Кафедра автоматизації проектування енергетичних процесів і систем
РОЗРАХУНКОВО-ГРАФІЧНА РОБОТА
з дисципліни “Програмування алгоритмічних структур”
Тема “Програмування базових алгоритмів”
Варіант-15
Завдання на розрахунково-графічну роботу (РГР):
1.Розробити алгоритмиі написати програми мовою Java із застосуванням операторів циклів for, while, do while для розв’язання завдань, поданих вдодатках1,2відповіднодо індивідуального варіанта. Варіант обрати за списком групи.
2.Розробити програмний проект в середовищі IntellijIDEA для реалізації написаних програм. Перевірити результати обчислень альтернативними розрахунками(наприклад, Excel, калькулятор, тощо).
3.Оформити РГР та вчасно надіслати викладачу на перевірку файл РГР та файл програми
Завдання 1:
Система лінійних алгебраїчних рівнянь (СЛАР) задана розширеною матрицею системи. Розв’язати СЛАР методом Гауса. Вивести на екран: початкову матрицю, трикутникову матрицю, вектор результатів.
/
Завдання 2:
Розв’язати задачу згідно обраного варіанту. Вивести на екран початкові дані та результати обчислень Завдання виконати для трьох різних вхідних даних
/
Короткий опис рішення завдання:
Завдання №1.
Для Вирішення завдання 1, було створено три методи task11(), task12(),task13().
У методі task11() типу double[][] було розроблено прямий хід методу Гаусса (перетворення матриці у трикутникову). У цьому методі я організував цей алгоритм використовуючи цикли for і while. У результаті його виконання я повертаю трикутну матрицю, яку пізніше виводжу у методі task13().
У методі task12() типу double[] розроблено зворотній хід методу Гаусса (Розв’язування рівнянь в оберненому порядку) і заповнення всіх отриманих даних у вектор результатів. Для цього було використано цикли for і while.
У методі task13() типу void було розроблено почерговий вивід усіх векторів і матриць. Для його справної роботи був використаний перегруз методів.
У одному методі я приймаю матрицю і надалі роблю її перевірку на трикутність. Якщо матриця трикутна я надаю її відповідний заголовок і роблю її вивід. Якщо вона не трикутна, надаю їй заголовок “ Початкова матриця ” і виводжу. Перевірку та вивід матриць я організував за допомогою циклів for і while.
У другому методі я приймаю звичайний одновимірний масив(вектор результатів) і далі провожу його вивід разом із заголовком “ вектор результатів ” .
Завдання №2.
Для вирішення цього завдання я створив метод task2().
Моєю ідею щодо його розв’язання було отримання і передача у метод task2() будь-якого числа, створення нового рядку і за допомогою методу String.valueOf() отримати це число у типі String і два рази додати у новий рядок. Цей метод повертає змінну str типу String де до будь-якого числа приписане таке саме число.
Блок-схема до Завдання №2:
/
Програма проекту(копія коду):
package com.company;
import java.util.Scanner;
public class RgrTr15Fund {
public static void main(String[] args) {
// -------- TASK1 ---------
int n = 5;
int m = n+1;
double[] x;
double[][] mat = {{9,3,-5,0,2,-62.6},
{-1,1,7,8,10,-18.4},
{4,8,-4,-1,3,-6.6},
{10,-8,-5,-10,1,-64.2},
{10,2,-9,-1,9,-46.7}};
System.out.println("---------- TASK1 -----------");
task13(mat,n,m);
System.out.printf("\n\n");
// Зведення до трикутної матриці
task11(mat,n,m);
task13(mat,n,m);
// Рішення трикутної матриці
x = task12(mat,n,m);
System.out.printf("\n\n");
task13(x,n);
System.out.printf("\n\n");
//------------ TASK2 -------------
System.out.println("---------- TASK2 -----------");
Scanner scan = new Scanner(System.in);
System.out.printf("Уведіть три будь-яких числа:\n");
int number1 = scan.nextInt();
System.out.printf("%s\n",task2(number1));
int number2 = scan.nextInt();
System.out.printf("%s\n",task2(number2));
int number3 = scan.nextInt();
System.out.printf("%s\n",task2(number3));
}
static public double[][] task11(double[][] mat,int n,int m) {
double l;
int k = 1;
while(k<n){
for (int j = k; j < n; j++) {
l = mat[j][k-1] / mat[k-1][k-1];
for (int i = 0; i < m; i++) {
mat[j][i] = mat[j][i] - l * mat[k-1][i];
}
}
k++;
}
return mat;
}
static public double[] task12(double[][] mat,int n, int m) {
double[] x = new double[n];
int k = n-1;
while (k >= 0){
x[k] = mat[k][n] / mat[k][k];
for(int c = n-1; c > k; c--) {
x[k] = x[k] - mat[k][c] * x[c] / mat[k][k];
}
k--;
}
return x;
}
static public void task13(double[][] mat,int n,int m) {
boolean flag = false;
for (int i = 1; i < n - 1; i++) {
for (int j = 0; j < i; j++) {
flag = mat[i][j] == 0;
}
}
if(!flag) {
System.out.printf("« Початкова матриця: »\n");
int u = 0;
while (u < n) {
System.out.printf("│ ");
for (int j = 0; j < m; j++) {
if (mat[u][j] % 1 == 0) {
System.out.printf("%4.0f\t", mat[u][j]);
}
else {
System.out.printf("%.3f\t", mat[u][j]);
}
}
u++;
System.out.printf(" │");
System.out.println();
}
} else {
System.out.printf("« Трикутникова матриця: »\n");
int t = 0;
while(t < n) {
System.out.printf("│ ");
for(int j = 0; j < m; j++){
if (mat[t][j] % 1 == 0) {
System.out.printf("%4.0f\t", mat[t][j]);
}
else {
System.out.printf("%.3f\t", mat[t][j]);
}
}
t++;
System.out.printf(" │");
System.out.println();
}
}
}
static public void task13(double[] x,int n) {
System.out.printf("« Вектор результатів: »\n");
System.out.printf("│ ");
for ( int i = 0; i < n; i++) {
if (x[i] % 1 == 0) {
System.out.printf("%4.0f\t", x[i]);
}
else {
System.out.printf("%.3f\t", x[i]);
}
}
System.out.printf(" │");
}
static public String task2(int number) {
String str = String.valueOf(number) + String.valueOf(number);
return str;
}
}
Результати обчислень:
/
/
Висновок:
Під час виконання даної розрахунково-графіної роботи я удосконавлив свої навички у програмуванні алгоритмів, роботі з матрицями та масивами. Розробив алгоритм для розв’язання СЛАР за допомогою методу Гаусса. Також удосконалив свої навички у роботі з рядками на мові Java. Отримані дані після роботи програми повністю задовільняють.