2

質問を投稿するのはこれが初めてです。だから私は宿題プログラムに取り組んでいて、誰かがチャイムを鳴らして私を助けてくれることを願っているいくつかのことに少し行き詰まっています. プログラムで行う必要があるのは次のとおりです。

  • プログラムは、句読点のある文を含むファイルを読み込む必要があります。
  • 文を単語と句読点に解析します。
  • 単語は辞書に入力され、句読点はリストに入力されます。単語を辞書に追加するとき、大文字と小文字は無視されます。辞書は辞書順に保存されていることに注意してください。
  • 辞書とリストの各エントリには、単語または句読点が元のテキストに出現する回数がカウントされます。
  • テキストを読んだ後 ($ の最初の文字を含む行でテキストが終了します)、辞書を出力し、カウントをリストします。
  • 次に、プログラムは次のような形式の行を読み取ります: word1 < word2
  • これは、テキスト内の word1 を word2 に置き換えることを意味します

ファイル(hw5-input)を入力して辞書順で印刷し、大文字を取り除きました。単語数もありますが、単語数で別々の行に印刷することはできません..私はまだまた、単語を交換してファイルを再度印刷する必要がありますが、単語カウントで印刷することは本当に助けが必要です。これが私がこれまでに持っているものです:

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

#define PUNCT " \n,\t!:;.-"
#define MAX_STR_LEN 2048

struct listNode 
{
    char *word;
    struct listNode *next;
    int wordCount;
};

struct listNode *newListNode(const char * const);
void insertWord(struct listNode *,const char * const);
void deleteList(struct listNode *);
void printList(struct listNode *);

// Create new struct listNode

struct listNode *newListNode(const char * const s) 
{
    struct listNode *n =
        (struct listNode*)calloc(1,sizeof(struct listNode));
    n->word = (char *)calloc(strlen(s)+1,sizeof(*s));
    strcpy(n->word,s);
    n->next = NULL;
    n->wordCount = 1;
    return n;
}

// Insert words into dictionary in ascending order

void insertWord(struct listNode *head,const char * const s) 
{
    char *i;
    int x = 0;
    for(i = s; *i != '\0'; i++) {
        *i = (char)tolower(*i);
        x++;
    }

    i = i-x;

// Gets rid of duplicate words and counts words

    struct listNode *p = head,
        *q = newListNode(i);

    while ((p->next != NULL) && (strcmp(i,p->next->word) > 0)) 
    {
        p = p->next;
    }
    if(p->next != NULL && strcmp(i,p->next->word) == 0)
    {
        p->next->wordCount++;
    } else {
        q->next = p->next;
        p->next = q;
    }
}

// Free all memory allocated for the list

void deleteList(struct listNode *head) 
{
    struct listNode *p = head, *q;
    while (p != NULL) 
    {
        q = p->next;
        free(p->word);
        free(p);
        p = q;
    }
}

// Print the dictionary

void printList(struct listNode *head) 
{
    struct listNode *p = head->next;

    while (p != NULL) 
    {
        printf("%s ",p->word);
        p = p->next;
    }
    puts("");
}

// Enter file and print words in lexicographic order

int main(int argc, char *argv[]) 
{
    char line[MAX_STR_LEN], *s, fileName[MAX_STR_LEN];
    struct listNode *head = newListNode("");

    int i = 0;
    char c;

    FILE *p;

    printf("Enter file name: ");
    scanf("%s", fileName);
        if((p = fopen(fileName, "r")) == NULL)
        {
            printf("File not found.");
            return 0;
        }

    while((c = getc(p)) != '$')
    { 
        line[i] = c;
        i++;
    }

    line[i] = '\0';
    for(s = strtok(line,PUNCT); s != NULL; s = strtok(NULL,PUNCT)) 
    {
        insertWord(head,s);
    }
    printf("Lexicographical order: ");
    printList(head);
    deleteList(head);

    return 0;
}

入力ファイル (hw5-input) は次のとおりです。

Call me Ishmael.  Some years ago--never mind how long precisely--
having little or no money in my purse, and nothing particular
to interest me on shore, I thought I would sail about a little
and see the watery part of the world.  It is a way I have
of driving off the spleen and regulating the circulation.
Whenever I find myself growing grim about the mouth;
whenever it is a damp, drizzly November in my soul; whenever I
find myself involuntarily pausing before coffin warehouses,
and bringing up the rear of every funeral I meet;
and especially whenever my hypos get such an upper hand of me,
that it requires a strong moral principle to prevent me from
deliberately stepping into the street, and methodically knocking
people's hats off--then, I account it high time to get to sea
as soon as I can.  This is my substitute for pistol and ball.
With a philosophical flourish Cato throws himself upon his sword;
I quietly take to the ship.  There is nothing surprising in this.
If they but knew it, almost all men in their degree, some time
or other, cherish very nearly the same feelings towards
the ocean with me.
$
substitute < replacement
whale < zebra
myself < oneself

