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



ЗНАЕТЕ ЛИ ВЫ?

Позначення елементів двовимірних масивів

Поиск

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

Масив даних у програмі розглядається як змінна структурованого типу. Масиву привласнюється ім'я, за допомогою якого можна посилатися як на масив даних у цілому, так і на кожний з його компонентів.

Змінні, що представляють компоненти масивів, називаються змінними з індексами на відміну від простих змінних, що представляють у програмі елементарні дані. Індекс у позначенні компонентів масивів може бути константою, змінною або виразом порядкового типу.

Якщо за кожним елементом масиву закріплений тільки один його порядковий номер, то такий масив називається лінійним. Взагалі кількість індексів елементів масиву визначає розмірність масиву. По цій ознаці масиви діляться на одномірні (лінійні), двовимірні, тривимірні і т.п.

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

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

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

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

Загальний вигляд інструкції оголошення масиву такий:

Ім’я: array [нижній перший індекс. верхній перший індекс, нижній другий індекс.. верхній другий індекс ] of тип;

де ім’я - ім’я змінної масиву;

array -зарезервоване слово мови TPascal, яке означає, що змінна є масивом;

нижній перший індекс, верхній перший індекс, нижній другий індекс, верхній другий індекс нижній індекс - цілі константи, які визначають діапазон зміни індексу елементів масиву та кількості елементів (розмір) масиву;

тип – тип елементів масиву.

Наприклад, задана матриця А розмірністю 3 4 має наступний вид:

Тут елемент A[2,1]=5, A[1,2]=-7, A[3,2]=5, A[3,3]=-8. Перший індекс елемента двовимірного масиву задає номер рядка матриці, у якій розташований елемент, другий індекс - номер стовпця.

Якщо число рядків матриці рівняється числу стовпців, то матриці даного типу називаються квадратними. Елементи квадратної матриці виду B[1,1], B[2,2], B[3,3]... становлять головну діагональ матриці. Іноді вводять поняття побічної діагоналі квадратної матриці для елементів виду B[1,N], B[2,N-1], B[3,N-2]...B[N,1], де N - число рядків (стовпців) матриці.

Приклади:

TYPE MATR = ARRA Y [1..4,1..5] OF INTEGER;

TYPE B = ARRA Y [2..9,0..6] OF REAL;

TYPE C=ARRAY[-1..4,-1..4] OF CHAR.

Також допускається вказівка імені іншого типу масиву як тип елементів масиву, наприклад:

TYPE VEC=ARRAY[1..4] OF REAL;

MAS=ARRAY[1..5] OF VEC.

Такий запис еквівалентний наступному:

TYPE MAS = ARRAY[1..5,1..4] OF REAL.

В результаті наведеного вище опису тип масиву MAS буде оголошений як тип двовимірного масиву, перший індекс якого буде мінятися від 1 до 5, а другий індекс - від 1 до 4, тобто розмірність масиву складе 5 4 елементів.

При введенні та виведенні елементів двовимірних масивів використаються вкладені цикли, у яких зовнішній оператор циклу, як правило, задає зміну рядків масиву, внутрішній оператор циклу - зміну стовпців.

Приклад розв’язання задач обробки двовимірних масивів

Нехай задана матриця А розмірністю 3×4 із дійсних чисел. Знайти найбільший елемент у другому рядку даної матриці.

Програма розв’язання завдання

Program max_st;

Type Matr=array[1..3,1..4] of real;

Va r max: real;

a:Matr;

i,j:integer;

Begin

for i:=1 to 3 do

for j:=1 to 4 do

begin

write(' a=[', i, ',',j,']=');

readln(a[i,j]);

end;

max:=a[2,1];

for j:=2 to 4 do

if max<a[2,j] then

max:=a[2,j];

writeln ('Найбільший елемент другого рядка =', max:8:2);

End.

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

Реакція ЕОМ

a=[1,1]=1.2
a=[1,2]=1.3
a=[1,3]=1.4
a=[1,4]=2.3
a=[2,1]=2.5
a=[2,2]=33
a=[2,3]=98.3
a=[2,4]=-32.3
a=[3,1]=3
a=[3,2]=.53
a=[3,3]=.333
a=[3,4]=1.36
Найбільший елемент другого рядка = 98.30

 


 

Блок-схема алгоритму

Хід роботи:

1. Вивчити теоретичний матеріал.

2. Виконати індивідуальне завдання.

3. Скласти звіт, в якому відповісти на теоретичні питання, описати алгоритм, описати програму, привести контрольний приклад виконання програми.

Контрольні запитання:

