Програма „Решето Ератосфена

Описание:
Доступные действия
Введите защитный код для скачивания файла и нажмите "Скачать файл"
Защитный код
Введите защитный код

Нажмите на изображение для генерации защитного кода

Текст:

УКООПСПІЛКА

Івано-Франківський фінансово-комерційний

 кооперативний коледж ім. С. Граната

КУРСОВИЙ ПРОЕКТ

з дисципліни “Програмування”

на тему:

Програма „Решето Ератосфена”

       студента групи ОК-202,

спеціальності 5.05010201

“Обслуговування комп’ютерних систем і мереж”                 Комков О.

               

 

 

               

Керівник курсового проекту                                     Нагірна К.Т.

                         

Захищено __________________ з оцінкою _______________________

           (дата)

2015 рік

 
 


                          2

 



УКООПСПІЛКА

Івано-Франківський фінансово-комерційний

кооперативний коледж ім. С. Граната

Дисципліна                    Програмування

Спеціальність5.05010201 “Обслуговування комп’ютерних систем і мереж”

Курс         2                Група            ОК-202Семестр              4

Завдання

на курсовий проект студентки

Комкова Олександра Васильовича

/ прізвище, ім’я, по-батькові /

1.      Тема              Програма „Решето Ератосфена”

 


2.      Початкові дані                  у відповідності з умовою задачі

 


3.      Зміст пояснювальної записки                 Вступ;

постановка задачі на розробку програмного за­безпечення;

архітектура програми;

 опис алгоритму функціонування програмного забезпечення;

 висновок;     список використаної літератури;

додатки

 


4.      Дата видачі завдання                    23.02.2015

 


5.      Термін пред’явлення завершеної роботи на рецензію          18.05.2015

 


Календарний план

№ п/п

Етапи і зміст роботи

Документація

Термін виконання

(тиждень)

1

Одержання завдання на курсове проектування, вибір літератури, ознайомлення з літературою

1

2

2.1

2.2

2.3

2.4

Постановка задачі

Визначення вимог до програми

Визначення складу вхідних та вихід­них даних

Попередній вибір методів розв"язання задачі

Запис постановки задачі

Розділ пояснювальної записки

2

3

Розробка та затвердження технічного завдання

Технічне завдання

3

4

4.1

4.2

4.3

4.4

Технічне проектування

Уточнення методів розв"язання задачі

Визначення структури програми, її модулів та їх взаємозв’язку

Розробка основного алгоритму функціонування програми

Складання специфікацій модулів

Розділи пояснювальної записки

4

5

5.1

5.2

5.3

5.4

5.5

Робоче проектування

Уточнення структури та визначення способу організації вхідних та вихід­них даних

Розробка алгоритмів роботи модулів

Написання текстів програм

Тестування та налагодження програм

Написання пояснювальної записки

Текст програм

Набір тестів

Пояснювальна записка

4-5

6

7-8

8-10

10-11

6

Захист проекту

12

    Студент _______________________    / Комков О. В. /

(підпис)

    Керівник курсового проекту  _____________________   / Нагірна К. Т. /

(підпис)


ЗМІСТ

Вступ ........................................................4

1.  Постановка задачі на розробку програмного за­безпечення ......8

2.  Архітектура програми ........................................9

3.  Опис алгоритму функціонування програмного забезпечення .....10

4.  Висновок ...................................................11

Список використаної літератури ..............................12

Додаток А. Технічне завдання ................................13

Додаток Б. Структурна модель програмного виробу..............14

Додаток В. Блок-схема алгоритму розв’язання задачі...........15

Додаток Г. Тексти програм та модулів.........................

Додаток Д. Контрольний приклад...............................

Додаток Е. Екранні форми ....................................

5.080405.00.00.ПЗ

Зм

Лист

№ докум.

Підп.

Дата

Розробив

Комков О. В.

23.02.15

Програма „Решето Ератосфена”

Літ.

Лист

Листів

Перевірив

Нагірна К. Т.

20.05.15

У

3

ІФФККК ім. С. Граната

Н.контр.


 

ВСТУП

Починаючи з версії 4.0, до складу Турбо Паскаля включена потужна бібліотека графічних підпрограм Graph.

 Ця бібліотека в загальній кількості містить понад 50 процедур і функцій, які дозволяють керувати графічним екраном.