次のように次の行にアルファベット順に印刷する必要があります。

a - 4
about - 1
account - 1
ago- 2
and - 5
etc..
4

3 に答える 3

1

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

さらに調べてみると、すでに strtok を実行しているようです。あなたが持っている本当の質問は、「文字列に最適な C リストの実装は何ですか?」ということです。

于 2012-07-20T20:05:16.023 に答える
0

Microsoft / Amazon タイプの質問: 疑似コードを作成します。C実装:

    define a struct like:

    struct node{
       int count;
       char * word;
       struct node *next;
   }Node;

   open the file for read;
   for each line in the file do:
         split the line, in other to have each work separately
         for each work in the line do:
            check if the work already exist in the list
            if not, create a new node
                   node->word = word
                   node->count = 1
            else:
                   node->count += 1

   sort the list by the node->word param

実装は演習でした!しかし、使いこなせればmap人生はもっとシンプルになります!

于 2012-07-21T00:24:11.897 に答える
0

wordcount 関数を使用できたので、printList 関数の下の print ステートメントを次のように編集しました。

printf("%15s (%2d)\n",p->word, p->wordCount);

その後、すべての単語を単語数とともに辞書順に印刷することができました。

Enter file name: hw5-input
Lexicographical order:
              a ( 5)
          about ( 2)
        account ( 1)
            ago ( 1)
            all ( 1)
         almost ( 1)
             an ( 1)
            and ( 7)
             as ( 2)
           ball ( 1)
         before ( 1)
       bringing ( 1)
            but ( 1)
           call ( 1)
            can ( 1)
           cato ( 1)
        cherish ( 1)
    circulation ( 1)
         coffin ( 1)
           damp ( 1)
         degree ( 1)
   deliberately ( 1)
        driving ( 1)
        drizzly ( 1)
     especially ( 1)
          every ( 1)
       feelings ( 1)
           find ( 2)
       flourish ( 1)
            for ( 1)
           from ( 1)
        funeral ( 1)
            get ( 2)
           grim ( 1)
        growing ( 1)
           hand ( 1)
           hats ( 1)
           have ( 1)
         having ( 1)
           high ( 1)
        himself ( 1)
            his ( 1)
            how ( 1)
          hypos ( 1)
              i ( 9)
             if ( 1)
             in ( 4)
       interest ( 1)
           into ( 1)
  involuntarily ( 1)
             is ( 4)
        ishmael ( 1)
             it ( 5)
           knew ( 1)
       knocking ( 1)
         little ( 2)
           long ( 1)
             me ( 5)
           meet ( 1)
            men ( 1)
   methodically ( 1)
           mind ( 1)
          money ( 1)
          moral ( 1)
          mouth ( 1)
             my ( 4)
         myself ( 2)
         nearly ( 1)
          never ( 1)
             no ( 1)
        nothing ( 2)
       november ( 1)
          ocean ( 1)
             of ( 4)
            off ( 2)
             on ( 1)
             or ( 2)
          other ( 1)
           part ( 1)
     particular ( 1)
        pausing ( 1)
       people's ( 1)
  philosophical ( 1)
         pistol ( 1)
      precisely ( 1)
        prevent ( 1)
      principle ( 1)
          purse ( 1)
        quietly ( 1)
           rear ( 1)
     regulating ( 1)
       requires ( 1)
           sail ( 1)
           same ( 1)
            sea ( 1)
            see ( 1)
           ship ( 1)
          shore ( 1)
           some ( 2)
           soon ( 1)
           soul ( 1)
         spleen ( 1)
       stepping ( 1)
         street ( 1)
         strong ( 1)
     substitute ( 1)
           such ( 1)
     surprising ( 1)
          sword ( 1)
           take ( 1)
           that ( 1)
            the (10)
          their ( 1)
           then ( 1)
          there ( 1)
           they ( 1)
           this ( 2)
        thought ( 1)
         throws ( 1)
           time ( 2)
             to ( 5)
        towards ( 1)
             up ( 1)
           upon ( 1)
          upper ( 1)
           very ( 1)
     warehouses ( 1)
         watery ( 1)
            way ( 1)
       whenever ( 4)
           with ( 2)
          world ( 1)
          would ( 1)
          years ( 1)

ただし、単語を入れ替えて入力ファイルを再印刷する必要があります。誰にも解決策がありますか?

于 2012-07-25T22:09:45.753 に答える