include iostream include stdio include stdlib include time using names

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int** create_array(int size)
{
srand(time(NULL));
int **array = new int* [size]; // Создаю указатель на список указателей
for (int i = 0; i < size; i++)
{
array[i] = new int[size]; // указатель теперь показывает на массив
for (int j = 0; j < size; j++)
{
array[i][j] = rand() % 2; // ну и заполняю его числами от 0 включительно до 2 исключая
}
}
return array;
}
void print_array(int **array, int size) // Первый аргумент указатель на указатель!
{ // Так же как в предыдущей задаче, то цикла 2 - один для срок, другой для столбцов
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << array[i][j] << "\t";
}
cout << endl;
}
cout << endl;
}
int multiplication(int *line1, int *line2, int size) // функция занимается перемножением строк
{ // ждёт, что ей передат 2 сроки (указателя на массивы) и размер
int result = 0; // устанавливаем результат функции равным 0
for (int i = 0; i < size; i++){ // все элементы срок
result += line1[i]*line2[i]; // перемножаем между собой и прибавляем к result
}
return result; // возвращаем result
}
bool check(int **array, int size)
{
for (int i = 0; i < size; i++){ // перебираем строки
if (multiplication(array[i], array[i], size) != 1){ // проверяем что будет если перемножим строку на строку, для этого передаём в функцию multiplication строку array[i] два раза
return false; // если результат функции не равен 1, возвращаем false, функция завершается.
}
for (int j = 0; j < size; j++){ // если она не завершилась выше, то запускаем ещё один цикл. Он снова перебирает все строки. Чтобы перемножить строку с индексом i со всеми остальными
if (i != j){ // перемножаем только если индекс i не равен j, то есть строка на саму себя, этот вариант мы проверили выше
if (multiplication(array[i], array[j], size) != 0){ // передаём в multiplication две строки и смотрим результат равен 0 или нет
return false; // ну если не равен, говорим ложь и выходим из функции
}
}
}
}
return true; // если весь код вверху выполнился, но нигде тока выхода (return) не сработала, возвращаем правду
}
int main(int argc, char** argv) {
int size;
cout << "Enter size of array: ";
cin >> size;
int **array = create_array(size); // создаём квадратную матрицу из 1 и 0. Только такие матрицы могут быть ортонормированными.
print_array(array, size); // печатаем её
if (check(array, size)){ // запускаем проверку на ортонормиррованность, если ф-ция вернула True (правда)
cout << "Matrix ortonormirovana"; // говорим об этом пользователю
}
else { // ну и если False (ложь), то тоже сообщаем
cout << "Matrix ne ortonormirovana";
}
return (EXIT_SUCCESS);
}