Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

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

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Операции с файлами.




 

11.1. В файле 1 записаны нечетные страницы книги. В файле 2 – четные страницы. Собрать все страницы по порядку в одном файле. Количество строк во всех страницах одинаково и равно s.

 

11.2. В файле хранятся порядковый номер, название товара и стоимость. Вывести на экран записи файла в прямом и обратном порядке (от первой к последней, затем от последней к первой).

11.3. В файле хранятся название товара, количество и цена единицы. Переписать в другой файл записи, описывающие това­ры со стоимостью, превосходящей заданное k.

 

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

 

11.5. В файле хранится текст книги, разбитый на страницы. Номер страницы располагается в ее первой строке и начинается с 15 пробелов, затем следуют знак «-» и номер страницы. Переписать в два других файла четные и нечетные страницы книги по отдельности.

 

11.6. Добавить в указанное место файла заданное количест­во записей, начиная с указанного места другого файла. Место за­дается номером записи.

 

11.7. В файле хранятся реквизиты рабочих: фамилия, имя, отчество, дата рождения, адрес, количество детей, количество от­работанных часов, расценка одного часа. Заработная плата вы­числяется умножением количества отработанных часов на рас­ценку минус 13% налога. Величина налога уменьшается на 0,01 %
на каждого имеющегося ребенка. Записать в другой файл фами­лии и инициалы рабочих и их заработную плату.

 

11.8. В файле хранятся фамилии хоккеистов, названия клу­бов, за которые они играют, количество сыгранных игр и забро­шенных шайб. Переписать в разные файлы данные об игроках
команд «Спартак» и «Динамо».

 

11.9. В файле целых чисел заменить все четные натуральные числа их квадратами.

 

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

 

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

 

11.12. Удалить заданное количество записей из указанного места файла.

 

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

 

11.14. В файле 1 хранятся данные о соревнованиях по решению задач. Он содержит название команды, номер решенной задачи, время, потраченное на ее решение. Время решения задачи измеряется в минутах от начала соревнований до момента, когда жюри засчитает ее решение. Записать в файл 2 название команды, количество решенных задач, время, потраченное на решение.

 

11.15. В файле удалить записи-дубликаты, т.е. те записи, которые повторяются.

 

11.16. Для заданного файла построить индекс по указанному полю. Индекс представляет собой файл из двух полей. В первом поле располагается в сортированном порядке значение какого-либо поля (одного для всего индекса), а во втором - номера соответствующих записей первого файла.

 

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

Число, июль 2002 г. День недели Выпущено, шт. Годных, шт.
  Понедельник    
  Вторник    
  Среда    
  Четверг    
  Пятница    
  Суббота    

Написать программу, определяющую даты, когда было выпу­щено минимальное количество бракованных телевизоров.

 

11.18. Вычислить значение функции y = x 2+ln(5 x -4) в 20 равноотстоящих точках интервала [1; 10]. Результаты (x и y) записать в текстовый файл.

 

11.19. Создать матрицу размера n х m. Элементы матрицы (положительные и отрицательные) получаются случайным образом (по модулю не больше 100). Записать полученную матрицу в файл.

 

11.20. Написать программу, считывающую из файла матрицу вида

x11 x12 x13 x14

x21 x22 x23 x24

x31 x32 x33 x34

x41 x42 x43 x44,

вычисляющую ее определитель d, и записывающую выходной файл в виде:

Source matrix is:

x11 x12 x13 x14

x21 x22 x23 x24

x31 x32 x33 x34

x41 x42 x43 x44,

Determinante = d.

 

11.21. Написать программу, позволяющую создать файл, в которым записана следующая информация о студентах группы: № по порядку, ФИО, год рождения. Для заполнения файла использовать цикл.

 

11.22. В файле 1 хранятся данные о студентах группы: № по порядку, ФИО, год рождения. Написать программу, считывающие эти данные из файла 1, определяющую студентов, с годом рождения позже заданного Year и записывающую этих студентов в файл 2.

 

