在对象pascal中计算字符串中的不同字符数

在对象pascal中计算字符串中的不同字符数,pascal,freepascal,Pascal,Freepascal,你好, 我编写了这个代码,它应该对字符串中的不同字符进行计数,我的代码通过几个输入进行了测试,但它无法对该输入中的字符进行计数: zcinitufxoldnokacdvtmdohsfdjepyfioyvclhmujiqwvmudbfjzxjfqqxjmoiyxrfsbvseawwoyynn 它几乎有80个字符,Pascal可以读取的最大字符串长度为256个字符。 我找不到更好的算法来解决这个问题,所以我想从这个领域的专家或者任何愿意分享知识的人那里寻求帮助 我猜我的代码在每个循环中跳转一个字

你好, 我编写了这个代码,它应该对字符串中的不同字符进行计数,我的代码通过几个输入进行了测试,但它无法对该输入中的字符进行计数:

zcinitufxoldnokacdvtmdohsfdjepyfioyvclhmujiqwvmudbfjzxjfqqxjmoiyxrfsbvseawwoyynn 
它几乎有80个字符,Pascal可以读取的最大字符串长度为256个字符。 我找不到更好的算法来解决这个问题,所以我想从这个领域的专家或者任何愿意分享知识的人那里寻求帮助

我猜我的代码在每个循环中跳转一个字符

这是我的密码:

function freq(char: char; username : String): Integer;
var 
   i, auxfreq: Integer;
begin
    auxfreq:= 0;
    for i:= 1 to length(username) do
        if char = username[i] then
            auxfreq:= auxfreq + 1;
            //writeln(freq);    
    freq:= auxfreq;         
end; 

function OddUserName(username : String): Boolean;
var
    usernameaux : String;
    length_usernameaux, i : Integer;
    Result : Boolean;

