Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 32
1

Реализация бинарной операции над множествами: "Симметрическая разность"

03.01.2019, 01:25. Показов 6272. Ответов 8

Author24 — интернет-сервис помощи студентам
Само условие:
Реализуйте бинарную операцию над множествами — симметрическую разность. Ее результатом являются те элементы двух множеств, которые принадлежат ровно одному из множеств (но не принадлежат их пересечению).

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

Выходные данные
Результат требуется вывести в том же формате: сначала количество элементов, полученных в результате операции, затем (если получено ненулевое количество элементов) вывести сами элементы в порядке возрастания.

Множества во входных данных могут быть неупорядочены и содержать равные элементы. Множество в выводе должно быть упорядочено и все элементы его должны быть различными.

Примеры
входные данные
3
1 2 3
2
1 2

выходные данные
1
3

Буду очень признателен за решение с комментариями.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.01.2019, 01:25
Ответы с готовыми решениями:

Реализовать операции над множествами: объединение, пересечение, разность
Модуль. Разработать способ представления множеств, содержащих более 255 элементов. Реализовать...

Операции над множествами
Даны три множества X1, X2, X3, содержащие целые числа из диапазона 100...200. Известно, что...

Операции над множествами
Выполнить операции над заданными множествами (A Δ B) ∩ C, где A Δ B = (A U B) \ (A ∩...

Операции над множествами
Даны два числовых множества A = (2,3,4,5,6,7,8,10) и B = (1,3,4,7,9,12,15). Написать программу,...

8
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
03.01.2019, 10:35 2
Цитата Сообщение от TheSuperSerg Посмотреть сообщение
количество элементов первого множества. Во второй строке через пробел перечислены эти элементы (натуральные числа).
А какой порядок количества и элементов?
0
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 32
05.01.2019, 00:58  [ТС] 3
Puporev, не понял ваш вопрос.
0
Модератор
9867 / 5235 / 3306
Регистрация: 17.08.2012
Сообщений: 16,005
05.01.2019, 04:27 4
TheSuperSerg, что может быть непонятного?

Напишите так:

"Максимальное количество элементов множества равно ..., каждый элемент множества не более ...".

Вместо многоточий укажите соответствующие числа.
0
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 32
05.01.2019, 22:20  [ТС] 5
Puporev, Максимальное количество элементов множества равно 256, каждый элемент не более 109
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
05.01.2019, 22:26 6
Еще забыл спросить какой Паскаль? В АВС.net можно работать с такими числами как с множествами, в других Паскалях только как с массивами, там для чисел только тип set of byte([0..255]).
0
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 32
06.01.2019, 01:23  [ТС] 7
Puporev, можно на любом, не важно.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
06.01.2019, 09:23 8
Лучший ответ Сообщение было отмечено TheSuperSerg как решение

Решение

Паскаль АВС.net
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var m1,m2,m3:set of integer;
    n1,n2,n3,a,mn,mx:integer;
begin
readln(n1);//читаем первое число
m1:=[];
for var i:=1 to n1 do//читаем числа из 2 строки
 begin
  read(a);
  include(m1,a);//заносим их в множество
 end;
readln(n2);//читаем второе число
m2:=[];
for var i:=1 to n2 do//читаем числа из 4 строки
 begin
  read(a);
  include(m2,a);//заносим во 2 множество
 end; 
m3:=(m1-m2)+(m2-m1);//получаем симметрическую разность
n3:=0;//считаем число элементов в множестве
mn:=maxint;//и находим минимальный и максимальный
mx:=-maxint-1;//в АВС.net выводит множество не в порядке возрастания
foreach var s in m3 do
 begin
  inc(n3);
  if s<mn then mn:=s
  else if s>mx then mx:=s;
 end; 
 writeln(n3);//выводим количество чисел в новом множестве
 if n3>0 then//если в множестве есть числа
 for var s:=mn to mx do//выводим числа в порядке возрастания
 if s in m3 then write(s,' ');
 end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
06.01.2019, 11:28 9
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const TSetMaxSize=256;
type
  TSet = record
    count: Word;
    data: array [0..TSetMaxSize-1] of LongInt;
  end;
 
function SymDiff(var s: TSet; const a, b: TSet): Boolean;
var ai, bi: Word;
begin with s do begin
  SymDiff:=False; count:=0; ai:=0; bi:=0;
  while (ai<a.count) and (bi<b.count) do begin
    if a.data[ai]<b.data[bi] then
      if count<TSetMaxSize then begin
        data[count]:=a.data[ai]; Inc(count); Inc(ai);
      end else Exit
    else if a.data[ai]>b.data[bi] then
      if count<TSetMaxSize then begin
        data[count]:=b.data[bi]; Inc(count); Inc(bi);
      end else Exit
    else begin
      Inc(ai); Inc(bi);
    end;
  end;
  while ai<a.count do
    if count<TSetMaxSize then begin
      data[count]:=a.data[ai]; Inc(count); Inc(ai);
    end else Exit;
  while bi<b.count do 
    if count<TSetMaxSize then begin
      data[count]:=b.data[bi]; Inc(count); Inc(bi);
    end else Exit;
  SymDiff:=True;
end; end;
Для добавления/удаления/проверки наличия можно использовать что-то вроде:
Pascal
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
function LowerBound(const v: array of LongInt; left, right: Word; x: LongInt): Word;
var m: Word;
begin
  while left<right do begin
    m:=left+(right-left) div 2;
    if x>v[m] then left:=m+1 else right:=m;
  end;
  LowerBound:=left;
end;
 
function sInclude(var s: TSet; x: LongInt): Boolean;
var i, j: Word;
begin with s do begin
  sInclude:=True;
  i:=LowerBound(data,0,count,x);
  if (i<count) and (data[i]=x) then Exit;
  if count=TSetMaxSize then begin
    sInclude:=False; Exit;
  end;
  Inc(count); for j:=count downto i+1 do data[j]:=data[j-1];
  data[i]:=x;
end; end;
 
procedure sExclude(var s: TSet; x: LongInt);
var i: Word;
begin with s do begin
  i:=LowerBound(data,0,count,x);
  if (i<count) and (data[i]=x) then begin
    Dec(count); for i:=i to count do data[i]:=data[i+1];
  end;
end; end;
 
function sIsIn(const s: TSet; x: Longint): Boolean;
var i: Integer;
begin with s do begin
  i:=LowerBound(data,0,count,x);
  sIsIn:=(i<count) and (data[i]=x);
end; end;
Пример использования
Pascal
75
76
77
78
79
80
81
82
83
84
var
  a, b, c: TSet;
  n: Word; x: LongInt;
begin
  Read(n); for n:=1 to n do begin Read(x); sInclude(a,x); end;
  Read(n); for n:=1 to n do begin Read(x); sInclude(b,x); end;
  if SymDiff(c,a,b) then with c do begin
    WriteLn(count); if count>1 then for n:=0 to count-1 do Write(' ',data[n]); WriteLn;
  end else WriteLn('Ошибка: слишком много значений');
end.
1
06.01.2019, 11:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2019, 11:28
Помогаю со студенческими работами здесь

Операции над множествами
Не могу разобраться, помогите пожалуйста. Пусть U= {a, b, с, d}, X= {а, с}, Y= {a, b, d}, Z= {b,...

Реализовать классические операции над множествами - объединение, пересечение и симметричная разность
Создать параметризованный тип данных - множество. Этот тип предназначен для хранения множества...

Работа с множествами: объединение, пересечение, симметрическая разность
В общем нужно задать 3 множества (a,b,c) (массивы) И на выходе получить (&quot;A&quot; объединение с &quot;B&quot;)...

Операции над множествами
Здравствуйте уважаемые. Нужно найти объединение, пересечение и разницу множеств А и В. a). A =...

Операции над множествами
Как реализовать стандартные операции объединение, пересечение и разность над множествами без...

Операции над множествами
Задано 5 множеств A, B, C, D, E перечисляемого типа. Получить множество Х, которое вычисляется по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru