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