wc.exe

github地址:https://github.com/impossible233/test/blob/master/wc.exe

一.项目要求

1.wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数

2.实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。程序处理用户需求的模式为:wc.exe [parameter] [file_name]

3.基本要求:

    wc.exe -c file.c     //返回文件 file.c 的字符数

    wc.exe -w file.c    //返回文件 file.c 的词的数目

    wc.exe -l file.c      //返回文件 file.c 的行数

4.扩展功能:

    -s   递归处理目录下符合条件的文件

    -a   返回更复杂的数据(代码行 / 空行 / 注释行)。

5.高级功能:

   -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

二.PSP表格

PSP2.1 Personal Software Process Stages 预估时间(分钟) 实际耗时(分钟)
Planning 计划 10 15
-Estimate -估计这个任务需要多少时间 500 900
Development 开发 300 350
-Analysis -需求分析(包括学习新技术) 20 40

-Design Spec

-生成设计文档 30 15
-Design Review -设计复审(和同事审核设计文档) 20 15
-Coding Standard -代码规范(为目前得开发制定合适得规范) 10 10
-Design -具体设计 40 80
-Coding -具体编码 150 250
-Code Review -代码复审 30 15
-Test -测试(自我测试,修改代码,提交修改) 20 45
Reporting 报告 45 60
-Test Report -测试报告 20 30
-Size Measurement -计算工作量 10 10
-Postmortem & Process Improvement Plan -事后总结,并提出过程改进计划 10 10
合计   715 945

三.解题思路

    1.基本要求:

  • 统计字符数:读取文件内容,用len函数逐步统计各行的字符数,再进行相加
  • 统计单词数:读取文件内容,通过检索含有a到z与A到Z之间的字符数,再逐步相加,即为单词数。
  • 统计行数:读取文件,用line与len函数进行行数运算。  

   2.进阶功能

  1. 空行数:检索全部行,去除每行左右空格后,若该行字符数小于等于1,即为空号,逐步累加求空行数。
  2. 标识行:先检索含有#的行数进行累加,再选取两侧不含“”或’‘的行数与其进行运算,求出标识行。
  3. 代码行:求出总行数后,减去空行与标识行,即为所求代码行。

 

 四.设计实现过程

    1.主要类:

  • main:项目的主函数
  • openfile:打开文件
  • readFile:读取文件
  • len:计数函数
  • splitt:仅读取所需字符,删除无关字符,便于查找。
  • startswith:检索所需字符

    五.代码说明

    1.返回字符数目

  • def char(file_name):
        f = open(file_name, 'r') 
        return len(f.read())        #字符数

    2.返回行数

  • def toline(file_name):
        f = open(file_name,"r")
        read=f.readlines()
        return len(read)            #行数

    3.返回单词数

  • def words(file_name):
        f = open(file_name,'r')
        read=re.split(r'[a-zA-Z]+',f.read())
        return len(read)            #词数

    4.扩展项目

  • ef expend(file_name):
        f = open(file_name,'r')
        fline = 0
        lined = 0     # 行数
        empty_line = 0 # 空行数
        code_line = 0  # 代码行
        comment_line = 0# 注释行
        is_comment = False #行注释标记
        comment_sign = 0
        read = f.read().split(r'\n')
        
        for line in read:
            fline += 1
            line= line.strip()
            if not is_comment:
                if len(line)<=1:
                    empty_line += 1
                elif line.startswith('#'): #检索'#'
                    comment_line += 1
                elif line.startswith("'''") or line.startswith('"""'):
                     comment_sign += 1
                     lined=fline
                     is_comment =True
                     if  comment_sign%2==0 and comment_sign>0:
                         comment_line = comment_line + fline - lined
                         is_comment = False
                         lined = fline
                else: code_line += 1
                    code_line += 1    
        print('空行数:',empty_line)    
        print('代码行:',code_line)    
        print('标识行:',comment_line)    
        

    主函数

  • def main()
       str.name = input('请输入命令及地址:\n').split()
       if   str == '-c':
           print ('字符数:',getchar(name))
       elif str == '-w':
           print ('单词数:',getwords(name))
       elif str == '-1':
           print ('行数:',getline(name))    
       elif str == '-a':
           getexpend(name)
       

    六.测试运行

  • 字符数
  • wc.exe
  • 行数
  • wc.exe
  • 单词数
  • wc.exe
  • 扩展项目
  • wc.exe
  • 项目总结

  • 这是第一次自己动手做项目,过程中难免有些枯燥,反复不断的查找资料以及修复bug和错位。首先是进一步加深了以前对这些函数单纯只是概念的理解,加深了自己的印象和使用技巧,其次也深刻的意识到自己的打代码的不熟练。革命尚未成功,同志仍需努力。
上一篇:【刷题】面筋-linux统计文件中字符串次数及文件夹下特定类型文件个数


下一篇:windows底层窗口的实现代码