Для того щоб її підключити необхідно в наступному рядку після Program написати команду Uses Graph.

При запуски програми з середовища Турбо Паскаля екран знаходиться в текстовому режимі роботи, тому програма яка використовує графічні можливості комп’ютера, повинна певним чином ініціювати графічний режим роботи.

Для цього використовується процедура InitGraph. 

Записується так
InitGraph(driver, mode,path);
де driver – змінна типу Integer, яка визначає тип графічного драйвера.
mode – змінна типу Integer, яка задає режим роботи графічного адаптера.
path – вираз типу String, який місить ім’я файлу драйвера і, можливо, шлях його пошуку.

Номер залікової книжки

Лист

4

Зм

Лист

№ докум.

Підп.

Дата

 

Ініціювання графіки на Турбо Паскалі має такий вигляд:
driver:=detect;
InitGraph(driver, mode,’’);
Після того, як буде ініційований графічний режим і програма виконає всі потрібні операції потрібно перейти в текстовий режим – команда CloseGraph;

CloseGraph – завершує роботу адаптера в графічному режимі і переходить в текстовий режим.

Багато графічних процедур і функцій використовують координати екрану.

 Ці координати задаються відносно лівого верхнього кута, який в свою чергу має координати 0, 0.

Таким чином, горизонтально координати екрану збільшується зліва на право, а вертикально – зверху вниз.

В мові програмування Турбо Паскаль є такі процедури, завдяки яким можна малювати найпростіші геометричні елементи. 

Серед них:

PutPixel(x, y, color) - виводить на екран точку з координатами х, у і кольором Color причому колір задаються або числом від 0 – 15 або константою: green – зелений, red – червоний.
Line(x1, y1, x2, y2) – викреслює лінію з координатами початку – х1, у1 і кінця х2, у2.
Circle(x, y, r) – викреслює коло з координатами центра х, у і радіусом r.
Rectangle(x1, y1, x2, y2) – викреслює прямокутник за координатами кутів: х1, у1 – лівого верхнього; х2, у2 – правого нижнього.

Номер залікової книжки

Лист

5

Зм

Лист

№ докум.

Підп.

Дата

 

 

Причому всі координати – це змінні типу Integer.

Для зміни кольору використовують такі процедури:

SetColor(color) – встановлює поточний колір color для ліній і символів які виводяться.
SetBkColor(color) – встановлює колір фону – color.

Для виводу текстового повідомлення потрібно скористатися процедуроюOuttextxy(x,y,text) яка виводить текст в координатах х, у, причому змінна text має тип String і містить текст який виводиться.

Розглянемо приклади.

Program okr;
Uses graph, crt;
Var x, y, r: integer;  { параметры окружности }
dx: integer;      { шаг перемещения окружности } 
grdriver, grmode: integer;   { графический режим } 
Begin 
Grdriver:=detect;
Initgraph ( grdriver, grmode, ‘ ‘ );
X:=0;
Y:=100;
R:=20;
Dx:=2;

 

Номер залікової книжки

Лист

6

Зм

Лист

№ докум.

Підп.

Дата

Repeat

Setcolor(15);

Circle(x,y,r);

Delay(100);

Setcolor(0);

Circle(x,y,r);

X:=x+dx;

Until keypressed;

Readln;

Closegraph;

End.

Таким чином, здійснюється мультиплікація в Паскалі.

Умова: Зобразити на екрані монітора декартову систему координат, початок якої збігається з центром екрана.

Для малювання осей x та y необхідно скористатися процедурою line, причому координати початку та кінця цих прямих обчислити неважко, тому що вони повинні розміщуватись в центрі екрану.

 Градуювання осей робиться теж за допомогою коротких відрізків довжиною 8 пікселів, що розташовані з кроком step пікселів (крок в програмі заданий у вигляді константи, хоча можна його задавати і іншим чином). 

Номер залікової книжки

Лист

7

Зм

Лист

№ докум.

Підп.

Дата

Підписи на осях можна зробити таким чином: число, що треба написати, переводиться в рядок процедурою str, а потім виводиться на екран процедурою OutTextXy.

 Зверніть увагу на те, що на від"ємному проміжку вісі до числа ліворуч дописується знак "-" командою S := "-"+S, де S - рядок, що містить підпис під поділкою. 

Для якісного оформлення малюнку використовується процедура settextjustify(1,1), що забезпечує відцентроване виведення тексту у вказану позицію.

Умова: Стовпчаста діаграма - це послідовно зображені прямокутники однакової ширини, що розташовані на одному горизонтальному рівні. Висота прямокутників пропорційна значенням деякої числової послідовності.

Побудувати стовпчасту діаграму за даними n цілими значеннями. Для наочності стовпчики зафарбувати різними кольорами.

Для побудови діаграми, по-перше, необхідно задати кількість стовпчиків, тобто кількість числових значень, по яких буде будуватися діаграма, а, по-друге, - самі значення. 

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

Після введення числових даних необхідно розрахувати коефіцієнти пропорційності по осях Х та Y, щоб отримати малюнок на весь екран. Врахуємо, що максимальний розмір по осі Х - 640 пікселів, а по осі Y - 480 пікселів. 

т

Номер залікової книжки

Лист

8

Зм

Лист

№ докум.

Підп.

Дата

Тоді очевидно, що коефіцієнт по осі Х можна обчислити за формулою SizeX = 640/N - 5, де SizeX - коефіцієнт пропорційності, N - кількість стовпчиків на діаграмі. 

Константне значення 5 від дробу віднімається, щоб розділити стовпчики між собою хоча б на 5 пікселів (це значення можна змінити).

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

Для знаходження максимуму використовуємо стандартний алгоритм. Тут можна запропонувати дітям згадати цей алгоритм самостійно. 

Прогнозована відповідь: беремо у якості еталону будь-який елемент масиву, наприклад, перший, а потім порівнюємо кожний наступний елемент з еталоном і у випадку невідповідності (черговий елемент більший за еталон) замінюємо еталон. 

Після знаходження максимуму знаходимо коефіцієнт пропорційності по осі Y за очевидною формулою SizeY = 480/Max, де SizeY - шуканий коефіцієнт, Max - максимальне значення з масиву.

Обидва шукані коефіцієнти пропорційності округлюємо функцією round, тому що екранні координати не можуть бути дробовими, а після цього нормалізуємо значення масиву множенням на коефіцієнт SizeY.

Після підготовки даних можна починати побудову діаграми.

т

Номер залікової книжки

Лист

9

Зм

Лист

№ докум.

Підп.

Дата

 Кожен елемент діаграми будується процедурою Bar, що малює зафарбований прямокутник, колір якого задається процедурою SetFillStyle. 

Очевидно, що ширина кожного стовпчика буде дорівнювати SizeX - 5, тому початкова координата по осі Х дорівнює (i - 1)*SizeX, а кінцева - i*SizeX - 5, де і - змінна циклу, що рахує номер чергового стовпчика. 

Початкова координата по осі Y буде максимальною, тобто 480, а кінцева координата дорівнювати різниці між 480 та елементом масиву.

Умова: Секторною діаграмою називають круг, площі секторів якого пропорційні відповідним числовим величинам, узятим з деякої послідовності.
Для заданої послідовності з n дійсних чисел побудувати секторну діаграму. 
Для наочності сектори діаграми зафарбувати різними кольорами.
Кількість елементів діаграми в цій задачі вводиться так само, як і в попередньому випадку, тобто з клавіатури, а заповнення масиву даними зробимо генератором випадкових чисел.

Далі, як і в попередній задачі, необхідно промасштабувати початкові значення для виведення їх на екран у вигляді кругової діаграми. Для цього спочатку знаходимо суму всіх елементів масиву, а потім масштабуємо їх за формулою

Ai = Ai*360/Sum, 

де Sum - загальна сума елементів масиву, 360 - кількість градусів у повному колі.

Сама діаграма будується за допомогою процедури PieSlice, що виводить на екран зафарбований сектор круга. 

т

Номер залікової книжки

Лист

10

Зм

Лист

№ докум.

Підп.

Дата

Колір зафарбування задається процедурою SetFillStyle, а початковий та кінцевий кути сектора обчислюються від поточного кута Angle з урахуванням значення елементу масиву. 

Центр кола, на якому будується кругова діаграма, завжди константний (320; 240).

т

Номер залікової книжки

Лист

11

