2010年2月11日 星期四

Problem 10815 Andy's First Dictionary,詞彙

Problem 10815 此題需將輸入的一段文章,接著我們必須紀錄它詞彙並由 a - z 排序輸出。

此題我還是用一個結構(struct)去解決它,將這結構宣告一個長度為 5000 的陣列後,儲存所有出現過的詞。我一開始使用 ctype.h 的 isalpha() 判斷是否為英文字母,如果是,就一直擷取出來放入一個暫存的 char 陣列,如果擷取到非字母或者是結尾符號 '\0',就將字加入結構陣列,順便判斷是否重複,以及排序。

以下是結構的設定:
#define MAXLEN 5000
struct Word
{
char word[20];
};
struct Word w[MAXLEN];
struct Word wRecode, change;

以下是主程式區段程式碼:
char str[200] = {"\0"};
while (gets(str))
{

j = 0; int isWord = 0;
for (i = 0; str[i]; i ++)
{
if (isalpha(str[i]))
{
wRecode.word[j] = tolower(str[i]);
j ++;
isWord = 1;
continue;
}
else if (isWord)
{
insert();
j = 0, isWord = 0;
memset(wRecode.word, 0, strlen(wRecode.word));
}
}
if (isWord && str[i + 1] == '\0')
insert(), j = 0, isWord = 0, memset(wRecode.word, 0, strlen(wRecode.word));
memset(str, 0, strlen(str));

}

以下是 insert() 函式程式碼:
void insert ()
{
int isRepeat = 0,i;
for (i = 0; i < index; i++)
if (strcmp(wRecode.word, w[i].word) == 0)
isRepeat = 1;
if (!isRepeat)
{
w[index] = wRecode, index ++;
for (i = index - 1; i >= 1; i --)
{
if (strcmp(w[i].word, w[i - 1].word) == -1)
{
change = w[i];
w[i] = w[i - 1];
w[i - 1] = change;
}
}
}
}

By David.K

p10815題目連結
回ACM題庫目錄
回首頁

沒有留言: