【问题标题】:Pascal Program toString not working帕斯卡程序 toString 不工作
【发布时间】:2015-02-25 09:18:00
【问题描述】:

我正在开发一个 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.

【问题讨论】:

  • Not working 是一个非常有限的描述,它是不是正在编译,如果它产生异常输出,你得到的输出是什么,你期望什么?
  • 正在编译。它应该做的是打印 {3,4,5},因为那是 2 个集合相交的地方,但我得到的只是 {}。
  • 哇。对于一个关于单个 toString 函数的问题来说,这是大量的代码。似乎可以通过删除许多不相关的代码来减少这种情况,这将使它对这里的未来读者更有用。 (当然,您接受的答案的comment 表明您发布的大部分内容无论如何都无关紧要。)

标签: pascal freepascal


【解决方案1】:

明显错误:

你正在使用

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

当你想要的时候

    print:=print+x+',';

isMember中的错误:

member:=false;

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

if s.setsize=0 then

应该是&gt; 0。但这不是必需的

【讨论】:

  • 我还是什么也没得到,唯一打印出来的就是集合的 {},仅此而已。
  • 查看了其他功能...(通常它看起来样式很糟糕且毫无意义,因为 fpc 具有一些设置/列表功能。)
  • 我知道集合操作是内置的,但我们不允许使用它们,这是我第一次使用 Pascal 的经验,因此对糟糕的设计表示歉意。我更改了isMember函数,但输出仍然错误。
  • 最后一个逗号?否则,在所有这些更改之后它可以在这里工作(必须为此安装 fpc)
  • 我第二次尝试了它,它有效,我只是犯了愚蠢的错误,无法阅读/打字。我将只编辑格式,这样最后的逗号就不会被打印出来。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多