1.个人PSP2.1表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
|
|
· Estimate |
· 估计这个任务需要多少时间 |
120 |
100+ |
Development |
开发 |
|
|
· Analysis |
· 需求分析 (包括学习新技术) |
120 |
200+ |
· Design Spec |
· 生成设计文档 |
60 |
0 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
10+ |
· Design |
· 具体设计 |
120 |
100+ |
· Coding |
· 具体编码 |
120 |
480+ |
· Code Review |
· 代码复审 |
30 |
10+ |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
90+ |
Reporting |
报告 |
|
|
· Test Report |
· 测试报告 |
30 |
20+ |
· Size Measurement |
· 计算工作量 |
30 |
10+ |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
90+ |
合计 |
|
|
2.问题的分析以及解决方法
我这个比较喜欢的是,简单清晰的主函数,功能多样性的功能函数,所以我在拿到提目后,就先把构架大概罗列了一下,功能函数先放在一边。随后,我上网找了一下wc命令实现大致需要哪些库,然后从一些库定义的功能开始入手,当然,最开始了解的,便是令我头疼的argc&*argv[]。(很遗憾,我最终的只能实现基本的功能,而且还是通过命令行先把程序打开,再进入输入操作,没能完成word上的要求)
问题我不会的有很多,基本通过手工搜索,以及请教大佬(这一点,我觉得很重要)。
3.实现过程
主函数主要就是定义一些基本变量,然后通过调用Counter_Basic函数(为什么加Basic,其实这是一个基本功能的算法,本来想弄高级语言的,但后来发现,我的能力不足)来对文本数据计数,再通过Function函数对相关格式的输入进行不同的输出。
4.简单的代码
如果你看了我的.cpp,你会发现,我其实在里面包含了很多的,像这种"/*…………*/",以及这种"//…………",其实这些,很多都是我挣扎后,不得以放弃的编码过程,那么废话不多说,来看看我的菜鸡代码:
先看看我的基本构架:
1 #include<iostream> 2 #include<fstream> 3 void Function(char, int []); //查询功能检索(如:"-c"为显示字符数)以及输出(std::cout) 4 void Counter_Basic(int[], char[]); //字符/行/单词/代码行/空行/注释行 5 6 int main(int argc, char* argv[]) 7 { 8 char function_set[10]; 9 char file_name[30]; 10 int count[6]{ 0, 0, 1, 0, 0, 0 }; //count[0]:字节数, count[1]:单词数, count[2]:行数. 11 //count[3]:代码行, count[4]:空行, count[5]:注释行. 12 std::cout << "\nPlease enter your file_path: "; //输入格式为"? file_path" 13 std::cin >> function_set; //'?'为功能设置 14 std::cin >> file_name; //"file_path"为文件路径 15 16 Counter_Basic(count, file_name); 17 18 Function(function_set[1], count); 19 20 std::cout << std::endl; 21 system("pause"); 22 return 0; 23 } 24 25 void Counter_Basic(int count[], char file_name[]){} 26 void Function(char ch, int count[]){}
接下来完善Counter_Basic函数:
1 void Counter_Basic(int count[], char file_name[]) 2 { 3 std::ifstream file_stream; 4 file_stream.open(file_name, std::ios::in); 5 if (!file_stream) 6 std::cout << "\nError.\n"; 7 8 bool flag_word = false; //当istream.read指向英文字母时, flag_word = true, 初始化false方便计算. 9 bool flag_cppline = false; //当istream.read指向某一字符时, flag_cppline = false. 10 int flag_explanation = 0; //当istream.read指向字符'\n'时,flag_explanation加1,大于1表示该行为注释行. 11 int flag_explanation_1 = false, flag_explanation_2 = false; //指"/*" 12 int flag_explanation_3 = false, flag_explanation_4 = false; //指"*/" 13 char *ch = new char[100]; 14 15 std::cout << "\nThe info of the file:\n\n"; //典型的字符、行、单词统计. 16 do 17 { 18 file_stream.read(ch, 1); 19 std::cout << *ch; 20 21 //count[0]:字节数, count[1]:单词数, count[2]:行数. 22 23 if (*ch > 'A' && *ch < 'Z' || *ch > 'a' && *ch < 'z') 24 { 25 if (flag_word == false) 26 { 27 count[1]++; 28 flag_word = true; 29 } 30 } 31 else flag_word = false; 32 33 if (*ch != ' ' && *ch != '\t' && *ch != '\n') 34 count[0]++; 35 36 if (*ch == '\n') 37 count[2]++; 38 39 } while (!file_stream.eof()); 40 41 std::cout << std::endl << std::endl; 42 }
最后是补上输出函数Function函数的内容:
1 void Function(char ch, int count[]) 2 { 3 if (ch == 'c') 4 std::cout << "The amount of the char: " << count[0] << std::endl; 5 else if (ch == 'l') 6 std::cout << "The amount of the line: " << count[2] << std::endl; 7 else if (ch == 'w') 8 std::cout << "The amount of the word: " << count[1] << std::endl; 9 10 }
其他那些半成品我就不展示了,那些只能是我挣扎的过程。
5.代码运行
虽然说,我的代码很鸡肋,但是,我还是要展示一下的,怎么说都是辛勤劳动的成果T-T。
先展示一下本期我们实验的对象:
(没错,就是这个家伙)
下面分别从不同格式输入,输出文本的不同数据:
-c 字符数:
-l 行数:
-w 单词数:
由于这个人有点菜,而且挣扎之后,其他功能也只是半成品。唉,再好好努力吧!
6.个人总结
看的时候要多想,想的时候要多做,实力便是实践的总结,果然,人可以蠢但是不能颓废,Practice makes perfect,历练锻造价值,只有不断练习与思考,才能有能力上明显的提高。
对于别人来说,我这点东西什么都不是;但对于我自己,跟以前咸鱼的我比起来,我总算是了解到了不少东西。比如,代码的规范性,构架清晰,再强的程序员,写出来的东西也是给人看的,所以让别人能读懂你的代码很重要,一篇零零散散的代码只会使人厌倦。
困难:
①这次我在argc和*argv[]这块上遇到了很多问题,虽然知道了它们的含义,但是仍然使用得不好,所以一些高级功能也就没有实现了;
②我对一些库不是很了解,别说了解,大多数是我第一次接触的,所以处理起来很棘手。
最后想总结的是,网络世界中,真的是没有你想不到的,只有你找不到的,所以遇到困难就多去寻求答案,求知欲要强;另外,要珍惜好身边的资源,好好向厉害的同学请教。
感谢观看!