求各位帮个忙!

kinup 2004-05-13 01:33:14
求各位帮个忙!小弟要做这样的一个程序:我首先找一定数量(不大于500篇,每篇不多于500个字)的文章,然后用空格把每个词分开,如:在 这里 的 网球 中心 举行 的 国际 女子 网球 卫星 巡回赛 上,获得 女子 单打 和 双打 两项 冠军。 女子 单打 和 双打 决赛 都 是 在 中国 选手 之间 进行 的。然后统计每个词出现的次数,如上面:“的”字出现过3次、“网球、单打、双打”分别出现过2次、“女子”出现过3次,其余均值出现过一次。然后输出结果,不用给出程序,只给个思路让我想想也好,最好用 C语言。谢谢!!!
...全文
63 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinup 2004-05-14
  • 打赏
  • 举报
回复
rorot(喵喵喵。。。[无聊啊]。。。。。。。。) 大哥说的词库问题,我解释一下,我是找了一定数量的文章,然后用手工分好词的,如:在 这里 的 网球 中心 举行 的 国际 女子 网球 卫星 巡回赛 上,获得 女子 单打 和 双打 两项 冠军。 女子 单打 和 双打 决赛 都 是 在 中国 选手 之间 进行 的。我每篇文章都这样分好了的,所以自己有了词库,这样是有点笨,但是没办法,我不是专门做软件的,如果你有更好的建议,请你讲一下好吗?谢谢!!
cngdzhang 2004-05-14
  • 打赏
  • 举报
回复
你用的是什么编译器啊?

我用tc和vc都测试过了呀(在xp底下),没问题啊

你用命令行窗口运行,不要用双击的办法

data.txt文件放的地方:

tc3.0
放在tc\bin目录里面

tc2.0
放在turboc2\里面


还有data.txt内容是:

在 这里 的 网球 中心 举行 的 国际 女子 网球 卫星 巡回赛 上,获得 女子 单打 和 双打 两项 冠军。 女子 单打 和 双打 决赛 都 是 在 中国 选手 之间 进行 的


kinup 2004-05-14
  • 打赏
  • 举报
回复
cngdzhang大哥,我运行的时候,把这个程序和 data.txt都放在同一个目录下,他还是说找不到该文件阿,然后我直接把便以后的程序和data.txt放在同一个目录下,点击cwords.exe文件,就谈出一个对话框:C:\cwords\cwords.exe
NTVOM CPU 遇到无效指令。
CS:0548 IP:0103 OP:63 6c 75 64 65 选择“关闭”种植应用程序
关闭 忽略
该怎么解决!在麻烦你解释一下好吗?谢谢!
cngdzhang 2004-05-14
  • 打赏
  • 举报
回复
思想是通过空格的隔开识别出词

注意:输出要在中文环境下才能看汉字

或者是,编译后,可执行程序的名字是cwords.exe
那么
c:\>cwords>out.txt
也行,输出结果在out.txt中
输入文件data.txt要和cwords.exe在同一个目录下

输入data.txt:

在 这里 的 网球 中心 举行 的 国际 女子 网球 卫星 巡回赛 上,获得 女子 单打 和 双打 两项 冠军。 女子 单打 和 双打 决赛 都 是 在 中国 选手 之间 进行 的


输出:

在 2
这里 1
的 3
网球 2
中心 1
举行 1
国际 1
女子 3
卫星 1
巡回赛 1
上,获得 1
单打 2
和 2
双打 2
两项 1
冠军。 1
决赛 1
都 1
是 1
中国 1
选手 1
之间 1
进行 1



程序:

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

char words[1000][20];
int count[1000];
int total;

void main()
{
FILE *f;
int i;
char c;
char s[20],*p;
int found;

f=fopen("data.txt","r");
if(!f)
{
printf("Can't open file !");
return;
}

total=0;
c=fgetc(f);
while(!feof(f))
{
while(c==' ' && !feof(f)) c=fgetc(f);
p=s;
while(c!=' ' && !feof(f))
{
*p++=c;
c=fgetc(f);
}
*p='\0';
found=0;
for(i=0;i<total;i++)
{
if(stricmp(s,words[i])==0)
{
count[i]++;
found=1;
break;
}
}
if(!found && *s!='\0')
{
strcpy(words[total],s);
count[total]=1;
total++;
}
}
fclose(f);
for(i=0;i<total;i++)
{
printf("%-20s%d\n",words[i],count[i]);
}
printf("\n\n");
}
rorot 2004-05-13
  • 打赏
  • 举报
回复
不可能。
其他都好做,但最关键的是你如何判断那儿加空格?没有词法库,除非你的人工智能到家了。
楼上楼主鸣谢的那两位纯粹是断章取义,这个问题重要的不是怎么查询和计数,而是词法分析
。心宇说的俺同意。你没有词库不成!
kinup 2004-05-13
  • 打赏
  • 举报
回复
谢谢上面各位大哥了!!特别要谢谢 yangshouxiang(风筝) 和 leonchew(安静) 两位大哥!当然其他也要谢谢的!!!!!!!
liuheliaoshi7879 2004-05-13
  • 打赏
  • 举报
回复
C++中包含一个文字库,
在计算词的个数时用栈来做
yangshouxiang 2004-05-13
  • 打赏
  • 举报
回复
说说我的思路如下:
为了提高效率和查询时间,我建议采用链表的方式处理


我这里只介绍一篇文章的处理方式
初始化一个链表
链表的结点是
struct node
{
char word[30];
int count
}

读文件
while(读一行 != 结束 )
{
while(从行中读一个词)
{
if( 链表里找到这个词 )
结点的.count 累加;
else
分配一个结点给word赋值 count = 1,并且插入链表(最好按顺序插入,等查找时就可以采用二分查找,效率高些)
}




}

最后得到链表,输出就很简单了
iidj 2004-05-13
  • 打赏
  • 举报
回复
想法借助输入法的词库.
leonchew 2004-05-13
  • 打赏
  • 举报
回复
说说我的思路。又不妥之处,见谅。志在抛砖引玉。
用字符数组array[max]存放这些文字数据串,同时设置其对应找到过的标志位置isFound[max]。从第一个元素开始遍历,按数组下标顺序每次取一个元素array[i+k++]{i= 0...max-1},与其后的数据串想比较,如array[j+k],(j = i+1....max-1 )其比较,这种比较应该是采用最大匹配对才算合格的一次,用k来控制的,其初值为0,最大值应该是max-j-1来控制范围。比较过程中还要判断是不是重复字符的比较。如“里里里"这中的,就不能认为是“里里”词了。每找到一个最大匹配后都要计算累加一,如用count++。遍历完一次后i的值都要重置为新字的开始i+=k,同时最大匹配字符对应数组标志位置设置1,以在新字查找中要忽略对应位置中array中数据。最后每遍历完一次,就打印找到内容和个数。
freefalcon 2004-05-13
  • 打赏
  • 举报
回复
难,没有词库的话怎么确定词组呢,纯粹用模式匹配的方法应该很难吧?(没做过,不知道)

不过可以想法借助输入法的词库
loveisbug 2004-05-13
  • 打赏
  • 举报
回复
呵呵,模式匹配?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