天天看點

課程設計--詞頻統計程式

       去年補休的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();
}      

文中有錯誤的地方希望指出,共同進步

繼續閱讀