Зм

Лист

№ докум.

Підп.

Дата

Список використаної літератури

1.       

т

Номер залікової книжки

Лист

12

Зм

Лист

№ докум.

Підп.

Дата

Додаток А

Технічне завдання

1. Найменування та область застосування

Найменування – формування списку простих чисел за методом „Решето Ератосфена”.

Позначення - Ератосфен.

Коротка характеристика - програма знаходження та виведення списку простих чисел за алгоритмом відсіву „Решето Ератосфена”.

2. Підстава для розробки

Завдання викладача для виконання курсового проекту.

3. Призначення розробки

Ератосфен повинен знаходити всі прості числа включно до деякого найбільшого значення, використовуючи алгоритм відсіву „Решето Ератосфена.

4. Вимоги до програмного забезпечення

4.1. Вимоги до функціональних характеристик

4.1.1. Ератосфен повинен працювати в одновіконному текстовому режимі і підтримувати роботу клавіатури та маніпулятора „миша”.

4.1.2. Користувач, по своєму бажанню, повинен мати можливість припинити або продовжити роботу Ератосфена.

4.1.4. Знайдений список простих чисел повинен демонструватися на екрані у вигляді таблиці.

4.1.5. Користувач повинен мати можливість зберігати інформацію про знайдений список простих чисел у текстовому файлі.

4.1.10. Програма повинна забезпечувати перегляд вихідного результату.

4.2. Вимоги до надійності

4.2.1. Програма повинна обробляти помилкові дії користувача і повідомляти йому про помилки.

4.2.2. Програма повинна контролювати послідовність дій користувача.

4.3.Вимоги до складу і параметрів технічних засобів

4.4.1. Програмне забезпечення розробляється для персональної обчислювальної техніки типу не нижче IBM PC-386 з наступними характеристиками:

- обсяг ОЗУ не нижче 1 Mb;

- графічний адаптер SVGA;

- маніпулятор типу "миша".

4.4.2. ЕОМ повинна працювати під керуванням операційної системи не нижче, ніж MS-DOS 5.0.

т

Номер залікової книжки

Лист

13

Зм

Лист

№ докум.

Підп.

Дата

Додаток Б

Структурна модель програмного виробу

т

Номер залікової книжки

Лист

14

Зм

Лист

№ докум.

Підп.

Дата

Додаток В

Блок-схема алгоритму розв’язання задачі

Програма eratosfen

т

Номер залікової книжки

Лист

15

Зм

Лист

№ докум.

Підп.

Дата

Додаток Г

Тексти програм та модулів

Програма eratosfen.pas

PROGRAM ERATOSFEN;

USES CRT, mymodul;

TYPE type_punkt=(prg, dani, rozr, rez, vuh);

     arr=ARRAY[1..399] OF WORD;

     arr1=ARRAY[1..19] OF WORD;

     vkarr=^arr; vkarr1=^arr1;

CONST menu: ARRAY[type_punkt] OF STRING[14]=

      ("Pro programy ", "Dani ", "Rozrahunok ", "Rezultat ", "Vuhid ");

      poz=10;

VAR x1, y1, x2, y2:BYTE; sim:CHAR; punkt: type_punkt;

    StartAttr:BYTE; OldMode:INTEGER;

    prime: vkarr; mult : vkarr1;

    n, m: WORD;

PROCEDURE prc_prg;

BEGIN

    TEXTBACKGROUND(15);

    TEXTCOLOR(6);

    CLRSCR;

    x1:=2;  y1:=4;  x2:=78;  y2:=20;

    ramka(x1,y1,x2,y2);

    GOTOXY(15,6); WRITELN("KURSOVUY PROEKT");

    GOTOXY(10,WHEREY); WRITELN("tema "Recheto Eratosfena"");

    GOTOXY(10,WHEREY); WRITELN("studenta ...");

    GOTOXY(30,22);

    WRITELN("PRESS KEY...");

    READLN;

END;

PROCEDURE prc_dani;

LABEL mitka;

VAR   x3, y3:BYTE;

      pr:BOOLEAN;

      CurEAttr:BYTE;

