Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mnoshtext.doc
Скачиваний:
5
Добавлен:
09.02.2015
Размер:
109.57 Кб
Скачать
  1. type Mn=set of char;

  2. var M1:Mn;

  3. Ch:char;

  4. begin

  5. M1:=[];

  6. Writeln(Rus('Введите символ'));

  7. ReadLn(Ch);

  8. Ch:=RusIn(Ch);

  9. while Ch<>'?' do

  10. begin

  11. M1:=M1+[Ch];

  12. writeln(Rus('Введите символ'));

  13. readLn(Ch);

  14. Ch:=RusIn(Ch);

  15. end;

  16. for Ch:=Chr(0) to Chr(255) do

  17. If Ch in m1 then Write(Rus(Ch));

  18. end.

В приведенном фрагменте ввод символов (элементов множества) производится до тех пор, пока не будет введен символ вопросительного знака. В качестве символа-признака окончания ввода можно выбрать любой символ, вводимый с клавиатуры. Можно при вводе каждый раз выводить пользователю запрос о продолжении ввода, но это неудобно, так как вместо одного символа требуется вводить два символа – ответ на запрос и сам вводимый символ.

  1. repeat

  2. writeln(Rus('Введите символ'));

  3. readLn(Ch);

  4. Ch:=RusIn(Ch);

  5. M1:=M1+[Ch];

  6. writeln(Rus('Продолжить ввод (Y/N)'));

  7. Ch:=RusIn(Ch);

  8. until UpCase(Ch)<>’Y’;

Поскольку множество может содержать максимально 256 элементов, то сфера применения этого типа данных достаточно ограничена. Наиболее удачной сферой применения множеств является использование их при обработке символьных и строковых данных.

Пример 1 использования множеств.Найти в строке все символы, которые встретились в ней ровно по два раза. Найденные символы распечатать в алфавитном порядке, алгоритм упорядочения не использовать.

При написании программы будем использовать три множества. Первое множество будут образовывать все символы, которые присутствуют в строке. Второе множество будет содержать только те символы, которые встретились не менее двух раз. В третьем множестве будут присутствовать те символы, которые встретились в строке более, чем по два раза. Во второе множество очередной символ строки заносится только в том случае, если он присутствует в первом множестве и отсутствует во втором. Если анализируемый символ строки уже присутствует во втором множестве, это означает, что он встретился более, чем во второй раз, и заносится в третье множество. Результирующее множество символов получается в результате вычитания третьего множества из второго.

  1. programmnosh2;

  2. {$APPTYPECONSOLE}

  3. uses

  4. SysUtils;

  5. type Mn=set of char;

  6. Var A,B,C:Mn;

  7. Ch:char;

  8. S:string;

  9. I,n:integer;

  10. function Rus(S:String):String;

  11. var I:Byte;

  12. begin

  13. Result:='';

  14. for I:=1 to Length(S) do

  15. case S[I] of

  16. 'А'..'п': Result:=Result+Chr(Ord(S[I])-64);

  17. 'р'..'я': Result:=Result+Chr(Ord(S[I])-16);

  18. 'Ё': Result:=Result+Chr(240);

  19. 'ё': Result:=Result+Chr(241);

  20. else

  21. Result:=Result+S[I];

  22. end;

  23. end;

  24. function RusIn(S:String):String;

  25. var I:Integer;

  26. begin

  27. Result:='';

  28. for I:=1 to Length(S) do

  29. case Ord(S[I]) of

  30. 128..175: Result:=Result+Chr(Ord(S[I])+64);

  31. 224..239: Result:=Result+Chr(Ord(S[I])+16);

  32. 240: Result:=Result+Chr(168);

  33. 241: Result:=Result+Chr(184);

  34. else

  35. Result:=Result+S[I];

  36. end;

  37. end;

  38. begin

  39. A:=[];

  40. B:=[];

  41. C:=[];

  42. WriteLn(Rus('Введите строку'));

  43. ReadLn(S);

  44. S:=RusIn(S);

  45. N:=Length(S);

  46. for I:=1 to N do

  47. begin

  48. if S[I] in A then

  49. if not(S[I] in B) then B:=B+[S[I]]

  50. else C:=C+[S[I]]

  51. else A:=A+[S[I]];

  52. end;

  53. B:=B-C;

  54. WriteLn(Rus('Символы, встретившиеся ровно по два раза в строке'));

  55. for Ch:=Chr(0) to Chr(255) do

  56. if Ch in B then Write(Rus(Ch));

  57. Readln;

  58. end.

Пример 2 использования множеств.Во втором примере рассмотрим использование множеств для работы с числовыми (целыми) значениями. Задача состоит в том, чтобы определить все простые числа из заданного диапазона целых чисел, причем максимальное число не должно превышать 3000.

Для определения простых чисел можно использовать алгоритм, названный решетом Эратосфена. Для этого сначала следует сформировать множество всех целых чисел в диапазоне от 1 до n, гдеn– максимальное число. Во второе множество заносятся простые числа. Для этого в него сначала помещаются два первых простых числа 1 и 2. Из исходного множества исключаются эти числа и все другие числа, кратные двум. Затем в исходном множестве находится минимальное число, которое является следующим простым числом. Это число включается в результирующее множество, а из исходного множества опять исключаются все числа, кратные найденному, включая само это число. Описанная процедура повторяется до тех пор, пока исходное множество не станет пустым.

Для решения поставленной задачи необходимо использовать массив множеств, так как все исходные числа не могут быть представлены в одном множестве. Если в одном множестве будут представлены mmчисел, то всего потребуется ]3000/mm[ элементов (множеств) массива. В этом случаеj-ый элементi-го множества будет соответствовать числу (i-1)*mm+j.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]