Главная страница
Навигация по странице:

  • 2.5 Определение структуры модуля для работы с файлом. В модуле для работы с типизированным файлом(GetFile.pas) определено два пользовательских типа – RecordCars и RecordZapros

  • FileCars и FileZapros

  • Экспериментальная часть 3.1 Инструкция для пользователя

  • 3.2 Определение интерфейса класса-массива

  • 3.4 Тестирование Тест №1 При вводе в поле размера массива некоректного значения – возникает модальное окно с предупреждением.Тест №2

  • Тест№3 Создаём массив машин из 3 элементов и вводим в поля ввода (‘111’,’222’,’333’,’qqq’) [добавить запись] - выводится модальное окно с предупреждением. Тест№3

  • Тест№5 Создаём массив машин из 3 элементов [Загрузить из файла] – таблица вывода заполняется данными из файла.Тест№6

  • Спасибо за внимание! Список используемой литературы

  • Приложения Модуль-форма класса-варианта

  • Московский государственный Институт Радиотехники. Г. Москва Курсовая работа по програмированию на языке высокого уровня. Тема Автосалон. Студента факультета вмс, группы вв607 Станкевича Сергея Алексеевича Г. Москва,2008 Реферат


    Скачать 318.5 Kb.
    НазваниеГ. Москва Курсовая работа по програмированию на языке высокого уровня. Тема Автосалон. Студента факультета вмс, группы вв607 Станкевича Сергея Алексеевича Г. Москва,2008 Реферат
    Дата27.09.2021
    Размер318.5 Kb.
    Формат файлаdoc
    Имя файлаМосковский государственный Институт Радиотехники.doc
    ТипКурсовая
    #237896
    страница2 из 3
    1   2   3

    procedure NullZapros; - задаёт размер массива запросов равный нулю.

    Function GetN : integer; - возвращае размер массива запросов.

    procedure Insert_Zapros(Telefon,Marka,Sost :string; const Cena:integer; L:integer); - производит вставку данных о каком-либо запросе в массив запросов в позицию L.
    procedure Add_Zapros(const Telefon : string; const Marka : string; const Sost : string; const Cena : integer); - заполняявсеполя, добавляетодинэлементкмассивузапросов.
    function Get_Zapros(const i : integer) : string; - возвращает строку состоящую из полей i-ого элемента массива запросов в специальном формате.
    function Get_Marka(L : integer):string; - возвращает значение поля марки элемента массива запросов под номером L.

    function Get_Sost(L : integer):string; - возвращает значение поля технического состояния элемента массива запросов под номером L.

    function Get_Cena(L : integer):integer; - возвращает значение поля цены элемента массива запросов под номером L.
    Так же реализованн костуктор класса AvtoSalon2.
    2.5 Определение структуры модуля для работы с файлом.

    В модуле для работы с типизированным файлом(GetFile.pas) определено два пользовательских типа – RecordCars и RecordZapros – типа запись и имеющие поля для хранения информации данных о машине и запросе соответственно.

    Также определено два пользовательских типа – FileCars и FileZapros – типа типизированный файл RecordCars и RecordZapros соответственно. Эти два типа предназначены для работы с файлами.
    Для работы с файлами были определены процедуры:
    procedure GetFileCars(var Mas : AvtoSalon; const FFF : string); - производитзаполнениемассивамашинизфайласименем FFF.

    procedure GetFileZapros(var Mas : AvtoSalon2; const FFF : string); - производит заполнение массива запросов с именем FFF.
    Экспериментальная часть

    3.1 Инструкция для пользователя

    Для успешного использования программы достаточно обладать самыми основными навыками работы с компьютером и операционной системой Microsoft Windows.
    3.2 Определение интерфейса класса-массива

    Разработанное приложение класс-массив



    При разработке интерфеса формы класс-массива было использованно: 14 текстовых полей и 10 кнопок группированных по элементам GroupBox. Для удобного вывода информации используется 2 таблицы StringGrid содержащие 5 колонок и изменяющееся (в ходе программы) количество строк.
    3.3 Определение интерфейса класс-варианта

    Разработанное приложение класс-вариант




    При разработке интерфейса формы класс-варианта было использованно: 8 текстовых полей и 5 кнопок группированных по элементам GroupBox.Для удобного вывода информации используется 2 таблицы StringGrid, содержащие по 2 колонки и 5 строк.
    3.4 Тестирование

    Тест №1

    При вводе в поле размера массива некоректного значения – возникает модальное окно с предупреждением.

    Тест №2

    Размер массива машин <---- 2 [создать] – выводится модальное окно с подтверждением создания массива.

    Тест№3

    Создаём массив машин из 3 элементов и вводим в поля ввода (‘111’,’222’,’333’,’qqq’) [добавить запись] - выводится модальное окно с предупреждением.

    Тест№3

    Создаём массив машин из 3 элементов и вводим в поля ввода (‘audi’,’1999’,’хорошее’,’156500’) [добавить запись] - в таблице вывода появляется строка Audi 1999 Хорошее 156500

    Тест№4

    Создаём массив машин из 3 элементов и вводим в поля ввода ‘audi’,’1999’,’хорошее’,’156500’,’3’) [добавить запись] - в таблице вывода на третей строке появляется запись Audi 1999 Хорошее 156500

    Тест№5

    Создаём массив машин из 3 элементов [Загрузить из файла] – таблица вывода заполняется данными из файла.

    Тест№6

    Создаём массив машин из 3 элементов, а в поле выбора файла пишем (‘Prprpr.pas’)[Загрузить из файла] – выводится модальное окно с предупреждением.

    Тест№7

    Создаём массив машин из 3 элементов [Загрузить из файла] [Отсортировать по году выпуска] – в таблице вывода появляется отсортированный список



    Вывод

    В ходе работы над данным курсовым проектом я довольно подробно изучил специфику ООП в среде Delphi. Так же мне было очень интересно познакомиться с процессом разработки многофункционального приложения на примере программы Автосалон. Я считаю, что владение ООП очень перспективная сфера деятельности, которая ещё будет развиваться всё дальше и дальше.

    Спасибо за внимание!

    Список используемой литературы

    Фаронов В.В: “Turbo Pascal 7.0 начальный курс”

    Лекции по программированию на ЯВУ за 1 курс.

    Анатолий Хомоненко, Владимир Гофман, Евгений Мещеряков, Владимир Никифоров: “Delphi7 наиболее полное руководство” в подлиннике.

    Приложения

    Модуль-форма класса-варианта

    unit Avtosalon;
    interface
    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, ExtCtrls, Grids, StdCtrls, Avtomobil, Pokupatel;
    type

    TForm1 = class(TForm)

    Bevel1: TBevel;

    Button1: TButton;

    GroupBox1: TGroupBox;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Edit4: TEdit;

    StringGrid1: TStringGrid;

    Button2: TButton;

    Bevel2: TBevel;

    Bevel4: TBevel;

    Bevel5: TBevel;

    Bevel6: TBevel;

    Button4: TButton;

    GroupBox2: TGroupBox;

    Edit5: TEdit;

    Edit6: TEdit;

    Edit7: TEdit;

    Edit8: TEdit;

    StringGrid2: TStringGrid;

    Button5: TButton;

    Button6: TButton;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    Label8: TLabel;

    procedure FormShow(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Edit1Change(Sender: TObject);

    procedure Edit2Change(Sender: TObject);

    procedure Edit3Change(Sender: TObject);

    procedure Edit4Change(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Edit5Change(Sender: TObject);

    procedure Edit6Change(Sender: TObject);

    procedure Edit7Change(Sender: TObject);

    procedure Edit8Change(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;

    var Form1: TForm1;

    Car : Avto;

    Zapros : Potrebitel;
    implementation
    {$R *.dfm}
    procedure TForm1.FormShow(Sender: TObject);

    begin

    StringGrid1.Rows[0].Strings[1] := 'Ìàøèíà';

    StringGrid1.Rows[1].Strings[0] := 'Ìàðêà';

    StringGrid1.Rows[2].Strings[0] := 'Ãîä âûïóñêà';

    StringGrid1.Rows[3].Strings[0] := 'Ñîñòîÿíèå';

    StringGrid1.Rows[4].Strings[0] := 'Öåíà';
    StringGrid2.Rows[0].Strings[1] := 'Ïîêóïàòåëü';

    StringGrid2.Rows[1].Strings[0] := 'Òåëåôîí';

    StringGrid2.Rows[2].Strings[0] := 'Ìàðêà';

    StringGrid2.Rows[3].Strings[0] := 'Ñîñòîÿíèå';

    StringGrid2.Rows[4].Strings[0] := 'Öåíà';

    end;
    procedure TForm1.Button1Click(Sender: TObject);

    begin

    Car := Avto.Create_Avto('Íå îïðåäåëåíî',0,'Íå îïðåäåëåíî',0);
    Edit1.Enabled := true;

    Edit2.Enabled := true;

    Edit3.Enabled := true;

    Edit4.Enabled := true;
    Edit1.Text := Car.PMarka;

    Edit2.Text := IntToStr(Car.PGod);

    Edit3.Text := Car.PSostoianie;

    Edit4.Text :=IntToStr(Car.PCena);
    StringGrid1.Rows[1].Strings[1] := Car.PMarka;

    StringGrid1.Rows[2].Strings[1] := IntToStr(Car.PGod);

    StringGrid1.Rows[3].Strings[1] := Car.PSostoianie;

    StringGrid1.Rows[4].Strings[1] := IntToStr(Car.PCena);
    Button2.Enabled := true;

    Button1.Enabled := false;

    end;
    procedure TForm1.Button2Click(Sender: TObject);

    begin

    Car.Destroy_Avto;
    Edit1.Enabled := false;

    Edit2.Enabled := false;

    Edit3.Enabled := false;

    Edit4.Enabled := false;
    Edit1.Text := 'Îáúåêò íå ñîçäàí';

    Edit2.Text := 'Îáúåêò íå ñîçäàí';

    Edit3.Text := 'Îáúåêò íå ñîçäàí';

    Edit4.Text := 'Îáúåêò íå ñîçäàí';
    StringGrid1.Rows[1].Strings[1] := '';

    StringGrid1.Rows[2].Strings[1] := '';

    StringGrid1.Rows[3].Strings[1] := '';

    StringGrid1.Rows[4].Strings[1] := '';
    Button1.Enabled := true;

    Button2.Enabled := false;

    end;
    procedure TForm1.Edit1Change(Sender: TObject);

    begin

    if Edit1.Text <> 'Îáúåêò íå ñîçäàí' then

    begin

    Car.PMarka := Edit1.Text;
    StringGrid1.Rows[1].Strings[1] := Car.PMarka;

    end;

    end;
    procedure TForm1.Edit2Change(Sender: TObject);

    var i,c:integer;

    begin

    val(Edit2.Text,i,c);

    if (c=0) then

    begin

    Car.PGod := i;

    StringGrid1.Rows[2].Strings[1] := Edit2.Text;

    end;

    end;
    procedure TForm1.Edit3Change(Sender: TObject);

    begin

    if Edit1.Text <> 'Îáúåêò íå ñîçäàí' then

    begin

    Car.PSostoianie := Edit3.Text;
    StringGrid1.Rows[3].Strings[1] := Car.PSostoianie;

    end;

    end;
    procedure TForm1.Edit4Change(Sender: TObject);

    var i,c:integer;

    begin

    val(Edit4.Text,i,c);

    if (c=0) then

    begin

    Car.PCena := i;

    StringGrid1.Rows[4].Strings[1] := Edit4.Text;

    end;
    end;
    procedure TForm1.Button4Click(Sender: TObject);

    begin

    Zapros := Potrebitel.Create_Potrebitel('Íå îïðåäåëåíî','Íå îïðåäåëåíî','Íå îïðåäåëåíî',0);
    Edit5.Enabled := true;

    Edit6.Enabled := true;

    Edit7.Enabled := true;

    Edit8.Enabled := true;
    Edit5.Text := Zapros.PTelefon;

    Edit6.Text := Zapros.PMarka;

    Edit7.Text := Zapros.PSostoianie;

    Edit8.Text :=IntToStr(Zapros.PCena);
    StringGrid2.Rows[1].Strings[1] := Zapros.PTelefon;

    StringGrid2.Rows[2].Strings[1] := Zapros.PMarka;

    StringGrid2.Rows[3].Strings[1] := Zapros.PSostoianie;

    StringGrid2.Rows[4].Strings[1] := IntToStr(Zapros.PCena);
    Button5.Enabled := true;

    Button4.Enabled := false;

    end;
    procedure TForm1.Button5Click(Sender: TObject);

    begin

    Zapros.Destroy_Potrebitel;
    Edit5.Enabled := false;

    Edit6.Enabled := false;

    Edit7.Enabled := false;

    Edit8.Enabled := false;
    Edit5.Text := 'Îáúåêò íå ñîçäàí';

    Edit6.Text := 'Îáúåêò íå ñîçäàí';

    Edit7.Text := 'Îáúåêò íå ñîçäàí';

    Edit8.Text := 'Îáúåêò íå ñîçäàí';
    StringGrid2.Rows[1].Strings[1] := '';

    StringGrid2.Rows[2].Strings[1] := '';

    StringGrid2.Rows[3].Strings[1] := '';

    StringGrid2.Rows[4].Strings[1] := '';
    Button4.Enabled := true;

    Button5.Enabled := false;
    end;
    procedure TForm1.Edit5Change(Sender: TObject);

    begin

    if Edit5.Text <> 'Îáúåêò íå ñîçäàí' then

    begin

    Zapros.PTelefon := Edit5.Text;
    StringGrid2.Rows[1].Strings[1] := Zapros.PTelefon;

    end;

    end;
    procedure TForm1.Edit6Change(Sender: TObject);

    begin

    if Edit6.Text <> 'Îáúåêò íå ñîçäàí' then

    begin

    Zapros.PMarka := Edit6.Text;
    StringGrid2.Rows[2].Strings[1] := Zapros.PMarka;

    end;

    end;
    procedure TForm1.Edit7Change(Sender: TObject);

    begin

    if Edit7.Text <> 'Îáúåêò íå ñîçäàí' then

    begin

    Zapros.PSostoianie := Edit7.Text;
    StringGrid2.Rows[3].Strings[1] := Zapros.PSostoianie;

    end;

    end;
    procedure TForm1.Edit8Change(Sender: TObject);

    var i,c:integer;

    begin

    val(Edit8.Text,i,c);

    if (c=0) then

    begin

    Zapros.PCena := i;

    StringGrid2.Rows[4].Strings[1] := Edit8.Text;

    end;
    end;
    procedure TForm1.Button6Click(Sender: TObject);

    begin

    Form1.Close;

    end;
    end.
    Модуль формы Класса-массива

    unit A;
    interface
    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, StdCtrls, Grids, ExtCtrls, Salon, Pokupatel, GetFail;
    type

    TForm1 = class(TForm)

    StringGrid1: TStringGrid;

    GroupBox1: TGroupBox;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Edit4: TEdit;

    Button1: TButton;

    GroupBox2: TGroupBox;

    Edit5: TEdit;

    Button2: TButton;

    Edit6: TEdit;

    Label1: TLabel;

    StringGrid2: TStringGrid;

    GroupBox3: TGroupBox;

    Edit7: TEdit;

    Button3: TButton;

    GroupBox4: TGroupBox;

    Label2: TLabel;

    Edit8: TEdit;

    Edit9: TEdit;

    Edit10: TEdit;

    Edit11: TEdit;

    Button4: TButton;

    Edit12: TEdit;

    GroupBox5: TGroupBox;

    Button5: TButton;

    Button6: TButton;

    Button7: TButton;

    Button8: TButton;

    Button9: TButton;

    Edit13: TEdit;

    GroupBox6: TGroupBox;

    Button10: TButton;

    Edit14: TEdit;
    procedure Show_Grid1(const C : AvtoSalon; const l:integer);

    procedure Show_Grid3(const C : AvtoSalon; const l:integer);

    procedure Show_Grid2(const C : AvtoSalon2; const l:integer);
    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Button8Click(Sender: TObject);

    procedure Button7Click(Sender: TObject);

    procedure StringGrid2SelectCell(Sender: TObject; ACol, ARow: Integer;

    var CanSelect: Boolean);

    procedure Button9Click(Sender: TObject);

    procedure Button10Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;
    var Form1: TForm1;

    Cars : AvtoSalon;

    Zapros : AvtoSalon2;

    SelectRow : integer = -1;
    implementation
    {$R *.dfm}
    procedure TForm1.Show_Grid1(const C : AvtoSalon; const l : integer);

    var i:integer;

    begin

    StringGrid1.RowCount := l + 1;

    for i:=0 to C.GetN - 1 do StringGrid1.Rows[i+1].Text := IntToStr(i+1) + Chr(VK_RETURN) + C.Get_Car(i);

    end;
    procedure TForm1.Show_Grid2(const C : AvtoSalon2; const l : integer);

    var i:integer;

    begin

    StringGrid2.RowCount := l + 1;

    for i:=0 to C.GetN - 1 do StringGrid2.Rows[i+1].Text := IntToStr(i+1) + Chr(VK_RETURN) + C.Get_Zapros(i);

    end;
    procedure TForm1.Show_Grid3(const C : AvtoSalon; const l : integer);

    var i:integer;

    begin

    if l <> 0 then

    begin

    StringGrid1.RowCount := l + 1;

    for i:=0 to l - 1 do StringGrid1.Rows[i+1].Text := IntToStr(i+1) + Chr(VK_RETURN) + C.Get_Variant(i);

    end

    else MessageDlg('Ïî äàííîìó çàïðîñó íå íàéäåíî ïîäõîäÿùèõ ìàøèí',mtInformation,[mbOK],1);
    end;

    procedure TForm1.Button1Click(Sender: TObject);

    var i,i2,i3,c,c2,c3:integer;

    begin

    val(Edit2.Text,i,c);

    val(Edit4.Text,i2,c2);

    val(Edit6.Text,i3,c3);
    if (Edit1.Text <> 'Ìàðêà') and (Edit1.Text <> '') and

    (Edit3.Text <> 'Òåõíè÷åñêîå ñîñòîÿíèå') and (Edit3.Text <> '') and

    (c = 0) and (c2 = 0) and (i2 > 0) then

    begin

    if c3 = 0 then Cars.Insert_Car(Edit1.Text,i,Edit3.Text,i2,i3-1)

    else Cars.Add_Car(Edit1.Text,i,Edit3.Text,i2);

    Form1.Show_Grid1(Cars,Cars.GetN);

    end

    else MessageDLG('Íå âåðíûé ôîðìàò ââîäèìûõ äàííûõ',mtInformation,[mbOk],1);
    end;

    procedure TForm1.Button2Click(Sender: TObject);

    var i,c:integer;

    begin

    val(Edit5.Text,i,c);

    if (c = 0) and (i > 0) then

    begin

    Cars := AvtoSalon.Create_Cars(i);

    GroupBox1.Enabled := true;

    GroupBox5.Enabled := true;
    GroupBox2.Enabled := false;
    StringGrid1.Enabled := true;

    StringGrid1.RowCount := i+1;
    MessageDLG('Áûë ñîçäàí îáúåêò: Àâòîñàëîí',mtInformation,[mbOk],1);

    end

    else MessageDLG('Ââåäèòå ïîäõîäÿùèé ðàçìåð ìàññèâà',mtInformation,[mbOk],1);

    end;
    procedure TForm1.FormCreate(Sender: TObject);

    begin

    StringGrid1.Rows[0].Strings[0] := '¹';

    StringGrid1.Rows[0].Strings[1] := 'Ìàðêà';

    StringGrid1.Rows[0].Strings[2] := 'Ãîä âûïóñêà';

    StringGrid1.Rows[0].Strings[3] := 'Òåõ. ñîñòîÿíèå';

    StringGrid1.Rows[0].Strings[4] := 'Öåíà';
    StringGrid2.Rows[0].Strings[0] := '¹';

    StringGrid2.Rows[0].Strings[1] := 'Òåëåôîí';

    StringGrid2.Rows[0].Strings[2] := 'Ìàðêà';

    StringGrid2.Rows[0].Strings[3] := 'Òåõ. ñîñòîÿíèå';

    StringGrid2.Rows[0].Strings[4] := 'Âîçìîæíîñòè';

    end;
    procedure TForm1.Button3Click(Sender: TObject);

    var i,c:integer;

    begin

    val(Edit7.Text,i,c);

    if (c = 0) and (i > 0) then

    begin

    Zapros := AvtoSalon2.Create_Zapros(i);

    GroupBox4.Enabled := true;

    GroupBox6.Enabled := true;
    GroupBox3.Enabled := false;
    StringGrid2.Enabled := true;

    StringGrid2.RowCount := i+1;
    MessageDLG('Áûë ñîçäàí îáúåêò: Çàïðîñû',mtInformation,[mbOk],1);

    end

    else MessageDLG('Ââåäèòå ïîäõîäÿùèé ðàçìåð ìàññèâà',mtInformation,[mbOk],1);
    end;
    procedure TForm1.Button4Click(Sender: TObject);

    var i,i3,c,c3:integer;

    begin

    val(Edit11.Text,i,c);

    val(Edit12.Text,i3,c3);
    if (Edit8.Text <> 'Êîíòàêòíûé òåëåôîí') and (Edit8.Text <> '') and

    (Edit9.Text <> 'Ìàðêà') and (Edit9.Text <> '') and

    (Edit10.Text <> 'Òåõíè÷åñêîå ñîñòîÿíèå') and (Edit10.Text <> '') and

    (c = 0) and (i > 0) then

    begin

    if c3 = 0 then Zapros.Insert_Zapros(Edit8.Text,Edit9.Text,Edit10.Text,i,i3-1)

    else Zapros.Add_Zapros(Edit8.Text,Edit9.Text,Edit10.Text,i);

    Form1.Show_Grid2(Zapros,Zapros.GetN);

    end

    else MessageDLG('Íå âåðíûé ôîðìàò ââîäèìûõ äàííûõ',mtInformation,[mbOk],1);
    end;
    procedure TForm1.Button5Click(Sender: TObject);

    begin

    Cars.Sort_Mas(true);
    Form1.Show_Grid1(Cars,Cars.GetN);

    end;
    procedure TForm1.Button6Click(Sender: TObject);

    begin

    Cars.Sort_Mas(false);
    Form1.Show_Grid1(Cars,Cars.GetN);

    end;
    procedure TForm1.Button8Click(Sender: TObject);

    begin

    Form1.Show_Grid1(Cars,Cars.GetN);

    end;
    procedure TForm1.Button7Click(Sender: TObject);

    begin

    if SelectRow <> -1 then

    begin

    Cars.Find_Variants(Zapros.Get_Marka(SelectRow - 1),Zapros.Get_Sost(SelectRow - 1),Zapros.Get_Cena(SelectRow - 1));
    Form1.Show_Grid3(Cars,Cars.GetZ);

    end

    else MessageDlg('Âûáåðèòå çàïðîñ â òàáëèöå çàïðîñîâ',mtInformation,[mbOK],1);

    end;
    procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,

    ARow: Integer; var CanSelect: Boolean);

    begin

    SelectRow := ARow;

    end;
    procedure TForm1.Button9Click(Sender: TObject);

    begin

    GetFileCars(Cars,Edit13.Text);
    Form1.Show_Grid1(Cars,Cars.GetN);

    end;
    procedure TForm1.Button10Click(Sender: TObject);

    begin

    GetFileZapros(Zapros,Edit14.Text);
    Form1.Show_Grid2(Zapros,Zapros.GetN);

    end;
    end.
    1   2   3


    написать администратору сайта