Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Теплоенергетичний факультет
Кафедра автоматизації проектування енергетичних процесів і систем
РОЗРАХУНКОВО-ГРАФІЧНА РОБОТА
з дисципліни «Програмування алгоритмічних структур»
Тема «Програмування базових алгоритмів»
Варіант № 25
Мета роботи:
Набуття практичних навичок розробки розгалужених та циклічних алгоритмів при створюванні програмних проектів для розв’язання практичних завдань.
Завдання на розрахунково-графічну роботу (РГР).
1.Розробити алгоритми і написати програми мовою Java і ззастосуванням операторів циклів for, while, do while для розв’язання завдань, поданих в додатках1,2 відповідно до індивідуального варіанта. Варіанто брати за списком групи.
2.Розробити програмний проект в середовищі IntellijIDEA для реалізації написаних програм. Перевірити результати обчислень альтернативними розрахунками(наприклад, Excel, калькулятор, тощо).3.Оформити РГР та вчасно надіслати викладачу на перевірку файл РГР та файл програми.
Так як варіант №25, виконуємо задачі під номером 25
Завдання №1
/
Завдання №2
/
Короткі описи рішення завдань:
Опис вирішення завдання №1
Створено в Java клас RgrTr15Shep .
В цьому класі розміщено методи main, task11, ,task12, ,task13,task2.
Метод Main є головним і виконується першим, тому у ньому створюємо масив для завдання №1. Значення вводимо шляхом присвоєння.
Тут відбувається виклик методу task11
Метод task11: Сюди передається початкова розширена матриця системи лінійних алгебраїчних рівнянь (СЛАР) та повертається трикутникова матриця. В даному методі організований прямий хід методу Гауса для розв’язання СЛАР. Використано два цикли for і while.
Далі, у Main викликаємо метод task12
Метод task12: Сюди передається трикутникова матриця та повертається вектор результатів розв’язання СЛАР. В даному методі організований зворотний хід методу Гауса для розв’язання СЛАР. Використано два цикли for і while
Далі, у Main викликаємо метод task13 три рази
Метод task13: цей метод по-черзі передаємо початкову матрицю, трикутникову матрицю, вектор результатів для виводу в консоль. Вивід організовано із відповідними заголовками: «Початкова матриця:», «Трикутникова матриця:» і «Вектор результатів:». Метод зроблено універсальним шляхом перевантаження, для виводу матриць і вектору. Виведення організовано за допомогою метода System.out.printf форматованого виводу значень. Для дробових чисел – не більше 3 знаків після коми. Цілі числа виведено без коми та нулів після коми. (Зауваження: з невідомих мені причин деякі цілі числа поводять себе ніби вони дробові, і виводяться з комою і нулями після неї)
Далі, починається розв’язання завдання №2. Щоб код був компактним, використано цикл while.
Відбувається введення чисел (за допомогою методів класу Scanner), і подальше їх присвоєння у масив. Потім викликається метод task2. (Зауваження: число 0 зарезервоване для того, щоб переходити далі)
Метод task2: у цей метод передаються масив чисел, що ввів користувач і далі відбувається їх обробка. Числа що нам підходять, присвоюються новому масиву. Повертається новий масив.
За один цикл відбувається присвоєння значень, виклик методу і вивід результатів.
Блок-схема для завдання №2
/ / /
/
Копія коду на білому фоні
package com.company;
import static java.lang.Math.*;
import java.util.Scanner;
public class RgrTr15Shep {
public static void main(String[] args) {
double[][] data1={{-2,-6,1,-4,-6,-20},
{-6,-9,9,6,1,-79.3},
{8,-7,10,5,0,-52.4},
{8,6,-5,-6,-3,73.2},
{-6,-10,7,-9,5,34.9}};
double[][] triangle= task11(data1);
double[] vector= task12(triangle);
//Виведення початкової матриці
System.out.println("\tПочаткова матриця");
task13(data1);
System.out.println("\tТрикутникова матриця");
task13(triangle);
System.out.println("\tВектор результатів");
// Виведення вектору результатів
task13(vector);
System.out.println();
// Код до завдання №2
System.out.println("\t Завдання №2 ");
//Наступна змінна допоможе виконати цикл while
int counter=1;
while (counter<4) {
System.out.printf("\t Введеня значень масиву №%d",counter);
//Нехай, число 0 буде зарезервоване для того, щоб переходити далі
System.out.println("\nВведіть масив чисел, які хочете перевірити.\n" +
"Потім, щоб перейти далі натисніть - 0 ");
//Ініціалізація змінних, які необхідні в програмі
int a = 1;
int i = 1;
int[] arr = new int[10];
Scanner scan = new Scanner(System.in);
while (a != 0) {
a = 0;
System.out.print(i + " число - ");
a = scan.nextInt();
arr[i - 1] = a;
i++;
}
// Виведення масиву заданих чисел
System.out.println("\nЗадані числа");
for (int t = 0; t < arr.length; t++) {
if (arr[t] == 0) continue;
System.out.printf(" %d", arr[t]);
}
System.out.println();
int[] result = task2(arr);
System.out.println("Числа, що задовільняють умову пошуку: ");
//Виведення результату обробки
int count=0;
for (int t = 0; t < result.length; t++) {
if (result[t] == 0) continue;
System.out.printf(" %d", result[t]);
count++;
}
if(count==0)
System.out.println("\t Ой, таких чисел тут немає...");
System.out.println("\n");
counter++;
}
}
public static int[] task2 (int[] array){
int[] newArr= new int[array.length];
int k=0;
for (int i=0;i<array.length;i++){
if ((int)log10(array[i])+1==3 & array[i]%7==0 & array[i]!=0){
int odynytsi= array[i]%10;
int des=array[i]%100/10;
int sotni=array[i]/100;
int sum= odynytsi+des+sotni;
if (sum%7==0){
newArr[k]= (int) array[i];
k++;
}
}
}
return newArr;
}
//Метод приведення матриці до трикутникового вигляду
public static double[][] task11 (double[][] array){
//Copy array
double[][] arr = new double[array.length][array[0].length];
int n = 0;
while (n < array.length){
for (int j = 0; j < array[n].length; j++)
arr[n][j] = array[n][j];
n++;
}
//Метод Гауса
//Приводження матриці до трикутникового вигляду
double multiplayer;
int c = 0;
while(c < arr.length - 1){
for (int i = c + 1; i < arr.length; i++) {
multiplayer = arr[i][c]/arr[c][c];
for (int j = c; j < arr[i].length; j++)
arr[i][j] -= arr[c][j] * multiplayer;
}
c++;
}
return arr;
}
// Метод повернення вектору результатів
public static double[] task12 (double[][] array){
//Copy array
/*double[][] arr = new double[array.length][array[0].length];
int n = 0;
while (n < array.length){
for (int j = 0; j < array[n].length; j++)
arr[n][j] = array[n][j];
n++;
}*/
int r =array.length;
double[] vector= new double[array.length];
int i=r-1;
while (i>=0){
vector[i]=array[i][r]/array[i][i];
for (int c=r-1;c>i;c=c-1){
vector[i]=vector[i]-array[i][c]*vector[c]/array[i][i];
}
i=i-1;
}
return vector;
}
static void task13(double[][] arr){
for (int i=0;i< arr.length;i++) {
System.out.print("|");
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] % 1 != 0)
System.out.printf(" %5.3f", arr[i][j]);
if (arr[i][j] % 1 == 0)
System.out.printf(" %5d", (int) arr[i][j]);
}
System.out.print("\t|\n");
}
}
static void task13(double[] arr){
System.out.print("|");
for (int i = 0; i < arr.length; i++){
if(arr[i] % 1 != 0)
System.out.printf("\t%.3f" , arr[i]);
if (arr[i] % 1 == 0)
System.out.printf("%d",arr[i]);
}
System.out.print("\t|\n");
}
}
Отримані результати
/
/
Висновок: В процесі виконання розрахунково-графічної роботи, набуто практичних навичок розробки розгалужених та циклічних алгоритмів. У нашому випадку, для розв’язання системи лінійних алгебраїчних рівнянь методом Гауса . Побудовано блок-схему, що коротко і доступно описує процеси, що відбуваються при вирішенні завдання №2.