ЛАБОРАТОРНАЯ РАБОТА №8
Обработка символьной информации
Строка. Множество.
Строковы тип определяет множество символьных цепочек (последовательностей символов).
1. Shortstring. Этот тип используется для объявления «короткой» строки.
Var
S:shortstring;
Переменной s выделяется память в объеме 256 байтов, из которых 255 байтов для значения строки, а один байт для хранения служебной информации.
Внутреннее представление переменной s: в нулевом байте хранится текущая длина строки в символьном формате, т. е. байт хранит символ, код которого равен количеству символов в строке; каждый байт, начиная с первого, используется для хранения самого строкового значения, при этом в одном байте хранится один символ;
2. String[n]. В определении типа параметр n определяет количество допустимых символов в строке.
Var
S:string[100];
Переменной s выделяется память в объеме 101 байта. Внутреннее представление полностью соответствует внутреннему представлению переменных типа shortstring.
3. String. Этот тип в Delphi используется для объявления длинной динамической строки. Максимальная длина строки 2Гб.
Var
S:string;
Переменная s является указателем на область памяти, в которой будет размещено строковое значение. Память переменной выделяется в размере: количество символов плюс один байт при выполнении следующих опреаций: при присваивании переменной значения; при вводе значения в переменную; с помощью процедуры setlength, используемой для массивов.
Внутреннее представление переменной s: последовательность байтов (строковое значение), за которым следует символ конца строки – символ с кодом нуль (терминальный нуль -#0).
4. AnsiString.
Максимальная длина строки 2Гб. Строковое значение в переменной этого типа завершается терминальным нулем. Но представление в памяти отличается от переменной string. Переменная типа AnsiString является указателем на облаcть памяти, где будет располагаться значение. Соответственно, это динамическая строка и память ей будет выделяться на этапе выполнения. Представление в памяти: последовательность символов строкового значения, затем терминальный нуль и за ним специальная область из четырех байтов – счетчик ссылок. Счетчик ссылок позволяет экономить память, он указывает какое количество переменных ссылаются на это строковое значение. Например,
Var
s1, s2:ansistring;
Begin
s1:=¢Строковое значение¢ ;
s2:=s1;
End.
В счетчике переменной s1 после присваивания значения было установлено значение один, после присваивания переменной s2 указателя s1, счетчик переменной s1 установился в значение два, т. е. две строки ссылаются на одно значение. Таким образом в памяти хранится один экземпляр строки, но на нее ссылаются две переменных.
Примечание. Строка и массив по внутренней организации похожи, но не идентичны. Строка в отличие от массива хранит дополнительную информацию: либо это длина строки, либо это символ конца строки.
1. Присваивания.
Знак операции присваивания :=.
Var
S, s1:string;
Sh:shortstring;
S5:string[5];
Begin
Sh:=’Что?’;
S5:=’Где?’;
S:=’Когда?’;
S1:=s
End.
2. Конкатенация (сцепление) строк.
Знак операции конкатенации +.
S1:=sh+s5+s;
В результате операций в переменной s1 будет храниться строка: Что? Где? Когда?.
3. Сравнение.
Равенство строк. Две строки равны, если их длины равны и они посимвольно равны. При посимвольном сравнении сравниваются коды элементов с одинаковыми индексами.
S:=’abc’; S1:=’abc’;
Неравенство строк. Строка s больше строки s1, если длина строки s больше строки s1. Например, S:=’abc’; S1:=’abcd’; т. е. строка S1 больше строки S.
Если строки имеют одинаковую длину, то больше та строка, у которой при посимвольном сравнении обнаружился символ с большим кодом. Например, S:=’adc’; S1:=’abc’; т. е. строка S больше S1.
4. Определение длины строки.
Эту операцию выполняет функция length(s), где s строковое значение. Результат функции значение целого типа – длина строки.
Var
S:string;
Begin
S:=’Что? Где? Когда’;
Writeln(‘В строке S ’, length(S), ‘ символов’);
End.
5. Копирование части строки.
Эту операцию выполняет функция copy(s,index,count), где: s – строка, index – индекс элемента строки s, count – количество копируемых элементов. Функция копирует count символов строки s, начиная с элемента с индексом index.
Пример копирования части строки
S:=’Что? Где? Когда’;
S1:=copy(s,5,4); //в строке s1 значение Где?
S1:= copy(s, i+1, length(s)-1);
6. Определение вхождения подстроки в строку.
Эту операцию выполняет функция pos(sub, s). Ее результатом будет индекс элемента, начиная с которого, подстрока sub полностью разместилась в строке s или 0, если подстрока sub не входит в строку s.
Пример использования операции
Var
S:string;
sub:shortstring;
Begin
S:=’Что?Где?Когда’;
sub:='Где?';
i:=pos(sub, S); //значение i=5
i:=pos('Почему?',S); //значение i=0
End.
7. Удаление из строки подстроки.
Для выполнения этой операции в Delphi используется процедура Delete(s,index,count), которая из строки s удаляет count символов, начиная с символа в позиции index. Параметр s в вызове процедуры должн быть представлен переменной.
Пример использования процедуры. Удалить из заданного предложения первое слово. Слова в предложении отделяются пробелом.
Var
S:string;
sub:shortstring;
Begin
S:='Первое слово должно быть удалено';
Delete(s,1,pos(' ',s)-1);
Writeln(s); //в s теперь текст: слово должно быть удалено
End.
8. Вставка строки в строку.
Для выполнения операции вставки в Delphi используется процедура Insert(sub,s,index), которая вставляет строку sub в позицию index строки s. После выполнения операции длина строки s увеличивается на длину строки sub. Параметр s в вызове процедуры должен быть представлен переменной.
Пример использования процедуры. Вставить слово «Последнее» в строку с текстом «слово должно быть удалено» перед первым словом.
Var
S:string;
sub:shortstring;
Begin
S:='слово должно быть удалено';
Insert('Последнее',s,1);
Writeln(s);
End.
9. Преобразование числа, представленного в числовом формате в строковый формат.
Для преобразования целого числа в строковый формат используется функция inttostr(x), где параметр x любого целого типа. Результатом функции является значение строкового типа.
Пример использования функции. В текст «План специальности xxxxxx» вместо xxxxxx вставить код специальности, представленный как целое число.
Var
S:string;
sub:shortstring;
x:integer;
Begin
S:='План специальности xxxxxx';
Writeln('Введите код специальности');
Readln(x);
Delete(s,20,6);
Sub:=inttostr(x);
Insert(sub, s,20);
Writeln(s);
End.
Для преобразования дробного числа в строковый формат используется функция floattostr(x), где параметр x любого вещественного типа. Результатом функции является значение строкового типа.
10. Преобразование числа, представленного в строковом формате в числовой формат.
Процедура Val(s, x,kod). Которая предназначена для преобразования строкового представления числа s в формат числовой переменной x. Параметр х может быть целого или вещественного типа. Параметр kod это переменная целого типа. Если преобразование выполнено успешно, то значение переменная kod равно нулю.
Функция strtoint(s). Параметр s строкового типа. Результатом функции является значение целого типа.
Функция strtofloat(s). Параметр s строкового типа. Результатом функции является значение вещественного типа.
Var
S:string;
X, kod:integer;
Y:float;
Begin
S:='123';
Val(s, x,kod); //kod=0
X:=strtoint(s);
S:='12.54';
Val(s, x,kod); //kod =3
Val(s, y,kod); //kod=0
Y:=strtofloat(s);
End.
11. Операции ввода-вывода.
Для ввода строковых значений в Delphi используется процедуры Read и Readln.
1) Пример поэлементного заполнения строковой переменной.
Var
S:string;
Sh:shortstring;
S5:string[5];
i:integer;
Begin
//заполнение переменной типа shortstring
For i:=1 to 10 do
Read(sh[i]);
S[0]:=chr(10);
//заполнение переменной типа string[5]
For i:=1 to 10 do
Read(s5[i]);
S[0]:=chr(5);
//заполнение переменной типа string
setLength(s,10);
For i:=1 to 10 do
Read(s[i]);
End.
2) Пример ввода строкового значения как единой последовательности символов.
Var
S:string;
Sh:shortstring;
S5:string[5];
i:integer;
Begin
Readln(sh);
Readln(s5);
Readln(s)
End.
Для вывода строковых значений в Delphi используется процедуры write и writeln. Вывод строкового значения можно выполнить поэлементно или как единой последовательности символов.
Примеры вывода строковых значений.
Var
S:string;
i:integer;
Begin
Readln(s):
//Посимвольный вывод строки
For i:=1 to length(s) do writeln(s[i]);
//вывод строки как единой последовательности символов
Writeln(s)
End.
Формат определения типа множество


