此題我還是用一個結構(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題庫目錄
回首頁
沒有留言:
張貼留言