Создание программного продукта для редактирования и сшивания топографических карт

Создание программного продукта, который позволит сшивать и редактировать топографические карты. Разработка алгоритмов отдельных функций. Возможность автоматизированной сшивки карт путем анализа изображения, добавлять и удалять с них топографические знаки.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 22.11.2015
Размер файла 3,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Вентиляция

Системы отопления и системы кондиционирования следует устанавливать так, чтобы ни теплый, ни холодный воздух не направлялся на людей. На производстве рекомендуется создавать динамический климат с определенными перепадами показателей. Температура воздуха у поверхности пола и на уровне головы не должна отличаться более, чем на 5 градусов. В производственных помещениях помимо естественной вентиляции предусматривают приточно-вытяжную вентиляцию. Основным параметром, определяющим характеристики вентиляционной системы, является кратность обмена, т.е. сколько раз в час сменится воздух в помещении.

Выводы

В этой части дипломной работы были изложены требования к рабочему месту пользователя. Созданные условия должны обеспечивать комфортную работу. На основании изученной литературы по данной проблеме, были указаны оптимальные размеры рабочего стола и кресла, рабочей поверхности, а также проведен выбор системы и расчет оптимального освещения производственного помещения, а также расчет информационной нагрузки. Соблюдение условий, определяющих оптимальную организацию рабочего места пользователя, позволит сохранить хорошую работоспособность в течение всего рабочего дня, повысит, как в количественном, так и в качественном отношениях производительность труда пользователя.

Заключение

В процессе реализации программы для сшивки карт пришлось решить ряд проблем. В частности:

- каким образом производить проверку пикселей?

- как сравнивать одиночные картины?

- как заполнить матрицу картин для получения конечного результата?

- каким образом реализовать интерфейс программы?

Все они были успешно решены. Однако как любое решение задачи, оно не единственно, и требует дополнительного обсуждения.

Проверка сходства пикселей реализована с возможностью задачи пользователем параметров в виде процентов. То есть пользователь может задать как 10 процентов, так и 100 процентов. Результатом будет единственный ответ - похожи или нет данные объекты. Однако, параметров для сравнения 4, и соответственно, для получения конечного ответа мы взяли логическое «И». То есть результатом сравнения при определенном проценте отклонение цветовых параметров одного пикселя от другого будет логическое умножение всех 4 величин. Данную функцию сравнения можно улучшить, но для этого требуется дополнительное исследование зависимости сходства пикселей друг от друга. При 95 процентах сравнение пикселей наиболее оптимально.

Сравнение одиночных картин производилось путем проверки последнего пиксела вдоль границы. Как показала практика, такого сравнения достаточно, чтобы получить ответ. Опять же был заложен процентный показатель, с какой точностью картины могут быть похожи. При 90-95 процентах мы можем с достаточной вероятностью утверждать, что картины похожи. Следует отметить, что процент сравнения есть отношение суммы похожих пикселей к общему пикселю стороны. Здесь мы могли пойти двумя путями. Первый - сравнение двух картин непосредственно, и второй - разложение сторон картин в единый массив. И тот и другой способ имеет свои недостатки и достоинства. Однако, при обоих подходах мы встречаемся с проблемой выбора схожих сторон. Дело в том, что если мы утверждаем, что 2 стороны похожи, то необходимо решить проблему, что делать, если в массиве встречаются еще похожие стороны. Заданием жестких процентных рамок не решает ситуацию. Мы решили проблему путем выбора стороны с наибольшим количеством совпавших пикселей. Однако, эту проблему можно решить, допустим, путем дополнительного анализа пикселей во 2 ряду. Тем не менее, если программа ошиблась с выбором верной стороны, мы заложили возможность пользователю вручную совместить неверную картину.

Сохранение результата возможно в 3 вариантах: gif, jpg, tif.

Список использованных источников

Берлянт, А. М. Картоведение: Учебник для вузов / А. М. Берлянт. - М.: Аспект Пресс, 2013. - 477 с.

Гинзбург, Г. А. Построение сеток меридианов и параллелей географических карт в основном графическими приемами / Г. А. Гинзбург. - М.: Издательство геодезической литературы, 1957. - 32 с.