11.23. В файле 1 в произвольном порядке хранятся данные о студентах группы: № по порядку, ФИО, год рождения. Написать программу, считывающие эти данные из файла 1, сортирующую список по году рождения и записывающую результат в файл 2.

 

11.24. Написать программу, создающую и записывающую в файл таблицу, состоящую из m строк и n столбцов, в которую занесены результаты голосования по выбору президента из n кандидатов. Каждая строка отображает результаты голосования в одном из m округов. На пересечении i -й строки и j -го столбца указывается, какое количество избирателей проголосовало в i -м округе за j -гo кандидата. Для заполнения таблицы использовать цикл.

 

11.25. В файле 1 хранится таблица, состоящая из m строк и n столбцов, в которую занесены результаты голосования по выбору президента из n кандидатов. Каждая строка отображает результаты голосования в одном из m округов. На пересечении i -й строки и j -го столбца указывается, какое количество избирателей проголосовало в i -м округе за j -гo кандидата. Написать программу, которая подсчитывает общее количество голосов, полученных каждым кандидатом, и величину процента, которую они составляют от общего количе­ства поданных голосов.

 

11.26. Считать из файла 1 матрицу размерностью 5 х 5, транспонировать его (поменять местами элементы, лежащие выше и ниже главной диагонали) и результат записать в файл 2.

 

11.27. В файле 1 записан матрица размерностью 3 х 4, в файле 2 – матрица размерностью 4 х 2. Перемножить матрицу из файла 1 на матрицу из файла 2 и результат записать в файл 3.

 

11.28. Создать массив размерностью 7 х 7, заполнить его случайным образом цифрами 7, 5 и 2. Результат в виде матрицы записать в текстовый файл..

 

11.29. Считать из файла 1 матрицу размерностью 3 х 4. Найти среднее арифметическое для каждой строки. Исходную матрицу и результат записать в файл 2.

 

11.30. Считать из файла 1 матрицу размерностью 5 х 7. Найти Максимальный по модулю элемент. Исходную матрицу и результат записать в файл 2.

 


 

ПРИЛОЖЕНИЕ

Задача х.хх Результаты торгов по американскому доллару, евро и британскому фунту на валютной бирже вводятся с клавиатуры в формате ‘день,доллар,евро,фунт’. Результаты торгов следующего дня от предыдущего разделяются одним пробелом. При вводе результатов торгов очередного дня номер дня, курс доллара, курс евро и курс фунта разделяются запятыми без пробелов. Примером ввода может служить строка:

‘3,27.44,33.98,45.23 4,27.55,33.92,45.7 5,27.6,33.95,44.9’.

Написать программу, определяющую максимальные и минимальные значения курсов валют и соответствующие этим значениям номера дней. Кроме того, полученные результаты записать в текстовый файл с именем D:\Results.txt

 

Решение.

Выделим основные логические блоки хода решения задачи:

1. Анализ введенных с клавиатуры исходных данных и определение количества введенных дней.

2. Выделение из исходной строки результатов торгов очередного дня в виде подстроки ‘день,доллар,евро,фунт’.

3. Выделение из подстроки ‘день,доллар,евро,фунт’ номера дня, курсов доллара, евро и фунта.

4. Повторение предыдущей операции для каждого дня.

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

6. Поиск максимальных и минимальных значений курсов валют и соответствующих этим значениям номеров дней.

7. Вывод результатов.

Очевидно, что в соответствии с условиями задачи, удобнее всего организовать ввод исходных данных в переменную строкового типа. Тогда чтобы определить количество результатов торгов (число дней с результатами) достаточно посчитать в этой строке число пробелов и увеличить его на единицу. Для выполнения данной операции создадим соответствующую функцию, которую назовем KolvoDays. На входе она будет получать переменную строкового типа, на выходе – отдавать число пробелов в этой строке, увеличенное на единицу. Ниже приведен листинг реализации данной функции:

function KolvoDays(s: string): integer;

Var

i: integer;

Begin

result:=1; // всегда есть один результат

for i:=1 to length(s) do

if s[i]=' ' then result:=result+1; // каждый пробел в строке увеличивает

// результат на 1

end;

 

Для того чтобы выделить из последовательности «день,доллар,евро,фунт» номер дня, а также курсы доллара, евро и фунта напишем процедуру Kurses, получающую на входе строку с данными в вышеуказанном формате, и отдающую в вызывающую среду интересующие значения посредством var -параметров: d (номер дня), Dollar (курс доллара), Euro (курс евро), Funt (курс фунта). Ниже приведен листинг процедуры Kurses, для удобства анализа кода строки программы пронумерованы:

1: procedure Kurses (s: string; var d: integer; var Dollar, Euro, Funt: real);

2: var

3: p,Code: integer;

4: st: string;

5: begin

6: p:=pos(',',s); // определение номера дня

7: st:=copy(s,1,p-1);

8: d:=StrToInt(st);

9: delete(s,1,p);

 

10: p:=pos(',',s); // определение курса доллара

11: st:=copy(s,1,p-1);

12: val(st, Dollar, Code);

13: delete(s,1,p);

 

14: p:=pos(',',s); // определение курса евро

15: st:=copy(s,1,p-1);

16: val(st, Euro, Code);

17: delete(s,1,p);

 

18: val(s, Funt, Code); // определение курса фунта

19: end;

 

Алгоритм работы процедуры следующий (рассмотрим на примере s =’3,27.44,33.98,45.23’). Сначала (строка 6) определяется позиция p запятой в строке s (для данного примера получим p =2), далее (в строке 7) все символы строки s c 1 до p -1 копируются в локальную переменную st (для данного примере получаем st =’3’) и с помощью функции StrToInt (строка 8) преобразовывается в целое число и присваивается переменной d (номер дня). Далее удаляется часть строки s от начала до p включительно (в данном случае после выполнения строки 9 переменная s примет значение ‘27.44,33.98,45.23’).

Далее в строке 10 опять определяется позиция p запятой в строке s (напомним, что к этому моменту s =‘27.44,33.98,45.23’, таким образом p =6), далее в строке 11 все что до p копируется из s в локальную переменную st (в результате st =’27.44’) и в строке 12 с помощью процедуры val преобразовывается в число и присваивается переменной Dollar (курс доллара). Переменная Code нужна здесь как вспомогательная для вызова процедуры val (при неудачном преобразовании строки в число в этой переменной возвращается номер позиции строки, вызвавшей ошибку, при удачном преобразовании Code =0). Далее опять удаляется уже не нужная часть строки s от начала до p включительно (в данном случае после выполнения строки 13 переменная s примет значение ‘33.98,45.23’).

Далее в строке 14 опять определяется позиция p запятой в строке s (т.к. к этому моменту s =‘33.98,45.23’, то p =6), далее в строке 15 все что до p копируется из s в локальную переменную st (в результате st =’33.98’) и в строке 16 с помощью процедуры val преобразовывается в число и присваивается переменной Euro (курс евро). Переменная Code опять нужна здесь как вспомогательная для вызова процедуры val. Далее опять удаляется уже не нужная часть строки s от начала до p включительно (в данном случае после выполнения строки 17 переменная s примет значение ‘45.23’).

Последнее, что нужно сделать – преобразовать s в значение курса фунта (строка 18).

Таким образом, имея на входе в Kurses значение входного параметра s =’3,27.44,33.98,45.23’ на выходе var -параметры примут значения: d =3; Dollar =27.44; Euro =33.98; Funt =45.23.

 

Указав особенности реализации основных процедуры и функции, приведем полный листинг программы – консольного приложения Delphi:


program Valuta;

 

{$APPTYPE CONSOLE}

 

Uses

SysUtils;

 

function KolvoDays(s: string): integer; // позволяет определить кол-во

