Тип данных Множество
Формат определения типа множество
Базовый тип множества – это порядковый тип, множество значений которого содержит не более 255 элементов.
Примеры объявлений переменных типа множество
Var
X:set of byte;
Y:set of char;
Примеры определения констант типа множество
[]; устое множество
[1,5,7,12];
['А'..'Я'];
['А'..'Я', 'а'..'я'];
Операции над множеством
Объединение множеств.
Знак операции +.
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.
Пересечение множеств
Знак операции *.
Var
S1,s2,s3: set of byte;
Begin
S1:=[1,2,5]; s2:=[3,5,7]; s3:=s1+s2; //в s3 множество [5]
End.
Вычитание множеств
Знак операции -.
Var
S1,s2,s3: set of byte;
Begin
S1:=[1,2,5]; s2:=[3,5,7]; s3:=s1-s2; //в s3 множество [1, 2]
End.
Сравнение множеств
Равенство. Знак операции =.
Два множества равны, если они состоят из одних и тех же элементов.
Неравенство.
Множество S1 больше множества S2, если S2 является подмножеством S1.
Операция 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
Дан текст, хранящийся в строковой переменной s, определить, входит ли подстрока ss в строку s.
Даны две строки, состоящие только из цифр (длина каждой более 10 символов). Считая , что в этих строках находятся очень длинные целые числа, сформировать третью строку - сумму этих чисел.
Вариант 3
Дан текст, хранящийся в строковой переменной s, вставить подстроку ss в строку s с позиции N. N вводится пользователем.
Дано предложение, в котором содержаться группы цифр (каждая не более 6 цифр). Группы отделяются друг от друга пробелами. Каждая группа - это символьный эквивалент целого десятичного числа. Найти эти группы и преобразовать в число. Полученное целое число перевести в систему с основанием N(2<=N<=16). Результат формировать в строковой переменной.
Вариант 4
Дана последовательность символов, которая вводиться посимвольно с клавиатуры. Запишите эту последовательность в короткую строку, не используя операцию конкатенации.
Дано предложение, состоящее из слов, разделенных запятой или пробелами среди которых есть группы цифр, определяющих целые числа из диапазона 0..65535.Удалить из текста все числа, принадлежащие диапазону [-100..100] и на их место поставить символ *.
Вариант 5
Разработайте программу копирования: а) длинной строки в короткую; б)длинной в длинную, рассматривая строки как массивы символов.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. Среди слов встречаются слова, представляющие код некоторого десятичного числа в 8- ой системе счисления (признака 8 кода: число начинается с символа O: само число. составленно из цифр ‘0’..’7’ ). Найти восьмеричные числа и заменить их десятичным значением.
Вариант 6
Дан текст, как последовательность символов, сохраните его в числовой переменной, если текст представляет число, или выведите номер символа, который нельзя преобразовать в числовой формат.
Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть группы цифр, определяющих целые числа из диапазона integer. Удалить из предложения те целые числа, в десятичной записи которых есть цифры 5,6,7 , а остальные числа увеличить на 2.
Вариант 7
Дано целое число, записать его в строковый форма, предвари
тельно проверив, что оно состоит из цифр десятичной системы
счисления.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. Вывести слова предложения предварительно преобразовав их следующим образом:
перенести последнюю букву в начало слова;
удалить из слова повторные вхождения каждой буквы.
Вариант 8
Строковая переменная содержит вещественное число в форме с фиксированной точкой. Разработайте программу преобразования числа из строкового формата в числовой формат.
Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть слова, составленные только из цифр, определяющие целые числа из диапазона 0 .. 65535. Удалить из предложения все числа, состоящие из одинаковых цифр. Сформировать массив из чисел предложения, преобразовав их в обратные (например: исходное число 123, а в массив записать 321).
Вариант 9
Дан текст, представленный в строковой переменной, определить позицию первого вхождения символа в текст.
Дано предложение и управляющий символ, значением которого может быть один из символов Y , N. Вывести этот текст без входящих в него цифр, если значение символа управления = Y ,а если этот символ = N, то перенести все цифры текста в конец предложения так, чтобы первая встреченная в исходном тексте цифра была последней цифрой, а последняя первой и был сохранен порядок следования остальных цифр.
Вариант 10
Удалить из строки подстроку, начиная с позиции N и длиной L.
Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть группы цифр, определяющих целые числа из диапазона [0..19]. Отредактировать введенную строку, заменив каждое число, на последовательность, заключенную в круглые скобки, символа +, (если число четное) или на –
(если число нечетное), длина которой равна найденному числу .
Вариант 11
Вставить в строку S, подстроку длиной L, начиная с по N.
Дано предложение, состоящее из символов. Вывести это предложение, удалив из него все символы, которые находятся между символами ‘(‘ ‘)’. Сами скобки не удалять, а вместо удаленного текста вставить число, соответствующее количеству удаленных символов. Если хотя бы одной скобки нет, то сообщить об этом.
Вариант 12
Разработать программу, которая делает короткую строку пустой.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. Распечатать те слова предложения, в которых буквы упорядочены по алфавиту, и удалить те слова, в которых каждая буква входит в слово не менее двух раз.
Вариант 13
Разработать программу, которая определяет длину строки, хранящейся в переменной типа string.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. Найти самое длинное симметричное слово и сформировать множество из букв этого слова. Вывести буквы, из которых оно составлено в алфавитном порядке используя множество. Заменить слово в предложении числом, определяющим его номер среди симметричных чисел.
Вариант 14
Разработать программу, которая подсчитывает количество вхождений заданного символа в текст.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. Составить частотный словарь слов, указав, сколько раз данное слово встретилось в предложении. При этом изменить предложение: - удалив повторные вхождения слов и вставив перед первым вхождением слова подстроку вида:(Число), где - Число – определяет количество таких слов в предложении.
Вариант 15
Удалить из строкового значения все вхождения заданного
символа.
Дано целочисленное арифметическое выражение, записанное как строка, в десятичной системе счисления. Проверить правильность записи и вычислить значение выражения. Выражение записывается без скобок, операции выполняются в порядке их следования.
Вариант 16
Разработать программу, которая выполняет конкатенацию двух заданных строк.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. Удалить из предложения все слова, начинающиеся с гласных букв русского алфавита, а слова, начинающиеся с согласных букв записать прописными буквами. Между словами, заканчивающимися и начинающимися одной буквой, вставить подстроку -*-.
Вариант 17
Разработать программу форматирования значения даты вида дд/мм/гг, исключая ведущий нуль в поле дд, добавляя ведущий ноль в поле мм. Например, 01/1/06 представить 1/01/2006.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. Среди слов этого предложения найти слова составленные из тех же букв что и первое слово. Найденные слова переставлять в начало предложения.
Вариант 18
Разработать программу, которая выводит значение короткой строки.
Дано предложение, состоящее из слов, разделенных запятой или пробелами. В данном предложении есть слова, представляющие запись вещественного числа в формате с плавающей точкой (т.е.+/-хххх.ххххЕ+/-рррр) . Создать массив вещественных чисел. В тексте эти слова заменить символом *.
Вариант 19
Разработать программу, которая удаляет указанный символ из короткой строки.
Дано предложение, состоящее из слов, разделенных запятой
или пробелами. Среди слов встречаются слова, представляющие код некоторого десятичного числа в 8- ой системе счисления (признака 8 кода: число начинается с символа O: само число. составленно из цифр ‘0’..’7’ ). Найти восьмеричные числа и заменить их десятичным значением.
Вариант 20
Строковая переменная содержит вещественное число в форме с фиксированной точкой. Написать подпрограмму конвертирования числа из строкового формата в числовой.
Дана последовательность чисел(целых и вещественных). Преобразовать каждое число в строковое представление. Объединить несколько подряд идущих строк – представлений чисел в одну строку, разделяя их символом пробел. Объединение строки производить пока длина строки не превысит 255 символов.
Вариант 21
Дано целое число. Записать его в строковую переменную, объявленную так string[10].
Дано предложение, состоящее из слов разделенных пробелами. Среди слов могут быть числа шестнадцатеричного кода, которые начинаются с символа $. Сформировать массив из десятичных значений шестнадцатеричных чисел, а сами шестнадцатеричные числа удалить из предложения.
Примеры программ обработки текстовой информации.
Пример обработки строки с использованием встроенных функций
Выполнить сжатие текста по правилу: подпоследовательность повторяющихся символов заменить на подстроку вида (к)символ, где к – количество символов в подпоследовательности. Например, текст а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.
