201671010422 詞頻統計軟件項目報告

個人GitHub

本次項目Github連接

1、需求分析

  • 1.程序可讀入任意英文文本文件,該文件中英文詞數大於等於1個。
  • 2.程序須要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
  • 3.指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
  • 4.高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
  • 5.統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。

2、功能設計

  • 基本功能:
    • 產品介紹以及使用幫助
    • 從本地文件中讀入一個文本文件
    • 統計每個單詞的出現次數
    • 用戶經過輸入選項,能夠查找大於輸入的頻數的單詞
    • 能夠讀出查詢後的結果,包括所有的詞彙和篩選出的詞彙
  • 擴展功能:
    • 用戶能夠直觀的看到總共的詞彙量
    • 操做界面乾淨美觀
    • 系統穩定

3、設計實現

一、整個程序在一個大的死循環中進行,只有在用戶選擇推出程序時才能夠退出程序

二、定義k=1,當進入while循環中,只有退出系統的的命令爲k=0

三、在操做頁面排版時用到了windows自用的庫函數

void SetPosition(int x,int y)
{
    HANDLE winHandle;   //句柄
    COORD pos = {x,y};
    winHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    //設置光標的座標
    SetConsoleCursorPosition(winHandle,pos);
}

四、功能流程圖

4、 測試運行

下圖是剛進入程序時的操做界面

這是一個用戶操做說明

這是讀取了一個19W單詞的文本文件後顯示全部單詞的詞頻顯示並讀出到txt文件中

這是用戶輸入100後,系統篩選出該文本中詞頻數大於等於100的單詞顯示並讀出到txt文件中

選擇退出時的界面

這是顯示該文本全部單詞及其詞頻數後自動生成並保存的文本文件

這是顯示帥選出的單詞及其詞頻數後自動生成並保存的文本文件

5、代碼展現

這段代碼是自定義的一些變量,在後面的文本控制能夠方便的使用和有效的節省時間

#include <windows.h>
#define SEP "------------------------------------------------------------------------------"//界面的總寬度
#define COL 78
#define MARGIN_X 20             //左邊距
#define MAP_START_Y 3           //開始y軸座標
#define MAP_END_Y 11            //結束y軸座標
#define INFO_START_Y 12         //信息界面開始的Y座標
#define INFO_END_Y 19           //信息界面結束的Y座標

這些是自定義的一些函數,依舊是提升效率

void SetPosition(int x,int y);
/*從x行,y列開始清rowcount行*/
void Clear(int x,int y,int rowcount);
/*從第x列,y行開始,把第rowcount行輸入空格*/
void SetColor(int froeColor,int bankColor);
/*設置文字的前景色,和背景色*/
void Clear(int x,int y,int rowcount)
{

    //每行清除78個字符——每行打印78個空格
    int i,j;
    for(i=0;i<rowcount;i++)
    {
        SetPosition(x,y+i);
        for(j=0;j<78;j++)
        {
            printf(" ");
        }
    }
}
void SetPosition(int x,int y)
{
    HANDLE winHandle;   //句柄
    COORD pos = {x,y};
    winHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    //設置光標的座標
    SetConsoleCursorPosition(winHandle,pos);
}
void SetColor(int foreColor,int bankColor)
{
    HANDLE winHandle;   //句柄
    winHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    //設置文字顏色
    SetConsoleTextAttribute(winHandle,foreColor+bankColor*0x10);
}

程序主函數,其中k爲死循環的條件變量

char temp[WORD_LENGTH]; //臨時存放單詞的詞組
    int k=1;    //用於while循環體,造成死循環
    FILE *fp; //打開要讀取的文件
    if((fp=fopen("Breaking Dawn.txt", "r"))==NULL )
    {
        printf("Open file failed!!\n");
        exit(1);
    }
        while( EOF != (fscanf(fp,"%s",temp)) )//循環讀取文本中的內容
    {
        CountWord(temp);
    }
       fclose(fp); //關閉文件

       while(k)
        {
            PrintResult(); //輸出統計結果;
        }
        system("pause");

       Release(); //釋放內存,養成好習慣

利用指針來進行對文本的查詢和統計

void CountWord(char *current)//單詞統計
{
    wordNode *pNode = NULL;
    pNode = SearchWord(current);
    if(NULL == pNode)
    {
        return;
    }
    else
    {
        pNode->iWordCount++;
    }
}

wordNode * SearchWord(char *current)//查找單詞所在節點
{

    if( NULL == pHeader) //當鏈表爲空的時候,也就統計第一個單詞時
    {
        pHeader = new wordNode;
        strcpy(pHeader->word, current);
        pHeader->iWordCount = 0;
        pHeader->pNext = NULL;
        return pHeader;
    }

    //搜索現有的鏈表
    wordNode *pCurr = pHeader;
    wordNode *pPre = NULL;
    while( (NULL != pCurr) && (0 != strcmp(pCurr->word, current)) )
    {
        pPre = pCurr;
        pCurr = pCurr->pNext;
    }

    if(NULL == pCurr) //該單詞不存在
    {
        pCurr = new wordNode;
        strcpy(pCurr->word, current);
        pCurr->iWordCount = 0;
        pCurr->pNext = NULL;
        pPre->pNext = pCurr;
    }
    return pCurr;
}

6、 總結

經過本項目,我對軟件的PSP我的開發流程有了大體的瞭解,這種規範化的流程對比我以往的代碼編寫方法確實有許多的優勢;好比大大減小了後期的修改和補充環節,在實現過程當中能夠按照需求分析和功能設計的去實現,而不是之前的想到什麼寫什麼,我也學到了一些新知識,好比怎樣在Github上發佈軟件項目,等整個項目完成以後感受到更加充實和知足;不過,我也發現了本身還有許多不足之處,好比長時間沒有編程,編程實現困難,前期的工做不充分,致使花了大量的時間去修改和補充。在本次項目開發中,我也有一點遺憾,一是沒有實現區間篩選功能,二是因我的能力不足沒有將指定單詞的柱狀圖徹底實現。

7、PSP展現

在整個項目中實現過程既是消耗時間作多的,也是預估和實踐相差懸殊最大的環節,這說明本身的編程能力仍是不夠,有待增強,除了實現過程以外,在後期的代碼複審和過程改進計劃也浪費了不少的時間,這說明前期的作的工做仍是不夠,沒有把需求分析和功能設計這兩個環節作透。

相關文章
相關標籤/搜索