質問を投稿するのはこれが初めてです。だから私は宿題プログラムに取り組んでいて、誰かがチャイムを鳴らして私を助けてくれることを願っているいくつかのことに少し行き詰まっています. プログラムで行う必要があるのは次のとおりです。
- プログラムは、句読点のある文を含むファイルを読み込む必要があります。
- 文を単語と句読点に解析します。
- 単語は辞書に入力され、句読点はリストに入力されます。単語を辞書に追加するとき、大文字と小文字は無視されます。辞書は辞書順に保存されていることに注意してください。
- 辞書とリストの各エントリには、単語または句読点が元のテキストに出現する回数がカウントされます。
- テキストを読んだ後 ($ の最初の文字を含む行でテキストが終了します)、辞書を出力し、カウントをリストします。
- 次に、プログラムは次のような形式の行を読み取ります: 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..