首页 > 技术文章 > 第2周个人作业:WordCount

RuanjianFqd 2018-03-20 22:24 原文

github地址

https://github.com/fqd332/wc

PSP表格

PSP2.1

PSP阶段

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

30

45

· Estimate

· 估计这个任务需要多少时间

15

20

Development

开发

1200

1200

· Analysis

· 需求分析 (包括学习新技术)

150

200

· Design Spec

· 生成设计文档

30

45

· Design Review

· 设计复审 (和同事审核设计文档)

45

60

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

10

15

· Design

· 具体设计

70

40

· Coding

· 具体编码

700

900

· Code Review

· 代码复审

150

200

· Test

· 测试(自我测试,修改代码,提交修改)

300

150

Reporting

报告

150

90

· Test Report

· 测试报告

50

50

· Size Measurement

· 计算工作量

15

20

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

30

30

 

合计

3005

3365

解题思路

第一步,想到徐丽萍老师教的编译原理,第二步,修改编译原理词法源程序,第三步,不会的请教寝室大佬,这样就昨完了基本功能。关于扩展功能,参考和借鉴了寝室张武科哥大佬的项目,在他的基础上进行修改而形成了本项目,相同内容的版权归原作者所有,并在此对上述大佬表示衷心感谢。

程序设计实现过程

根据编译原理改变,只能用C语言实现,单词行数等都用递归下降分析法完成。扩展功能参考张大佬的项目,理解后再修改实现。

代码说明

核心代码采用递归下降分析,沿用上学期的开发项目,降低开发成本。

 1 int count()//统计单词数、行数、注释行数
 2 {
 3     get();
 4     clearToken();
 5     while (isSpace(ch) || isNewline(ch) || isTab(ch) || isComma(ch))
 6     {
 7         if (isNewline(ch)) line_num++;
 8         get();
 9     }
10     if (isStar(ch))
11     {
12         catToken(ch);
13     }
14     else if (isDivi(ch))
15     {
16         catToken(ch);
17         get();
18         if (isStar(ch))
19         {
20             note_num++;
21             catToken(ch);
22             do
23             {
24                 do
25                 {
26                     get();
27                     if (isNewline(ch))
28                     {
29                         note_num++;
30                         line_num++;
31                     }
32 
33                 } while (!isStar(ch));
34                 do
35                 {
36                     get();
37                     if (isNewline(ch))
38                     {
39                         note_num++;
40                         line_num++;
41                     }
42                     if (isDivi(ch))
43                     {
44                         catToken(ch);
45                         return 0;
46                     }
47                 } while (isStar(ch));
48             } while (!isStar(ch));
49         }
50         if (isDivi(ch))
51         {
52             catToken(ch);
53             do
54             {
55                 get();
56             } while (!isNewline(ch));
57             note_num++;
58         }
59         if (isNewline(ch))
60             line_num++;
61     }
62     else if (isEnd(ch))
63         return 0;
64     else
65     {
66         while (!(isSpace(ch) || isNewline(ch) || isTab(ch) || isComma(ch) || isDivi(ch)))
67         {
68             catToken(ch);
69             get();
70         }
71         retract();
72         if(strcmp(stopWord, "") == 0 || strcmp(token,stopWord)!=0)
73            word_num++;
74     }

没有回溯和左递归,顺着检测即可,获取停用词后,检测到停用词就++。

void none()//统计空行数
{
    int i,j = 0;
    for (i = 0;; i++)
    {
        if (art[i] == EOF)
            break;
        if (art[i] != '\n'&& art[i] != '\t'&& art[i] != ' ')
        {
            j++;
        }
        if (art[i] == '\n')
        {
            if (j <= 1)
                none_num++;
            j = 0;
        }
    }
}

没有或者只有一个字符,判定为空行

输出输入与格式控制等省略

测试设计过程

测试程序整合在主函数中,参数有任意个,并且部分参数在一起才有意义,如-e 和 -w,部分参数单独无意义,如-s,由于代码原因,考虑参数先后顺序,如-o最低,-s其次,在此基础上做排列组合即可。因为是有穷自动机,存在部分字符无法识别导致出错的问题,需要注意。以下例举对老师给的file.c的部分测试及测试结果:

测试:

 

 

测试结果:

 

参考文献

http://www.cnblogs.com/ningjing-zhiyuan/p/8563562.html

http://www.cnblogs.com/MrZhang145689/p/8613206.html
https://github.com/lzwk/WordCount 

推荐阅读