Санкт-Петербургский государственный
Политехнический университет
Факультет Технической кибернетики
Кафедра «Системный анализ и управление»
Расчётное задание
по дисциплине "Системный анализ и управление в информатике"
на тему: " Моделирование метрического пространства"
выполнила: студентка группы 1082/3
Тамбаум Марина Андреевна
проверил: доцент кафедры САиУ
Болотин Игорь Васильевич
Санкт-Петербург
Содержание:
Постановка задачи ………………………………………………………………3
Теоретическая часть……………………………………………………………..4
Объект исследования и блок-схемы программы………………………………5
Описание основных идентификаторов………………………………………. 12
Код программы…………………………………………………………………..13
Выводы…………………………………………………………………………...17
1. Постановка задачи планирования производства в общем случае.
В данном расчётном задании необходимо было определить, принадлежит ли множество чисел метрическому пространству, проверяя необходимые условия для элементов множества.
Множество, над которым было проведено исследование: {2 43 65 7 891 4 3 6 9}
Исследуемое множество вводиться пользователем с клавиатуры в текстовый файл, а программа последовательно проверяет все необходимые условия принадлежности множества к метрическому. В работе используются элементы x,y, функционал - | x – y |.
Теоретическая часть
В теории метрических пространств развивается геометрический язык, на котором выражаются результаты анализа. Этот язык позволяет придать этим результатам достаточную общность и вместе с тем дать наиболее простые и отражающие суть дела доказательства. Нас будут интересовать топологические аспекты теории метрических пространств, связанные с концепцией предельного перехода, а также алгебраические аспекты при изучении основных операций над элементами метрических пространств. Метрические пространства являются частным видом более общих топологических пространств.
Пусть Е - некоторое множество. Расстояние в Е есть отображение (функционал) d произведения E×E во множество действительных чисел R:
Предполагается, что функционал d обладает следующими свойствами:
1. Для любых (x,y) ;
2. ;
3. Для любых x,y ;
4. Для любых x,y,z .
Свойство 4 называется неравенством треугольника.
Множество Е с заданным в нем расстоянием d называется метрическим пространством. Обычно это пространство, т.е. пару (Е, d) обозначают одной буквой E.
Объект исследования и схемы программы
Объект исследования
Исходным множеством будем считать {2 43 65 7 891 4 3 6 9}
Схема программы
Функция 1.
Функция 2
Функция 3
Функция 4
Функция input
Функция output
Функция main
Описание основных идентификаторов
1. Идентификатор void func1(int *, int, int&) – функция, в которую подаются три параметра: первый - указатель на массив, второй – размерность массива, третий – адрес bool переменной С_1, которая отвечает за последующую запись в файл. В этой функции производится проверка условия
2. Идентификатор void func2 (int *, int, int&) – функция, в которую передаются три параметра: первый – указатель на массив, второй – размерность массива, третий – адрес bool переменной С_2, которая отвечает за последующую запись в файл. В этой функции производиться проверка условия
3. Идентификатор void func3 (int *, int, int&) – функция, в которую передаются три параметра: первый – указатель на массив, второй – размерность массива, третий – адрес bool переменной С_3, которая отвечает за последующую запись в файл. В этой функции производиться проверка условия
4.Идентификаторvoid func4 (int *, int, int&) - функция, в которую передаются три параметра: первый – указатель на массив, второй – размерность массива, третий – адрес bool переменной С_4, которая отвечает за последующую запись в файл. В этой функции производиться проверка условия
5. Идентификатор void input(int *, int) – функция, в которую передаются два параметра: первый – указатель на массив, второй – размерность массива. Эта функция производит считывание из текстового файла
6. Идентификатор void output(int *, int&,int&,int&,int&) – функция, в которую передаются 5 параметров: первый – указатель на массив, остальные 4 - адреса bool переменной С_. Функция производить запись в файл.
Код программы
//заголовочный файл
#pragma once // единождое подключение заголовочкого файла
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
void func1(int *, int, int&); //объявление первой функции, проверяющей первое условие
void func2(int *, int, int&); //объявление второй функции, проверяющей второе условие
void func3(int *, int, int&); //объявление третьей функции, проверяющей третье условие
void func4(int *, int, int&); //объявление четвертой функции, проверяющей четвертое условие
void input(int *, int);//объявление функции, считывающей множество из файла
void output(int *, int&,int&,int&,int&); //объявление функции, записывающей результут в текстовый файл
// файл func1.cpp, в котором проиводиться проверка первого условия
#include "header_file.h" //подключение заголовочного файла
//функция, выполняющая проверку первого условия на то, что для любой пары (х,у) d(x,y)>=0
void func1(int *A, int N, int &C_1)
{
int i,j; //объявление переменных, необходимых для цикла
for (i=0; i<N; i++) //циклы для просмотра всех элементов
{ //из текстового
for (j=i+1; j<N; j++)//файла
{
if (abs(A[j]-A[i])>=0) //проверка условия, что для любой пары (х,у) условие d(x,y)>=0
{
C_1=1;//если данное условие выполняется, поднимаем флаг, значит условие = истина
}
else //либо
{
C_1=0;//опускаем=ложь
exit;
}
}
}
}
// файл func2.cpp, в котором проиводиться проверка второго условия
#include "header_file.h"//подключение заголовочного файла
//функция для проверки третьего условия на то, что d(x,y)=0 <=> x=y
void func2(int *A, int N, int &C_2)
{
int i,j;//объявление переменных, необходимых для цикла
for (j=0; j<N; j++)//циклы для просмотра всех элементов
{ //считываемых из
for (i=0; i<N; i++)//текстового файла
{
if (abs(A[j]-A[i])==0) //проверки
{ //условия на то, что
if (A[i]==A[j]) //d(x,y)=0 <=> x=y
{
C_2=1;//если выполнено, поднимаем флаг, условие=истина
}
else//либо опускаем, условие=ложь
{
C_2=0;
exit;
}
}
}
}
}
// файл func3.cpp, в котором производиться проверка третьего условия
#include "header_file.h"//подключение заголовочного файла
//функция для проверки третьего условия на то, что d(x,y)=d(y,x) для любых x,y
void func3(int *A, int N, int &C_3)
{
int i=0,j=0;//объявление переменных и присваивание им значения, для входа в циклы
for (j=0; j<N; j++)//циклы для просмотра всех элементов
{ //считываемых из текстового файла
for (i=0; i<N; i++)
{
if (abs(A[j]-A[i])==abs(A[i]-A[j])) //условие для проверки d(x,y)=d(y,x)
{
C_3=1;//если выполнено, поднимаем флаг, условие=истина
}
else//либо опускаем
{
C_3=0;//условие=ложь
exit;
}
}
}
}
// файл func4.cpp, в котором производиться проверка четвертого условия
#include "header_file.h"//подключение заголовочного файла
//функция для проверки условия на то, что d(x,z)<=d(x,y)+d(y,z) для любых x,y,z:
void func4(int *A, int N, int &C_1)
{
int i=0,j=0,z=0;//объявление переменных и присваивание им значения для входа в циклы
for (z=0; z<N; z++)//циклы для
{ //просмотра
for (j=0; j<N; j++)//всех
{ //элементов
for (i=0; i<N; i++)//считываемых из текстового файла
{
if (abs(A[z]-A[i])<=abs(A[i]-A[j])+abs(A[j]-A[z])) // проверка условия, что d(x,z)<=d(x,y)+d(y,z)
{
C_1=1;//если выполнено, поднимаем флаг, условие=истина
}
else
{
C_1=0;//либо опускаем, условие = ложь
exit;
}
}
}
}
}
#include "header_file.h";//подключение заголовочного файла
//функция, которая считывает задаваемый массив из файла
void input(int *text, int mn)
{
int i=0;//объявление переменной и присваивание ей значения
ifstream file ("space.txt"); //открытие файла для считывания массива
if (!file) //если файл невозможно найти, выход из программы
{
exit;
}
while(!file.eof())//считывание файла и запись его в массив
{
file>>text[i];
i++;//переход к последующему элементу
}
file.close();//закрытие файла
}
//функция, которая записывает в файл ответ
void output(int *text, int& C_1, int& C_2, int& C_3, int& C_4)
{
ofstream file("report.txt", ios::app);//открытие файла для записи отчета
if(file.is_open())//если необходимый файл есть
{
file <<"данное множество:"<<endl;
for (int i=0; i<10;i++)//цикл для записи элементов из файл
{
file<<text[i]<<" ";//запись множества
}
file<<" "<<endl;//перевод строки
if ((C_1==1)&&(C_2==1)&&(C_3==1)&&(C_4==1))//условие на то, что все проверки=истина
{
file<<"Это множество метрическое, так как:"<<endl;
file<<"1) d(x,y)>=0"<<endl;
file<<"2) If d(x,y)=0, x=y"<<endl;
file<<"3) d(x,y)=d(y,x)"<<endl;
file<<"4) d(x,z)<=d(x,y)+d(y,z)"<<endl;
}
else //если условия не выполнились, то выводим следующее
{
file<<"Множество не метрическое, так как:"<<endl;
if (C_1!=1)//если первое условие - ложь, то выводим
{
file<<"d(x,y)>=0"<<endl;//уточнение причин того, что множество не метрическое
}
if (C_2!=1)//если не выполнилось второе условие
{
file<<"d(x,y)>=0"<<endl;//уточнение причин того, что множество не метрическое
}
if (C_3!=1)//если не выполнилось третье условие
{
file<<"d(x,y)>=0"<<endl;//уточнение причин того, что множество не метрическое
}
if (C_4!=1)//если не выполнилось четвертое условие
{
file<<"d(x,y)>=0"<<endl;//уточнение причин того, что множество не метрическое
}
}
}
else cout<<"Файл не может быть открыт!"; //если файл не найден
}
//основная функция
#include "header_file.h"//подключение заголовочного файла
int main()
{
setlocale(LC_ALL,"rus");//подключение русскоязычной клавиатуры
int mn=10,i=0;
int C_1=0, C_2=0, C_3=0, C_4=0;
int *text=new int[mn];
input(text,mn);
for (i=0; i<mn;i++)//цикл для вывода каждого элемента
{
printf("%i ",text[i]);//вывод массива
}
input(text, mn);//чтение исходного множества из файла
func1(text, 10, C_1);//условие, выполняющие
func2(text, 10, C_2);//проверку на то,
func3(text, 10, C_3);//что множество является
func4(text, 10, C_4);//метрическим
output(text, C_1, C_2, C_3, C_4);//запись в файл полного отчета по проверкам
printf("\n");//переход к следующей строке
cout<< "Данные о проверках на принадлежность множества к метрическому пространству\nнаходятся в файле report.txt";
printf("\n");//переход к следующей строке и завершение работы консоли
return 0;
}