Вахрамеева, Л. А. Математическая картография: Учебник для вузов / Л. А. Вахрамеева, Л. М. Бугаевский, З. Л. Казакова - М.: Недра, 1986. - 286 с.

Раклов, В. П. Картография и ГИС: учебное пособие для слушателей образовательной программы профессиональной переподготовки специалиста / В. П. Раклов. - М.: 2010. - 118 с.

Картавцева, Е.Н. Картография: учебное пособие / Е.Н. Картавцева. - Томск: Изд-во Том. гос. архит.-строит. ун-та, 2010. - 158 с.

Топчилов, М. А. Картография: учебно-методическое пособие / М. А. Топчилов, Л. А. Ромашова, О. Н. Николаева. - Издание 2-е, перераб. и доп.- Новосибирск: СГГА, 2012. - 109 с.

Рихтер, Дж. CLR via С#. Программирование на платформе Microsoft .NET Framework 4.0 / Дж. Рихтер. - 3-е изд. - СПб.: Питер, 2012. - 928 с.

Климов, Л. П. С#. Советы программистам / Л. П. Климов. - СПб.: БХВ-Петербург, 2008. - 544 с.

Культин, Н. Б. Microsoft Visual С# в задачах и примерах / Н. Б. Культин. - СПб.: БХВ-Петербург, 2009. - 320 с.

Абрамян, М. Э. Visual С# на примерах / М. Э. Абрамян. - СПб.: БХВ-Петербург, 2008. - 496 с.

Фленов, М. Е. Библия С# / М. Е. Фленов. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2011. - 560 с.

Самсонова, Т. В. Технико-экономическое обоснование дипломных проектов: Методическое пособие / Т. В. Самсонова - Минск: БГТУ, 1997. - 29 с.

Нейгел К. С# 2005 и платформа .NET 3.0 для профессионалов / К. Нейгел. - М.: ООО "И.Д. Вильямс", 2008. - 1376 с.

Фокина, Л. A. Картография с основами топографии: учеб. пособие для студентов вузов, обучающихся по специальности 050103 (032500) «География» / Л. A. Фокина. - М.: Гуманитар. изд. центр ВЛАДОС, 2005. - 335 с.

Салищев, К. А. Картоведение: Учебник / К. А. Салищев - 3-е изд. - М.: Издательство МГУ, 1990. - 400 с.

Тикунов, В. С. Моделирование в картографии: Учебник / В. С. Тикунов - М.: Издательство МГУ, 1997. - 405 с.

Чекин, Л. С. Картография христианского средневековья. VIII--XIII вв. Тексты, перевод, комментарий / Л. С. Чекин - М.: Издательская фирма «Восточная

Приложение

Наименование показателя

Сумма, рублей

Основная заработная плата

26 180 052

Дополнительная заработная плата

2 618 005

Отчисления в Фонд социальной защиты населения

9 791 339

Отчисления по обязательному страхованию от несчастных случаев на производстве и профессиональных заболеваний

143 990

Расход на материалы

41 496

Расход на оплату машинного времени

663 613

Прочие прямые затраты

3 403 407

Накладные расходы

28 798 507

Расходы на разработку ПС

71 640 409

Расходы на сопровождение и адаптацию ПС

7 164 041

Полная себестоимость ПС

78 804 450

Прибыль от реализации ПС

23 641 335

Планируемая цена разработчиков ПС без налогов

102 445 785

Налог на добавленную стоимость

20 489 157

Отпускная цена с НДС

122 934 942

namespace DiplomKarta

