1.预计完成时间:
在一开始的时候,我并不认为这项作业的完成难度有多大。因为觉得这个程序主要的部分就是三块码,读入当前目录下的所有内容,统计单词和排序,但是我对于C++和C#两种语言都不熟悉,所以准备先用两天来熟悉语言(后来发现这个决定是错误的。。至少 不应该用这么长的时间)。在程序的具体模块中,我划分了四个模块:
主函数:处理整个流程,包括读入目录中的所有内容和对于所执行模式的判断,预计用时1小时。
分割函数:将文件中的单词分割出来。由于有三种模式,预计用时3小时。
计数函数:统计频率,作为统计单词频率的工具,预计用时半小时。
容器:统计单词、排序、输出。预计用时3小时。
预计总用时7.5小时。
2.实际完成时间:
在写程序的时候我发现我实在是太乐观了。。。虽然我用了两天来熟悉C#语言,但是显而易见的两天的时间没有实践根本不能让我对这门语言很熟悉。还好有java语言的基础,所以用还是可以用的。我自己的习惯是先编写完程序的各个模块后再来完成主程序,在最开始的时候我又把读入的部分作为一个函数提取了出来~这部分用时1h;不得不说对于语言的各种函数的不熟悉真是太要命了。。。这个后面再提。。。分割函数还好,主要是对于正则表达式不是很熟悉,所以在写的过程中又学习了正则表达式的相关知识,占用了一些时间。同时。。我竟然忘了StringBuilder这个类。。在写程序是真是各种困难,最后完成时间4小时。计数函数还好,1h完成。好了,到了最要我命的地方了。。软件工程的作业要测试效率么。。成绩是按效率来的啊。。所以我在查了一些相关资料后决定使用哈希表来作为容器完成word Frequency的工作。但是。。但是。。但是。。。统计很好写,真的,遍历也不难。。但是。。排序啊排序,卡死我了。其实利用快排然后做一下调整这个过程还是挺好完成的,但是对于我自己来说吧,对于C#中的各种类型不熟悉,哈希表也是刚刚才学习的,用起来总要查很多东西,总之在写了一个通宵之后硬是没有弄明白该怎么来按照Value排序。当然了,也有因为时间比较紧同时语言不熟悉所造成的焦虑的原因。。排序没写成。。怎么办怎么办。。我看看还有一天多的时间,好吧。。推翻重来吧。。。
还好主要的部分都已经完成了,所谓的推翻重来也不是指全部的内容o(╯□╰)o
在和同学的讨论中,一个同学告诉我,dictionary是一个很强大的东西,很强大很强大,所以我就把哈希表换成了它。然后呢,先学习了这个方面相关的知识,写起来虽然慢但是还是完成了。实际用时加上哈希表上所用的时间。。嗯,20个小时了。语言不熟真要命啊,选择错误更要命。。
终于写到主函数了,在主函数中我已开始是递归的读取文件的,谢了好长的代码。后来发现没有必要。。
一开始是这样的:
public System.Collections.ArrayList fileTravel(System.IO.DirectoryInfo the_path)
{
if (!the_path.Exists)//判断目标文件夹是否存在
throw new System.IO.DirectoryNotFoundException("the folder not found" + the_path);
else//若存在,对文件夹进行遍历
{
System.IO.FileInfo[] allFile = the_path.GetFiles();//获取当前目录下的所有文件
foreach (System.IO.FileInfo fi in allFile)
{
if ((fi.FullName.EndsWith(".txt")) | (fi.FullName.EndsWith(".h"))
| (fi.FullName.EndsWith(".cpp")) | (fi.FullName.EndsWith(".cs")))//判断文件格式
FileList.Add(fi.FullName);//将所有文件的全称存入list
}
System.IO.DirectoryInfo[] allDir = the_path.GetDirectories();
foreach (System.IO.DirectoryInfo d in allDir)
{
fileTravel(d);//递归访问
}
}
return FileList;
}
最后是这样的:
var files = from f in System.IO.Directory.GetFiles(dir, "*", System.IO.SearchOption.AllDirectories)
where f.EndsWith(".cpp", StringComparison.OrdinalIgnoreCase) ||
f.EndsWith(".txt", StringComparison.OrdinalIgnoreCase) ||
f.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) ||
f.EndsWith(".h", StringComparison.OrdinalIgnoreCase)
select f;
省事好多。。最后主函数用时1h多一点。
总共用时。。嗯,好长
3.提升效率
一开始呢是想利用哈希表来提升效率,但是失败了o(╯□╰)o
后来利用了dictionary,但最后效率也不是很高o(╯□╰)o
没办法了。。我就想把程序改成多线程的,一个线程来读入文件,一个线程来处理单词,但是。。多线程的程序最后没有来得及完成,到现在还是不能正常地运行。好伤心,这个博客写完还要继续去调看看能不能弄好o(╯□╰)o
最后贴个图。。
4.10个测试用例
1.空文件夹
2.文件名中含有.cpp的处理
file.cpp.txt;
3.大小写的处理
File。file,FIle
4.数字
File,124File,FIle123,ab,as12;
5,老师博客o(╯□╰)o
6.一个巨大的英文小说的文件夹
好忧伤。。跑了好久好久。。回去改效率去。。
7.一个套一个的空文件夹。。我好无聊
8.feiakhf23ahf 中间有数字的处理
9. File12 File file FILE file
测试排序和多个单词的统计
10.ashfk@3ahf@(^o^)/~ejhg……ashfk
不同的分隔符的处理。
5.学到了什么
虽然这次作业完成的还是挺痛苦的,但是呢,确实学到了不少的东西。首先是督促我自己吧C#至少从不会现在已经入门了,嗯。然后在学习了正则表达式的相关知识,学习了哈希表的知识和dictionary的知识。。还知道了以前不知道的很多函数。虽然多线程没有完成,但是还是学到了不少线程相关的知识。总的来说收获还是不小的。