1. Що називають двовимірним масивом?

2. Якою може бути розмірність масиву у мові Pascal?

3. Приведіть приклад двовимірного масиву.

4. Чому масив є структурованим типом даних?

5. Що таке розмірність масиву? Чи існують обмеження на розмірність масиву?

6. Якого типу можуть бути елементи масиву?

7. Якого типу можуть бути індекси елементів масиву?

8. Які прості типи даних відносяться до порядкових?

9. Якими способами може бути сформований масив? Приведіть приклади.

10. Як визначити кількість комірок, що відводяться під масив?

11. Які дії виконують над елементами масиву?

12. Чи може масив бути елементом масиву?

13. Що позначають індекси матриці?

14. Скільки елементів у матриці з 7 рядків та 9 стовпчиків?

15. Дайте поняття квадратної матриці, діагоналей квадратної матриці.

16. Як обробляються рядки у двовимірному масиві?

17. Які властивості мають елементи, які знаходяться на головній діагоналі?

18. Які властивості елементів, розташованих під побічною діагоналлю?

Індивідуальні завдання: Скласти алгоритм та програму для розв¢язання задачі.

1. Дано дійсну квадратну матрицю n x n. Потрібно перетворити матрицю таким чином: поелементно відняти останній рядок із усіх рядків, крім останнього.

2. Дано квадратна матриця А розміру nхn цілих чисел. Одержати b1 ,...,bn. , де bi- це найменше із значень елементів, що знаходяться на початку i-того рядка до елемента aii включно.

