Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Задача на множества


Автор: Ekatharina 28.6.2009, 23:07
Постановка задачи
Даны 2 набора целых чисел. Определить какие из чисел есть в обоих наборах

люди добрые спасите пожалуйста.... smile я не разбираюсь в паскале.....

Автор: neic 29.6.2009, 01:15
А пары плохо однако пропускать. Задач может быть с ошибками, ибо в 2 ночи тестить не резон.
Код

var i,j:integer
      a:array[1..5] of integer
      b:array[1..5] of integer

begin
writeln('vvedite chsila po 5 na mnojestvo');
For i:=1 to 5 do
      Readln(a[i])

For i:=1 to 5 do
      Readln(b[i])

writeln;

For i:=1 to 5 do
begin
      For j:=1 to 5 do
      begin
              If A[i]=B[j] then
                    wite(a[i])
      end;
end;

readkey
end.


Автор: Elerond 29.6.2009, 05:54
neic, немного зря писал, он просил на множества. У тебя массивы. 

Автор: Ekatharina 29.6.2009, 16:54
Пасибки канешно за старания....эх. может кто нить сможет написать на множества? 
у меня экзамен через 2 дня...если эту задачу не сдам меня не допустят  smile 

Автор: neic 30.6.2009, 01:23
В принципе разница небольшая.

Есть допустим набор A состоящий из 5 элементов, есть набор B из 5 элементов.

Можно конечно вбить в 2 строчки и проверить поэлементно практически также.

Для утверждения можно ввод сделать в {} скобки  smile 

Автор: neic 30.6.2009, 02:48
Вспомнил я про множества...да действительно не так.

Если кто-нить подскажет как вытащить из множества элемент, то я решу...

а так пока решил так:

Код

uses crt;
var b: set of char;
    s: string;
    i: integer;
begin

clrscr;
b:=['1','2','3'];
s:='2';

For i:=1 to length(s) do
begin
    If s[i] in b then
    begin
       write('1');
    end;
end;
readkey;
end.


Минус в том, что прога не сможет правильно обрабатывать числa >9

Автор: AndreyZ53 30.6.2009, 10:21
Код

program test;
uses crt;
type
Dig=set of char;
var
A:Dig;
str,str2:string;
i:integer;
begin
   clrscr;
   writeln('Vvedite mnogestvo');
   readln(str);
   for i:=1 to length(str) do
    begin
     include(A,str[i]);
    end;
   writeln('Vvedite 2 mnogestvo');
   readln(str2);
   for i:=1 to length(str2) do
    begin
     if str2[i] in A then
      write(str2[i]);
    end;
   readln;
end.

Автор: neic 30.6.2009, 12:25
AndreyZ53, у тебя тот же самый косяк будет.

Цитата(neic @  30.6.2009,  02:48 Найти цитируемый пост)

Минус в том, что прога не сможет правильно обрабатывать числa >9


ты просто сделал ввод по другому.

Автор: AndreyZ53 30.6.2009, 17:34
Ну хорошо, а так?

Код

program test;
uses crt;
type
   Dig=set of 0..255;
var
a,b:array[1..100] of integer;
H:Dig;
i,n,m,j:integer;
begin
   clrscr;
   writeln('Vvedite kolvo chisel 1 mnogestva');
   readln(n);
   writeln('Vvedite 1 mnogestvo');
   for i:=1 to n do
    begin
     readln(a[i]);
    end;
   for i:=1 to n do
    begin
     include(H,a[i]);
    end;
   writeln('Vvedite kolvo chisel 2 mnogestva');
   readln(m);
   writeln('Vvedite 2 mnogestvo');
   for j:=1 to m do
    begin
     readln(b[j]);
    end;
   for j:=1 to m do
    begin
     if (b[j] in H) then
      write(' ',b[j]);
    end;
   readln;
end.

Автор: neic 30.6.2009, 20:24
AndreyZ53, тут ты будешь сравнивать элемент матрицы с элементами множества (что в принципе не правильно, но на 3ку потянет, как мне кажется)
И всё равно будет не правильно работать числа >9, как мне кажется, протестируй:

Попробуй вбить в множество (в a[i]->H)):
11,12,13

в матирцу (в b[i]) вбить:
1, 2, 3, 4

Если я прав: то числа 1, 2, 3 будут выведены и это будет не правильно.

Идеально было бы сделать так:
Вбить строку разделяя элементы множеств запятыми, пример:
1) 11, 4, 13, 8, 1
2) 1, 5, 8, 11

При сравнении делать проверку так: выдёргиваешь элементы из 1ого множества считывая их до 1ой запятой и проверяешь на включёность (IN).

Мне кажется так будет правильно и впринципе придраться нельзя, т.к. это не будет массивом (матрицей).

Автор: Elerond 1.7.2009, 13:21
Нету паскаля под рукой... так попробую...

определяем множество:
Код

var
  a, b: set of Integer;


Заполняем:
Код

a:=[]; b:=[];
for i:=1 to n do begin
  x:=random(m); 
  y:=random(m);
  a:=a+[x];
  b:=b+[y];
end;

Смотрим элементы которые есть и там и там:
Код

for i:=1 to n do
  if i in a*b then writeln(i);

Автор: neic 1.7.2009, 16:40
Да у Вас всё верно решено. Просто я не особо знал функцию include, поэтому и сомневался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)