GitHub项目地址

   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[]这块上遇到了很多问题,虽然知道了它们的含义,但是仍然使用得不好,所以一些高级功能也就没有实现了;

  ②我对一些库不是很了解,别说了解,大多数是我第一次接触的,所以处理起来很棘手。

  最后想总结的是,网络世界中,真的是没有你想不到的,只有你找不到的,所以遇到困难就多去寻求答案,求知欲要强;另外,要珍惜好身边的资源,好好向厉害的同学请教。

  感谢观看!