{

public partial class Form1 : Form

{

String[] NameOfFile; // ссылка на массив имен файлов рисунков

String dir = @"c:\\Значки\";

Image[] MassImage; //ссылка нa массив картинок

Image ReturnImage; //ссылка на окончательный рисунок

Bitmap[] bm; // массив битмапов для работы с рисунками

public int Percent = 1; // процент совпадения пикселей

public int Percent2 =1; // процент совпадения массива квадратов

public int Percent1 = 90; // процент совпадения квадратов

public Picture[] Pic; // ссылка на массив обьектов рисунков

public Picture[] IMAGE; //ссылка на массив картинок для внесения на карту

//int MaxX = SystemInformation.PrimaryMonitorSize.Width; //разрешение экрана по х

//int MaxY = SystemInformation.PrimaryMonitorSize.Height; // разрешение экрана по у

int MaxX = 0;

int MaxY = 0;

int KoordX = 0; // это суммарная координата для подсчета размера результирующего изображения по х

int KoordY = 0; // это суммарная координата для подсчета размера результирующего изображения по y

Form1 ObjForm1;

Form2 ObjForm2;

Form3 ObjForm3;

int[] TempMass1 = new int[4]; // заплатка

int[] result; // переменная для проверки результатов совпадений

Picture PictureRuler;

public int MinRule = 0;

public int MaxRule = 0;

public bool SplitFlag;

public bool IsClicked=false;

int number = 0;

public Form1()

{

ObjForm2 = new Form2();

ObjForm3 = new Form3();

ObjForm1 = this;

InitializeComponent();

}

private void AddToolStripMenuItem_Click(object sender, EventArgs e)

{

FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();

if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)

{

// MessageBox.Show(folderBrowserDialog1.SelectedPath);

DirectoryInfo MyDirectory = new DirectoryInfo(folderBrowserDialog1.SelectedPath);

FileInfo[] NumsOfFile = MyDirectory.GetFiles();

NameOfFile = new String[NumsOfFile.Length];

MassImage = new Image[NameOfFile.Length];

int i = 0;

foreach (FileInfo fri in NumsOfFile)

{

if (fri.Extension == ".jpg" || fri.Extension == ".bmp" || fri.Extension == ".png")

{

NameOfFile[i] = fri.FullName;

MassImage[i] = Image.FromFile(NameOfFile[i]);

i++;

}

}

// получеине директории, где лежат картинки

MyDirectory = new DirectoryInfo(dir);

NumsOfFile = MyDirectory.GetFiles();

string[] NameOfFile1 = new String[NumsOfFile.Length];

IMAGE = new Picture[NumsOfFile.Length];

i = 0;

foreach (FileInfo fri in NumsOfFile)

{

NameOfFile1[i] = fri.FullName;

Picture a;

a = new Picture(0, 0, Image.FromFile(NameOfFile1[i]));

IMAGE[i] = a;

i++;

}

splitToolStripMenuItem.Enabled = true;

saveToolStripMenuItem.Enabled = true;

toolStripButton1.Enabled = true;

toolStripButton2.Enabled = true;

toolStripButton3.Enabled = true;

toolStripButton4.Enabled = true;

toolStripButton5.Enabled = true;

toolStripButton6.Enabled = true;

toolStripButton7.Enabled = true;

toolStripButton8.Enabled = true;

toolStripButton9.Enabled = true;

this.Invalidate();

}

}

public Picture[] addInMass(Picture[] mass, Picture obj )

{

Picture[] mass1 = new Picture[mass.Length+1];

int i = 0;

foreach (Picture a in mass)

{

mass1[i] = a;

i++;

}

mass1[i] = obj;

return mass1;

}

//функция рисует рисунок из массива рисунков MassImage1 с размером области рисования XWindow, YWindow

public Image DrawImageFromMass(Image[] MassImage1, int XWindow,int YWindow)

{

//рассчитываем размер результируещего файла

int height=0;

int width=0;

foreach (Image im in MassImage1)

{

height = height + im.Height;

width = width + im.Width;

}

if (XWindow == 0 & YWindow == 0) // автоматическое задание максимальных размеров окна

{

if (height > width)

{

width = height;

}

else

{

height = width;

}

XWindow = width ;

YWindow = height; }

Image TempImage = new Bitmap(XWindow, YWindow); //результирующая картинка, которая должна быть выдана в конце функции

Graphics g = Graphics.FromImage(TempImage);

Point PPoint = new Point();

int x = 0;

int y = 0;

int sum = 0;

PPoint.X = 0;

PPoint.Y = 0;

int maxY=0;

for(int i=0;i<MassImage1.Length;i++)

{

Image im = MassImage1[i];

g.DrawImage(im, PPoint);

x = x + im.Width;

if (maxY < im.Height) maxY = im.Height;

if (x + im.Width > TempImage.Width) // если ширина добавляемой картинки меньше ширины результирующей картинки

{

x = 0;

sum = sum + maxY;

y = sum;

maxY = 0;

}

PPoint.X = x;

PPoint.Y = y;

}

return TempImage;

}

public int[] AnalisKubov(System.Drawing.Bitmap image1, System.Drawing.Bitmap image2, int percent)

{

// функция сравнивает крайние пикселы картинок (граничный пиксель) и выдает результат

int[] MassRes;

//создание и определение размерности массивов цветов пикселей у 1 и 2 квадрата

Color[][] im1 = new Color[4][]; // 1 массив

Color[][] im2 = new Color[4][]; // 2 массив

im1[0] = new Color[image1.Width];

im1[1] = new Color[image1.Height];

im1[2] = new Color[image1.Width];

im1[3] = new Color[image1.Height];

im2[0] = new Color[image2.Width];

im2[1] = new Color[image2.Height];

im2[2] = new Color[image2.Width];

im2[3] = new Color[image2.Height];

// заполняем массивы элементами

for (int i = 0; i < im1.Length; i++)

{

for (int j = 0; j < im1[i].Length; j++)

{

if (i == 0) im1[0][j] = image1.GetPixel(j, 1);

if (i == 1) im1[1][j] = image1.GetPixel(image1.Width - 1, j);

if (i == 2) im1[2][j] = image1.GetPixel(j, image1.Height - 1);

if (i == 3) im1[3][j] = image1.GetPixel(1, j);

}

}

for (int i = 0; i < im2.Length; i++)

{

for (int j = 0; j < im2[i].Length; j++)

{

if (i == 0) im2[0][j] = image2.GetPixel(j, 1);

if (i == 1) im2[1][j] = image2.GetPixel(image2.Width - 1, j);

if (i == 2) im2[2][j] = image2.GetPixel(j, image2.Height - 1);

if (i == 3) im2[3][j] = image2.GetPixel(1, j);

}

}

// для сохранения результата создаем массив ответов совпадений пикселей размерности 1 квадрата

// размерность ответов определяется исходя из размерности 1 куба, иначе сравнение не имеет смысла

bool[][] res = new bool[16][];

for (int i = 0; i <= 15; i++)

{

int k = 0;

if (i <= 3) k = im1[0].Length;

if (i > 3 && i <= 7) k = im1[1].Length;

if (i > 7 && i <= 11) k = im1[2].Length;

if (i > 11 && i <= 15) k = im1[3].Length;

res[i] = new bool[k];

}

// теперь сравниваем массивы и заносим результат сравнения в массив

int m = 0; //переменная для счета количества проходов

for (int i = 0; i < im1.Length; i++) // проход по граням 1 кубика

{

for (int k = 0; k < im1.Length; k++) // проход по граням 2 кубика

{

if (im1[i].Length == im2[k].Length) // если измерение стороны 1 кубика и измерение 2 кубика одинаковы иначе нет смысла сравнивать

{

for (int j = 0; j < im1[i].Length; j++) // проход по пикселям

{

// заполняем массив ответов

if (PixelAnalis(im1[i][j], im2[k][j], Percent)) res[m][j] = true;

}

}

m++;

}

}

//анализируем результат и выдаем ответ если процент совпадения больше 80 - тогда считаем годным для склеивания

MassRes = new int[4]; // этот массив - массив совпадений

// заодно подсчитаем количество совпадений и предположим, где больше совпадений, там вероятнее того, что стороны одинаковые

int[] TempMass = new int[16];

int count = 0;

for (int i = 0; i <= 15; i++)

{

for (int j = 0; j < res[i].Length; j++)

{

if (res[i][j]) count++;

}

TempMass [i] = count;

count = 0;

}

// выясним максимальное значение для одной стороны и запишем в ответ Max

int[] Max = new int[4];

for (int i = 0; i <= 15; i++)

{

if (i <= 3)

{

if (TempMass[i] > Max[0])

{

Max[0] = TempMass[i];

if (Max[0] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[0] / (double)res[i].Length) * 100) >= percent) MassRes[0] = i + 1;

};

} //1 сторона кубика

}