// введенных результатов

Var

i: integer;

Begin

result:=1; // всегда есть один результат

for i:=1 to length(s) do

if s[i]=' ' then result:=result+1; // каждый пробел в строке увеличивает

// результат на 1

end; // конец функции KolvoDays

 

// позволяет выделить из последовательности Day,Dollar,Euro,Funt,

// заданной строкой s, соответствующие значения

procedure Kurses(s: string; var d: integer; var Dollar, Euro, Funt: real);

Var

p,Code: integer;

st: string;

Begin

p:=pos(',',s); // определение номера дня

st:=copy(s,1,p-1);

d:=StrToInt(st);

delete(s,1,p);

 

p:=pos(',',s); // определение курса доллара

st:=copy(s,1,p-1);

val(st, Dollar, Code);

delete(s,1,p);

 

p:=pos(',',s); // определение курса евро

st:=copy(s,1,p-1);

val(st, Euro, Code);

delete(s,1,p);

 

val(s, Funt, Code); // определение курса фунта

end; // конец процедуры Kurses

 

var // блок описания глобальных переменных

N, i, p, d: integer;

Dollar, Euro, Funt: real;

st,one: string;

arrDays: array of integer; // массив "номера дней"

arrValuta: array of array of real; // массив "курсы валют"

maxKurs, minKurs: array [1..3] of real; // минимальные и

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

maxDayKurs, minDayKurs: array [1..3] of integer; // дни минимальных

// и максимальных значений курсов валют

f: system.text;

ch: char;

 

begin // начало основной программы

Repeat

writeln('Input data, please');

readln(st); // считали исходные данные с клавиатуры

st:=trim(st); // удалили ведущие и замыкающие пробелы из строки st

N:=KolvoDays(st); // определили кол-во дней, за которые введены

// данные по курсам валют

SetLength(arrDays,N); // распределили память под динамические

// массивы "номера дней"

SetLength(arrValuta,N,3); // и "курсы валют"

 

{--- Выделение данных из строки st и заполнение массивов "номера дней" и "курсы валют" ---}

for i:=1 to N-1 do

Begin

p:=pos(' ',st); // находим, где в st заканчиваются данные то

// текущему дню

one:=copy(st,1,p-1); // выделяем этот день в переменную one

Kurses(one, d, Dollar, Euro, Funt); // выделяем из one номер дня,

// курс $, курс евро и курс фунта

// запоминаем полученные значения в соответствующих массивах

arrDays[i-1]:=d;

arrValuta[i-1,1]:=Dollar;

arrValuta[i-1,2]:= Euro;

arrValuta[i-1,3]:=Funt;

delete(st,1,p); // удаляем из st данные по уже обработанному дню

end;

 

// после заверщения цикла в st останутся необработанные данные по

// последнему дню, выделяем из st номер последнего дня, курсы валют

// и запоминаем полученные значения в соответствующих массивах

Kurses(st, d, Dollar, Euro, Funt);

arrDays[N-1]:=d;

arrValuta[N-1,1]:=Dollar;

arrValuta[N-1,2]:= Euro;

arrValuta[N-1,3]:=Funt;

{------------------------------------------------------------------------------------}

{------- Распечатываем полученные данные в табличном виде -------}

writeln; // пустая строка на экране для улучшения внешнего вида

writeln('Day Dollar Euro Funt');

for i:=1 to N do

Begin

write(' ',arrDays[i-1],' ');

writeln(arrValuta[i-1,1]:6:2, arrValuta[i-1,2]:6:2, arrValuta[i-1,3]:6:2);

end;

{------------------------------------------------------------------------------------}

 

{--- Определение максимального и минимального значений курсов и соответствующих дней ---}

// в качестве начальных максимальных и минимальных значений

// выбираем первые элементы массивов для

maxKurs[1]:=arrValuta[0,1]; minKurs[1]:=arrValuta[0,1]; // доллара

