СПИСОК ИСПОЛЬЗОВАННЫЫХ ИСТОЧНИКОВ



1. Евсеева, А.Б. Работа с базами данных на языке C#. Технология ADO.NET: Учебное пособие / сост. О. Н. Евсеева, А. Б. Шамшев. –Ульяновск: УлГТУ, 2009. –170 с.

2. ADO.NET: Обзор технологии [Электронный ресурс].–Режим доступа: http://www.cyberguru.ru/dotnet/ado-net/adonet-overview.html, свободный. –(Дата обращения 12.05.2017).

3. ADO. NET [Электронный ресурс] / П. В. Ветров, Тюменский государственный университет. Институт математики и компьютерных наук. – Режим доступа: http://www.codenet.ru/db/other/ado-dot-net/, свободный.–(Дата обращения 12.05.2017).

4. Евсеева, О.Н. ОСНОВЫ ЯЗЫКА C# 2005: Учебное пособие / сост. О. Н. Евсеева, А.Б.Шамшев. –Ульяновск: УлГТУ, 2008. – 132 с.

5.CSharp – Wikipedia [Электронный ресурс]. – Режим доступа: https://ru.wikipedia.org/wiki/C_Sharp, свободный. –(Дата обращения 12.05.2017).

6. Евсеева, О.Н. Отладка и тестирование приложений в среде VisualStudio2005 : учебное пособие / сост. О. Н. Евсеева, А. Б. Шамшев. –Ульяновск :УлГТУ, 2008. – 96 с.

7. Достоинства и недостатки СУБД [Электронный ресурс]. – Режим доступа: http://pivot-table.ru/dostoinstva-i-nedostatki-subd.html, свободный. –(Дата обращения 12.05.2017)..

8. Проектирование баз данных – Wikipedia [Электронный ресурс]. – Режим доступа: https://ru.wikipedia.org/wiki/Проектирование_баз_данных, свободный. –(Дата обращения 12.05.2017).

9.Советов, Б.Я. Базы данных: теория и практика: Учебник для бакалавров / Б.Я. Советов, В.В. Цехановский, В.Д. Чертовской. – М.: Юрайт, 2013. – 463 c.

10.Кириллов, В.В. Введение в реляционные базы данных.Введение в реляционные базы данных / В.В. Кириллов, Г.Ю. Громов. – СПб.: БХВ-Петербург, 2012. – 464 c.

11.Кузин, А.В. Базы данных: Учебное пособие для студ. высш. учеб. заведений / А.В. Кузин, С.В. Левонисова. – М.: ИЦ Академия, 2012. – 320 c.

12.Р. Фрост Базы данных. Проектирование и разработка / РэймондФрост, Джон Дей, Крейг Ван Слайк. – М.: – НТ Пресс, 2007. – 592с.

13. Пирогов, В.Ю. Информационные системы и базы данных: организация и проектирование: Учебное пособие / В.Ю. Пирогов. –  СПб.: БХВ-Петербург, 2009. –  528 c.

14.Д. ШарпMicrosoft Visual C#.Подробное руководство. / Д. Шарп. – СПб.: – Питер, 2017. – 848с.

15.Databasecomparsion – Digitalocean [Электронный ресурс]. – Режим доступа: https://www.digitalocean.com/community/tutorials/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems, свободный. – (Дата обращения 12.05.2017).


 

Приложение А

SQL-запрос на выборку: отображение полной таблицы.

SELECT PassportOPS.idPassportOPS, Pochtamt.[Индекс], Pochtamt.[Наименование почтамта], OPS.[Наименование ОПС], OPS.[Индекс ОПС], OPS.ЕАС, ConnectType.[Вид соединения], TypeOPS.[Наименование типа ОПС], Class.[Класс ОПС], Address.Район, Address.[Населённый пункт], Address.Улица, Address.Дом, OPS.Телефон, InternetCanal.ТелефонИнтернет, TypeCanal.[Наименование типа канала], Speed.Скорость, Operator.[Название оператора], InternetCanal.[IP-адрес], OPS.[Количество окон]