BEGIN

    TEXTBACKGROUND(15);

    TEXTCOLOR(1);

    CLRSCR;

    x1:=2;  y1:=4;  x2:=78;  y2:=20;

    GOTOXY(25,6); WRITELN("Recheto Eratosfena");

    GOTOXY(15,WHEREY+3); WRITE("Vkajit kilkist prostux chusel:");

    x3:=WHEREX+5; y3:= WHEREY;

mitka: GOTOXY(x3,y3);

    CLREOL;

    ramka(x1,y1,x2,y2);

      GOTOXY(x3,y3);

    cursor_on;

  {$I-} READLN(n); {$I+}

    cursor_off;

    pr:=(IORESULT<>0);

    pr:=(pr OR (n>20) OR (n<=0));

т

Номер залікової книжки

Лист

9

Зм

Лист

№ докум.

Підп.

Дата

    IF pr THEN

    BEGIN

         CurEAttr:=TEXTATTR;

         GOTOXY(25,15);

         TEXTCOLOR(4);

         WRITELN("ERROR!!!  PRESS KEY...");

         READKEY;

         GOTOXY(25,15);  CLREOL;

         TEXTATTR:=CurEAttr;

         ramka(x1,y1,x2,y2);

         GOTO mitka;

    END;

    m:=n*n;

    GOTOXY(30,22);

    WRITELN("PRESS KEY...");

    READLN;

END;

PROCEDURE prc_rozr;

VAR accept:BOOLEAN;

    p,s,i,j,k:WORD;

BEGIN

    NEW(prime);

    NEW(mult);

    prime^[1]:=2;

    p:=2;

    k:=1;

    s:=sqr(prime^[1]);

    FOR i:=2 TO m-1 DO

    BEGIN

         REPEAT

                 inc(p);

           IF s<=p THEN

           BEGIN

             mult^[k]:=s;

            inc(k);

             s:=sqr(prime^[k]);

                 END;

               accept:=TRUE;

               FOR j:=1 TO k-1 DO

               BEGIN

                 IF mult^[j]

                 accept:=(mult^[j]>p);

             IF NOT accept THEN BREAK

           END;

         UNTIL accept;

         prime^[i]:=p;

    END;

    TEXTBACKGROUND(15);

    TEXTCOLOR(1);

    CLRSCR;

    x1:=2;  y1:=4;  x2:=78;  y2:=20;

    ramka(x1,y1,x2,y2);

    GOTOXY(25,6); WRITELN("Recheto Eratosfena");

    GOTOXY(20,10); TEXTCOLOR(4);

    WRITE("Rozrahunok uspichno zavercheno!!!");

т

Номер залікової книжки

Лист

10

Зм

Лист

№ докум.

Підп.

Дата

    GOTOXY(30,22); TEXTCOLOR(1);

    WRITELN("PRESS KEY...");

    READLN;

END;

PROCEDURE prc_rez;

VAR  i:WORD;

BEGIN

    TEXTMODE(CO80+FONT8X8);

    TEXTBACKGROUND(15);

    TEXTCOLOR(1);

    CLRSCR;

    GOTOXY(25,3); WRITELN("Recheto Eratosfena");

    WRITELN;

    FOR i:=1 TO 10 DO WRITE(i:7);

    WRITELN;

    TEXTCOLOR(YELLOW);

    FOR i:=1 TO m-1 DO

    BEGIN

            WRITE(prime^[i]:7);

      IF i MOD 10=0 THEN WRITELN

    END;

    GOTOXY(30,WHEREY+2);

    TEXTCOLOR(1);

    WRITELN("PRESS KEY...");

    x1:=1;  y1:=1;  x2:=79;  y2:=49;

    ramka(x1,y1,x2,y2);

    READLN;

    TEXTMODE(CO80);

END;

PROCEDURE prc_vuh;

BEGIN

    TEXTATTR:= StartAttr;

    TEXTMODE(OldMode);

    cursor_on;

    HALT;

END;

PROCEDURE osn_menu;

VAR s: type_punkt;

    nom: INTEGER;

BEGIN

    WINDOW(1,1,80,25);

    TEXTBACKGROUND(3);

    TEXTCOLOR(1);

    CLRSCR;

    x1:=25;  y1:=8;  x2:=55;  y2:=16;

    ramka(x1,y1,x2,y2);

    FOR s:=prg TO vuh DO

       IF s=punkt THEN

         BEGIN

           nom:=poz+ord(s);

           TEXTBACKGROUND(7);

           GOTOXY(x1+8,nom);

           WRITE(menu[s]);

           TEXTBACKGROUND(3);

