| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1652 人关注过本帖
标题:[求助]单词统计
只看楼主 加入收藏
yesxdf
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-1
收藏
 问题点数:0 回复次数:9 
[求助]单词统计

这是一个单词统计的程序,基本思想是用一个Node型的数组临时存储从文件中读入的单词,然后生成一个排序二叉树,中序遍历输出二叉树中节点的值;
文件读入部分调试过,没什么问题, 生成二叉树部分编译可以通过, 但是运行后会出现操作系统错误报告,
错误签名是
AppName: main.exe AppVer: 0.0.0.0 ModName: msvcrt.dll
ModVer: 7.0.2600.2180 Offset: 00037740

我用的是C-Free编辑器,分步调试后错误提示为
0x7c92eaf0 in _size_of_stack_reserve__ ()(gdb) Cannot access memory
我不怎么搞得懂,请指教


#include <stdio.h>
#include<string.h>
struct Node
{
char a[8];
}; /*临时存储数据的节点*/
struct Tree
{
char b[8];
int w;
struct Tree *left;
struct Tree *right;
};
void main()
{
FILE *fp;
struct Node m[400];
struct Tree *root,*p,*q;
char filename[40],ch;
int i,j,k,l;
root=(struct Tree *)malloc (sizeof(struct Tree));
root=NULL;
for(i=0;i<400;i++)
{
for(j=0;j<8;j++)
{
m[i].a[j]=NULL;
}
}
printf("Please input the name of file: ");
scanf("%s", filename);
fflush(stdin);
if((fp=fopen(filename, "r")) == NULL)
{
printf("Cannot open the file.\n");
exit(0);
}
else
{
i=0;
j=0;
ch=fgetc(fp);
while (ch!=EOF)
{
if(((ch<=122)&&(ch>=65))||(ch=' '))
{
if(i>=8)
{
if(ch==' ')
{
i=0;
j++;
ch=fgetc(fp);
}
else
{
ch=fgetc(fp);
continue;
}
}
if(ch==' ')
{
if(m[j].a[0]!=NULL)
{j++;}
i=0;
ch=fgetc(fp);
}
else
{
if((ch>=97)&&(ch<=122))
{ch=ch-32;}
m[j].a[i]=ch;
i++;
ch=fgetc(fp);
}
}
else
{
ch=fgetc(fp);
continue;
}
}
} /*上面部分是实现文件的输入,基本上没什么问题*/
l=j;/*保存节点数*/
for(i=0;i<l;i++) /*下部分是生成二叉树*/
{

if(m[i].a[0]==NULL)
{break;} /*如果临时存放数据的数组的数据域为空,则二叉树生成结束*/

else
{
p=(struct Tree *)malloc(sizeof(struct Tree));
p->left=NULL;
p->right=NULL;
p->w=1;

for(k=0;k<8;k++)
{
p->b[k]=m[i].a[k];
}

if(root==NULL)
{root=p;}

else
{
q=root;
while(q!=NULL)
{
if((strcmp(q->b,m[i].a))>0)
{
if((q->left)!=NULL)
{
q=q->left;
if((strcmp(q->b,m[i].a))==0)
{
q->w=q->w+1;
q=NULL;
}
}
else
{
q->left=p;
q=NULL;
}
}

if((strcmp(q->b,m[i].a))<0)
{
if((q->right)!=NULL)
{
q=q->right;
if((strcmp(q->b,m[i].a))==0)
{
q->w=q->w+1;
q=NULL;
}
}
else
{
q->right=p;
q=NULL;
}
}

else
{
q->w=q->w+1;
q=NULL;
}


}
}
}
}
fclose(fp);
}

搜索更多相关主题的帖子: 单词 统计 
2006-06-28 01:34
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-28 06:10
yesxdf
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-1
收藏
得分:0 

我是新手嘛,还没到那种不乱些的地步,你所说的那句root=NULL是后来加的,加不加效果一样,可错误在哪儿啊

2006-06-28 12:18
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-28 12:20
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

单词统计有这么麻烦吗???

倚天照海花无数,流水高山心自知。
2006-06-28 14:46
yesxdf
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-1
收藏
得分:0 

你有什么好的算法,请指教.
二叉树生成用的是非剃规,所以比较长

2006-06-28 18:53
yesxdf
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-1
收藏
得分:0 

搞了半天,终于出现正确结果了,程序在一些地方加continue就行啦
老是有人说我程序写得乱,我有些不明白,计算机方面我都是自学的(不都是写成锯齿型的嘛),不少东西书本上是没有的,请大家指教,我在哪些方面要改进?
还有,出现这种错误报告问题的根源在哪里?

2006-06-28 19:53
yesxdf
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-1
收藏
得分:0 