FROM ((((Operator INNER JOIN (((TypeCanal INNER JOINтInternetCanal ON TypeCanal.idTypeCanal = InternetCanal.[Типканала]) INNER JOIN (TypeOPS INNER JOIN ((PassportOPS INNER JOIN Pochtamt ON PassportOPS.Почтамт = Pochtamt.idPochtamt) INNER JOIN OPS ON PassportOPS.ОПС = OPS.idOPS) ON TypeOPS.idTypeOPS = OPS.[ТипОПС]) ON InternetCanal.idInternetCanal = PassportOPS.Интернет) INNER JOIN Speed ON InternetCanal.Скорость = Speed.idSpeed) ON Operator.idOperator = InternetCanal.Оператор) INNER JOIN ConnectType ON InternetCanal.[Видсоединения] = ConnectType.idConnectType) INNER JOIN Class ON OPS.Класс = Class.idClass) INNER JOIN Address ON OPS.Адрес = Address.idAddress)

 


 

Приложение Б

КодформыLoginForm.

using System;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.Windows.Forms;

usingSystem.Data.OleDb;

using System.IO;

 

 

namespace WindowsFormsApplication2

{

publicpartialclassLoginForm :Form

{

publicLoginForm()

{     

InitializeComponent();

this.AcceptButton = this.button1;this.ActiveControl = this.textBox1;  

}

 

privatevoid linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

{

InitializeComponent();

textBox1.Text = null;textBox2.Text = null;

Register f = newRegister();

this.Hide(); f.ShowDialog();

}

privatevoid button1_Click(object sender, EventArgs e)

{

stringconnectionstring = Properties.Settings.Default.conSt;

Datasdataform = newDatas();

if (connectionstring == "" || !File.Exists(Properties.Settings.Default.DbFileName))

      {

dataform.chooseFile(); return;

string login = textBox1.Text; string password = textBox2.Text;

OleDbConnection conn = newOleDbConnection(connectionstring);

conn.Open();

//Поиск пользователя в таблице Users

OleDbCommandcomm = newOleDbCommand("SELECT COUNT(*) FROM `Users` WHERE Login = @login and Password = @password", conn);

comm.Parameters.Add("@login", OleDbType.Char).Value = login;

comm.Parameters.Add("@password", OleDbType.Char).Value = password;

if ((int)(comm.ExecuteScalar()) == 1)

//Переходкосновномуокну

{this.Hide(); dataform.Show();

        textBox1.Text = null; textBox2.Text = null;}

else

{MessageBox.Show("Попробуйтеещёраз", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }

 

conn.Close();

  }

}

}

ПриложениеВ

КодформыRegister.

using System;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Data.OleDb;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.Windows.Forms;

using System.IO;

 

 

namespace WindowsFormsApplication2

{

publicpartialclassRegister :Form

{

publicRegister()

   {

InitializeComponent();

this.ActiveControl = this.textBox1;

this.AcceptButton = this.button1;

   }

privatevoid button1_Click(object sender, EventArgs e)

   {

stringconnectionstring = Properties.Settings.Default.conSt;

Datasdataform = newDatas();

if (connectionstring == "" || !File.Exists(Properties.Settings.Default.DbFileName))

       {

dataform.chooseFile();

return;

       } 

string login = textBox1.Text;

string password = textBox2.Text;

OleDbConnection conn = newOleDbConnection(connectionstring);

conn.Open();           

OleDbCommandcomm = newOleDbCommand("SELECT COUNT(*) FROM `Users` WHERE Login = @login and Password = @password", conn);

comm.Parameters.Add("@login", OleDbType.Char).Value = login;

comm.Parameters.Add("@password", OleDbType.Char).Value = password;

if ((int)(comm.ExecuteScalar()) == 1)

       {

MessageBox.Show("Пользовательсуществует", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

       }

//Проверка заполненности формы регистрации

if (textBox1.Text == String.Empty)

       {

MessageBox.Show("Не заполнено поле Логин", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

       }

elseif (textBox2.Text == String.Empty)

       {

MessageBox.Show("НезаполненополеПароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

       }

//Заполнениетаблицы Users

comm = newOleDbCommand("INSERT INTO `users` VALUES(@1, @2, @3); ", conn);

comm.Parameters.Add("@1", OleDbType.Char).Value = login;

comm.Parameters.Add("@2", OleDbType.Char).Value = password;

comm.Parameters.Add("@3", OleDbType.Boolean).Value = "false";

comm.ExecuteNonQuery();

//ПереходкокнуLoginForm

this.Hide();

LoginFormloginform = newLoginForm();

loginform.Show();

   }

privatevoidRegister_FormClosed(object sender, FormClosedEventArgs e)

{

Application.OpenForms[0].Show();

   }

}

}


 

ПриложениеГ

КодформыDatas.

using System;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Data.OleDb;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.Windows.Forms;

using Excel = Microsoft.Office.Interop.Excel;

using System.IO;

 

namespace WindowsFormsApplication2

{

publicpartialclassDatas :Form

{

stringzapros = null;

publicDatas()

   {

InitializeComponent();

   }

privateOleDbConnection conn;

privateOleDbCommandcomm;

publicstringconnectionstring;

publicvoidconnecting()

   {        

connectionstring = Properties.Settings.Default.conSt;

if (connectionstring == "" || !File.Exists(Properties.Settings.Default.DbFileName))

       {

chooseFile();

       }         

           conn = newOleDbConnection(connectionstring);

comm = newOleDbCommand();      

   }

publicvoidDataTable_Load(object sender, EventArgs e)

{

connecting();

// TODO: данная строка кода позволяет загрузить данные в таблицу "pOCHTADataSet.Class". При необходимости она может быть перемещена или удалена.

// this.classTableAdapter.Fill(this.pOCHTADataSet.Class);

 

conn.Open();

//Получение списка таблиц БД в combobox

DataTabletbls = conn.GetSchema("Tables", newstring[] { null, null, null, "TABLE" });

foreach (DataRow row intbls.Rows)

       {

stringTableName = row["TABLE_NAME"].ToString();

comboBox1.Items.Add(TableName);

       }

conn.Close();

//Выделениестроки

       dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

dataGridView1.DefaultCellStyle.SelectionBackColor = Color.Blue;

   }

//ОТОБРАЖЕНИЕВСЕЙТАБЛИЦЫ

publicvoidLoadFullTable_Click(object sender, EventArgs e)

   {

ClearDGV();

connecting();

comm.Connection = conn;

conn.Open();

zapros = @"SELECT Pochtamt.[Индекс], Pochtamt.[Наименованиепочтамта], OPS.[НаименованиеОПС], OPS.[ИндексОПС], OPS.[ЕАС], ConnectType.[Видсоединения], TypeOPS.[НаименованиетипаОПС], Class.[КлассОПС], Address.Район, Address.[Населённыйпункт], Address.Улица, Address.Дом, OPS.Телефон, InternetCanal.ТелефонИнтернет, TypeCanal.[Наименованиетипаканала], Speed.Скорость, Operator.[Названиеоператора], InternetCanal.[IP-адрес], OPS.[Количествоокон] FROM ((((Operator INNER JOIN (((TypeCanal INNER JOIN InternetCanal ON TypeCanal.idTypeCanal = InternetCanal.[Типканала]) INNER JOIN (TypeOPS INNER JOIN ((PassportOPS INNER JOIN Pochtamt ON PassportOPS.Почтамт = Pochtamt.idPochtamt) INNER JOIN OPS ON PassportOPS.ОПС = OPS.idOPS) ON TypeOPS.idTypeOPS = OPS.[ТипОПС]) ON InternetCanal.idInternetCanal = PassportOPS.Интернет) INNER JOIN Speed ON InternetCanal.Скорость = Speed.idSpeed) ON Operator.idOperator = InternetCanal.Оператор) INNER JOIN ConnectType ON InternetCanal.[Видсоединения] = ConnectType.idConnectType) INNER JOIN Class ON OPS.Класс = Class.idClass) INNER JOIN Address ON OPS.Адрес = Address.idAddress)";

DataTabletble = getTable(zapros);

       dataGridView1.DataSource = tble;

numRows();

conn.Open();

//количество строк и столбцов

dataGridView1.ReadOnly = true;

conn.Close();

}

//Нумерация строк в таблице

publicvoidnumRows()

{

for (inti = 0; i<dataGridView1.Rows.Count; i++)

       {

           dataGridView1.Rows[i].HeaderCell = newDataGridViewRowHeaderCell();

           dataGridView1.Rows[i].HeaderCell.Value = (i + 1) + " ";

}

   }

//выборка данных для колонки с выпадающим списком

publicDataGridViewComboBoxColumncreateCBColumn(DataTable source, stringdMember, stringvMember)

   {

//Созданиеколонки

DataGridViewComboBoxColumn column = newDataGridViewComboBoxColumn();

//Назначемисточникданных

column.DataSource = source;

//Отображаемоезначение

column.ValueMember = dMember;

//Значение

column.DisplayMember = vMember;

 

column.MaxDropDownItems = 100;

returncolumn;

   }

//Метод для получения таблицы

publicintRowC = 0;

publicintColumnC = 0;

publicDataTablegetTable(stringzapros)

   {

connecting();

comm.Connection = conn;

comm.CommandText = zapros;

conn.Open();

//создаемтаблицу

DataTabletble = newDataTable();

OleDbDataReader reader = comm.ExecuteReader();

for (inti = 0; i<reader.FieldCount; i++) //fieldcountколичествостолбцов

       {

tble.Columns.Add(reader.GetName(i)); //getnameполучениеименистолбцаcolumns.addдобавлениестолбца

}

object[] newRow; //массив для хранения строк из результата запроса 

ColumnC = reader.FieldCount;

RowC = 0;

while (reader.Read())

       {

RowC++;

newRow = newobject[reader.FieldCount];

for (inti = 0; i<reader.FieldCount; i++)

           {

newRow[i] = reader.GetValue(i);

           }

tble.Rows.Add(newRow);

       }

numRows();

reader.Dispose();

conn.Close();

returntble;

   }

publicvoid button3_Click(object sender, EventArgs e)

   } 

connecting();

conn.Open();

ClearDGV();

       dataGridView1.ReadOnly = true;

zapros = @"SELECT " + comboBox1.SelectedItem + @".* FROM " + comboBox1.SelectedItem;

OleDbDataAdapter dbAdapter1 = newOleDbDataAdapter(zapros, conn);

DataTabledataTable = newDataTable();

       dbAdapter1.Fill(dataTable);

       dataGridView1.DataSource = dataTable;

conn.Close();

   }

publicvoidUpdateBtn_Click(object sender, EventArgs e)

   {

DataSetdataSett = newDataSet();

try

       {

//    dataSett.AcceptChanges();

//    this.table1TableAdapter.Update(this.database2DataSet1.Table1);

       }

catch

       {

MessageBox.Show("lololo");

       }

   }

//Действиепризакрытииформы

privatevoidDatas_FormClosed(object sender, FormClosedEventArgs e)

   {

Formloginform = Application.OpenForms[0];

loginform.Show();

   }

//МЕНЮToolStripMenu

privatevoidвыходToolStripMenuItem_Click(object sender, EventArgs e)

   {

this.Close();

Formloginform = Application.OpenForms[0];

loginform.Close();

   }

privatevoidоПрограммеToolStripMenuItem_Click(object sender, EventArgs e)

   {

MessageBox.Show("Разработчик: КрыжевичПавел (c) 2017", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

   }

privatevoidвернутьсяКАвторизацииToolStripMenuItem_Click(object sender, EventArgs e)

   {

Formloginform = Application.OpenForms[0];

loginform.Show();

this.Close();

   }

privatevoidэкспортТаблицыВExcelToolStripMenuItem_Click(object sender, EventArgs e)

   {

       saveFileDialog1.InitialDirectory = "C:\\tmp";

       saveFileDialog1.Filter = "All files (*.*)|*.*|Microsoft Office Excel *.xlsx|*.xlsx";

       saveFileDialog1.FilterIndex = 2;

       saveFileDialog1.AddExtension = true;

saveFileDialog1.ShowDialog();

   }

//Проверка возможности редактирования таблицы

privatevoid checkBox1_CheckedChanged(object sender, EventArgs e)

   {

if (checkBox1.Checked == true)

       {

this.dataGridView1.ReadOnly = false;

       }

else

       {

this.dataGridView1.ReadOnly = true;

       }

   }

//СОРТИРОВКА

staticboolIsNum(string s)

   {

foreach (char c in s)

       {

if(!Char.IsDigit(c)) returnfalse;

       }

returntrue;

   }

publicvoidSort()

   {

stringTableColumnName = null;

stringSortTextis = null;

if (IsNum(SortText.Text) == true)

       {

SortTextis = SortText.Text;

       }

else

       {

SortTextis = "'" + SortText.Text + "'";

       }

connecting();

conn.Open();

// ВыбортаблицыизCombobox

intSortIndex = 1000;

SortIndex = SortBox.SelectedIndex;

switch (SortIndex)

       {

case 0:

TableColumnName = @"Pochtamt.[Наименованиепочтамта]";

break;

case 1:

TableColumnName = @"OPS.[НаименованиеОПС]";

break;

case 2:

TableColumnName = @"OPS.[ИндексОПС]";

break;

 

case 3:

TableColumnName = @"OPS.ЕАС";

//УсловиедляЕАС

if (EACcheck.Checked)

               {

SortTextis = "-1";

               }

else

               {

SortTextis = "0";

               }

break;

case 4:

TableColumnName = @"ConnectType.[Видсоединения]";

break;

case 5:

TableColumnName = @"TypeOPS.[НаименованиетипаОПС]";

break;

case 6:

TableColumnName = @"Class.[КлассОПС]";

break;

case 7:

TableColumnName = @"Address.[Населённыйпункт]";

break;

case 8:

TableColumnName = @"TypeCanal.[Наименованиетипаканала]";

break;

case 9:

TableColumnName = @"Operator.[Названиеоператора]";

break;

       }

comm.Connection = conn;

if (TableColumnName == "" || SortTextis == "")

       {

TableColumnName = "";

SortTextis = "";

MessageBox.Show("Незаполненоусловиепоиска", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

       }

try

       {

zapros = "SELECT distinct Pochtamt.Индекс, Pochtamt.[Наименованиепочтамта], OPS.[НаименованиеОПС], OPS.[ИндексОПС], TypeOPS.[НаименованиетипаОПС], Class.[КлассОПС], Address.[Населённыйпункт], Address.Улица, Address.Дом, OPS.Телефон, OPS.ЕАС, OPS.[Количествоокон], TypeCanal.[Наименованиетипаканала], Operator.[Названиеоператора], Speed.Скорость, InternetCanal.ТелефонИнтернет, InternetCanal.[IP-адрес], ConnectType.[Видсоединения] FROM (((((((Class INNER JOIN (Address INNER JOIN OPS ON Address.idAddress = OPS.Адрес) ON Class.idClass = OPS.Класс) INNER JOIN PassportOPS ON OPS.idOPS = PassportOPS.ОПС) INNER JOIN ((InternetCanal INNER JOIN ConnectType ON InternetCanal.[Видсоединения] = ConnectType.idConnectType) INNER JOIN Operator ON InternetCanal.Оператор = Operator.idOperator) ON PassportOPS.Интернет = InternetCanal.idInternetCanal) INNER JOIN Pochtamt ON PassportOPS.Почтамт = Pochtamt.idPochtamt) INNER JOIN Speed ON InternetCanal.Скорость = Speed.idSpeed) INNER JOIN TypeCanal ON InternetCanal.[Типканала] = TypeCanal.idTypeCanal) INNER JOIN TypeOPS ON OPS.[ТипОПС] = TypeOPS.idTypeOPS) WHERE " + TableColumnName + " = " + SortTextis;

       }

catch (OleDbException)

       {

MessageBox.Show("ERROR", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

       }

conn.Close();

//создаемтаблицу

DataTabletble = getTable(zapros);

       dataGridView1.DataSource = tble;

conn.Close();

   }

//Кнопкасортировки, запросынавыборку

publicvoid button2_Click(object sender, EventArgs e)

   {

ClearDGV();

Sort();

       dataGridView1.ReadOnly = true

numRows();     

   }

//Заменаформысортировки

publicvoidSortBox_SelectedIndexChanged(object sender, EventArgs e)

   {

intSelIndex = this.SortBox.SelectedIndex;

if (SelIndex == 3)

       {

SortText.Visible = false;

EACcheck.Visible = true;

       }

else

       {

SortText.Visible = true;

EACcheck.Visible = false;

       }

   }

//Очисткатаблицы

publicvoidClearDGV()

   {

       dataGridView1.SelectAll();

       dataGridView1.ClearSelection();

dataGridView1.Columns.Clear();

       dataGridView1.DataSource = null;

   }

//Методэкспортав EXCEL

publicvoidExportToExcel()

   {

//Подключениек Excel

Microsoft.Office.Interop.Excel.ApplicationexcelApp = newMicrosoft.Office.Interop.Excel.Application();

Microsoft.Office.Interop.Excel.WorkbookObjWorkBook;

Microsoft.Office.Interop.Excel.WorksheetObjWorkSheet;

//Созданиеновойкниги Excel

ObjWorkBook = excelApp.Workbooks.Add(System.Reflection.Missing.Value);

//Созданиеновойтаблицы Excel

ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];

excelApp.Workbooks.Add();

Microsoft.Office.Interop.Excel.WorksheetworkSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelApp.ActiveSheet;

conn.Open();

numRows();

DataTabletble = getTable(zapros);

//Считываниетаблицы

for (inti = 0; i<ColumnC; i++)

       {

workSheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;

       }

for (inti = 0; i< dataGridView1.ColumnCount; i++)

       {

 

for (int j = 0; j <RowC; j++)

           {

workSheet.Cells[j + 2, i + 1] = dataGridView1[i, j].Value.ToString();

           }

       }

 

//Сохранениекниги Excel

stringpathToFile;

pathToFile = saveFileDialog1.FileName;

workSheet.SaveAs(pathToFile);

excelApp.Application.Quit();

   }

privatevoid saveFileDialog1_FileOk(object sender, CancelEventArgs e)

   {

try{ ExportToExcel(); }

catch{ MessageBox.Show("Невозможноэкспортироватьданнуютаблицу."); return; }

   }

privatevoid openFileDialog1_FileOk(object sender, CancelEventArgs e)

   {

MessageBox.Show("Файлвыбран!", "Уведомление", MessageBoxButtons.OK, MessageBoxIcon.Information);

   }

//ВыборпутикфайлуБД

publicvoidchooseFile()

   {

if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)

       {

FileInfo fi = newFileInfo(openFileDialog1.FileName);

Properties.Settings.Default.conSt = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + openFileDialog1.FileName;

Properties.Settings.Default.DbFileName = openFileDialog1.FileName;

connectionstring = Properties.Settings.Default.conSt;

Properties.Settings.Default.Save();

       }

   }

publicvoidвыбратьФайлБДToolStripMenuItem_Click(object sender, EventArgs e)

{

chooseFile();

return;  

}  

}

}


Дата добавления: 2018-06-27; просмотров: 233; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!