3. Дано квадратну матрицю А розміру nхn цілих чисел. Одержати b1 ,...,bn. , де bi- це значення першого додатнього елемента i-той рядка матриці (якщо таких елементів немає, то прийняти bi= -1.

4. Дано квадратну матрицю А розміру n x n цілих чисел. Знайти номера стовпчиків, всі елементи яких - нулі.

5. Дано квадратну матрицю А розміру n x n цілих чисел. Знайти номера стовпчиків, в яких елементи однакові.

6. Дано квадратну матрицю А розміру n x n цілих чисел. Знайти номера стовпчиків, елементи кожного з який утворять зростаючу послідовність.

7. У даній квадратній матриці розміру n x n цілих чисел зазначити індекси всіх елементів, що мають найбільше значення.

8. За допомогою матриці дійсних чисел

на площині задано n точок так, що x1j, x2j- координати j-ї точки. Точки попарно сполучені відрізками. Знайти довжину найбільшого відрізка.

9. Дано квадратну матрицю розміру n x n. Одержати транспоновану матрицю.

10. У даній матриці дійсних чисел розміру 6х9 поміняти місцями рядок, що містить елемент із найбільшим значенням, із рядком, що містить елемент із найменшим значенням.

11. У даній квадратній матриці цілих чисел порядку n зазначити індекси всіх елементів із найбільшим значенням.

12. Дано дійсну матрицю розміру n x m, всі елементи якої різні. У кожному рядку вибирається елемент із найменшим значенням, потім серед цих чисел вибирається найбільше. Зазначити індекси елемента із знайденим значенням.

13. Дано дійсну матрицю розміру m x n. Знайти суму найбільших значень елементів її рядків.

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

15. Дано дійсну матрицю розміру m x n. Знайти середнє арифметичне найбільшого і найменшого елементів матриці.

16. Для кожної колонки двовимірного масива Z обчислити добуток елементів, що не дорівнюютть нулю.

17. Визначити кількість елементів, що дорівнюють нулю в кожному рядку двовимірного масиву G.

18. Визначити кількість позитивних елементів у кожній колонці двовимірного масиву X.

19. Визначити номери колонок двовимірного масиву C, які містять позитивні елементи.

20. Обчислити суму позитивних елементів двовимірного масива А.

21. Для кожного рядка двовимірного масива D обчислити суму елементів колонок з парними номерами.

22. Визначіть кількість елементів, що не дорівнюють нулю, у кожній колонці двовимірного масиву B.

23. Визначити кількість від’ємних елементів у кожній колонці двовимірного масиву B.

24. Визначити найбільший елемент у кожній колонці двовимірного масиву E.

25. Обчислити суму від’ємних елементів для кожного рядка двовимірного масиву F.

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

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

28. Знайти найбільший елемент та його індекси у двовимірному масиві H

29. Визначити кількість від’ємних елементів кожного рядка двовимірного масиву C

30. Обчислити суму позитивних елементів двовимірного масиву D


Лабораторна робота №8.

Тема роботи: “ Організація програм, для роботи з рядковими змінними ”

Мета роботи: дати навички студентам розв’язувати задачі з використанням рядкових змінних.

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

Рекомендована література.

1. Жалдак М.І., Рамський Ю.С. Інформатика: навч. Посібник.-К.: Вища шк.,1991 стр.233-237.

2. Вычислительная техника и программирование: Учеб. Для техн. вузов/ А.В. Петров, В.Е. Алексеев, А.С. Ваулин и др.; Под редакцией А.В. Петрова.- М.: Высш. Шк. 1990.-стр.233-234.

3. Епанешников, В. Епанешников Программирование в среде Turbo Pascal 7.0.-М.: «Диагог-МИФИ», 1993, стр.28-31.

4. ФароновВ.В. Турбо Паскаль 7.0. Учебное пособие. В 2-х книгах -М.: «Нолидж», 1997, т.1. стр. 278-286.

5. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7/0. К.: Юниор, 1997. Стр.216-220.

Теоретичні положення

Рядкові змінні - це одномірні впаковані масиви символів, для опису яких в TURBO PASCAL уведений тип String. Наприклад, якщо рядок містить до 30 символів, її тип буде визначений як

type s= String [30].

Довжина рядка не може містити більш, ніж 255 символів. В TURBO PASCAL визначене поняття рядка змінної довжини, у цьому випадку її опис задається як

type s= String;

Тип String без вказівки довжини сполучимо з усіма типами рядків. Особливістю рядкових змінних є те, що до них можна звертатися як до скалярним змінних, так і до масивів. У другому випадку застосовується конструкція "змінна з індексом", що забезпечує доступ до окремих символів рядка. При цьому нижня границя індексу дорівнює 1. Окремий символ рядка s получимо з типом Char.

У пам'яті ЕОМ рядок займає кількість байтів, на одиницю більше її довжини. Нульовий байт рядка містить її довжину. Для рядків визначені операції присвоювання, злиття (конкатенації) і порівняння.

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

Рядки можуть бути елементами списку уведення - висновку, при цьому записується ім'я рядка без індексу.

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

Ініціалізація рядків може вироблятися як за допомогою типізованих констант:

const sName: String[9]= 'IBM PC/AT';

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

Тип String (рядок) у Турбо Паскалі широко використовується для обробки текстів. Цей тип є стандартним і багато в чому схожий на одномірний масив символів Array [0..N] of Char. Значення N відповідає кількості символів у рядку й може змінюватися від 0 до 255. Символи, що входять у рядок, займають позиції з 1 до N. Початковий байт рядка з індексом 0 містить інформацію про її довжину, тобто це символ з кодом, рівним довжині рядка.

Можна, також описувати змінні типу String [K], де K - ціле число не більше 255. Так визначаються рядки з довжиною не більше K. Цей тип уже не є стандартним. Із символами рядка можна працювати як з елементами масиву із символів, але на відміну від масивів, рядки можна вводити цілком, порівнювати один з одним і зчіплювати операцією "+".

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

ПРИКЛАД: Порівняння рядків.

'abcd' > 'abcD' { 'd'>'D' }

'abcd' > 'abc' { 'd'> ' }

'abc' < 'axxc' { 'b'<'x' }

'abcd' = 'abcd'

Існує ряд стандартних функцій і процедур для роботи з рядками.

• Функція Length (s) видає довжину рядка s.

• Функція Concat (s1,s2,..,sn) повертає рядок s1+s2+..+sn.

• Функція Copy (s,p,k) повертає фрагмент рядка s, що починається в позиції p і має довжину k.

• Функція Pos (s1,s) шукає перше входження підстроки s1 у рядок s і повертає номер першого символу s1 у рядку s або 0 якщо входження не знайшли.

• Процедура Delete (St, poz, n) видаляє з рядка s фрагмент, що починається в позиції p і має довжину k.

Приклад

Значеня St Вираз Результат
абвгде Delete(St, 4, 2) абве'
'ріка Волга' Delete(St, 1, 5) 'Волга'

• Процедура Insert (s,s1,p) вставляє в рядок s підстроку s1, починаючи із заданої позиції p.

Chr (x) - перетворить вираження у символ і повертає значення символу

Ord (ch) - перетворить символ ch у його код і повертає значення коду

Pred (ch) - повертає попередній символ

Succ (ch) - повертає наступний символ

Приклад. Ord (':') =58

Ord ('A')=65 Chr (128)=B Pred ('B')=A Succ ('r')=A

Спочатку будь-який описаний у розділі Var рядок містить "сміття" і рекомендується заповнювати рядки порожніми значеннями або чим-небудь іншим.

Для заповнення досить довгих рядків однаковими символами використовується убудована процедура FillChar, наприклад:

Var S: string[80];

Begin...

FillChar(S[1],80,' '); {Заповнення рядка пробілами}
S[0]:=Chr(80); {Занесення коду довжини рядка}

End.

Довжину рядка можна визначити також, використовуючи убудовану функцію Length (S), де S - рядок типу String.

У ряді випадків виникає необхідність перетворення числових значень у рядок і навпаки. Для цього можна використати дві процедури:

1) Str (X,S) - перетворить числове значення X у рядкове S. Можливе
завдання формату для X у виді: X:F:n (для речовинних чисел, де F - загальне
число позицій виділюваних під число, включаючи десяткову крапку, а n - число
знаків у дробовій частині) або X:F (для цілих чисел). Ця функція найчастіше
використається при роботі із процедурами модуля GRAPH. Наприклад:

Str (55,s); - рядкова змінна s приймає значення, рівне '55'.

2) Val (S,X,ErrCode) - перетворить рядок S у числове значення, якщо це
можливо. Параметр ErrCode містить нуль, якщо перетворення пройшло
успішно, і тоді в X міститься результат перетворення, у противному випадку
він містить номер позиції в рядку S, де виявлений помилковий символ.
Наприклад:

Val ('125',K,kod) - у результаті виконання цієї процедури змінна До одержує ціле значення, рівне 125, параметр kod=0;

Val (' 1.05',M,code) - M=1.05, code=0;

Val ('100, ',N,code) - це помилковий виклик, тому що у вихідному рядку на 4-й позиції розташовується неприпустимий для числа символ ', ' і тому параметр code=4, а змінна N залишається без зміни.

Турбо Паскаль дозволяє робити перетворення числових значень у строкові й навпаки. Для цього використаються процедури Str (X:n:d,S) і Val (S,X,e). Перша одержує їхні числа X рядок S із зображенням цього числа, у якій не менш n символів і з них d знаків після коми. Параметри n й d необов'язкові. Друга процедура одержує з рядка S число X. При успішному результаті e = 0.

Приклад оформлення програми для роботи з текстом:

var s,x,y,z: string; c: char;

Begin

x:='turbo';

y:='pascal';

z:=x+' '+y; { z='turbo pascal' }

writeln (z);

s:= '; { пустая строка }

for c:='a' to 'z' do s:=s+c; { s='abcd..xyz' }

writeln (s);

end.

 

Реакція ЕОМ:

turbo pascal abcdefghijklmnopqrstuvwxyz

Складемо блок-схему алгоритму:


 

 

Хід роботи:

Вивчити теоретичний матеріал.

Виконати індивідуальне завдання.

Скласти звіт, в якому відповісти на теоретичні питання, описати алгоритм, описати програму, привести контрольний приклад виконання програми.

Контрольні запитання:

Дайте характеристику змінним типа String?

Що значить символ #13?

Чим відрізняються функції Chr та Ord?

Поясніть запис var s: string[23];?

Як рядкові дані виводяться до друку?

Який оператор слід використовувати для вводу даних з клавіатури?

Як працює функція pos, наведіть приклади.

Що означає функція Ord?

Що означає функція Chr?

Для чого потрібна процедура FillChar?

Що це - упаковані масиви?

Як пояснити запис: const sName: String[9]= IBM PC/AT';?

Які операції можна виконувати над рядками?

За допомогою яких операцій можна порівнювати рядки?

Які стандартні процедури існують для оброблення текстової інформації?

Наведіть приклад використання процедури delete?

Як працюють процедури copy, str і val?

Індивідуальне завдання. Скласти програму для розв¢язання задачі.

    Таблиця 1. Завдання
