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.主要类:
- 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)
六.测试运行
- 字符数
- 行数
- 单词数
- 扩展项目
-
项目总结
- 这是第一次自己动手做项目,过程中难免有些枯燥,反复不断的查找资料以及修复bug和错位。首先是进一步加深了以前对这些函数单纯只是概念的理解,加深了自己的印象和使用技巧,其次也深刻的意识到自己的打代码的不熟练。革命尚未成功,同志仍需努力。