设现有一属性集合A={a,b,c,d,e},如何用循环实现求A中包含i个属性的全体子集(i=1,2,3,4,5).

解决方案 »

  1.   

    type TElement=(a,b,c,d,e);
    TElements=set of TElement;
    const
      ElementName:array[TElement]of char=('a','b','c','d','e');
      function ElementsToStr(Elements:TElements):string;
      var i:TElement;
      begin
        Result:='';
        for i:=low(TElement) to high(TElement) do
          if i in Elements then Result:=Result+ElementName[i]+' ';
      end;
    var Elements:TElements;i:Integer;Data:byte absolute Elements;begin
      for i:=1 to (1 shl 5) do
      begin
        Data:=i;
        Writeln(ElementsToStr(Elements));
      end;
    end.
      

  2.   

    更加难懂一点就把ElementsToStr改为:
      function ElementsToStr(Elements:TElements):string;
      var i:TElement;
      begin
        Result:='';
        for i in [a..e] do
          if i in Elements then Result:=Result+ElementName[i]+' ';
      end;呵呵
      

  3.   

    Eastunfail:你好!谢谢你的回复。我的问题可能提得不够清楚。
    我想实现下述功能:
     属性集合A={a,b,c,d,e},我想得到包含i个属性的子集,(i=1..5)
    即:1个属性{a},{b},{c},{d},{e};
        2个属性{a,b},{a,c},{a,d},{a,e},{b,c},{b,d},{b,e},{c,d},{c,e},{d,e};
        3个属性{a,b,c},{a,b,d},{a,b,e},{b,c,d},{b,c,e},{c,d,e};
        4个属性{a,b,c,d},{a,b,c,e},{b,c,d,e};
        5个属性{a,b,c,d,e}.
    且用一个string型变量str来存放包含i个属性的子集,最外层循环用变量i来控制。
      

  4.   

    从原来的代码改的,效率低了点:type TElement=(a,b,c,d,e);
    TElements=set of TElement;
    const
    ElementName:array[TElement]of char=('a','b','c','d','e');
      function ElementsToStr(Elements:TElements):string;
      var i:TElement;
      begin
        Result:='';
        for i in [a..e] do
        if i in Elements then Result:=Result+ElementName[i]+' ';
      end;
      function GetSize(int:byte):Integer;
      var i:Integer;
      begin
        Result:=0;
        for i:=0 to 7 do
        begin
          if ((1 shl i) and int)<>0 then
            Inc(Result);
        end;
      end;
      function GetElements(Size:Integer):String;
      var Elements:TElements;i:Integer;Data:byte absolute Elements;
      begin
        Result:='';
        for i:=1 to (1 shl 5)-1 do
        begin
          Data:=i;
          if GetSize(Data)=Size then
            Result:=Result+'{'+TrimRight(ElementsToStr(Elements))+'} ';
        end;
      end;
    begin
      Writeln(GetElements(1));
      Writeln(GetElements(2));
      Writeln(GetElements(3));
      Writeln(GetElements(4));
      Writeln(GetElements(5));
    end.
      

  5.   

    可不可以给个matlab的同样功能的程序……