算法思路:希望用x作为行,i作为列.每往下一行就减少一列,减少的列为delid所示的数.
但我的程序代码做出来后,在第一行已经被减掉的数字还在后面的行中出现.请高手帮忙指正错在哪里了,不胜感激.
    i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 
x=1  1   2   3   4   6   7    8 
x=2  1   2   3   4   7   8
x=3  1   3   4   7   8
x=4  1   4   7   8
x=5  1   7   8
x=6  1   8如上是我想实现的结果,但我写的程序在x=3的时候为 1  4  5  7  8 ;x=4 时为 1  6  7  8 都和预期不一致.请高手指正.
var i:integer;
    x:integer;
    y:integer;
    w:string;
const delid:array[1..6] of integer =(5,6,2,3,4,7);function Deid (x,i: integer): integer;
var h:integer;
    f:integer;
    g:integer;
    temp:integer;
    p:integer;
    min:integer;
begin
temp:=9;
min:=0;
for f:=1 to x do 
begin 
g:=1; 
while g <=x do 
begin 
p:=delid[g]; 
if p <temp then
begin 
if p>min then 
begin 
h:=p; 
p:=temp; 
temp:=h;
end; 
end; 
g:=g+1; 
end; 
if i>=temp then 
begin
i:=i+1;
end;
min:=temp;
temp:=p; 
end;
result:=i;
end;begin
with adoquery1 do
    begin
    close;
    sql.clear;
    sql.add('create table b (x1 integer,i1 integer,str integer)');
    execsql;
    end;for x:=1 to 6 do
begin
for i:=1 to 8-x do
begin
w:=deid(x,i);
with adoquery1 do
    begin
    close;
    sql.clear;
    sql.add('insert into b (x1,i1,str) values(x,i,w)');
    parameters.parambyname('x').value:=x;
    parameters.parambyname('i').value:=i;
    parameters.parambyname('w').value:=w;
    execsql;
    end;end;
end;
end;
end;

解决方案 »

  1.   

    我不知道理解有错没有,其实这种减数的东西最好用string来做,比如
    s:string;s:='11234678';你要次第剪掉第一个,for i:=1 to length(s) do
      s:=delete(s,1,1);搞掂,比用数组容易。
      

  2.   

    看不明白你的代码,没对齐,晕了。
    给你写个新的代码。
    var
        i,j:integer;
        strs:TStringList;
        const delid:array[1..6] of integer =(5,6,2,3,4,7);
    begin
        strs:=TStringList.Create;
        for i:=1 to 8 do
            strs.Add(IntToStr(i));///////加如初始值1----------8
    ...............    for i:=1 to 6 do
        begin
            strs.Delete(strs.IndexOf(IntToStr(delid[i])));
            for j:=0 to strs.Count-1 do
            with adoquery1 do
            begin
                close;
                sql.clear;
                sql.add('insert into b (x1,i1,str) values(x,i,w)');
                parameters.parambyname('x').value:=i;
                parameters.parambyname('i').value:=j+1;
                parameters.parambyname('w').value:=strs.Strings[j];
                execsql;
            end;
        end;
        strs.Free;
    end;
      

  3.   

    谢谢上面的两位大哥,因为我这个算法本来应该是三维的,为了好说明,所以我简化了,其实并不是可以用string就能完成的,所以还请大哥帮忙看看代码是错在哪里了,或者给个用数值来实现的代码。
      

  4.   

    再给你写个数字的,你的Deid函数计算方法不好,不知道是不是有其他原因,每次都要从第一层开始过滤,太多重复,用个数组来记录过滤后的数据,这样每次过滤一下就好。var
        a:Array[0..7] of integer;
        i,j:integer;
        s:string;
        xLast,iValidCnt:integer;
        const delid:array[1..6] of integer =(5,6,2,3,4,7);    function Deid (x,i: integer): integer;
        var 
            f:integer;
            g:integer;
        begin
            if  xLast<x then
            begin
                for f:=0 to iValidCnt-1 do
                    if delid[x]=a[f] then
                    begin
                        for g:=f to iValidCnt-2 do
                            a[g]:=a[g+1];
                        inc(iValidCnt,-1);
                        break;
                    end;
            end;        xLast:=x;
            Result:=a[i-1];
        end;
    begin
        for i:=1 to 8 do
            a[i-1]:=i; ///////初始化数组,添入值1-------8
        xLast:=0;////////////上次过滤的位置,为了和你的原来函数用法一致,增加的变量
        iValidCnt:=8;///////目前数组有效长度    for x:=1 to 6 do
        begin
            s:='';
            for i:=1 to 8-x do
            begin
               w:=IntToStr(deid(x,i)); 
               .......................
            end;
        end;end;
      

  5.   

    4楼的大哥,小弟比较笨,不会把二维的函数变成三维的,
    我原来的程序如下,其实是想实现决策树的算法,x表示树的层数,y表示每层中的树枝,i表示这个树枝中的第i个数.上面的我简化成了每层只有一个树枝.但不会变成三维了.
    下面程序中的delid[g,j]是其他地方调用过来的,就是g层中第j个树枝要删掉的数.
    帮我看看吧,搞了几天了,头都大了.不胜感激.
    function Deid (x,y,i: integer): integer;
    var j:integer;
        h:integer;
        f:integer;
        g:integer;
        temp:integer;
        p:integer;
        min:integer;
    begin
    delid[1,1]:=5;
    delid[1,2]:=5;
    temp:=9;
    min:=0;
    for f:=1 to x do
    begin
    g:=1;
    while g<=x do
    begin
    j:=ceil(y/(power(2,(x-g))));
    p:=delid[g,j];
    if (p<temp) and (p>min) then
    begin
    h:=p;
    p:=temp;
    temp:=h;
    end;
    g:=g+1;
    end;
    if i>=temp then
    begin
    i:=i+1;
    end;
    min:=temp;
    temp:=p;
    end;
    result:=i;
    end;