maxKurs[2]:=arrValuta[0,2]; minKurs[2]:=arrValuta[0,2]; // евро

maxKurs[3]:=arrValuta[0,3]; minKurs[3]:=arrValuta[0,3]; // фунта

// в качестве дней начальных максимальных и минимальных

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

maxDayKurs[1]:=arrDays[0]; minDayKurs[1]:=arrDays[0]; // доллара

maxDayKurs[2]:=arrDays[0]; minDayKurs[2]:=arrDays[0]; // евро

maxDayKurs[3]:=arrDays[0]; minDayKurs[3]:=arrDays[0]; // фунта

for i:=2 to N do

Begin

 

if arrValuta[i-1,1]>maxKurs[1] then

Begin

maxKurs[1]:=arrValuta[i-1,1]; // запомнили новый максимум для

// доллара

maxDayKurs[1]:=arrDays[i-1]; // запомнили день максимума

end;

if arrValuta[i-1,1]<minKurs[1] then

Begin

minKurs[1]:=arrValuta[i-1,1]; // запомнили новый минимум для

// доллара

minDayKurs[1]:=arrDays[i-1]; // запомнили день минимума

end;

 

if arrValuta[i-1,2]>maxKurs[2] then

Begin

maxKurs[2]:=arrValuta[i-1,2]; // запомнили новый максимум для

// евро

maxDayKurs[2]:=arrDays[i-1]; // запомнили день максимума

end;

if arrValuta[i-1,2]<minKurs[2] then

Begin

minKurs[2]:=arrValuta[i-1,2]; // запомнили новый минимум для

// евро

minDayKurs[2]:=arrDays[i-1]; // запомнили день минимума

end;

 

if arrValuta[i-1,3]>maxKurs[3] then

Begin

maxKurs[3]:=arrValuta[i-1,3]; // запомнили новый максимум для

// фунта

maxDayKurs[3]:=arrDays[i-1]; // запомнили день максимума

end;

if arrValuta[i-1,3]<minKurs[3] then

Begin

minKurs[3]:=arrValuta[i-1,3]; // запомнили новый минимум для

// фунта

minDayKurs[3]:=arrDays[i-1]; // запомнили день минимума

end;

 

end;

// печать результатов

writeln('max Dollar value = ',maxKurs[1]:1:2,' at Day ',maxDayKurs[1]);

writeln('min Dollar value = ',minKurs[1]:1:2,' at Day ',minDayKurs[1]);

writeln('max Euro value = ',maxKurs[2]:1:2,' at Day ',maxDayKurs[2]);

writeln('min Euro value = ',minKurs[2]:1:2,' at Day ',minDayKurs[2]);

writeln('max Funt value = ',maxKurs[3]:1:2,' at Day ',maxDayKurs[3]);

writeln('min Funt value = ',minKurs[3]:1:2,' at Day ',minDayKurs[3]);

{-------------------------------------------------------------------------------------}

 

{------- Запись результатов в файл D:\Results.txt -------}

AssignFile(f,'D:\Results.txt'); // связали файловую переменную с

// файлом D:\Results.txt

ReWrite(f); // Открытие файла для перезаписи, если файл не

// существует, то он будет создан

// вывод исходных данных в файл табличном виде

writeln(f, 'Day Dollar Euro Funt');

for i:=1 to N do

Begin

write(f, ' ',arrDays[i-1],' ');

writeln(f,arrValuta[i-1,1]:6:2, arrValuta[i-1,2]:6:2, arrValuta[i-1,3]:6:2);

end;

writeln(f ); // пустая строка в файле для улучшения внешнего вида

// вывод результатов в файл

writeln(f,'max Dollar value = ',maxKurs[1]:1:2,' at Day ',maxDayKurs[1]);

writeln(f, 'min Dollar value = ',minKurs[1]:1:2,' at Day ',minDayKurs[1]);

writeln(f, 'max Euro value = ',maxKurs[2]:1:2, ' at Day ',maxDayKurs[2]);

writeln(f, 'min Euro value = ',minKurs[2]:1:2, ' at Day ',minDayKurs[2]);

writeln(f, 'max Funt value = ',maxKurs[3]:1:2, ' at Day ',maxDayKurs[3]);

writeln(f, 'min Funt value = ',minKurs[3]:1:2, ' at Day ',minDayKurs[3]);

CloseFile(f); // Закрытие файла после вывода результатов

{--------------------------------------------------------}

 

writeln; // пустая строка на экране для улучшения внешнего вида

write('This results is write to file D:\Results.txt. Continue (Y-yes, N-no)? ');

readln(ch);

if not ((ch='Y') or (ch='y')) then break;

writeln; // пустая строка на экране для улучшения внешнего вида

until false;

End.

 

Несмотря на то, что листинг сопровождается комментариями, поясним подробнее отдельные моменты.

Во-первых, массивы номеров дней и курсов валют объявлены динамическими:

arrDays: array of integer; // массив "номера дней"

arrValuta: array of array of real; // массив "курсы валют"

их размер устанавливаем после того, как с помощью функции KolvoDays определим число введенных результатов:

N:=KolvoDays(st);

SetLength (arrDays, N); // распределили память под динамические

SetLength (arrValuta, N,3); // массивы

 

Во-вторых, выделение данных из строки st и заполнение массивов arrDays и arrValuta организовано по схожему с реализацией процедуры Kurses принципу:

for i:=1 to N-1 do

Begin

p:=pos(' ',st); // находим, где в st заканчиваются данные то

// текущему дню

one:=copy(st,1,p-1); // выделяем этот день в переменную one

Kurses(one, d, Dollar, Euro, Funt); // выделяем из one номер дня,

// курс $, курс евро и курс фунта

// запоминаем полученные значения в соответствующих массивах

arrDays[i-1]:=d;

arrValuta[i-1,1]:=Dollar;

arrValuta[i-1,2]:= Euro;

arrValuta[i-1,3]:=Funt;

delete(st,1,p); // удаляем из st данные по уже обработанному дню

end;

// после заверщения цикла в st останутся необработанные данные по

// последнему дню, выделяем из st номер последнего дня, курсы валют

// и запоминаем полученные значения в соответствующих массивах

Kurses(st, d, Dollar, Euro, Funt);

arrDays[N-1]:=d;

arrValuta[N-1,1]:=Dollar;

arrValuta[N-1,2]:= Euro;

arrValuta[N-1,3]:=Funt;

{------------------------------------------------------------------------------------}

Т.е. в текущем значении переменной st ищется позиция пробела; в переменную one выделяется часть подстроки до пробела (результаты одного дня); с помощью процедуры Kurses из one получаем номер дня, курсы доллара, евро и фунта и сохраняем их в соответствующих массивах; удаляем из st обработанную, уже не нужную часть (до пробела включительно). Так повторяем N -1 раз и в результате от st остается часть с результатами последнего дня торгов, из которой уже вне цикла получаем необходимые сведения.

В-третьих, для определения максимальных и минимальных значений курсов валют, и соответствующих им дней объявлены статические массивы:

maxKurs, minKurs: array [1..3] of real; // минимальные и

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

maxDayKurs, minDayKurs: array [1..3] of integer; // дни минимальных

// и максимальных значений курсов валют

Первый элемент массива maxKurs используются для определения максимального значения доллара, второй – максимального значения евро, третий – максимального значения фунта. Аналогичным образом используются элементы массивов minKurs (минимальные значения доллара, евро и фунта), maxDayKurs (день максимального значения доллара, евро и фунта) и minDayKurs (день минимального значения доллара, евро и фунта)

На рис.1 показана экранная форма с результатами работы программы, а на рис. 2 – содержимое файла D:\Results.txt.

 

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

Рис. 1. Результаты работы программы для задачи х.хх

 

Рис. 2. Содержимое D:\Results.txt в результате решения задачи х.хх


 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных