1. 程式人生 > >C語言---單詞檢查

C語言---單詞檢查

已知有一個正確單詞索引表(儲存在當前目錄下的檔案index.txt中,且全為小寫字母,按照字典序由小到大排列,每個單詞獨佔一行),編寫程式利用該單詞表對某一英文文章(儲存在當前目錄下的另一個檔案in.txt中)進行單詞正確性檢查,若該英文文章中出現的單詞(只有連續字母組成)沒有出現在單詞索引檔案中(檢查時大小寫無關),則將該出錯的單詞(其中的字母全部轉換為小寫)輸出到當前目錄下的另一檔案error.txt中,每個單詞獨佔一行,並且以字典序由小到大的順序輸出。
假設:
1、in.txt中的文章有可能沒有經過排版,格式有可能雜亂無章,也有可能沒有寫完整。
2、index.txt中的單詞個數不超過1000個,每個單詞的長度不超過50個字母。
3、若出錯的單詞多次出現,則多次輸出。

【輸入形式】

儲存單詞索引表的檔案index.txt和儲存英文文章的檔案in.txt都位於當前目錄下。

【輸出形式】

將出錯的單詞以字典序由小到大的順序輸出到當前目錄下的檔案error.txt中,每個單詞單獨佔一行,多次出錯的單詞多次輸出。若沒有出現錯誤單詞,則什麼也不輸出。

【樣例輸入1】

假設檔案in.txt內容為:

There are two verrsions of the international standards for C.
Thee first version was ratified in 1989 by the American National
Standards Institue (ANS1) C standard committee.It is often
referred as ANS1 C or C89. The secand C standard was completed
in 1999. This standard is comonly referred to as C99. C99 is a
milestone in C’s evolution into a viable programing languga
for numerical and scientific computing.

檔案index.txt中的單詞索引表內容為:

a
american
and
ansi
are
as
by
c
committee
commonly
completed
computing
evolution
first
for
in
institue
international
into
is
it
language
milestone
national
numerical
of
often
or
programming
ratified
referred
s
scientific
secand
standard
standards
the
there
this
to
two
version
versions
viable
was

【樣例輸出1】

檔案error.txt中出錯的單詞應為:

ans
ans
comonly
languga
programing
thee
verrsions

【樣例1說明】

用index.txt中的單詞索引表對in.txt中出現的每一個單詞進行檢查,檢查時大小寫無關,所以第一個單詞There出現在索引表中,不是錯誤單詞;單詞verrsions沒有出現在索引表中,拼寫錯誤,所以作為出錯單詞輸出;單詞ANSI拼寫成了ANS1,將其中字母都轉換為小寫後輸出,並且多次出現,多次輸出;其他出錯單詞類似。錯誤單詞輸出按照字典序由小到大輸出到error.txt檔案中。

【樣例輸入2】

假設檔案in.txt內容為:

There are two versions of the international standard fo

檔案index.txt中的單詞索引表內容為:

are
for
international
of
standards
the
there
two
versions

【樣例輸出2】

檔案error.txt中出錯的單詞應為:

fo
standard

【樣例2說明】

檔案in.txt中的單詞standard沒有出現在索引表文件index.txt中,所以作為錯誤單詞輸出。
注意:樣例2中in.txt檔案內容還不完整,最後的單詞fo後沒有任何字元,fo也沒有出現在索引表中,所以也作為錯誤單詞輸出。

【評分標準】本題要求對文章的單詞進行檢查,提交程式檔名為words.c或words.cpp。

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

int main() {
    FILE *f, *g,*h;
    char word[20], c, tmp[20];
    char words[100][20],tr[100][20],err[100][20];
    int i, j = 0, k = 0,m=0;
    f = fopen("in.txt", "r");
    h = fopen("index.txt", "r");
    g = fopen("error.txt", "w");
    while (!feof(f)) {
        fscanf(f, "%s", words[k++]);
    }
    rewind(f);
    while (!feof(h)) {
        fscanf(h, "%s", tr[m++]);
    }
    rewind(h);

    for (i = 0; i < k; i++) {
        for (j = 0; j < strlen(words[i]); j++) {
            c = words[i][j];
            if ((c <= 'z'&&c >= 'a') || (c <= 'Z'&&c >= 'A')) {
                if ((c <= 'Z'&&c >= 'A')) {
                    c += 32;
                }
                words[i][j] = c;
            }
            else if (c == '\'') {
                int a = j, t = 0;
                while (words[i][a++] != ' ') {
                    words[k][t++] = words[i][a];
                }
                k++; 

            }
            else {

                words[i][j] = '\0';
            }
        }
    }
    int flag = 0,tp=0;
    for (i = 0; i < k; i++) {
        if ((words[i][0] == '\0')) {
            continue;
        }
        for (j = 0; j < m; j++) {
            if (strcmp(words[i], tr[j]) == 0) {
                flag = 1;
            }
        }
        if (!flag) {
            strcpy(err[tp++] , words[i]);
        }
        flag = 0;

    }
    for (i = 0; i < tp; i++) {
        for (j = i + 1; j < tp; j++) {
            if (strcmp(err[i], err[j]) > 0) {
                strcpy(word, err[i]);
                strcpy(err[i], err[j]);
                strcpy(err[j], word);
            }
        }
        fprintf(g, "%s\n", err[i]);
    }
    fclose(f);
    fclose(g);
    fclose(h);
    return 0;
}