т

Номер залікової книжки

Лист

11

Зм

Лист

№ докум.

Підп.

Дата

           TEXTCOLOR(1);

         END

       ELSE

        BEGIN

           nom:=poz+ord(s);

           GOTOXY(x1+8,nom);

           WRITE(menu[s]);

         END;

    GOTOXY(30,24);

    WRITE("ENTER-vubir");

END;

BEGIN   {golovna programa}

  StartAttr:=TEXTATTR;

  OldMode:=LASTMODE;

  TEXTMODE(CO80);

  cursor_off;

  punkt:=prg;

  REPEAT

    osn_menu;

    REPEAT

        sim:=READKEY;

        IF (sim=#0) AND KEYPRESSED THEN

           sim:=READKEY;

           CASE sim OF

               #80: IF punkt <> vuh THEN punkt:=SUCC(punkt)

                                    ELSE punkt:=prg;

               #72: IF punkt <> prg THEN punkt:=PRED(punkt)

                                    ELSE punkt:=vuh;

           END;

    UNTIL sim = #13;   {Enter}

    CASE punkt OF

        prg : prc_prg;

        dani: prc_dani;

        rozr: prc_rozr;

        rez : prc_rez;

        vuh : prc_vuh;

    END

  UNTIL FALSE

END.

т

Номер залікової книжки

Лист

12

Зм

Лист

№ докум.

Підп.

Дата

Модуль mymodul.pas

UNIT mymodul;

INTERFACE

      USES crt,dos;

      PROCEDURE ramka(x1,y1,x2,y2:BYTE);

      PROCEDURE cursor_off;

      PROCEDURE cursor_on;

IMPLEMENTATION

PROCEDURE ramka(x1,y1,x2,y2:BYTE);

     VAR i: INTEGER;

     BEGIN

       GOTOXY(x1,y1); WRITE("╔");  {ALT+CTRL+201}

       FOR i:=1 TO x2-x1-1 DO WRITE("═"); {ALT+CTRL+205}

       WRITE("╗");   {ALT+CTRL+187}

       FOR i:=1 TO y2-y1-1 DO

       BEGIN

          GOTOXY(x1,y1+i); WRITE("║");    {ALT+CTRL+186}

            GOTOXY(x2,y1+i); WRITE("║");    {ALT+CTRL+186}

       END;

       GOTOXY(x1,y2); WRITE("╚");  {ALT+CTRL+200}

       FOR i:=1 TO x2-x1-1 DO WRITE("═"); {ALT+CTRL+205}

       WRITE("╝");   {ALT+CTRL+188}

      END;

    PROCEDURE cursor_off;

    VAR regs:registers;

    BEGIN

      regs.ax:=$0100;

      regs.cx:=$2607;

      intr($10,regs);

    END;

    PROCEDURE cursor_on;

    VAR regs:registers;

    BEGIN

      regs.ax:=$0100;

      regs.cx:=$0506;

      intr($10,regs);

    END;

END.

т

Номер залікової книжки

Лист

13

Зм

Лист

№ докум.

Підп.

Дата

Додаток Д

Контрольний приклад

Вхідні повідомлення:

 


Вихідні повідомлення:

 

т

Номер залікової книжки

Лист

13

Зм

Лист

№ докум.

Підп.

Дата

Додаток Е

Екранні форми

Головне меню програми

 


Пункт меню „Про програму”

 
 


Пункт меню „Дані”

 


т

Номер залікової книжки

Лист

13

Зм

Лист

№ докум.

Підп.

Дата

Пункт меню „Розрахунок”

 


 
Пункт меню „Результат”

т

Номер залікової книжки

Лист

13

Зм

Лист

№ докум.

Підп.

Дата

Информация о файле
Название файла Програма „Решето Ератосфена от пользователя a.v.
Дата добавления 5.5.2020, 18:14
Дата обновления 5.5.2020, 18:14
Тип файла Тип файла (zip - application/zip)
Скриншот Не доступно
Статистика
Размер файла 2 мегабайт (Примерное время скачивания)
Просмотров 374
Скачиваний 140
Оценить файл