|
/******************************************************************************
Copyright (C), 2001-2012, Huawei Tech. Co., Ltd.
******************************************************************************
File Name : FindSimilarWord.cpp
Version :
Author :
Created : 2012/09
Last Modified :
Description :
Function List :
History :
1.Date : 2012/09
Author :
Modification: Created file
******************************************************************************/
char word[1000][51];
int counts=0;
int wordlength[1000];
int hisbrother[1000];
/******************************************************************************
原 型:int AddOneWord (char* Word);
功 能:在字典中增加一个单词
输入参数:
Word 单词字符串,调用者保证Word指针不为空,指向的是合法单词
输出参数:
无
返回值:
-1 失败(单词在字典中已存在等情况)
0 成功
********************************************************************************/
int AddOneWord (char* Word)
{
/* 在这里实现功能 */
//if(counts>1000)return -1;
int length=0;//字长
for(int i=0;i<51;i++){
word[counts]=*Word;
length++;
if(*Word=='\0')break;
Word++;
if(i==49){
word[counts][50]='\0';//特殊情况,最大字数为50,则要有51个字节来保存,以使最后一个可以放置一个'\0'
length++;
}
}
wordlength[counts]=length-1;//去掉末尾的'\0',得到长度
bool haved=false;
for(int i=0;i<counts;i++){
if(wordlength==wordlength[counts]){//首先字数相等,才可能相同
for(int j=0;j<wordlength[counts];j++){
if(word[j]!=word[counts][j])break;
if(j==wordlength[counts]){
haved=true;
}
}
if(haved)break;//当单词表中已经有这个单词时,则不能存入
}
}
if(haved)return -1;
else counts++;//如果没有重复,则完成加入
return 0;
}
/******************************************************************************
原 型:int FindSimilarWordNum (char* Word);
功 能:查找指定单词在字典中的兄弟单词个数
输入参数:
Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
输出参数:
无
返回值:
返回指定单词在字典中的兄弟单词总个数。如果不存在兄弟单词,返回0
*******************************************************************************/
int FindSimilarWordNum (char* Word)
{
/* 在这里实现功能 */
char WORD[51];
int length=0;
int CharNum[26];
int brother=0;
for(int i=0;i<26;i++)CharNum=0;//字母数量数组
for(int i=0;i<51;i++){
WORD=*Word;
if(*Word=='\0')break;
length++;
CharNum[(*Word-97)]++;//a为97
Word++;
}
int need;
bool isb;//是兄弟吗?
for(int i=0;i<counts;i++){//遍历所有单词
if(wordlength==length){//当字数相同时,来进行判断
for(int j=0;j<26;j++){//遍历,判断26个字母数分别是否相同
need=CharNum[j];
isb=true;
for(int k=0;k<length;k++){
if(word[k]==j+97)need--;//每当匹配到相同字母,则need减一
}
if(need!=0){//字母数相等则继续判断,不等,则跳出,不是兄弟
isb=false;
break;
}
}
if(isb){
for(int j=0;j<length;j++){
if(word[j]!=WORD[j]){//当单词不是同一单词时,为兄弟单词
hisbrother[brother]=i;//将兄弟单词的序号传给数组保存,直接用于之后的函数
brother++;
break;
}
}
}
}
}
return brother;
// return 0;
}
/******************************************************************************
原 型:int FindOneSimilarWord (char* Word, int Seq, char* SimilarWord);
功 能:查找指定单词的指定序号的兄弟单词,指定序号指字典中兄弟单词按字典顺序
排序后的序号(从1开始)
输入参数:
Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
Seq 指定序号(大于等于1)
输出参数:
SimilarWord 返回兄弟单词字符串,指针不为空,指向的内存由调用者预先分配,
占51个字节长度,输出的兄弟单词必须紧跟’\0’结束。如果不存在指定序号的
兄弟单词,输出空串。
返回值:
-1 失败(如果不存在指定序号的兄弟单词,返回失败)
0 成功
*******************************************************************************/
int FindOneSimilarWord (char* Word, int Seq, char* SimilarWord)
{
/* 在这里实现功能 */
int n=FindSimilarWordNum(Word);//获得
if(Seq>n){
return -1;
}else{
int no=0;
//SimilarWord=word[hisbrother[Seq-1]];//额,预先有位置,不能改
//要获得排序后的兄弟单词的序号,简单的计算方法,企图用26进制计算大小。。。。失败,数太大,无法计算
//使用冒泡算法
char *a;//较小值,
char *b;//用于排序,
int use;//排序时,不是排字符数组,而是拍兄弟单词序号数组
for(int i=0;i<Seq;i++){//需要第几位,就应该取第几位的最小值
for(int j=n-1;j>0;j--){//从后向前遍历数组
a=word[hisbrother[j]];
b=word[hisbrother[j-1]];
for(int k=0;k<wordlength[hisbrother[j]];k++){//循环比较每一个字母大小
if(*a<*b){
use=hisbrother[j];
hisbrother[j]=hisbrother[j-1];
hisbrother[j-1]=use;
break;
}else if(*a>*b){
break;
}else{
a++;
b++;//比较下一个字母
}
}
}
}
no=hisbrother[Seq-1];//完成排序,直接使用
int length=wordlength[no];//获得长度
length++;//要有‘\0'
for(int i=0;i<length;i++){
*SimilarWord=word[no];
SimilarWord++;
}
SimilarWord-=length;
return 0;
}
}
/******************************************************************************
原 型:void ClearAllWords(void);
功 能:清空字典中所有单词
输入参数:
无
输出参数:
无
返回值:
无
*******************************************************************************/
void ClearAllWords(void)
{
for(int i=0;i<counts;i++){
for(int j=0;j<wordlength;j++){
word[j]='\0';//清空字符串数组
}
}
//其他数组没必要清空
counts=0;
/* 在这里实现功能 */
}
有两个用例未通过,暂时不知道什么地方出错。
不行,我不能忍,我必须知道用例是什么,得想个办法搞到用例。 |
|
|