if ((i > 3 & i <= 7))

{

if (TempMass[i] >= Max[1])

{

Max[1] = TempMass[i];

if (Max[1] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[1] / (double)res[i].Length) * 100) >= percent) MassRes[1] = i - 3;

};

} //2 сторона кубика

}

if ((i > 7 & i <= 11))

{

if (TempMass[i] >= Max[2])

{

Max[2] = TempMass[i];

if (Max[2] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[2] / (double)res[i].Length) * 100) >= percent) MassRes[2] = i - 7;

};

}

//3 сторона кубика

}

if ((i > 11 & i <= 15))

{

if (TempMass[i] >= Max[3])

{

Max[3] = TempMass[i];

if (Max[3] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[3] / (double)res[i].Length) * 100) >= percent) MassRes[3] = i - 11;

};

}//4 сторона кубика

}

}

int maxtemp = 0;

int[] max1= new int[4];

int l=0;

// тогда проверка совпадений идет по максимальному значению из массива

{

//ищем максимальное знаечение

for (int i = 0; i < 4; i++)

{

if ( Max[i] > maxtemp)

{

maxtemp = Max[i];

}

}

// здесь заполняестя вспомогательный массив, в котором отфильтрованы максимальные значения, которые

// будут соответсвовать совпавшим сторонам

for (int i = 0; i < 4; i++)

{

if (Max[i] > (int) (((double)maxtemp) * (((double)Percent1) / 100)))

{

max1[l] = Max[i];

l++;

}

}

// ищем номера совпавших элементов

int j = 3;

l = 0;

int k=0;

for (int i = 0; i < TempMass.Length;i++ )

{

if ((max1[k]> 0) & (max1[k] == TempMass[i])) // счетчик элементов массива max1

{

if (i <= 3) { MassRes[0] = i + 1; TempMass1[0] = max1[k]; }

if (i > 3 && i <= 7) { MassRes[1] = i - 3;TempMass1[1] = max1[k]; }

if (i > 7 && i <= 11) { MassRes[2] = i - 7; TempMass1[2] = max1[k]; }

if (i > 11 && i <= 15) { MassRes[3] = i - 11; TempMass1[3] = max1[k]; }

if(k < 3) k++; // это заплатка, если неверно выставленны проценты

}

if (j == i) // счетчик сторон

{

l++;

j = j + 4;

}

}

}

