Pascal程序toString无法正常工作

时间:2015-02-25 09:18:00

标签: pascal freepascal

我正在开发一个Pascal程序,它可以在不使用内置操作的情况下使用集合。但是我的toString函数不起作用,我无法弄清楚原因。

这是该计划的主要部分

    unit isetADT; {// do not change this!}

interface

const
    MAX_SIZE = 100; {// if needed, use value 100; arbitrary}

type
    iset = record {// your type definition goes here}
    arrayint:array[1..MAX_SIZE] of integer;
    setsize:integer;
    end;

procedure makeEmpty(var s:iset);
function isEmpty(s:iset):boolean;
function isMember(n:integer; s:iset):boolean;
function equals(s1,s2:iset):boolean;
function card(s:iset):integer; {// cardinality}

procedure add(n:integer; var s:iset); {// does nothing if n is already a member of s}
procedure remove(n:integer; var s:iset); {// does nothing if n is not in s}

procedure union(s1,s2:iset; var res:iset);
procedure intersect(s1,s2:iset; var res:iset);
procedure diff(s1,s2:iset; var res:iset); {// s1 - s2}
function toString(s:iset):ansistring;

implementation

{// your implementation code goes here}
procedure makeEmpty(var s:iset);
begin
    {s:=[]; clears array, unneeded}
    s.setsize:=0;
end;

function isEmpty(s:iset):boolean;
var
        empty:boolean;
begin
    empty:=false;
    if s.setsize=0  then
        empty:=true;
    isEmpty:=empty;
end;

function isMember(n:integer; s:iset):boolean;
var
    count:integer;
begin
    member:=false;
    if s.setsize>0 then
    begin
        for count:=1 to s.setsize do
        begin
            if s.arrayint[count]=n then
            isMember:=true;
        end;
    end;
end;

function equals(s1,s2:iset):boolean;
var
    equal:boolean;
    count:integer;
begin
    equal:=false;
    if s1.setsize<>s2.setsize then
    else
    begin
        for count:=1 to s1.setsize do
        begin
            if isMember(s1.arrayint[count],s2) then
            equal:=true
            else
            equal:=false;
        end;
    end;
    equals:=equal;
end;

function card(s:iset):integer; {// cardinality}
var
    cardinality:integer;
begin
    cardinality:=s.setsize;
end;


procedure add(n:integer; var s:iset);
begin
    if isMember(n,s) then
    {it is already in the set nothing is done}
    else
    begin
        s.setsize:=s.setsize+1; {adds 1 to the size so that the new member can be added}
        s.arrayint[s.setsize]:=n; {puts member in the newly created space}
    end;
end;

procedure remove(n:integer; var s:iset);
var
    newsize:integer;
    count:integer;
    count2:integer;
begin
    {needed to keep size constant when it is being changed in nested loops}
    newsize:=s.setsize;
    if isMember(n,s) then
    begin
        for count:= 1 to newsize do
        begin
            if s.arrayint[count]=n then
            begin
                for count2:=1 to newsize do
                begin
                s.arrayint[count]:=s.arrayint[count+1]; {replaces the removed member}
                end;
            s.setsize:=s.setsize-1;{removes unneeded size}
            end;
        end;
    end;
end;


procedure union(s1,s2:iset; var res:iset);
var
    count:integer;
    count2:integer;
begin
    makeEmpty(res);
    if equals(s1,s2) then
    {they are the same, nothing is done}
    else
    begin
        {takes a member of s2 and puts it res if it is not in s1 since res is the same as s1}
        for count:=1 to s1.setsize do
        begin
            add(s1.arrayint[count],res);
        end;

        for count2:=1 to s2.setsize do
        begin
            add(s2.arrayint[count2],res);
        end;
    end;
end;

procedure intersect(s1,s2:iset; var res:iset);
var
    count:integer;
begin
    if equals(s1,s2) then
    res:=s1 {since they are the same only 1 needs to be returned}
    else
    begin
        for count:=1 to s1.setsize do
        begin
            {number is added to res if it is in both s1 AND s2 only}
            if isMember(s1.arrayint[count],s2) then
                add(s1.arrayint[count],res)
        end;
    end;
end;

procedure diff(s1,s2:iset; var res:iset);
var
    member:boolean;
    count:integer;
    count2:integer;
begin
    member:=false;
    if equals(s1,s2) then
    {if they are the same then nothing is returned because there is no difference}
    makeEmpty(res)
    else
    begin
        for count:=1 to s1.setsize do
        begin
            for count2:=1 to s2.setsize do
            begin
                {if number is in s1 and not s2 then it is true and it is added to res}
                if s1.arrayint[count]=s2.arrayint[count2] then
                    member:=true;
            end;
        if member=false then
            add(s1.arrayint[count],res);
        end;
    end;
end;

function toString(s:iset):ansistring; {this is just a string with no size limit}
var
    print:ansistring;
    x:string;
        i: Integer;
        count:integer;
 begin
    print:='';
    for count:=1 to s.setsize do
    begin
        i:=s.arrayint[count];
        str(i,x);
        print:=print+x+',';
    end;
    print:='{'+ print+'}';
    toString:=print;

end;


end. {END OF PROGRAM}

这是该计划的跑步者

program testisetSample;
uses isetADT;
var
s1,s2,s3 : iset;
i : integer;
begin
makeEmpty(s1); makeEmpty(s2);
for i := 1 to 5 do
add(i,s1);
for i := 3 to 8 do
add(i,s2);
intersect(s1,s2,s3);
writeln(toString(s3));
readln;
end.

1 个答案:

答案 0 :(得分:1)

明显的错误:

您正在使用

    print:=print+'x'+',';

何时需要

    print:=print+x+',';

isMember中的错误:

member:=false;

您没有设置isMember,返回的值将是&#34;随机&#34;。您可以完全删除member并始终使用`isMember?

if s.setsize=0 then

应为> 0。但它不需要