在对象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;