这是我第一次发布问题。所以我正在做一个家庭作业计划,有点卡在一些事情上,我希望有人能插话并帮助我。这是我需要在程序中做的事情:
- 你的程序必须读入一个包含带有标点符号的句子的文件。
- 它将句子解析为单词和标点符号。
- 单词将被输入字典,标点符号将被输入列表。将单词添加到字典时忽略大小写。请记住,字典是按字典顺序保存的。
- 字典和列表中的每个条目都会计算单词或标点符号在原始文本中出现的次数。
- 阅读文本后(第一个字符为 $ 的行终止文本),打印出字典并列出计数。
- 您的程序接下来将读取如下格式的行: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..