№ варіанта Завдання Текст
  В тексті замінити усі символи а на символ в ’. Звуки вальсу особливо хвилюють того, хто не вміє танцювати.
  Підрахувати кількість символів у тексті, а також кількість пропусків. Не спокушайтеся думкою бути особистим благодійником роду людського.
  Підрахувати кількість символів ‘а’ у тексті. Душі ранимої й хворий не допомагає щит сталевий
  Вилучити усі символи ‘а’ з тексту. Людина без сумнівів повинна неодмінно викликати сумніву навколишніх.
  Перевірити баланс дужок в арифметичному виразі. Повідомити результат перевірки. S=2*X1+3*X2/(X2+3*X1)/(X2+25*X
  В тексті зробити подвоєння символу ‘a’. Ідеали голодного шлунка після ситного обіду мінливі.
  Зашифрувати уведений з клавіатури текст заміною вихідних символів на символи з кодом, більшим на три одиниці. Провести дешифрування. Успіх лідера виноситься на плечах бегущих по п'ятах.
  Визначити й вивести на екран номера позицій і кількість повторень запитуваного символу в рядку, введеного із клавіатури. Аматор постійно опиратися на плечі своїх друзів залишається зрештою без них.
  В тексті замінити всі символи ‘а’ на ‘А’. Творча наполегливість що вміють танцювати найчастіше називається стилем.
  Модифікувати текст таким чином, змінити регістр літер на великий. Кожний нещасний сприймається людьми через відчуття радості свого благополуччя.
  Підрахувати в тексті кількість великих літер. В зоряній системі є великі планети, наприклад: Сатурн, Юпітер, Уран, Нептун.
  Підрахувати кількість літер в тексті не враховуючи інші символи. Всі ми не гірше акторів уміємо підбирати особу до певного випадку.
  В тексті замінити усі символи ‘в’на символ‘а’. Невдало, що пролилося світло, істини часто залишає незмивні плями.
  В тексті замінити усі пропуски на символ‘ ’. Маленька куля ведмедя валить.
  Вилучити з тексту усі сторонні символи, повинні залишитись тільки літери. Старий дурень історично терпіти не може / молодшого розумника[6].
  Підрахувати кількість літер ‘у’ в тексті. Бездарні трудівники мистецтва люблять носити волосяницю мученика.
  В тексті замінити всі пропуски на крапку з комою. Хто потрапив під мікроскоп не розуміє своїх рОЗМІрІВ.
  Визначити скільки літер ‘а’ у тексті. Хто вміє робить, а хто не вміє кричить та вчить.
  Визначити позицію першого пропуску, та виписати перше слово. У платіжної відомості Розумовський пожинав плоди свого розуму й освіченості.
  Замінити символом ‘|’ усі пропуски. В очах вовка світилася щиросердечна туга й неприборкана любов до баранини.
  В арифметичному виразі підрахувати кількість операцій добутку. S=2*X1+3*X2/(X2+3*X1)/(X2+25*X
  Визначити скільки разів в тексті зустрічається літера ‘м’. Частокіл холодної байдужості до інших ставиться в основному самому собі.
  Замінити пропуски словом ‘ПРОПУСК’ Музичне мистецтво завжди любило хапатися за диригентську паличку.
  Знайти літеру ‘к’ в тексті та повідомити її позицію. Людина, закохана в самого себе, не залишає місця закоханості для іншого.
  Вилучити символ ‘о’ з тексту, та повідомити скільки вилучено символів. В абетці особи й зовнішнього вигляду не все однаково грамотні.
  Модифікувати текст таким чином, перевести всі літери в нижній регістр. В зоряній системі є великі планети, наприклад: Сатурн, Юпітер, Уран, Нептун.
  Вилучити символ ‘а’ з тексту, та повідомити скільки вилучено символів. Скільки качко не мудруй, а лебедем не будеш.
  Замінити символ ‘а’ символами‘XXX’. Праця здоров’я не відбирає.
  В арифметичному виразі підрахувати кількість операцій вирахування. S=2*X1+3*X2/(X2+3*X1)/(X2+25*X
  В арифметичному виразі підрахувати кількість операцій підсумування. S=2*X1+3*X2/(X2+3*X1)/(X2+25*X

Лабораторна робота №9

Тема роботи: “ Організація програм, що містять процедури та функції ”

Мета роботи: дати навички студентам розв’язувати задачі з використанням функцій та процедур.

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

Рекомендована література.

1. Жалдак М.І., Рамський Ю.С. Інформатика: навч. Посібник.-К.: Вища шк.,1991 стр.233-237.

2. Вычислительная техника и программирование: Учеб. Для техн. вузов/ А.В. Петров, В.Е. Алексеев, А.С. Ваулин и др.; Под редакцией А.В. Петрова.- М.: Высш. Шк. 1990.-стр.233-234.

3. Епанешников, В. Епанешников Программирование в среде Turbo Pascal 7.0.-М.: «Диагог-МИФИ», 1993, стр.28-31.

4. ФароновВ.В. Турбо Паскаль 7.0. Учебное пособие. В 2-х книгах -М.: «Нолидж», 1997, т.1. стр. 278-286.

5. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7/0. К.: Юниор, 1997. Стр.216-220.

Теоретичні положення



Поделиться:


Последнее изменение этой страницы: 2016-04-18; просмотров: 820; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.25.117 (0.009 с.)