Базовый тип множества – это порядковый тип, множество значений которого содержит не более 255 элементов.
Примеры объявлений переменных типа множество
Var
X:set of byte;
Y:set of char;
Примеры определения констант типа множество
[]; устое множество
[1,5,7,12];
['А'..'Я'];
['А'..'Я', 'а'..'я'];
Операции над множеством
1) Объединение множеств.
Знак операции +.
Var
S1,s2,s3: set of byte;
Begin
S1:=[1,2,5]; s2:=[3,5,7]; s3:=s1+s2; //в s3 множество [1,2,3,5,7]
End.
Пример формирования множество.
Создание множества из букв слова.
Var
S:set of char;
X:string;
Begin
Readln(x);
S:=[];
For i:=1 to length(s) do
S:=S+[x[i]];
End.
2) Пересечение множеств
Знак операции *.
Var
S1,s2,s3: set of byte;
Begin
S1:=[1,2,5]; s2:=[3,5,7]; s3:=s1+s2; //в s3 множество [5]
End.
3) Вычитание множеств
Знак операции -.
Var
S1,s2,s3: set of byte;
Begin
S1:=[1,2,5]; s2:=[3,5,7]; s3:=s1-s2; //в s3 множество [1, 2]
End.
4) Сравнение множеств
Равенство. Знак операции =.
Два множества равны, если они состоят из одних и тех же элементов.
Неравенство.
Множество S1 больше множества S2, если S2 является подмножеством S1.
5) Операция in.
Используется для определения принадлежности некоторого элемента множеству. Формат операции:
Элемент in множество
Результат операции значение логического типа.
Пример применения операции.
Определить каких цифр нет в заданном целом числе.
Var
S1,S2:set of byte;
X:integer;
begin
S1:=[0..9];
S2:=[]; //множество цифр числа
While x<>0 do
Begin
S2:=S2+[x mod 10];
X:=x div 10)
End;
For x:=0 to 9 do
If not(x in S2) then writeln(x);
End.
1. Для каждой задачи варианта разработайте отдельные программы.
2. В первой задаче не используйте функции и процедуры для выполнения операций над строкой, а рассматривайте строку как массив символов.
3. Во второй задаче используйте универсальную строку для представления в памяти текстовых данных.
Вариант 1
1. Дан текст, хранящийся в строковой переменной, удалить все гласные буквы.
2. Дано предложение, составленное из слов и групп цифр (считать тоже словами), определяющих целые числа. Слова разделены запятой или одним или несколькими пробелами. Удалить из него слова, которые встретились там более одного раза и сформировать массив из чисел, встретившихся в тексте.
Вариант 2
1. Дан текст, хранящийся в строковой переменной s, определить, входит ли подстрока ss в строку s.
2. Даны две строки, состоящие только из цифр (длина каждой более 10 символов). Считая, что в этих строках находятся очень длинные целые числа, сформировать третью строку - сумму этих чисел.
Вариант 3
1. Дан текст, хранящийся в строковой переменной s, вставить подстроку ss в строку s с позиции N. N вводится пользователем.
2. Дано предложение, в котором содержаться группы цифр (каждая не более 6 цифр). Группы отделяются друг от друга пробелами. Каждая группа - это символьный эквивалент целого десятичного числа. Найти эти группы и преобразовать в число. Полученное целое число перевести в систему с основанием N(2<=N<=16). Результат формировать в строковой переменной.
Вариант 4
1. Дана последовательность символов, которая вводиться посимвольно с клавиатуры. Запишите эту последовательность в короткую строку, не используя операцию конкатенации.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами среди которых есть группы цифр, определяющих целые числа из диапазона 0..65535.Удалить из текста все числа, принадлежащие диапазону [-100..100] и на их место поставить символ *.
Вариант 5
1. Разработайте программу копирования: а) длинной строки в короткую; б)длинной в длинную, рассматривая строки как массивы символов.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. Среди слов встречаются слова, представляющие код некоторого десятичного числа в 8- ой системе счисления (признака 8 кода: число начинается с символа O: само число. составленно из цифр ‘0’..’7’ ). Найти восьмеричные числа и заменить их десятичным значением.
Вариант 6
1. Дан текст, как последовательность символов, сохраните его в числовой переменной, если текст представляет число, или выведите номер символа, который нельзя преобразовать в числовой формат.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть группы цифр, определяющих целые числа из диапазона integer. Удалить из предложения те целые числа, в десятичной записи которых есть цифры 5,6,7 , а остальные числа увеличить на 2.
Вариант 7
1. Дано целое число, записать его в строковый форма, предвари
тельно проверив, что оно состоит из цифр десятичной системы
счисления.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. Вывести слова предложения предварительно преобразовав их следующим образом:
· перенести последнюю букву в начало слова;
· удалить из слова повторные вхождения каждой буквы.
Вариант 8
1. Строковая переменная содержит вещественное число в форме с фиксированной точкой. Разработайте программу преобразования числа из строкового формата в числовой формат.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть слова, составленные только из цифр, определяющие целые числа из диапазона 0Удалить из предложения все числа, состоящие из одинаковых цифр. Сформировать массив из чисел предложения, преобразовав их в обратные (например: исходное число 123, а в массив записать 321).
Вариант 9
1. Дан текст, представленный в строковой переменной, определить позицию первого вхождения символа в текст.
2. Дано предложение и управляющий символ, значением которого может быть один из символов Y , N. Вывести этот текст без входящих в него цифр, если значение символа управления = Y ,а если этот символ = N, то перенести все цифры текста в конец предложения так, чтобы первая встреченная в исходном тексте цифра была последней цифрой, а последняя первой и был сохранен порядок следования остальных цифр.
Вариант 10
1. Удалить из строки подстроку, начиная с позиции N и длиной L.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть группы цифр, определяющих целые числа из диапазона [0..19]. Отредактировать введенную строку, заменив каждое число, на последовательность, заключенную в круглые скобки, символа +, (если число четное) или на –
(если число нечетное), длина которой равна найденному числу.
Вариант 11
1. Вставить в строку S, подстроку длиной L, начиная с по N.
2. Дано предложение, состоящее из символов. Вывести это предложение, удалив из него все символы, которые находятся между символами ‘(‘ ‘)’. Сами скобки не удалять, а вместо удаленного текста вставить число, соответствующее количеству удаленных символов. Если хотя бы одной скобки нет, то сообщить об этом.
Вариант 12
1. Разработать программу, которая делает короткую строку пустой.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. Распечатать те слова предложения, в которых буквы упорядочены по алфавиту, и удалить те слова, в которых каждая буква входит в слово не менее двух раз.
Вариант 13
1. Разработать программу, которая определяет длину строки, хранящейся в переменной типа string.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. Найти самое длинное симметричное слово и сформировать множество из букв этого слова. Вывести буквы, из которых оно составлено в алфавитном порядке используя множество. Заменить слово в предложении числом, определяющим его номер среди симметричных чисел.
Вариант 14
1. Разработать программу, которая подсчитывает количество вхождений заданного символа в текст.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. Составить частотный словарь слов, указав, сколько раз данное слово встретилось в предложении. При этом изменить предложение: - удалив повторные вхождения слов и вставив перед первым вхождением слова подстроку вида:(Число), где - Число – определяет количество таких слов в предложении.
Вариант 15
1. Удалить из строкового значения все вхождения заданного
символа.
2. Дано целочисленное арифметическое выражение, записанное как строка, в десятичной системе счисления. Проверить правильность записи и вычислить значение выражения. Выражение записывается без скобок, операции выполняются в порядке их следования.
Вариант 16
1. Разработать программу, которая выполняет конкатенацию двух заданных строк.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. Удалить из предложения все слова, начинающиеся с гласных букв русского алфавита, а слова, начинающиеся с согласных букв записать прописными буквами. Между словами, заканчивающимися и начинающимися одной буквой, вставить подстроку -*-.
Вариант 17
1. Разработать программу форматирования значения даты вида дд/мм/гг, исключая ведущий нуль в поле дд, добавляя ведущий ноль в поле мм. Например, 01/1/06 представить 1/01/2006.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. Среди слов этого предложения найти слова составленные из тех же букв что и первое слово. Найденные слова переставлять в начало предложения.
Вариант 18
1. Разработать программу, которая выводит значение короткой строки.
2. Дано предложение, состоящее из слов, разделенных запятой или пробелами. В данном предложении есть слова, представляющие запись вещественного числа в формате с плавающей точкой (т. е.+/-хххх. ххххЕ+/-рррр) . Создать массив вещественных чисел. В тексте эти слова заменить символом *.
Вариант 19
1. Разработать программу, которая удаляет указанный символ из короткой строки.
2. Дано предложение, состоящее из слов, разделенных запятой
или пробелами. Среди слов встречаются слова, представляющие код некоторого десятичного числа в 8- ой системе счисления (признака 8 кода: число начинается с символа O: само число. составленно из цифр ‘0’..’7’ ). Найти восьмеричные числа и заменить их десятичным значением.
Вариант 20
1. Строковая переменная содержит вещественное число в форме с фиксированной точкой. Написать подпрограмму конвертирования числа из строкового формата в числовой.
2. Дана последовательность чисел(целых и вещественных). Преобразовать каждое число в строковое представление. Объединить несколько подряд идущих строк – представлений чисел в одну строку, разделяя их символом пробел. Объединение строки производить пока длина строки не превысит 255 символов.
Вариант 21
1. Дано целое число. Записать его в строковую переменную, объявленную так string[10].
2. Дано предложение, состоящее из слов разделенных пробелами. Среди слов могут быть числа шестнадцатеричного кода, которые начинаются с символа $. Сформировать массив из десятичных значений шестнадцатеричных чисел, а сами шестнадцатеричные числа удалить из предложения.
Примеры программ обработки текстовой информации.
Пример обработки строки с использованием встроенных функций
Выполнить сжатие текста по правилу: подпоследовательность повторяющихся символов заменить на подстроку вида (к)символ, где к – количество символов в подпоследовательности. Например, текст аbbbcdddddde заменить (1)a(3)b(1)c(6)d(1)e.
program Lab7_Prim4;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
s, sub_s:string;
k, i,i1:word;
begin
readln(s); i:=0;
while i<=length(s) do
begin
inc(i);
K:=1; i1:=i;
while (i<length(s)) and (s[i]=s[i+1]) do
begin
inc(i);inc(k);
end;
if k>2 then begin
sub_s:='('+inttostr(k)+')'+s[i1];
delete(s, i1,k);
insert(sub_s, s,i1);
i:=i1+length(sub_s)-1;
end;
end;
writeln(s);
readln;
end.
Пример обработки строки, рассматриваемой как массив символов
Дан текст из строчечных русских букв. Преобразовать текст, записав его прописными буквами.
program Lab7_prim5;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
S_text, S_Strochechnie, S_Propisnie:string;
i, k:word;
begin
readln(S_text); //ввод текста в кодировке ASCII866
s_text:=RUSASCII866_ANSI1251(S_text);//преобразование текста в ANSI1251
S_Strochechnie:='абвгдежзиклмнопрстуфхцчшщьыъэюя';
S_Propisnie:='АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
for i:=1 to length(S_text) do
begin
k:=pos(S_text[i],S_Strochechnie);
if k<>0 then
S_text[i]:= S_Propisnie[k];
end;
writeln(RUSANSI1251_ASCII866(S_text));
readln
end.
Пример формирования числового массива из чисел – слов текста.
Дано предложение, состоящее из слов разделенных пробелами. Среди слов могут быть числа шестнадцатеричного кода, которые начинаются с символа $. Сформировать массив из десятичных значений шестнадцатеричных чисел, а сами шестнадцатеричные числа удалить из предложения.
Program MassChisel;
uses
SysUtils;
type
TDar=array of integer;
var
s1,s2:string;
i, j,k, err:longint;
a:TDar;
x:integer;
begin
readln(s1);
s1:=s1+' '; j:=0;
repeat
k:= pos(' $',s1); //начало необходимого слова
if k<>0 then // найдено слово
begin
i:=k+2;
while (s1[i]<>' ') and (s1[i]<>#0 ) do //поиск конца слова
inc(i);
s2:=copy(s1,k+1,i-(k+1)); //сохранение слова в переменной
if length(s2)>0 then // если длина слов >0
begin
val(s2,x,err); //преобразование числа в числовой формат
if err=0 then // т.е. в s2 число
begin
setlength(a, j+1);
a[j]:=x;
inc(j);
delete(s1,k, i-k);
end;
end
end
until k=0;
if j=0 then
writeln('Массив не сформирован')
else
for i:=0 to high(a) do
write(a[i],' ');
end.
Пример модуля с функциями конвертирования
unit Convertor;
interface;
// из формата DOS в Win формат
function RUSASCII866_ANSI1251(s:string):string
// из формата Win в DOS формат
function RUSANSI1251_ASCII866(s:string):string;
implementation
function RUSANSI1251_ASCII866(s:string):string;
var i:longint;
begin
for i:=1 to length(s) do
begin
if ord(s[i]) in [192..239] then s[i]:=chr(ord(s[i])-64)
else
if ord(s[i]) in [240..255] then s[i]:=chr(ord(s[i])-16);
end;
result:=s
end;
function RUSASCII866_ANSI1251(s:string):string;
var i:longint;
begin
for i:=1 to length(s) do
begin
if ord(s[i]) in [128..159] then s[i]:=chr(ord(s[i])+64)
else
if ord(s[i]) in [160..175] then s[i]:=chr(ord(s[i])+64)
else
if ord(s[i]) in [224..239] then s[i]:=chr(ord(s[i])+16);
end;
result:=s
end;
end.
1. Перечислите типы Delphi для описания строковых переменных.
2. Укажите отличие в представлении в памяти строк различных типов.
3. Как изобразить в программе строковую константу?
4. Особенности типа string и string[n].
5. Сколько памяти выделяется строковой переменной типа string в Delphi?
6. Какие вы знаете способы заполнения строковой переменной значением? (Приведите примеры).
7. Какие операции реализованы в Delphi для строковых значе
ний?
8. Можно ли присвоить короткой строке (shortstring) длинную (string) или широкую строки (widestring), а можно ли наоборот?
9. Строки AnsiString. Особенности их представления.
10. Какие вы знаете способы удаления из строки одинаковых символов? (фрагменты программ)
11. Запишите фрагмент программы для преобразования значения дня, месяца и года взятых из текста: Новое тысячелетие наступило 1/01/2000 года в формат числовых переменных.
12. Стандартные подпрограммы для преобразования строк String в другие типы и обратно.
13. Стандартные процедуры и функции для работы со строками String в Object Pascal.
14. Объясните ошибку в программе, фрагмент которой представлен ниже, и исправьте ее.
Var s:string;
S1:string[5];
Begin
S[0]:=’5’; S1[1]=’5’;
S1:=’abcde’; s1:=s1+’f’
End.
15. Приведите фрагмент программы для изменения текста на текст
16. Разработайте программу. Дана строка, состоящая из слов – чисел. Слова разделены пробелами. Сформировать массив правильных
17. Как описать в программе множество, состоящее только из английских букв больших и малых?
18. Сколько значений может содержать множество?
19. Укажите ошибки в описании множеств
Type Num=set of 1200..1440;
Num1=set of 12..0;
Num2=set of ‘a’..’z’;
20. Дана последовательность слов, на русском языке, заканчивающаяся признаком конца строки. Найти все гласные буквы общие для всех слов и вывести их в алфавитном порядке прописными буквами.
21. Написать программу. Дана последовательность целых чисел из N элементов(N<255). Определить, является ли последовательность перестановкой чисел 1..N.(Использовать множество).


