UVA 123 - Searching Quickly(分离单词)

        这道题还是有点麻烦的。如果把每个句子存为一个字符串,则在最后分离单词的时候会很麻烦。所以,我用一个结构体来作为一句话,把每句话中的单词单独储存,则最后处理的时候会方便很多。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct ss {
    int x, y;
    char word[20][50];
    char key[50];
}stmp[250], s[250];

char ig[55][15];        // 被忽略的词
int ign = 0, sn = 0;    // 被忽略词数量和title数量

// 将字符串大写转小写
void UTL(char str[]) {
    int len = strlen(str);

    for (int i=0; i<len; i++)
        if (str[i]>='A' && str[i] <= 'Z') {
            str[i] += ('a'-'A');
        }
}
// 将字符串小写转大写
void LTU(char str[]) {
    int len = strlen(str);

    for (int i=0; i<len; i++)
        if (str[i]>='a' && str[i] <= 'z') {
            str[i] += ('A'-'a');
        }
}

// 判断是否为被忽略词
bool judge(char str[]) {
    for (int i=0; i<ign; i++) {
        if (0 == strcmp(str, ig[i]))
            return false;
    }
    return true;
}

// 快排比较函数,如果两个字符串相等,就比较它们的优先级
int cmp(const void *_a, const void *_b) {
    struct ss *a = (struct ss*)_a;
    struct ss *b = (struct ss*)_b;
    if (strcmp(a->key, b->key) != 0)
        return strcmp(a->key, b->key);
    return a->x - b->x;
}

int main() {

    // 下面两个while 用于输入操作
    while (scanf("%s", ig[ign])) {
        if (':' == ig[ign][0])
            break;
        ign++;
    }
    getchar();

    char str[50];
    while (scanf("%s", str) != EOF) {
        char ch = getchar();

        // 先将每个单词转为小写
        UTL(str);

        strcpy(stmp[sn].word[stmp[sn].y], str);
        stmp[sn].y++;           // 记录每句话单词的个数

        if ('\n' == ch) {
            stmp[sn].x = sn;    // 记录每句话的优先级
            sn++;
        }
    }

    // 下面对每句话的每个单词进行处理
    int num = 0;
    for (int i=0; i<sn; i++) {
        for (int j=0; j<stmp[i].y; j++) {   // 现在对每个单词进行处理
            if (judge(stmp[i].word[j])) {
                s[num] = stmp[i];
                LTU(s[num].word[j]);
                strcpy(s[num].key, s[num].word[j]);
                num++;
            }
        }
    }

    // 排序并输出
    qsort(s, num, sizeof (s[0]), cmp);
    for (int i=0; i<num; i++) {
        int j;
        for (j=0; j<s[i].y-1; j++)
            printf("%s ", s[i].word[j]);
        printf("%s\n", s[i].word[j]);
    }

    return 0;
}


 

你可能感兴趣的:(快排,单词分离)