begin
    Result:= false;
    usernameaux:= username;
    i:= 0;
    repeat
        i +=1; 
        length_usernameaux:= length(usernameaux);
        if freq(usernameaux[i], usernameaux) <> 1 then 
            delete(usernameaux, i, 1);
    until i = length_usernameaux;
    // length(usernameaux) is supposed to be the number of the distinct characters.
    
    {if length(usernameaux) mod 2 <> 0 then // you will have to ignore this.
        Result:= true; // odd}

    //writeln(usernameaux); 
    //writeln(length(usernameaux));
    OddUserName:= Result; // ignore this too    
end; 
函数freq(char:char;username:String):整数;
变量
i、 auxfreq:整数;
开始
auxfreq:=0;
对于i:=1到长度(用户名)do
如果char=username[i],则
auxfreq:=auxfreq+1;
//写入(频率);
频率:=auxfreq;
结束;
函数OddUserName(用户名:字符串):布尔值;
变量
usernameaux:String;
长度_usernameaux,i:整数;
结果:布尔型;
开始
结果:=假;
usernameaux:=用户名;
i:=0;
重复
i+=1;
length_usernameaux:=长度(usernameaux);
如果freq(usernameaux[i],usernameaux)1,则
删除(usernameaux,i,1);
直到i=length\u usernameaux;
//长度(usernameaux)应该是不同字符的数量。
{如果length(usernameaux)mod 2 0,则//您必须忽略此项。
结果:=true;//奇数}
//writeln(usernameaux);
//writeln(长度(usernameaux));
OddUserName:=结果;//也忽略这一点
结束;

我衷心感谢您的帮助。

当您从字符串中删除()字符时,您没有正确解释字符串长度的变化

如果
username
为空,则由于
repeat
循环试图访问索引1中不存在的字符,因此最终访问的字符无效。实际上,由于
i=length\u usernameaux
将始终为False,因此您最终会陷入一个无休止的循环,因为
i
从1开始并向上递增,但
length\u usernameaux
始终为0(至少,循环会一直运行,直到
i
溢出到负值,并最终增加到0,但到那时,您可能已经在这之前崩溃了代码)

如果
username
不为空,则在每次循环迭代中递增
i
,当
delete()
i
处添加字符时,它将跳过下一个字符
删除()
'd,因为下一个字符将向下滑动以占据刚刚删除的字符的索引。仅当不删除字符时,才增加
i

请尝试以下方法:

函数freq(chartofId:char;用户名:String):整数;
变量
i、 auxfreq:整数;
开始
auxfreq:=0;
对于i:=1到长度(用户名)do
开始
如果chartofId=username[i],则
auxfreq:=auxfreq+1;
结束;
//写入(频率);
频率:=auxfreq;
结束;
函数OddUserName(用户名:字符串):布尔值;
变量
usernameaux:String;
长度_usernameaux,i:整数;
结果:布尔型;
开始
结果:=假;
usernameaux:=用户名;
length_usernameaux:=长度(usernameaux);
i:=1;
而我呢
开始
删除(usernameaux,i,1);
length_usernameaux:=length_usernameaux-1;
结束其他
开始
i=i+1;
结束;
结束;
//length_usernameaux应该是不同字符的数量。
{如果length_usernameaux mod 2 0,则//您必须忽略此项。
结果:=true;//奇数}
//writeln(usernameaux);
//writeln(长度_usernameaux);
OddUserName:=Result;//也忽略此选项
结束;

当您从字符串中删除()个字符时,您没有正确考虑字符串长度的变化

如果
username
为空,您将访问无效字符,因为您的
repeat
循环尝试访问索引1处不存在的字符。实际上,由于
i=length\u usernameaux
将始终为False,因为
i
从1开始并向上递增,但
leng,您将进入一个无止境的循环th_usernameaux
始终为0(至少,循环运行直到
i
溢出为负值,并最终递增回0,但到那时,您可能已经在这之前崩溃了代码)

如果
username
不为空,则在每次循环迭代中递增
i
,当
delete()
i
处添加字符时,它将跳过下一个字符
删除()
'd,因为下一个字符将向下滑动以占据刚刚删除的字符的索引。仅当不删除字符时,才增加
i

请尝试以下方法:

函数freq(chartofId:char;用户名:String):整数;
变量
i、 auxfreq:整数;
开始
auxfreq:=0;
对于i:=1到长度(用户名)do
开始
如果chartofId=username[i],则
auxfreq:=auxfreq+1;
结束;
//写入(频率);
频率:=auxfreq;
结束;
函数OddUserName(用户名:字符串):布尔值;
变量
usernameaux:String;
长度_usernameaux,i:整数;
结果:布尔型;
开始
结果:=假;
usernameaux:=用户名;
length_usernameaux:=长度(usernameaux);
i:=1;
而我呢
开始
删除(usernameaux,i,1);
length_usernameaux:=length_usernameaux-1;
结束其他
开始
i=i+1;
结束;
结束;
//length_usernameaux应该是不同字符的数量。
{如果length_usernameaux mod 2 0,则//您必须忽略此项。
结果:=true;//奇数}
//写
function CountDistinctCharacters(InputString: string): Integer;
var I: Integer;
    //String for storing all distinct characters
    DistinctChars: string;
begin
  //Loop trough every character in input string
  for I := 1 to Length(InputString) do
  begin
    //Use Pos function to find position of specific character in DistinctChars string
    //Function returns 0 if character is not found
    if Pos(InputString[I], DistinctChars) = 0 then
    begin
      //If character isn't found in DistinctChars string add it to it
      DistinctChars := DistinctChars+InputString[I];
    end;
  end;
  //Finaly check the lenght of DistinctChars string to get the number of distinct character
  //found and return it as function result
  Result := Length(DistinctChars);
end;
//Pass external string as var parameter to your function in order to allow function to
//fill it with all distinct characters
function CountDistinctCharacters(InputString: string; var DistinctChars: string): Integer;
var I: Integer;
begin
  //Loop trough every character in input string
  for I := 1 to Length(InputString) do
  begin
    //Use Pos function to find position of specific character in DistinctChars string
    //Function returns 0 if character is not found
    if Pos(InputString[I], DistinctChars) = 0 then
    begin
      //If character isn't found in DistinctChars string add it to it
      DistinctChars := DistinctChars+InputString[I];
    end;
  end;
  //Finaly check the lenght of DistinctChars string to get the number of distinct character
  //found and return it as function result
  Result := Length(DistinctChars);
end;
function OddUserName(username : String): Boolean;
var
    usernameaux : String;
    length_usernameaux, i : Integer;
    //Result : Boolean;

begin
    Result:= false;
    usernameaux:= username;
    i:= 0;
    repeat
        i +=1; 
        length_usernameaux:= length(usernameaux);
        if freq(usernameaux[i], usernameaux) <> 1 then 
        begin   
            delete(usernameaux, i, 1);
            i-=1; // <----- added 
        end;    
    until i = length_usernameaux;
    
    if length(usernameaux) mod 2 <> 0 then
        Result:= true; // odd

    //writeln(usernameaux); 
    //writeln(length(usernameaux));
    OddUserName:= Result;   
end;