咋没人回啦
下面是这个程序的要求,你们会怎么实现?
课题 :单词索引表与二叉排序树
文本文件单词索引是指将文本中单词按字母顺序列出并且列出每个单词在文本中出现的次数,它也是关键字列表的一种特例,即单词为关键字并附加每个关键字在文中出现次数.文本文件单词索引常用于作者著作分析以此决定有争议作品作者身份。
实验目的与目标
设计实现,测试并注释 C/C++程序,程序读入文本文件并构造该文件单词为关键字的索引表同时报告每个单词在文中出现的次数作为表的数据,一个链式二叉排序树被用来代表这个关键字列表,树结点即包含关键字同时也包含次数计数,不考虑大小写字母情况下按字母顺序排序,最好在class中实现这写功能。
程序把连续字母看成单词,其他符号则视为间隔号,大小写均视为相同如‘HOUSE’、‘House’、‘house’将被视为同一单词,另外程序只计算单词的前8个字母如"manipulated"和"manipulation"被看成"manipula"的两个实例
输入
用户从终端输入文件名(包括程序本身也可以作为输入的文件)
输出
文本文件单词索引表(如前所述)
错误信息
程序应能够处理任何文件而不需要侦测错误.
实例
如果输入的文本文件为:
This is a small
test file, containing a small
number of words.

则输出结果为:
Word Count
---------------
A 2
CONTAINI 1
FILE 1
IS 1
NUMBER 1
OF 1
SMALL 2
TEST 1
THIS 1
WORDS 1
---------------
The file contains 10 distinct words
.

2006-06-29 19:27
yesxdf
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-1
收藏
得分:0 
[CODE]

#include <stdio.h>
#include<string.h>
struct Node /*临时存放数据的节点*/
{
char a[8];
};
struct Tree
{
char b[8];
int w;
struct Tree *left;
struct Tree *right;
};

void visit(struct Tree *node)
{
int i;
for(i=0;i<8;i++)
{
if(node->b[i]=='\0')
putchar(' ');
else
printf("%c",node->b[i]);
}
printf(" %d \n",node->w);
}

void print(struct Tree *root) /*中序遍历输出函数*/
{
if(root==NULL)
{return;}
else
{
if((root->left)!=NULL)
{print(root->left);}
visit(root);
if((root->right)!=NULL)
{print(root->right);}
}
}

main()
{
FILE *fp;
struct Node m[400];
struct Tree *root,*p,*q;
char filename[40],ch;
int i,j,k,l;
root=NULL;

for(i=0;i<400;i++)
{
for(j=0;j<8;j++)
{
m[i].a[j]='\0';
}
}
printf("Please input the name of file: "); /*文件读入部分*/
scanf("%s", filename);
fflush(stdin);
if((fp=fopen(filename, "r")) == NULL)
{
printf("Cannot open the file.\n");
exit(0);
}
else
{
i=0;
j=0;
ch=fgetc(fp);
while (ch!=EOF)
{
if(((ch<=122)&&(ch>=97))||((ch<=90)&&(ch>=65))||(ch=' '))
{
if(i>=8)
{
if(ch==' ')
{
i=0;
j++;
ch=fgetc(fp);
continue;

}
else
{
ch=fgetc(fp);
continue;
}
}
if(ch==' ')
{
if(m[j].a[0]!='\0')
{j++;}
i=0;
ch=fgetc(fp);
}
else
{
if((ch>=97)&&(ch<=122))
{ch=ch-32;}
m[j].a[i]=ch;
i++;
ch=fgetc(fp);
}
}
else
{
ch=fgetc(fp);
continue;
}
}
}
fclose(fp); /*文件读入结束*/
l=j;
for(i=0;i<l;i++) /*二叉树生成部分(非递规)*/
{

if(m[i].a[0]=='\0')
{break;}
else
{
p=(struct Tree *)malloc(sizeof(struct Tree));
p->left=NULL;
p->right=NULL;
for(k=0;k<8;k++)
{p->b[k]=-1;}
p->w=1;

for(k=0;k<8;k++)
{
p->b[k]=m[i].a[k];
}
free(m[i]);

if(root==NULL)
{root=p;}

else
{
q=root;
while(q!=NULL)
{
if((strcmp(q->b,m[i].a))>0)
{
if((q->left)!=NULL)
{
q=q->left;
if((strcmp(q->b,m[i].a))==0)
{
q->w=q->w+1;
q=NULL;
continue;
}
continue;
}
else
{
q->left=p;
q=NULL;
continue;
}
}

if((strcmp(q->b,m[i].a))<0)
{
if((q->right)!=NULL)
{
q=q->right;
if((strcmp(q->b,m[i].a))==0)
{
q->w=q->w+1;
q=NULL;
continue;
}
continue;
}
else
{
q->right=p;
q=NULL;
continue;
}
}

else
{
q->w=q->w+1;
q=NULL;
continue;
}
}
}
}
}
printf("The result is:\nThere are %d words in this file.\n",l);
print(root);
}

[/CODE]
这是可以通过的程序,我的方法比较笨,浪费的空间比较多,你们会怎么实现?
2006-06-29 19:30
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-12 21:16
快速回复:[求助]单词统计
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015874 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved