to kbsoft(景乐) 谢谢,取汉字拼音这块程序我以做出来了,只是要实现客户要求,要分别把一个词中所有汉字读音取出排列……词中多音字越多组合的就越多…… to zf925(天下哪来那么多高手) 也谢谢你的关注和帮忙,字符串我也组合出来了,就是怎么把它拆成我要的比如: 中国人:我以把拼音组和成 zhong@guo@ren 和解(都是多音字):我以把拼音组和成 huo'hu'he@xie'jie
HZPY :array[1..length(strHZ)] of string;function GT(strHZ, j{strHZ的第j个字}):string; begin if j<>Length(strHZ) then begin for i := strToint(strHZpy[j][1]) downto 1 do begin HZPY[j] := copy(strHZpy[j], findstr(strHZpy[1],intTostr(i))+1,findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i))); GT(strHZ, j-1); end else begin HZPY[j] := copy(strHZpy[j], findstr(strHZpy[1],intTostr(i))+1,findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i))); print(HZPY); //打印汉字拼音串 end; end; end;
下面是一个处理上述问题的通用递归算法: 首先生成一标志字符串如:‘435’代表共有三重循环,第一重5次,二重3次,三重4次 procedure Tform1.mysub(str:string); var i,count:integer; begin if length(str)=1 then begin count:=strtoint(str[length(str)]); for i:=1 to count do begin //////处理代码 listbox1.Items.Add(inttostr(i)); end; exit; end;//////递归处理 count:=strtoint(str[1]); for i:=1 to count do begin listbox1.items.add(inttostr(i)+'////'+copy(str,2,length(str)-1)) ; mysub(copy(str,2,length(str)-1)); end; ////递归结束 end;
uses StrUtils;procedure p(mStr: string; mStrings: TStrings); var I: Integer; L: Integer; T: string; begin mStrings.Clear; L := Length(mStr); T := DupeString('0', L); while T <> mStr do begin mStrings.Add(T); for I := L downto 1 do begin if StrToIntDef(T[I], 0) >= StrToIntDef(mStr[I], 0) then T[I] := '0' else begin T[I] := Succ(T[I]); Break; end; end; if mStrings.Count > 100 then Exit; end; mStrings.Add(mStr); end;procedure TForm1.Button1Click(Sender: TObject); begin p('0120', Memo1.Lines) end;
//for Delphi6 //如果你是Delphi5请加function DupeString(const AText: string; ACount: Integer): string; var P: PChar; C: Integer; begin C := Length(AText); SetLength(Result, C * ACount); P := Pointer(Result); if P = nil then Exit; while ACount > 0 do begin Move(Pointer(AText)^, P^, C); Inc(P, C); Dec(ACount); end; end;
//....... L := Length(mStr); T := StringReplace(Format('%*s', [L, '']), #32, '0', [rfReplaceAll]); //或者修改成 while T <> mStr do begin //.......
//请你测试function StrLeft(const mStr: string; mDelimiter: string): string; { 返回左分隔字符串 } begin Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1); end; { StrLeft }function ListCount(mList: string; mDelimiter: string = ','): Integer; { 返回列表数 } var I, L: Integer; begin Result := 0; if mList = '' then Exit; L := Length(mList); I := Pos(mDelimiter, mList); while I > 0 do begin mList := Copy(mList, I + Length(mDelimiter), L); I := Pos(mDelimiter, mList); Inc(Result); end; Inc(Result); end; { ListCount }function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string; { 返回列表指定位置的元素 } var I, L, K: Integer; begin L := Length(mList); I := Pos(mDelimiter, mList); K := 0; Result := ''; while (I > 0) and (K <> mIndex) do begin mList := Copy(mList, I + Length(mDelimiter), L); I := Pos(mDelimiter, mList); Inc(K); end; if K = mIndex then Result := StrLeft(mList + mDelimiter, mDelimiter); end; { ListValue }//--------------------------------------------- procedure p(mStr: string; mStrings: TStrings); var I: Integer; L: Integer; T: string; begin mStrings.Clear; L := Length(mStr); T := StringReplace(Format('%*s', [L, '']), #32, '0', [rfReplaceAll]); while T <> mStr do begin mStrings.Add(T); for I := L downto 1 do begin if StrToIntDef(T[I], 0) >= StrToIntDef(mStr[I], 0) then T[I] := '0' else begin T[I] := Succ(T[I]); Break; end; end; if mStrings.Count > 100 then Exit; end; mStrings.Add(mStr); end;function f(mStr: string; mStrings: TStrings): Boolean; var vStringList1: TStringList; vStringList2: TStringList; I, J: Integer; S: string; begin Result := False; if not Assigned(mStrings) then Exit; mStrings.Clear; vStringList1 := TStringList.Create; vStringList2 := TStringList.Create; try S := ''; vStringList1.Text := StringReplace(mStr, '@', #13#10, [rfReplaceAll]); for I := 0 to vStringList1.Count - 1 do S := S + IntToStr(ListCount(vStringList1[I], '''') - 1); p(S, vStringList2); for I := 0 to vStringList2.Count - 1 do begin S := ''; for J := 0 to vStringList1.Count - 1 do S := S + '''' + ListValue(vStringList1[J], StrToIntDef(vStringList2[I][J + 1], 0), ''''); Delete(S, 1, 1); mStrings.Add(S); end; finally vStringList1.Free; vStringList2.Free; end; Result := True; end;procedure TForm1.Button1Click(Sender: TObject); begin f('huo''hu''he@xie''jie@ren', Memo1.Lines); end;
完整正确的程序我给你写好了:const max = 10; var Form1: TForm1; HZPY :array[1..max] of string; strHZpy :array[1..max] of string;implementation{$R *.DFM}procedure GT( j :integer); var i,m :integer; s :string; begin if j<>3 then for i := strToint(strHZpy[j][1]) downto 1 do begin HZPY[j] := copy(strHZpy[j] ,Pos(intTostr(i),strHZpy[j])+1 ,Pos(intTostr(i-1),strHZpy[j])- Pos(intTostr(i),strHZpy[j]) -1 ); GT(j+1); end else for i := strToint(strHZpy[j][1]) downto 1 do begin HZPY[j] := copy(strHZpy[j] ,Pos(intTostr(i),strHZpy[j])+1 ,Pos(intTostr(i-1),strHZpy[j])- Pos(intTostr(i),strHZpy[j]) -1 ); //打印汉字拼音串 s:=''; for m:=1 to 3 do s:=s+HZPY[m]+' '; Form1.RichEdit1.Lines.Add( s ); end;end;procedure TForm1.Button1Click(Sender: TObject); var HZ :string; begin HZ := '和解人'; strHZpy[1]:='3hou2he1hu0'; strHZpy[2]:='2jie1xie0'; strHZpy[3]:='1ren0'; GT(1); end;end.
下面的两个3是你汉字的个数:if j<>3 then for i := strToint(strHZpy[j][1]) downto 1 do
for m:=1 to 3 do s:=s+HZPY[m]+' ';这个递归算法很容易理解~~
to zSWANg(伴水)(* pascal→c *) 高手高手!!! p~~f~~~~p~~f~
if mStrings.Count > 100 then Exit; //这句话请删除掉!
const max = 10; var Form1: TForm1; HZPY :array[1..max] of string; //放当前的汉字拼音(GT中用) strHZpy :array[1..max] of string;//每个汉字所有的读音 iHZtotal :integer; //汉字的个数implementation{$R *.DFM}procedure GT( j :integer); //递归程序 var i,m :integer; s :string; //用于输出 begin if j<>iHZtotal then //是否为最后一个汉字?
for i := strToint(strHZpy[j][1]) downto 1 do begin HZPY[j] := copy(strHZpy[j] //取第j个汉字的第i种读音 ,Pos(intTostr(i),strHZpy[j])+1 ,Pos(intTostr(i-1),strHZpy[j])- Pos(intTostr(i),strHZpy[j]) -1 ); GT(j+1); //递归调用 end else //是最后一个汉字就可以打印 for i := strToint(strHZpy[j][1]) downto 1 do begin HZPY[j] := copy(strHZpy[j] //取最后一个汉字的第i种读音 ,Pos(intTostr(i),strHZpy[j])+1 ,Pos(intTostr(i-1),strHZpy[j])- Pos(intTostr(i),strHZpy[j]) -1 ); //打印汉字拼音串 s:=''; for m:=1 to iHZtotal do s:=s+HZPY[m]+' '; Form1.RichEdit1.Lines.Add( s ); end;end;procedure TForm1.Button1Click(Sender: TObject); var HZ :string; begin HZ := '和解人'; strHZpy[1]:='3hou2he1hu0'; strHZpy[2]:='2jie1xie0'; strHZpy[3]:='1ren0'; iHZtotal := Length(HZ) div 2; RichEdit1.Lines.Add(HZ); GT(1); end;end.
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ 有那么复杂吗??????????????? #######################################################const max = 10; var Form1: TForm1; HZPY :array[1..max] of string; //放当前的汉字拼音(GT中用) strHZpy :array[1..max] of string;//每个汉字所有的读音 iHZtotal :integer; //汉字的个数implementation{$R *.DFM}procedure GT( j :integer); //递归程序 var i,m :integer; s :string; //用于输出 begin if j<>iHZtotal then //是否为最后一个汉字?
for i := strToint(strHZpy[j][1]) downto 1 do begin HZPY[j] := copy(strHZpy[j] //取第j个汉字的第i种读音 ,Pos(intTostr(i),strHZpy[j])+1 ,Pos(intTostr(i-1),strHZpy[j])- Pos(intTostr(i),strHZpy[j]) -1 ); GT(j+1); //递归调用 end else //是最后一个汉字就可以打印 for i := strToint(strHZpy[j][1]) downto 1 do begin HZPY[j] := copy(strHZpy[j] //取最后一个汉字的第i种读音 ,Pos(intTostr(i),strHZpy[j])+1 ,Pos(intTostr(i-1),strHZpy[j])- Pos(intTostr(i),strHZpy[j]) -1 ); //打印汉字拼音串 s:=''; for m:=1 to iHZtotal do s:=s+HZPY[m]+' '; Form1.RichEdit1.Lines.Add( s ); end;end;procedure TForm1.Button1Click(Sender: TObject); var HZ :string; begin HZ := '和解人'; strHZpy[1]:='3hou2he1hu0'; strHZpy[2]:='2jie1xie0'; strHZpy[3]:='1ren0'; iHZtotal := Length(HZ) div 2; RichEdit1.Lines.Add(HZ); GT(1); end;end.
to 大家 谢谢大家的关注,请有好想法的详细一点 OK
word[] - 每一字
for(int i=0; i<l; i++)
{
CString s("");
CString temp("");
temp = GetFirstSound(word[i]);
for(;Temp != NULL;)
{
s += Temp
Temp = GetNextMultiSound(word[i]);
}
s += "'";
}
#include "hztopy.h" AnsiString ConvertHZToPY(char *as_HzString)
{
static int li_SecPosValue[]={1601,1637,1833,2078,2274,2302,2433,2594,2787,3106,3212,3472,3635,3722,3730,3858,4027,4086,4390,4558,4684,4925,5249};
static char* lc_FirstLetter[] = {"A", "B","C","D","E","F","G","H","J","K","L","M","N","O","P","Q","R","S","T","W","X","Y","Z"};
static char* ls_SecondSecTable =
"CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY"
"LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY"
"WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY"
"DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP"
"MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB"
"PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX"
"YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS"
"QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ"
"YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK"
"HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ"
"FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ";
AnsiString result = "";
int H,L,W;
unsigned int i, stringlen = strlen(as_HzString);
int j; for( i = 0; i < stringlen; i ++ )
{
H = (unsigned char)(as_HzString[i + 0]);
L = (unsigned char)(as_HzString[i + 1]);
if(H < 0xA1 || L < 0xA1)
{
result += as_HzString[i];
continue;
}
else W = (H - 160) * 100 + L - 160; if(W > 1600 && W < 5590)
{
for(j = 22; j >= 0; j --)
if(W >= li_SecPosValue[j])
{
result += lc_FirstLetter[j];
i ++;
break;
}
continue;
}
else
{
i ++;
W = ( H - 160 - 56 )*94 + L - 161;
if(W >= 0 && W <= 3007)
result += ls_SecondSecTable[W];
else
{
result += (char)H;
result += (char)L;
}
}
} return result;
}
#include "hztopy.h" AnsiString ConvertHZToPY(char *as_HzString)
{
static int li_SecPosValue[]={1601,1637,1833,2078,2274,2302,2433,2594,2787,3106,3212,3472,3635,3722,3730,3858,4027,4086,4390,4558,4684,4925,5249};
static char* lc_FirstLetter[] = {"A", "B","C","D","E","F","G","H","J","K","L","M","N","O","P","Q","R","S","T","W","X","Y","Z"};
static char* ls_SecondSecTable =
"CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY"
"LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY"
"WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY"
"DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP"
"MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB"
"PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX"
"YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS"
"QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ"
"YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK"
"HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ"
"FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ";
AnsiString result = "";
int H,L,W;
unsigned int i, stringlen = strlen(as_HzString);
int j; for( i = 0; i < stringlen; i ++ )
{
H = (unsigned char)(as_HzString[i + 0]);
L = (unsigned char)(as_HzString[i + 1]);
if(H < 0xA1 || L < 0xA1)
{
result += as_HzString[i];
continue;
}
else W = (H - 160) * 100 + L - 160; if(W > 1600 && W < 5590)
{
for(j = 22; j >= 0; j --)
if(W >= li_SecPosValue[j])
{
result += lc_FirstLetter[j];
i ++;
break;
}
continue;
}
else
{
i ++;
W = ( H - 160 - 56 )*94 + L - 161;
if(W >= 0 && W <= 3007)
result += ls_SecondSecTable[W];
else
{
result += (char)H;
result += (char)L;
}
}
} return result;
}
应这样: l - 字个数
word[] - 每一字CString s("");
for(int i=0; i<l; i++)
{
CString temp("");
temp = GetFirstSound(word[i]);
for(;Temp != "";)
{
s += Temp;
Temp = GetNextMultiSound(word[i]);
}
if(s != "")
s += "'";
}
再把串截取出来
和解(都是多音字):我以把拼音组和成 huo'hu'he@xie'jie
我用'@' 分割字,用"'"分割多音 我的程序也以可以分析,两个字这种了…… 但对于多个字……… 比如: 和解人: 那我想要的就是把huo'hu'he@xie'jie@ren拆成huo'xie'ren
huo'jie'ren
hu'xie'ren
hu'jie'ren
he'xie'ren
he'jie'ren
哈哈!! 看来只有你明白了,我也想了半天,也只能用递归了 :(我现在就在想这个递归结构……
请把你的递归结构列出来看看,好吗?
如果做完了我会把全部代码列出来的
email: [email protected]
QQ 7862483
有空聊聊
strHZ := "和解人"
strHZpy :array(1..length(strHZ)) of string =('3huo2hu1he0','2xie1jie0','1ren0');和: 3hou2hu1he 这样定的好处是,取第一个字符就可以知道一共有几个读音,
而顺序区出以便排序可以这样:(当然,我是简单的写个伪代码)for i := strToint(strHZpy[1][1]) downto 1 do
py := copy(strHZpy[1], findstr(strHZpy[1],intTostr(i)),findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i)));等一下,在想递归的算法!
我妹妹 : [email protected]
MSN : [email protected]
begin
if j<>Length(strHZ) then
begin
for i := strToint(strHZpy[j][1]) downto 1 do
begin HZPY[j] := copy(strHZpy[j], findstr(strHZpy[1],intTostr(i))+1,findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i))); GT(strHZ, j-1);
end
else
begin
HZPY[j] := copy(strHZpy[j], findstr(strHZpy[1],intTostr(i))+1,findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i)));
print(HZPY); //打印汉字拼音串
end;
end;
end;
首先生成一标志字符串如:‘435’代表共有三重循环,第一重5次,二重3次,三重4次
procedure Tform1.mysub(str:string);
var i,count:integer;
begin
if length(str)=1 then
begin
count:=strtoint(str[length(str)]);
for i:=1 to count do
begin
//////处理代码
listbox1.Items.Add(inttostr(i));
end;
exit;
end;//////递归处理
count:=strtoint(str[1]);
for i:=1 to count do
begin
listbox1.items.add(inttostr(i)+'////'+copy(str,2,length(str)-1)) ;
mysub(copy(str,2,length(str)-1));
end;
////递归结束
end;
刚才所有的findstr(strHZpy[j],intTostr(i))
写成了:findstr(strHZpy[1],intTostr(i))HZPY是放汉字串的当前读音排序的拼音
StrUtils;procedure p(mStr: string; mStrings: TStrings);
var
I: Integer;
L: Integer;
T: string;
begin
mStrings.Clear;
L := Length(mStr);
T := DupeString('0', L);
while T <> mStr do begin
mStrings.Add(T);
for I := L downto 1 do begin
if StrToIntDef(T[I], 0) >= StrToIntDef(mStr[I], 0) then
T[I] := '0'
else begin
T[I] := Succ(T[I]);
Break;
end;
end;
if mStrings.Count > 100 then Exit;
end;
mStrings.Add(mStr);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
p('0120', Memo1.Lines)
end;
从每行的第一个元素(列下标为0)开始,然后将最后一行的列标加 1,并判断元素值是否为结束标志,如果是则将列标置为0,并将前一行的列标加1,依次类推,只用一个循环,次数为各汉字读音数之积即总组合数;
例如:
第一个组合A10.. A(n-3)0 A(n-2)0 A(n-1)0 //n为字数
第二个组合A10.. A(n-3)0 A(n-2)0 A(n-1)1
第三个组合A10.. A(n-3)0 A(n-2)0 A(n-1)2
第四个组合A10.. A(n-3)0 A(n-2)1 A(n-1)0 //A(n-1)3的值为结束标志
第四个组合A10.. A(n-3)0 A(n-2)1 A(n-1)1
第四个组合A10.. A(n-3)0 A(n-2)1 A(n-1)2
第四个组合A10.. A(n-3)1 A(n-2)0 A(n-1)0 //A(n-2)2的值为结束标志
第四个组合A10.. A(n-3)1 A(n-2)0 A(n-1)1
第四个组合A10.. A(n-3)1 A(n-2)0 A(n-1)2希望已说明白,请建议,谢谢!
//如果你是Delphi5请加function DupeString(const AText: string; ACount: Integer): string;
var
P: PChar;
C: Integer;
begin
C := Length(AText);
SetLength(Result, C * ACount);
P := Pointer(Result);
if P = nil then Exit;
while ACount > 0 do
begin
Move(Pointer(AText)^, P^, C);
Inc(P, C);
Dec(ACount);
end;
end;
L := Length(mStr);
T := StringReplace(Format('%*s', [L, '']), #32, '0', [rfReplaceAll]); //或者修改成
while T <> mStr do begin
//.......
{ 返回左分隔字符串 }
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function ListCount(mList: string; mDelimiter: string = ','): Integer;
{ 返回列表数 }
var
I, L: Integer;
begin
Result := 0;
if mList = '' then Exit;
L := Length(mList);
I := Pos(mDelimiter, mList);
while I > 0 do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(Result);
end;
Inc(Result);
end; { ListCount }function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string;
{ 返回列表指定位置的元素 }
var
I, L, K: Integer;
begin
L := Length(mList);
I := Pos(mDelimiter, mList);
K := 0;
Result := '';
while (I > 0) and (K <> mIndex) do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(K);
end;
if K = mIndex then Result := StrLeft(mList + mDelimiter, mDelimiter);
end; { ListValue }//---------------------------------------------
procedure p(mStr: string; mStrings: TStrings);
var
I: Integer;
L: Integer;
T: string;
begin
mStrings.Clear;
L := Length(mStr);
T := StringReplace(Format('%*s', [L, '']), #32, '0', [rfReplaceAll]);
while T <> mStr do begin
mStrings.Add(T);
for I := L downto 1 do begin
if StrToIntDef(T[I], 0) >= StrToIntDef(mStr[I], 0) then
T[I] := '0'
else begin
T[I] := Succ(T[I]);
Break;
end;
end;
if mStrings.Count > 100 then Exit;
end;
mStrings.Add(mStr);
end;function f(mStr: string; mStrings: TStrings): Boolean;
var
vStringList1: TStringList;
vStringList2: TStringList;
I, J: Integer;
S: string;
begin
Result := False;
if not Assigned(mStrings) then Exit;
mStrings.Clear;
vStringList1 := TStringList.Create;
vStringList2 := TStringList.Create;
try
S := '';
vStringList1.Text := StringReplace(mStr, '@', #13#10, [rfReplaceAll]);
for I := 0 to vStringList1.Count - 1 do
S := S + IntToStr(ListCount(vStringList1[I], '''') - 1);
p(S, vStringList2);
for I := 0 to vStringList2.Count - 1 do begin
S := '';
for J := 0 to vStringList1.Count - 1 do
S := S + '''' + ListValue(vStringList1[J],
StrToIntDef(vStringList2[I][J + 1], 0), '''');
Delete(S, 1, 1);
mStrings.Add(S);
end;
finally
vStringList1.Free;
vStringList2.Free;
end;
Result := True;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
f('huo''hu''he@xie''jie@ren', Memo1.Lines);
end;
max = 10;
var
Form1: TForm1;
HZPY :array[1..max] of string;
strHZpy :array[1..max] of string;implementation{$R *.DFM}procedure GT( j :integer);
var
i,m :integer;
s :string;
begin if j<>3 then
for i := strToint(strHZpy[j][1]) downto 1 do
begin
HZPY[j] := copy(strHZpy[j]
,Pos(intTostr(i),strHZpy[j])+1
,Pos(intTostr(i-1),strHZpy[j])-
Pos(intTostr(i),strHZpy[j]) -1 );
GT(j+1);
end
else
for i := strToint(strHZpy[j][1]) downto 1 do
begin
HZPY[j] := copy(strHZpy[j]
,Pos(intTostr(i),strHZpy[j])+1
,Pos(intTostr(i-1),strHZpy[j])-
Pos(intTostr(i),strHZpy[j]) -1 );
//打印汉字拼音串
s:='';
for m:=1 to 3 do
s:=s+HZPY[m]+' ';
Form1.RichEdit1.Lines.Add( s );
end;end;procedure TForm1.Button1Click(Sender: TObject);
var
HZ :string;
begin
HZ := '和解人';
strHZpy[1]:='3hou2he1hu0';
strHZpy[2]:='2jie1xie0';
strHZpy[3]:='1ren0';
GT(1);
end;end.
for i := strToint(strHZpy[j][1]) downto 1 do
for m:=1 to 3 do
s:=s+HZPY[m]+' ';这个递归算法很容易理解~~
max = 10;
var
Form1: TForm1;
HZPY :array[1..max] of string; //放当前的汉字拼音(GT中用)
strHZpy :array[1..max] of string;//每个汉字所有的读音
iHZtotal :integer; //汉字的个数implementation{$R *.DFM}procedure GT( j :integer); //递归程序
var
i,m :integer;
s :string; //用于输出
begin if j<>iHZtotal then //是否为最后一个汉字?
for i := strToint(strHZpy[j][1]) downto 1 do
begin
HZPY[j] := copy(strHZpy[j] //取第j个汉字的第i种读音
,Pos(intTostr(i),strHZpy[j])+1
,Pos(intTostr(i-1),strHZpy[j])-
Pos(intTostr(i),strHZpy[j]) -1 );
GT(j+1); //递归调用
end else //是最后一个汉字就可以打印 for i := strToint(strHZpy[j][1]) downto 1 do
begin
HZPY[j] := copy(strHZpy[j] //取最后一个汉字的第i种读音
,Pos(intTostr(i),strHZpy[j])+1
,Pos(intTostr(i-1),strHZpy[j])-
Pos(intTostr(i),strHZpy[j]) -1 ); //打印汉字拼音串
s:='';
for m:=1 to iHZtotal do
s:=s+HZPY[m]+' ';
Form1.RichEdit1.Lines.Add( s );
end;end;procedure TForm1.Button1Click(Sender: TObject);
var
HZ :string;
begin
HZ := '和解人';
strHZpy[1]:='3hou2he1hu0';
strHZpy[2]:='2jie1xie0';
strHZpy[3]:='1ren0';
iHZtotal := Length(HZ) div 2;
RichEdit1.Lines.Add(HZ);
GT(1);
end;end.
有那么复杂吗???????????????
#######################################################const
max = 10;
var
Form1: TForm1;
HZPY :array[1..max] of string; //放当前的汉字拼音(GT中用)
strHZpy :array[1..max] of string;//每个汉字所有的读音
iHZtotal :integer; //汉字的个数implementation{$R *.DFM}procedure GT( j :integer); //递归程序
var
i,m :integer;
s :string; //用于输出
begin if j<>iHZtotal then //是否为最后一个汉字?
for i := strToint(strHZpy[j][1]) downto 1 do
begin
HZPY[j] := copy(strHZpy[j] //取第j个汉字的第i种读音
,Pos(intTostr(i),strHZpy[j])+1
,Pos(intTostr(i-1),strHZpy[j])-
Pos(intTostr(i),strHZpy[j]) -1 );
GT(j+1); //递归调用
end else //是最后一个汉字就可以打印 for i := strToint(strHZpy[j][1]) downto 1 do
begin
HZPY[j] := copy(strHZpy[j] //取最后一个汉字的第i种读音
,Pos(intTostr(i),strHZpy[j])+1
,Pos(intTostr(i-1),strHZpy[j])-
Pos(intTostr(i),strHZpy[j]) -1 ); //打印汉字拼音串
s:='';
for m:=1 to iHZtotal do
s:=s+HZPY[m]+' ';
Form1.RichEdit1.Lines.Add( s );
end;end;procedure TForm1.Button1Click(Sender: TObject);
var
HZ :string;
begin
HZ := '和解人';
strHZpy[1]:='3hou2he1hu0';
strHZpy[2]:='2jie1xie0';
strHZpy[3]:='1ren0';
iHZtotal := Length(HZ) div 2;
RichEdit1.Lines.Add(HZ);
GT(1);
end;end.