return MassRes;

}

public bool PixelAnalis(Color a, Color b, int percent)

{

bool like = false; // переменная, которая возвращает результат, равны ли пиксели

bool like1 =false; // прозрачность

bool like2 = false; //

bool like3 = false; //

bool like4 = false; //

double res = 0.0;

if (a.A >= b.A){

res = (double)b.A / (double)a.A * 100.0;

if ((int)res >= percent) like1 = true;

}

else {

res = (double)a.A / (double)b.A * 100.0;

if ((int)res >= percent) like1 = true;

}

if (a.B >= b.B)

{

res =(double) b.B /(double) a.B * 100.0;

if ((int)res >= percent) like2 = true;

}

else

{

res = (double)a.B / (double)b.B * 100.0;

if ((int)res >= percent) like2 = true;

}

if (a.G >= b.G)

{

res = (double)b.G / (double)a.G * 100.0;

if ((int)res >= percent) like3 = true;

}

else

{

res = (double)a.G / (double)b.G * 100.0;

if ((int)res >= percent) like3 = true;

}

if (a.R >= b.R)

{

res = (double)b.R / (double)a.R * 100.0;

if ((int)res >= percent) like4 = true;

}

else

{

res = (double)a.R / (double)b.R * 100.0;

if ((int)res >= percent) like4 = true;

}

if (like1 && like2 && like3 && like4) like = true;

return like;

}

public int ProverkaNaSovpadenie(int SideA, int SideB)

{

int res = 0;

return res;

}

private void straightedgeToolStripMenuItem_Click(object sender, EventArgs e)

