суббота, 15 октября 2016 г.

Вывод подмножеств

Задание:
Напишите программу, которая выводит все подмножества множества {a, b, c, d}

Решение:
Был выбран язык Delphi/Object Pascal из-за наличия встроенной работы с множествами.


1) Код "в лоб":
program Sets;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes;

type
  TSet = set of (a, b, c, d);

var
  I: Byte;
  SetX: TSet;

begin
  for I := 0 to 15 do
  begin
    SetX := TSet(I);
    write('{');
    if a in SetX then
      write('A');
    if b in SetX then
      write('B');
    if c in SetX then
      write('C');
    if d in SetX then
      write('D');
    writeln('}');
  end;

  readln;
end.
Вывод:
{}
{A}
{B}
{AB}
{C}
{AC}
{BC}
{ABC}
{D}
{AD}
{BD}
{ABD}
{CD}
{ACD}
{BCD}
{ABCD}
Недостаток:
Плохое форматирование.


2) Код использующий операции над множествами для улучшенного вывода:

program Sets;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes;

type
  TSet = set of (a, b, c, d);

var
  I: Byte;
  SetX: TSet;

begin
  for I := 0 to 15 do
  begin
    SetX := TSet(I);
    write('{');
    if a in SetX then
      if SetX - [a] = [] then write('A') else write('A, ');
    if b in SetX then
      if SetX - [a, b] = [] then write('B') else write('B, ');
    if c in SetX then
      if SetX - [a, b, c] = [] then write('C') else write('C, ');
    if d in SetX then
      write('D');
    writeln('}');
  end;

  readln;
end.

Вывод:

2 комментария:

  1. интересно! а что можно/нужно сделать, чтобы выводить сначала все одноэлементные, потом все двухэлементные и т.п.? и наверное допилить ввод самого множества а не хардкодом его задавать?

    ОтветитьУдалить
    Ответы
    1. "а что можно/нужно сделать, чтобы выводить сначала все одноэлементные, потом все двухэлементные и т.п.?" - первое что приходит в голову - отсортировать по количеству элементов, либо можно сделать двойной цикл, где наружный цикл - перебирает количество элементов 0..4, а внутренний производя перебор 0..15, выводит только те подмножества, которые имеют количество элементов равные итератору внешнего цикла.

      "и наверное допилить ввод самого множества а не хардкодом его задавать?" - не совсем понятно, в каком виде множество не хардкодить? Не хардкорить количество элементов или буковки?

      Удалить