天天看点

课程设计--词频统计程序

       去年补休的C语言,今年开学开始做C语言课设,拿到的课设是“词频统计程序”,所以最近就写了一个词频统计的。

      但是总是出现意想不到的bug,能运行但是就是答案错误,自己一直在输出中间变量debug,一直没有找到原因,可能自己在MAP方面掌握的还不好,自己寒假在家写过利用STL写过简单的map的题目。这回以为可以用得上,最终还是转向自己熟悉下的领域的链表。

(一)这个是课程要求:

     内容:打开一篇英文文章,统计每个词在该文章中的出现频率,然后根据用户输入的两个阈值a和b,将词频大于a的和词频小于b的所有单词输出。

设计要求:

1)  独立完成系统的设计、编码和调试;

2)  系统利用C语言实现;

3)  按照课程设计规范书写课程设计报告。

(二)总体设计

本程序主要分为五个模块:主函数模块,读取单词函数模块,显示单词统计函数模块,单词统计函数模块,单词添加函数模块。

(1)主函数模块:先调用读取单词函数,然后根据用户输入的阈值调用显示单词统计函数输出结果。

(2)读取单词函数模块:打开用户输入的文件,调用单词统计函数,然后关闭文件。

(3)显示单词统计函数模块:将链表中频率大于a且小于b的单词输出在操作界面上。

(4)单词统计函数模块用户:输入的文章以字符的形式进行判断,如果该字符为字母(包括“’”),则添加到单词数组中,否则,调用单词添加函数添加一个新单词。

单词添加函数模块:要添加单词首字母改为小写,然后判断该单词在链表中是否存在,若存在,则出现频率加1,否则在链表中创建一个新的节点,将该单词信息放到该节点中。

(三)使用说明

(1)首先在你建立的工程文件夹下添加一个test.txt的文件,在test.txt文件中写入一篇英文文章。如果你的文件隐藏了后缀“.txt”,在我的电脑中找到“查看”,然后点击“选项”,进入到文件夹选项中,选择“查看”,去掉“隐藏已知文件类型的扩展名”。

直接源代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define Name_Max 30    //文件名最大长度
#define Word_Max 60    //每个单词最大长度

typedef struct word        //连表 单词结构
{
    char w[Word_Max];    //单词
    int count;                //个数
    struct word *next;
}link;

link *head=NULL;    //连表头
FILE *fp;            //文件指针
int count=0;

int isnotWord(char a)        //判断是否为字母
{
    if(a <= 'z' && a >= 'a')
    {
        return 0;
    }
    else if(a <= 'Z' && a >= 'A')
    {
        return 0;
    }
    else
        return 1;
}

void addWord(char *w1)        //添加单词
{
    link *p1,*p2;
    if(w1[0] <= 'Z' && w1[0] >= 'A')    //转成小写字母
    {
        w1[0]+=32;
    }
    for(p1=head;p1!=NULL;p1=p1->next)    //判断单词在连表中是否存在
    {
        if(!strcmp(p1->w,w1))
        {
            p1->count++;            //存在就个书加1
            return;
        }
    }
                                    
    p1=(struct word *)malloc(sizeof(word));//不存在添加新单词
    strcpy(p1->w,w1);
    p1->count=1;
    p1->next=NULL;
    count++;

    if(head==NULL)
    {
        head=p1;
    }
    else
    {
        for(p2=head;p2->next!=NULL;p2=p2->next);
        p2->next=p1;
    }
}

void wordCount()    //统计单词
{
    int i=0,j=0;
    char word[Word_Max],c;
    while(!feof(fp))
    {
        fscanf(fp,"%c",&c);
        if(isnotWord(c))
        {
            word[j]='\0';
            if(j>0)
            {
                addWord(word);
            }
            j=0;
        }
        else
        {
            word[j]=c;
            j++;
        }
        i++;
    }
}

void readWord()        //读取文件中的单词
{
    char name[Name_Max];
    printf("请出入要读取的单词文件名[如:test.txt]:");
    scanf("%s",name);
    getchar();
    fp=fopen(name,"r");
    wordCount();
    fclose(fp);
}

void showWord(int a,int b)        //显示单词统计情况
{
    link *p;
    printf("个数\t单词\n");
    for(p=head;p!=NULL;p=p->next)
    {
        if((p->count > a)&&(p->count < b))
            printf("%d\t%s\n",p->count,p->w);
    }
}

int main()
{
    readWord();
    int a,b;
    printf("请输入阈值a和b[如:2 10]:");
    scanf("%d %d",&a,&b);
    getchar();
    showWord(a,b);
    getchar();
}      

文中有错误的地方希望指出,共同进步

继续阅读