0

私はエンコーダー/デコーダー コードを持っています。入力として最後に "\n" を含む空白を含む単語ダンプを取得し、テキスト内の上位 5 単語の出現をエンコードし、その逆も同様です。それは魅力的に働いているようですが、私のスーパーバイザープログラムはまだ10回から6回失敗しています. 入力ファイルをエンコードしてから、エンコードされた入力ファイルをデコードすると、完全に機能します。まだ何が悪いのか理解できません。皆さん、私はあなたの目が必要です!

シンプルなエンコーダー ファイル内で最も一般的な 5 つの単語 (少なくとも 3 文字の長さ) を見つけて、短いコードに置き換えます。コードは 2 文字の長さで、!1 !2...!5 のようになります。!1 は、テキスト内で最も多く出現する単語を置き換え、!5 は、最も出現回数が少ない単語を置き換えます。2 つの単語が同じように出現する場合、行の最初の単語がコードリストの最初になります ("sooner better")。残りの単語はそのままにしておく必要があります。エンコードされたファイルの最初に、コードリストを提示する必要があります。プログラムにはデコード機能も必要です。入力が「!」で始まる場合、コードリストを適応させ、ファイル全体をデコードして、元の状態を復元する必要があります。入力: 2 種類の入力ファイルが存在できます。元の入力には、間に空白を含む最大 2000 語が含まれます。各単語は最大 22 文字です。最後の単語の後に空白はありませんが、改行 ("\n") があります。単語は英語のアルファベットの文字から作られ、すべて小文字です。どの単語にも「!」が含まれていません。サイン。少なくとも 3 文字の異なる種類の単語が常に最低 5 種類あります。警告!入力フォーマットが出力フォーマットと等しい場合、もちろんデコードが必要です! デコードの場合、もちろんファイルの先頭にあるコードリストよりも 2000 語の制限と最大 22 文字が有効です。出力: 最初の 5 行にはコードリストが含まれています。最初の単語はコードで、その隣に置き換えられる単語があります。間の空白、replacebal ワードの後の改行。6 行目からは、デコードが必要なエンコードされたテキストが続きます。単語間の空白、最後に 1 つの改行のみ。警告!出力ファイル形式は、入力ファイル形式と同じにすることができます! その場合、もちろんエンコードが必要です。

要件: 読み取り用の "input.txt" (読み取り専用!) と書き込み用の "output.txt" (書き込み専用!)。正常に実行するには、0 を返します。main() の最後に、フォルトコードを回避するために必要です。考えられる障害コード: Memory- timelimit を超えました。浮動小数点の失敗、fe: ゼロで割る。; メモリ アクセスの失敗、配列オーバー インデックス、ヌル ポインターの使用。

/* Input.txt

   o xxa o xxb xxb o xxc o xxd xxb xxe xxe

   Output.txt 

   !1 xxb
   !2 xxe
   !3 xxa
   !4 xxc
   !5 xxd
   o !3 o !1 !1 o !4 o !5 !1 !2 !2 */


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

typedef struct words {
            char *kod;
       int occurrence;
} TABLE;

int main() {
    FILE *data;
    char wordmax[23];
    TABLE *table = NULL;
    int number = 0, i, m, n;
    char c;
    data = fopen("be.txt", "r" );
    c = fgetc(data);
    FILE *outfile;
    outfile = fopen("ki.txt", "w");
    int first = 1;
    char codeReadIn[10][23];

    if ( c == '!' ) {
       data = fopen("be.txt", "r" );
   for ( i = 0; i<10; i++){
       fscanf(data, "%s", codeReadIn[i]);
   }

       while (fscanf(data, "%s", wordmax) != EOF ) {
             if (first == 0){
        fprintf(outfile, " ");
             }
         if (first == 1){
        first = 0;
         }
             for (m=0; m<10; m = m + 2) {                           
                 if (strcmp(wordmax, codeReadIn[m]) == 0) {     
                    fprintf(outfile, "%s", codeReadIn[m+1]);
            break;                    
                 }
             }
             if (m==10) {
                fprintf(outfile, "%s", wordmax);
         }
       }
    fprintf(outfile, "\n");
  } else {
  data = fopen("be.txt", "r" );
  while (fscanf(data, "%s", wordmax) != EOF ) {
    for (i = 0; i < number; ++i){
        if (strcmp(table[i].kod, wordmax) == 0){
            break;
         }
     }
    if (strlen(wordmax) <= 2){  // 2 char skip
       continue;
    }
    if (i == number) {
        ++number;
        table = (TABLE *)realloc(table, number * sizeof(TABLE));
        table[i].kod = (char *)malloc((strlen(wordmax) + 1) * sizeof(char));
        strcpy(table[i].kod, wordmax);
        table[i].occurrence = 1;
    }else{
        ++table[i].occurrence;
    }
}
int maxOccurrences[5];
char* maxCodes[5];
int j, k ;
for(j = 0; j < 5; j++){ // search for the top5 among occurrences
    maxOccurrences[j] = -1;
    for (i = 0; i < number; ++i){ // going trough occurrences
        // once put in top5, wont put it in again
        int foundone = 0;
        for (k = 0; k < j; k++){
            if ( strcmp(maxCodes[k], table[i].kod) == 0){
                 foundone = 1;
            }
        }
        if(foundone == 1){
            continue;
        } // search for max
        if ( table[i].occurrence > maxOccurrences[j] ) { // if bigger then better
             maxOccurrences[j] = table[i].occurrence;
             maxCodes[j] = table[i].kod;
        }
    }
}

char* kod[5];
kod[0] = "!1";
kod[1] = "!2";
kod[2] = "!3";
kod[3] = "!4";
kod[4] = "!5";
for (i=0;i<5;i++) {
fprintf(outfile, "%s %s\n", kod[i], maxCodes[i]);
}
int m;
data = fopen("be.txt", "r" );
first = 1;
while (fscanf(data, "%s", wordmax) != EOF ) { 
    if(first == 0){
   fprintf(outfile, " ");
    }
 if(first == 1){
   first = 0;
 }       
    for (m=0; m<j; m++) {                           
        if (strcmp(wordmax, maxCodes[m]) == 0) {     
            fprintf(outfile, "%s", kod[m]);
      break;                      
        }
    }
    if (m==j) {
       fprintf(outfile, "%s", wordmax);
 }
}
fprintf(outfile, "\n");
for (i=0;i<number;++i){
    free(table[i].kod);
}
free(table);    
}
fclose(data);
fclose(outfile);
return 0;
}
4

1 に答える 1

0

1文字や2文字の単語を無視するのはなぜですか。

if (strlen(wordmax) <= 2){  // 2 char skip
       continue;
    }

strcasecmp()の代わりに使用した方がよいのではないでしょうstrcmp()か。それとも、実際には大文字と小文字の単語を別々に扱う必要がありますか?

編集:ここにいくつかのテストケースがあります:

入力: one one two two three three four four five five

出力:

!1 two
!2 three
!3 four
!4 five
!5 one
!5 !5 !1 !1 !2 !2 !3 !3 !4 !4

リストの最後に「1」があるのはなぜですか? これは問題ですか?

入力: aaa bbb ccc ddd eee

出力:

!1 bbb
!2 ccc
!3 ddd
!4 eee
!5 ^A
aaa !1 !2 !3 !4

そこで奇妙なことが起こっている

入力: xxx yyy zzz

出力:バス エラー

于 2013-11-01T20:37:33.777 に答える