{ }

private void Form1_MouseClick(object sender, MouseEventArgs e)

{

MouseButtons batton = e.Button;

if (SplitFlag & e.Button == MouseButtons.Left)

{

// если кликнули на квадрате, то при нажатаии клавиши двигаем квадратик

// определим координаты

IsClicked = true;

// XMousePos = e.X;

//YMousePos = e.Y;

int i = 0;

int scrollPositionX = this.AutoScrollPosition.X;

int scrollPositionY = this.AutoScrollPosition.Y;

foreach (Picture pic1 in Pic)

{

i++;

if (e.X - this.AutoScrollPosition.X > pic1.x & e.X - this.AutoScrollPosition.X < pic1.x + pic1.image.Width & e.Y - this.AutoScrollPosition.Y > pic1.y & e.Y - this.AutoScrollPosition.Y < pic1.y + pic1.image.Height)

{

number = i;

}

}

}

if (e.Button == MouseButtons.Right)

{

IsClicked = false;

}

}

private void Form1_MouseMove(object sender, MouseEventArgs e)

{

if (IsClicked)

{

int scrollPositionX = this.AutoScrollPosition.X;

int scrollPositionY = this.AutoScrollPosition.Y;

Pic[number - 1].x = e.X+ scrollPositionX;

Pic[number - 1].y = e.Y+ scrollPositionY;

this.Invalidate();

}

}

Размещено на Allbest.ru


Подобные документы

  • Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.

    дипломная работа [1,5 M], добавлен 12.06.2009

  • Разработка программного продукта, который позволяет формировать отчет о мобильных телефонах во всем мире. Реализация функций добавления, редактирования, поиска и вывода на печать отчета. Проектирование интерфейса пользователя. Описание рабочих модулей.

    курсовая работа [6,6 M], добавлен 11.01.2017

  • Информационное обеспечение задачи автоматизации учета. Программное обеспечение задачи автоматизации учета. Расчет технико-экономической эффективности программного продукта по учету пластиковых карт. Расчет затрат на разработку программного модуля.

    дипломная работа [2,1 M], добавлен 10.02.2018

  • Создание программного продукта, представляющего моделирование на компьютере логнормального распределения, определение вероятностной оценки стоимости актива. Описание работы программного продукта. Работа с графиками, таблицами, математическими функциями.

    курсовая работа [742,7 K], добавлен 08.01.2009

  • Разработка программного продукта для планирования автобусного движения в районе. Возможность добавлять, удалять новые рейсы, вносить изменения в имеющиеся, выдавать справочную информацию. Приложение, написанное на языке С++ с использованием библиотек MFC.

    курсовая работа [453,7 K], добавлен 05.02.2013

  • Подсчет количества функциональных точек. Расчет трудозатрат на разработку программного средства и ориентировочного времени его разработки, модель жизненного цикла. Разработка технического задания на создание автоматизированной системы, требования к ней.

    курсовая работа [2,0 M], добавлен 11.01.2014

  • Особенности создания цифровых топографических карт и планов. Используемые технические средства, программное обеспечение. Создание цифровых карт по материалам полевых измерений. Цифрование картографических изображений. Прикладные задачи картографии.

    курсовая работа [5,3 M], добавлен 31.05.2014

  • Создание рабочей версии информационной системы выбора оптимальных туристских маршрутов. Разработка программного продукта для туристического агентства, который позволит ускорить процесс продажи, а, следовательно, приведет к увеличению прибыли компании.

    дипломная работа [775,9 K], добавлен 20.03.2012

  • Характеристика и особенности системы Pascal ABC 3.0.1. Обучение программированию школьников и студентов младших курсов. Создание и отладка программного продукта для поиска документа, книги в библиотеке или в архиве, получения информации об издании.

    курсовая работа [3,4 M], добавлен 11.09.2011

  • Характеристика программного продукта и стадий разработки. Расчет затрат на разработку и договорной цены, эксплуатационных расходов, связанных с использованием нового программного продукта. Оценка конкурентоспособности. Изучение, оценка рыночного спроса.

    курсовая работа [139,0 K], добавлен 22.09.2008

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.