第一次课程作业项目报告
一.实验内容
要求
1. 对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等)统计字符数、单词数、行数、词频,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
2. 使用性能测试工具进行分析,找到性能的瓶颈并改进
3. 对代码进行质量分析,消除所有警告
4. 设计10个测试样例用于测试,确保程序正常运行(例如:空文件,只包含一个词的文件,只有一行的文件,典型文件等等)
5. 使用Github进行代码管理
6. 撰写博客
基本功能
1. 统计文件的字符数
2. 统计文件的单词总数
3. 统计文件的总行数
4. 统计文件中各单词的出现次数
5. 对给定文件夹及其递归子文件夹下的所有文件进行统计
6. 统计两个单词(词组)在一起的频率,输出频率最高的前10个。
7. 在Linux系统下,进行性能分析,过程写到blog中(附加题)
二.PSP表格
|
预计用时/h |
实际用时/h |
Planning |
0.5 |
1 |
· Analysis |
1 |
1 |
· Design |
1 |
2 |
· Design Review |
0.5 |
0.5 |
· Coding Standard |
0.5 |
1 |
· Coding |
10 |
12 |
· Code Review |
1 |
4 |
· Test |
1 |
3 |
Reporting |
1.5 |
2 |
· Test Report |
1 |
1.5 |
·Summary |
0.5 |
0.5 |
合计 |
17 |
28.5 |
三.代码
Windows版
// ConsoleApplication2.cpp: 定义控制台应用程序的入口点。 // /*总思路:hashnum存储字符串的哈希值,用Hash的下标来表示,Hash此下标中存 着字符指针的下标(即W[n]中的n),同时Fren[hashnum]存储对应Hash[hashnum]的频率 所以最终输出时对Fren数组进行查找出最大的,然后找出对应Hash表中的字符指针下表*/ #include "stdafx.h" #include "iostream" #include "string" #include "string.h" #include <cstring> // for strcpy(), strcat() #include <io.h> #define strcasecmp _stricmp #define N 50331553 #define LONGMAX 1024 FILE *fin, *fout, *fin1, *fin2, *fin3; char *W[20000000]; char *PH[20000000]; char *PL[20000000]; int Hash[N] = { 0 }; int Fren[N] = { 0 }; int HashP[N] = { 0 }; int FrenP[N] = { 0 }; long int chnum = 0, linenum = 0, wordsnum = 0; int pp = 0, ii = 0; using namespace std; unsigned int BKDRHash(char *str); unsigned int BKDRHashP(char *str1, char *str2); bool Ascll(char c); bool isc(char c); bool is(char c); void charnum(void); void wordnum(void); int Insert(char *str, int n); int InsertP(char *str1, char *str2, int n); bool Compare(char *str1, char *str2); void listFiles(const char * dir); int FindWord(char *str); int FindWord(char *str) { unsigned int hashnum; int p; hashnum = BKDRHash(str); int a; p = Hash[hashnum]; if (W[p] == NULL) return 0; a = Compare(str, W[p]); while (a==0) { hashnum++; p = Hash[hashnum]; a = Compare(str, W[p]); } return p; } unsigned int BKDRHashP(char *str1, char *str2) { unsigned int hashnum1; unsigned int hashnum2; hashnum1 = BKDRHash(str1); hashnum2 = BKDRHash(str2); return((hashnum1 + hashnum2) % N); } int InsertP(char *str1, char *str2, int n) { if (n == 0) return 0; int hashnum; int p, a, b; hashnum = BKDRHashP(str1, str2); while (FrenP[hashnum]>0) { p = HashP[hashnum]; a = Compare(PH[p], str1); b = Compare(PL[p], str2); if (a == 1 && b == 1) { FrenP[hashnum]++; return 1; } else hashnum = (hashnum + 1) % N; } HashP[hashnum] = n; FrenP[hashnum] = 1; return 0; } bool Compare(char *str1, char *str2) { char new1[LONGMAX], new2[LONGMAX]; int n1, n2, i, n; n1 = strlen(str1); if (str2 == NULL) return false; n2 = strlen(str2); n1--; n2--; while ((int)str1[n1] > 47 && (int)str1[n1] < 58) { n1--; } for (i = 0; i < n1 + 1; i++) new1[i] = str1[i]; new1[n1 + 1] = '